From 7b2e6f3ed7c8b871195f344d0efeecb59a202e8f Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Sat, 25 Jan 2020 01:44:30 +0000 Subject: Revert "Get the dex2oat host tool path from module dependency on..." Revert submission 1211982-dex2oat-soong-dep Reason for revert: Build failures. See b/148312086. Reverted Changes: Ibc427a9a8: Make dex2oat(d) visible for use as implicit dexpre... I71df11c1e: Move the Once cache for dexpreopt.GlobalConfig int... I38317f2d5: Get the dex2oat host tool path from module depende... I440a09dba: Separate dexpreopt.GlobalSoongConfig to allow inde... Bug: 148312086 Bug: 145934348 Exempt-From-Owner-Approval: Plain revert Change-Id: I0cf6fef04434fd3c0b7957ee9abdcaabeb20b9d8 --- java/java_test.go | 4 ---- 1 file changed, 4 deletions(-) (limited to 'java/java_test.go') diff --git a/java/java_test.go b/java/java_test.go index b724b4de2..f047486e6 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -57,8 +57,6 @@ func TestMain(m *testing.M) { } func testConfig(env map[string]string, bp string, fs map[string][]byte) android.Config { - bp += dexpreopt.BpToolModulesForTest() - config := TestConfig(buildDir, env, bp, fs) // Set up the global Once cache used for dexpreopt.GlobalSoongConfig, so that @@ -94,8 +92,6 @@ func testContext() *android.TestContext { cc.RegisterRequiredBuildComponentsForTest(ctx) ctx.RegisterModuleType("ndk_prebuilt_shared_stl", cc.NdkPrebuiltSharedStlFactory) - dexpreopt.RegisterToolModulesForTest(ctx) - return ctx } -- cgit v1.2.3-59-g8ed1b From 453bf0985351826b7ed64e3b20ccc4965141c4de Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Sat, 25 Jan 2020 01:44:30 +0000 Subject: Revert "Move the Once cache for dexpreopt.GlobalConfig into the ..." Revert submission 1211982-dex2oat-soong-dep Reason for revert: Build failures. See b/148312086. Reverted Changes: Ibc427a9a8: Make dex2oat(d) visible for use as implicit dexpre... I71df11c1e: Move the Once cache for dexpreopt.GlobalConfig int... I38317f2d5: Get the dex2oat host tool path from module depende... I440a09dba: Separate dexpreopt.GlobalSoongConfig to allow inde... Bug: 148312086 Bug: 145934348 Exempt-From-Owner-Approval: Plain revert Change-Id: I6b656afb5feaad70d958b9d38b6c6eab7b03fba1 --- dexpreopt/config.go | 77 +++++--------------------------- dexpreopt/dexpreopt_gen/dexpreopt_gen.go | 12 ++--- java/dexpreopt.go | 6 +-- java/dexpreopt_bootjars.go | 14 +++--- java/dexpreopt_bootjars_test.go | 2 +- java/dexpreopt_config.go | 50 +++++++++++++++++++-- java/java_test.go | 4 +- 7 files changed, 77 insertions(+), 88 deletions(-) (limited to 'java/java_test.go') diff --git a/dexpreopt/config.go b/dexpreopt/config.go index cd74ec847..63d55df7f 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -176,9 +176,10 @@ func constructWritablePath(ctx android.PathContext, path string) android.Writabl return constructPath(ctx, path).(android.WritablePath) } -// ParseGlobalConfig parses the given data assumed to be read from the global -// dexpreopt.config file into a GlobalConfig struct. -func ParseGlobalConfig(ctx android.PathContext, data []byte) (GlobalConfig, error) { +// LoadGlobalConfig reads the global dexpreopt.config file into a GlobalConfig +// struct. LoadGlobalConfig is used directly in Soong and in dexpreopt_gen +// called from Make to read the $OUT/dexpreopt.config written by Make. +func LoadGlobalConfig(ctx android.PathContext, data []byte) (GlobalConfig, error) { type GlobalJSONConfig struct { GlobalConfig @@ -201,65 +202,10 @@ func ParseGlobalConfig(ctx android.PathContext, data []byte) (GlobalConfig, erro return config.GlobalConfig, nil } -type globalConfigAndRaw struct { - global GlobalConfig - data []byte -} - -// GetGlobalConfig returns the global dexpreopt.config that's created in the -// make config phase. It is loaded once the first time it is called for any -// ctx.Config(), and returns the same data for all future calls with the same -// ctx.Config(). A value can be inserted for tests using -// setDexpreoptTestGlobalConfig. -func GetGlobalConfig(ctx android.PathContext) GlobalConfig { - return getGlobalConfigRaw(ctx).global -} - -// GetGlobalConfigRawData is the same as GetGlobalConfig, except that it returns -// the literal content of dexpreopt.config. -func GetGlobalConfigRawData(ctx android.PathContext) []byte { - return getGlobalConfigRaw(ctx).data -} - -var globalConfigOnceKey = android.NewOnceKey("DexpreoptGlobalConfig") -var testGlobalConfigOnceKey = android.NewOnceKey("TestDexpreoptGlobalConfig") - -func getGlobalConfigRaw(ctx android.PathContext) globalConfigAndRaw { - return ctx.Config().Once(globalConfigOnceKey, func() interface{} { - if data, err := ctx.Config().DexpreoptGlobalConfig(ctx); err != nil { - panic(err) - } else if data != nil { - globalConfig, err := ParseGlobalConfig(ctx, data) - if err != nil { - panic(err) - } - return globalConfigAndRaw{globalConfig, data} - } - - // No global config filename set, see if there is a test config set - return ctx.Config().Once(testGlobalConfigOnceKey, func() interface{} { - // Nope, return a config with preopting disabled - return globalConfigAndRaw{GlobalConfig{ - DisablePreopt: true, - DisableGenerateProfile: true, - }, nil} - }) - }).(globalConfigAndRaw) -} - -// SetTestGlobalConfig sets a GlobalConfig that future calls to GetGlobalConfig -// will return. It must be called before the first call to GetGlobalConfig for -// the config. -func SetTestGlobalConfig(config android.Config, globalConfig GlobalConfig) { - config.Once(testGlobalConfigOnceKey, func() interface{} { return globalConfigAndRaw{globalConfig, nil} }) -} - -// ParseModuleConfig parses a per-module dexpreopt.config file into a -// ModuleConfig struct. It is not used in Soong, which receives a ModuleConfig -// struct directly from java/dexpreopt.go. It is used in dexpreopt_gen called -// from Make to read the module dexpreopt.config written in the Make config -// stage. -func ParseModuleConfig(ctx android.PathContext, data []byte) (ModuleConfig, error) { +// LoadModuleConfig reads a per-module dexpreopt.config file into a ModuleConfig struct. It is not used in Soong, which +// receives a ModuleConfig struct directly from java/dexpreopt.go. It is used in dexpreopt_gen called from oMake to +// read the module dexpreopt.config written by Make. +func LoadModuleConfig(ctx android.PathContext, data []byte) (ModuleConfig, error) { type ModuleJSONConfig struct { ModuleConfig @@ -358,10 +304,9 @@ type globalJsonSoongConfig struct { ConstructContext string } -// ParseGlobalSoongConfig parses the given data assumed to be read from the -// global dexpreopt_soong.config file into a GlobalSoongConfig struct. It is -// only used in dexpreopt_gen. -func ParseGlobalSoongConfig(ctx android.PathContext, data []byte) (GlobalSoongConfig, error) { +// LoadGlobalSoongConfig reads the dexpreopt_soong.config file into a +// GlobalSoongConfig struct. It is only used in dexpreopt_gen. +func LoadGlobalSoongConfig(ctx android.PathContext, data []byte) (GlobalSoongConfig, error) { var jc globalJsonSoongConfig err := json.Unmarshal(data, &jc) diff --git a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go index 4da003e11..708bb9b23 100644 --- a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go +++ b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go @@ -84,9 +84,9 @@ func main() { os.Exit(2) } - globalSoongConfig, err := dexpreopt.ParseGlobalSoongConfig(ctx, globalSoongConfigData) + globalSoongConfig, err := dexpreopt.LoadGlobalSoongConfig(ctx, globalSoongConfigData) if err != nil { - fmt.Fprintf(os.Stderr, "error parsing global Soong config %q: %s\n", *globalSoongConfigPath, err) + fmt.Fprintf(os.Stderr, "error loading global Soong config %q: %s\n", *globalSoongConfigPath, err) os.Exit(2) } @@ -96,9 +96,9 @@ func main() { os.Exit(2) } - globalConfig, err := dexpreopt.ParseGlobalConfig(ctx, globalConfigData) + globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, globalConfigData) if err != nil { - fmt.Fprintf(os.Stderr, "error parsing global config %q: %s\n", *globalConfigPath, err) + fmt.Fprintf(os.Stderr, "error loading global config %q: %s\n", *globalConfigPath, err) os.Exit(2) } @@ -108,9 +108,9 @@ func main() { os.Exit(2) } - moduleConfig, err := dexpreopt.ParseModuleConfig(ctx, moduleConfigData) + moduleConfig, err := dexpreopt.LoadModuleConfig(ctx, moduleConfigData) if err != nil { - fmt.Fprintf(os.Stderr, "error parsing module config %q: %s\n", *moduleConfigPath, err) + fmt.Fprintf(os.Stderr, "error loading module config %q: %s\n", *moduleConfigPath, err) os.Exit(2) } diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 0fd1f28f9..0734b3fce 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -59,7 +59,7 @@ type DexpreoptProperties struct { } func (d *dexpreopter) dexpreoptDisabled(ctx android.ModuleContext) bool { - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) if global.DisablePreopt { return true @@ -96,7 +96,7 @@ func (d *dexpreopter) dexpreoptDisabled(ctx android.ModuleContext) bool { } func odexOnSystemOther(ctx android.ModuleContext, installPath android.InstallPath) bool { - return dexpreopt.OdexOnSystemOtherByName(ctx.ModuleName(), android.InstallPathToOnDevicePath(ctx, installPath), dexpreopt.GetGlobalConfig(ctx)) + return dexpreopt.OdexOnSystemOtherByName(ctx.ModuleName(), android.InstallPathToOnDevicePath(ctx, installPath), dexpreoptGlobalConfig(ctx)) } func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.ModuleOutPath) android.ModuleOutPath { @@ -105,7 +105,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo } globalSoong := dexpreopt.GetGlobalSoongConfig(ctx) - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) bootImage := defaultBootImageConfig(ctx) if global.UseApexImage { bootImage = frameworkJZBootImageConfig(ctx) diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 0082d038a..a497b08fc 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -162,7 +162,7 @@ func dexpreoptBootJarsFactory() android.Singleton { } func skipDexpreoptBootJars(ctx android.PathContext) bool { - if dexpreopt.GetGlobalConfig(ctx).DisablePreopt { + if dexpreoptGlobalConfig(ctx).DisablePreopt { return true } @@ -195,7 +195,7 @@ func DexpreoptedArtApexJars(ctx android.BuilderContext) map[android.ArchType]and files := artBootImageConfig(ctx).imagesDeps // For JIT-zygote config, also include dexpreopt files for the primary JIT-zygote image. - if dexpreopt.GetGlobalConfig(ctx).UseApexImage { + if dexpreoptGlobalConfig(ctx).UseApexImage { for arch, paths := range artJZBootImageConfig(ctx).imagesDeps { files[arch] = append(files[arch], paths...) } @@ -213,7 +213,7 @@ func (d *dexpreoptBootJars) GenerateBuildActions(ctx android.SingletonContext) { d.dexpreoptConfigForMake = android.PathForOutput(ctx, ctx.Config().DeviceName(), "dexpreopt.config") writeGlobalConfigForMake(ctx, d.dexpreoptConfigForMake) - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) // Skip recompiling the boot image for the second sanitization phase. We'll get separate paths // and invalidate first-stage artifacts which are crucial to SANITIZE_LITE builds. @@ -305,7 +305,7 @@ func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage, arch android.ArchType, profile android.Path, missingDeps []string) android.WritablePaths { globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) symbolsDir := image.symbolsDir.Join(ctx, image.installSubdir, arch.String()) symbolsFile := symbolsDir.Join(ctx, image.stem+".oat") @@ -444,7 +444,7 @@ Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verifier" to see func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath { globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) if global.DisableGenerateProfile || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() { return nil @@ -499,7 +499,7 @@ var bootImageProfileRuleKey = android.NewOnceKey("bootImageProfileRule") func bootFrameworkProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath { globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) if global.DisableGenerateProfile || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() { return nil @@ -587,7 +587,7 @@ func dumpOatRules(ctx android.SingletonContext, image *bootImage) { } func writeGlobalConfigForMake(ctx android.SingletonContext, path android.WritablePath) { - data := dexpreopt.GetGlobalConfigRawData(ctx) + data := dexpreoptGlobalConfigRaw(ctx).data ctx.Build(pctx, android.BuildParams{ Rule: android.WriteFile, diff --git a/java/dexpreopt_bootjars_test.go b/java/dexpreopt_bootjars_test.go index c3b2133a9..4ce30f678 100644 --- a/java/dexpreopt_bootjars_test.go +++ b/java/dexpreopt_bootjars_test.go @@ -49,7 +49,7 @@ func TestDexpreoptBootJars(t *testing.T) { pathCtx := android.PathContextForTesting(config) dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx) dexpreoptConfig.BootJars = []string{"foo", "bar", "baz"} - dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig) + setDexpreoptTestGlobalConfig(config, dexpreoptConfig) ctx := testContext() diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index a1a9a764c..f776b459f 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -22,12 +22,56 @@ import ( "android/soong/dexpreopt" ) +// dexpreoptGlobalConfig returns the global dexpreopt.config. It is loaded once the first time it is called for any +// ctx.Config(), and returns the same data for all future calls with the same ctx.Config(). A value can be inserted +// for tests using setDexpreoptTestGlobalConfig. +func dexpreoptGlobalConfig(ctx android.PathContext) dexpreopt.GlobalConfig { + return dexpreoptGlobalConfigRaw(ctx).global +} + +type globalConfigAndRaw struct { + global dexpreopt.GlobalConfig + data []byte +} + +func dexpreoptGlobalConfigRaw(ctx android.PathContext) globalConfigAndRaw { + return ctx.Config().Once(dexpreoptGlobalConfigKey, func() interface{} { + if data, err := ctx.Config().DexpreoptGlobalConfig(ctx); err != nil { + panic(err) + } else if data != nil { + globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, data) + if err != nil { + panic(err) + } + return globalConfigAndRaw{globalConfig, data} + } + + // No global config filename set, see if there is a test config set + return ctx.Config().Once(dexpreoptTestGlobalConfigKey, func() interface{} { + // Nope, return a config with preopting disabled + return globalConfigAndRaw{dexpreopt.GlobalConfig{ + DisablePreopt: true, + DisableGenerateProfile: true, + }, nil} + }) + }).(globalConfigAndRaw) +} + +// setDexpreoptTestGlobalConfig sets a GlobalConfig that future calls to dexpreoptGlobalConfig will return. It must +// be called before the first call to dexpreoptGlobalConfig for the config. +func setDexpreoptTestGlobalConfig(config android.Config, globalConfig dexpreopt.GlobalConfig) { + config.Once(dexpreoptTestGlobalConfigKey, func() interface{} { return globalConfigAndRaw{globalConfig, nil} }) +} + +var dexpreoptGlobalConfigKey = android.NewOnceKey("DexpreoptGlobalConfig") +var dexpreoptTestGlobalConfigKey = android.NewOnceKey("TestDexpreoptGlobalConfig") + // systemServerClasspath returns the on-device locations of the modules in the system server classpath. It is computed // once the first time it is called for any ctx.Config(), and returns the same slice for all future calls with the same // ctx.Config(). func systemServerClasspath(ctx android.PathContext) []string { return ctx.Config().OnceStringSlice(systemServerClasspathKey, func() []string { - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) var systemServerClasspathLocations []string for _, m := range global.SystemServerJars { @@ -88,7 +132,7 @@ var ( func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { return ctx.Config().Once(bootImageConfigKey, func() interface{} { - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) targets := dexpreoptTargets(ctx) deviceDir := android.PathForOutput(ctx, ctx.Config().DeviceName()) @@ -229,7 +273,7 @@ func frameworkJZBootImageConfig(ctx android.PathContext) bootImageConfig { func defaultBootclasspath(ctx android.PathContext) []string { return ctx.Config().OnceStringSlice(defaultBootclasspathKey, func() []string { - global := dexpreopt.GetGlobalConfig(ctx) + global := dexpreoptGlobalConfig(ctx) image := defaultBootImageConfig(ctx) updatableBootclasspath := make([]string, len(global.UpdatableBootJars)) diff --git a/java/java_test.go b/java/java_test.go index f047486e6..b4795c065 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -99,7 +99,7 @@ func run(t *testing.T, ctx *android.TestContext, config android.Config) { t.Helper() pathCtx := android.PathContextForTesting(config) - dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) + setDexpreoptTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) ctx.Register(config) _, errs := ctx.ParseBlueprintsFiles("Android.bp") @@ -118,7 +118,7 @@ func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config ctx := testContext() pathCtx := android.PathContextForTesting(config) - dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) + setDexpreoptTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) ctx.Register(config) _, errs := ctx.ParseBlueprintsFiles("Android.bp") -- cgit v1.2.3-59-g8ed1b From e4b5342d43d544871257c0422d52cdcad323eb5e Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Sat, 25 Jan 2020 01:44:30 +0000 Subject: Revert "Separate dexpreopt.GlobalSoongConfig to allow independen..." Revert submission 1211982-dex2oat-soong-dep Reason for revert: Build failures. See b/148312086. Reverted Changes: Ibc427a9a8: Make dex2oat(d) visible for use as implicit dexpre... I71df11c1e: Move the Once cache for dexpreopt.GlobalConfig int... I38317f2d5: Get the dex2oat host tool path from module depende... I440a09dba: Separate dexpreopt.GlobalSoongConfig to allow inde... Bug: 148312086 Bug: 145934348 Exempt-From-Owner-Approval: Plain revert Change-Id: Ice3990225635a737e49e9aed7373f06516fccea3 --- dexpreopt/config.go | 65 ++++++++++---------------------- dexpreopt/dexpreopt.go | 35 +++++++++-------- dexpreopt/dexpreopt_gen/dexpreopt_gen.go | 18 ++++----- dexpreopt/dexpreopt_test.go | 24 ++++-------- java/dexpreopt.go | 3 +- java/dexpreopt_bootjars.go | 9 ++--- java/dexpreopt_config.go | 3 +- java/java_test.go | 8 +--- 8 files changed, 61 insertions(+), 104 deletions(-) (limited to 'java/java_test.go') diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 63d55df7f..2a929c536 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -22,7 +22,8 @@ import ( ) // GlobalConfig stores the configuration for dex preopting. The fields are set -// from product variables via dex_preopt_config.mk. +// from product variables via dex_preopt_config.mk, except for SoongConfig +// which come from CreateGlobalSoongConfig. type GlobalConfig struct { DisablePreopt bool // disable preopt for all modules DisablePreoptModules []string // modules with preopt disabled by product-specific config @@ -81,6 +82,8 @@ type GlobalConfig struct { BootFlags string // extra flags to pass to dex2oat for the boot image Dex2oatImageXmx string // max heap size for dex2oat for the boot image Dex2oatImageXms string // initial heap size for dex2oat for the boot image + + SoongConfig GlobalSoongConfig // settings read from dexpreopt_soong.config } // GlobalSoongConfig contains the global config that is generated from Soong, @@ -177,9 +180,11 @@ func constructWritablePath(ctx android.PathContext, path string) android.Writabl } // LoadGlobalConfig reads the global dexpreopt.config file into a GlobalConfig -// struct. LoadGlobalConfig is used directly in Soong and in dexpreopt_gen -// called from Make to read the $OUT/dexpreopt.config written by Make. -func LoadGlobalConfig(ctx android.PathContext, data []byte) (GlobalConfig, error) { +// struct, except the SoongConfig field which is set from the provided +// soongConfig argument. LoadGlobalConfig is used directly in Soong and in +// dexpreopt_gen called from Make to read the $OUT/dexpreopt.config written by +// Make. +func LoadGlobalConfig(ctx android.PathContext, data []byte, soongConfig GlobalSoongConfig) (GlobalConfig, error) { type GlobalJSONConfig struct { GlobalConfig @@ -199,6 +204,10 @@ func LoadGlobalConfig(ctx android.PathContext, data []byte) (GlobalConfig, error config.GlobalConfig.DirtyImageObjects = android.OptionalPathForPath(constructPath(ctx, config.DirtyImageObjects)) config.GlobalConfig.BootImageProfiles = constructPaths(ctx, config.BootImageProfiles) + // Set this here to force the caller to provide a value for this struct (from + // either CreateGlobalSoongConfig or LoadGlobalSoongConfig). + config.GlobalConfig.SoongConfig = soongConfig + return config.GlobalConfig, nil } @@ -244,16 +253,9 @@ func LoadModuleConfig(ctx android.PathContext, data []byte) (ModuleConfig, error return config.ModuleConfig, nil } -// createGlobalSoongConfig creates a GlobalSoongConfig from the current context. +// CreateGlobalSoongConfig creates a GlobalSoongConfig from the current context. // Should not be used in dexpreopt_gen. -func createGlobalSoongConfig(ctx android.ModuleContext) GlobalSoongConfig { - if ctx.Config().TestProductVariables != nil { - // If we're called in a test there'll be a confusing error from the path - // functions below that gets reported without a stack trace, so let's panic - // properly with a more helpful message. - panic("This should not be called from tests. Please call GlobalSoongConfigForTests somewhere in the test setup.") - } - +func CreateGlobalSoongConfig(ctx android.PathContext) GlobalSoongConfig { // Default to debug version to help find bugs. // Set USE_DEX2OAT_DEBUG to false for only building non-debug versions. var dex2oatBinary string @@ -274,26 +276,6 @@ func createGlobalSoongConfig(ctx android.ModuleContext) GlobalSoongConfig { } } -var globalSoongConfigOnceKey = android.NewOnceKey("DexpreoptGlobalSoongConfig") - -// GetGlobalSoongConfig creates a GlobalSoongConfig the first time it's called, -// and later returns the same cached instance. -func GetGlobalSoongConfig(ctx android.ModuleContext) GlobalSoongConfig { - globalSoong := ctx.Config().Once(globalSoongConfigOnceKey, func() interface{} { - return createGlobalSoongConfig(ctx) - }).(GlobalSoongConfig) - return globalSoong -} - -// GetCachedGlobalSoongConfig returns a cached GlobalSoongConfig created by an -// earlier GetGlobalSoongConfig call. This function works with any context -// compatible with a basic PathContext, since it doesn't try to create a -// GlobalSoongConfig (which requires a full ModuleContext). It will panic if -// called before the first GetGlobalSoongConfig call. -func GetCachedGlobalSoongConfig(ctx android.PathContext) GlobalSoongConfig { - return ctx.Config().Get(globalSoongConfigOnceKey).(GlobalSoongConfig) -} - type globalJsonSoongConfig struct { Profman string Dex2oat string @@ -328,7 +310,7 @@ func LoadGlobalSoongConfig(ctx android.PathContext, data []byte) (GlobalSoongCon } func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonContext) { - config := GetCachedGlobalSoongConfig(ctx) + config := CreateGlobalSoongConfig(ctx) jc := globalJsonSoongConfig{ Profman: config.Profman.String(), Dex2oat: config.Dex2oat.String(), @@ -355,7 +337,7 @@ func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonC } func (s *globalSoongConfigSingleton) MakeVars(ctx android.MakeVarsContext) { - config := GetCachedGlobalSoongConfig(ctx) + config := CreateGlobalSoongConfig(ctx) ctx.Strict("DEX2OAT", config.Dex2oat.String()) ctx.Strict("DEXPREOPT_GEN_DEPS", strings.Join([]string{ @@ -408,14 +390,7 @@ func GlobalConfigForTests(ctx android.PathContext) GlobalConfig { BootFlags: "", Dex2oatImageXmx: "", Dex2oatImageXms: "", - } -} - -func GlobalSoongConfigForTests(config android.Config) GlobalSoongConfig { - // Install the test GlobalSoongConfig in the Once cache so that later calls to - // Get(Cached)GlobalSoongConfig returns it without trying to create a real one. - return config.Once(globalSoongConfigOnceKey, func() interface{} { - return GlobalSoongConfig{ + SoongConfig: GlobalSoongConfig{ Profman: android.PathForTesting("profman"), Dex2oat: android.PathForTesting("dex2oat"), Aapt: android.PathForTesting("aapt"), @@ -423,6 +398,6 @@ func GlobalSoongConfigForTests(config android.Config) GlobalSoongConfig { Zip2zip: android.PathForTesting("zip2zip"), ManifestCheck: android.PathForTesting("manifest_check"), ConstructContext: android.PathForTesting("construct_context.sh"), - } - }).(GlobalSoongConfig) + }, + } } diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index a69498a29..ac5b691c1 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -49,7 +49,7 @@ const SystemOtherPartition = "/system_other/" // GenerateDexpreoptRule generates a set of commands that will preopt a module based on a GlobalConfig and a // ModuleConfig. The produced files and their install locations will be available through rule.Installs(). -func GenerateDexpreoptRule(ctx android.PathContext, globalSoong GlobalSoongConfig, +func GenerateDexpreoptRule(ctx android.PathContext, global GlobalConfig, module ModuleConfig) (rule *android.RuleBuilder, err error) { defer func() { @@ -72,10 +72,10 @@ func GenerateDexpreoptRule(ctx android.PathContext, globalSoong GlobalSoongConfi var profile android.WritablePath if generateProfile { - profile = profileCommand(ctx, globalSoong, global, module, rule) + profile = profileCommand(ctx, global, module, rule) } if generateBootProfile { - bootProfileCommand(ctx, globalSoong, global, module, rule) + bootProfileCommand(ctx, global, module, rule) } if !dexpreoptDisabled(global, module) { @@ -87,7 +87,7 @@ func GenerateDexpreoptRule(ctx android.PathContext, globalSoong GlobalSoongConfi generateDM := shouldGenerateDM(module, global) for archIdx, _ := range module.Archs { - dexpreoptCommand(ctx, globalSoong, global, module, rule, archIdx, profile, appImage, generateDM) + dexpreoptCommand(ctx, global, module, rule, archIdx, profile, appImage, generateDM) } } } @@ -119,8 +119,8 @@ func dexpreoptDisabled(global GlobalConfig, module ModuleConfig) bool { return false } -func profileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, global GlobalConfig, - module ModuleConfig, rule *android.RuleBuilder) android.WritablePath { +func profileCommand(ctx android.PathContext, global GlobalConfig, module ModuleConfig, + rule *android.RuleBuilder) android.WritablePath { profilePath := module.BuildPath.InSameDir(ctx, "profile.prof") profileInstalledPath := module.DexLocation + ".prof" @@ -131,7 +131,7 @@ func profileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, glob cmd := rule.Command(). Text(`ANDROID_LOG_TAGS="*:e"`). - Tool(globalSoong.Profman) + Tool(global.SoongConfig.Profman) if module.ProfileIsTextListing { // The profile is a test listing of classes (used for framework jars). @@ -158,8 +158,8 @@ func profileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, glob return profilePath } -func bootProfileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, global GlobalConfig, - module ModuleConfig, rule *android.RuleBuilder) android.WritablePath { +func bootProfileCommand(ctx android.PathContext, global GlobalConfig, module ModuleConfig, + rule *android.RuleBuilder) android.WritablePath { profilePath := module.BuildPath.InSameDir(ctx, "profile.bprof") profileInstalledPath := module.DexLocation + ".bprof" @@ -170,7 +170,7 @@ func bootProfileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, cmd := rule.Command(). Text(`ANDROID_LOG_TAGS="*:e"`). - Tool(globalSoong.Profman) + Tool(global.SoongConfig.Profman) // The profile is a test listing of methods. // We need to generate the actual binary profile. @@ -190,9 +190,8 @@ func bootProfileCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, return profilePath } -func dexpreoptCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, global GlobalConfig, - module ModuleConfig, rule *android.RuleBuilder, archIdx int, profile android.WritablePath, - appImage bool, generateDM bool) { +func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module ModuleConfig, rule *android.RuleBuilder, + archIdx int, profile android.WritablePath, appImage bool, generateDM bool) { arch := module.Archs[archIdx] @@ -300,14 +299,14 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, gl if module.EnforceUsesLibraries { if module.ManifestPath != nil { rule.Command().Text(`target_sdk_version="$(`). - Tool(globalSoong.ManifestCheck). + Tool(global.SoongConfig.ManifestCheck). Flag("--extract-target-sdk-version"). Input(module.ManifestPath). Text(`)"`) } else { // No manifest to extract targetSdkVersion from, hope that DexJar is an APK rule.Command().Text(`target_sdk_version="$(`). - Tool(globalSoong.Aapt). + Tool(global.SoongConfig.Aapt). Flag("dump badging"). Input(module.DexPath). Text(`| grep "targetSdkVersion" | sed -n "s/targetSdkVersion:'\(.*\)'/\1/p"`). @@ -328,7 +327,7 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, gl Implicits(conditionalClassLoaderContextHost29) rule.Command().Textf(`conditional_target_libs_29="%s"`, strings.Join(conditionalClassLoaderContextTarget29, " ")) - rule.Command().Text("source").Tool(globalSoong.ConstructContext).Input(module.DexPath) + rule.Command().Text("source").Tool(global.SoongConfig.ConstructContext).Input(module.DexPath) } // Devices that do not have a product partition use a symlink from /product to /system/product. @@ -341,7 +340,7 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, gl cmd := rule.Command(). Text(`ANDROID_LOG_TAGS="*:e"`). - Tool(globalSoong.Dex2oat). + Tool(global.SoongConfig.Dex2oat). Flag("--avoid-storing-invocation"). FlagWithOutput("--write-invocation-to=", invocationPath).ImplicitOutput(invocationPath). Flag("--runtime-arg").FlagWithArg("-Xms", global.Dex2oatXms). @@ -410,7 +409,7 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong GlobalSoongConfig, gl dmInstalledPath := pathtools.ReplaceExtension(module.DexLocation, "dm") tmpPath := module.BuildPath.InSameDir(ctx, "primary.vdex") rule.Command().Text("cp -f").Input(vdexPath).Output(tmpPath) - rule.Command().Tool(globalSoong.SoongZip). + rule.Command().Tool(global.SoongConfig.SoongZip). FlagWithArg("-L", "9"). FlagWithOutput("-o", dmPath). Flag("-j"). diff --git a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go index 708bb9b23..e2818bb61 100644 --- a/dexpreopt/dexpreopt_gen/dexpreopt_gen.go +++ b/dexpreopt/dexpreopt_gen/dexpreopt_gen.go @@ -80,13 +80,13 @@ func main() { globalSoongConfigData, err := ioutil.ReadFile(*globalSoongConfigPath) if err != nil { - fmt.Fprintf(os.Stderr, "error reading global Soong config %q: %s\n", *globalSoongConfigPath, err) + fmt.Fprintf(os.Stderr, "error reading global config %q: %s\n", *globalSoongConfigPath, err) os.Exit(2) } globalSoongConfig, err := dexpreopt.LoadGlobalSoongConfig(ctx, globalSoongConfigData) if err != nil { - fmt.Fprintf(os.Stderr, "error loading global Soong config %q: %s\n", *globalSoongConfigPath, err) + fmt.Fprintf(os.Stderr, "error loading global config %q: %s\n", *globalSoongConfigPath, err) os.Exit(2) } @@ -96,9 +96,9 @@ func main() { os.Exit(2) } - globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, globalConfigData) + globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, globalConfigData, globalSoongConfig) if err != nil { - fmt.Fprintf(os.Stderr, "error loading global config %q: %s\n", *globalConfigPath, err) + fmt.Fprintf(os.Stderr, "error parse global config %q: %s\n", *globalConfigPath, err) os.Exit(2) } @@ -130,12 +130,12 @@ func main() { } }() - writeScripts(ctx, globalSoongConfig, globalConfig, moduleConfig, *dexpreoptScriptPath) + writeScripts(ctx, globalConfig, moduleConfig, *dexpreoptScriptPath) } -func writeScripts(ctx android.PathContext, globalSoong dexpreopt.GlobalSoongConfig, - global dexpreopt.GlobalConfig, module dexpreopt.ModuleConfig, dexpreoptScriptPath string) { - dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(ctx, globalSoong, global, module) +func writeScripts(ctx android.PathContext, global dexpreopt.GlobalConfig, module dexpreopt.ModuleConfig, + dexpreoptScriptPath string) { + dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(ctx, global, module) if err != nil { panic(err) } @@ -150,7 +150,7 @@ func writeScripts(ctx android.PathContext, globalSoong dexpreopt.GlobalSoongConf dexpreoptRule.Command().Text("mkdir -p").Flag(filepath.Dir(installPath.String())) dexpreoptRule.Command().Text("cp -f").Input(install.From).Output(installPath) } - dexpreoptRule.Command().Tool(globalSoong.SoongZip). + dexpreoptRule.Command().Tool(global.SoongConfig.SoongZip). FlagWithArg("-o ", "$2"). FlagWithArg("-C ", installDir.String()). FlagWithArg("-D ", installDir.String()) diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go index 44bbbc247..a128dc009 100644 --- a/dexpreopt/dexpreopt_test.go +++ b/dexpreopt/dexpreopt_test.go @@ -61,13 +61,10 @@ func testModuleConfig(ctx android.PathContext, name, partition string) ModuleCon } func TestDexPreopt(t *testing.T) { - config := android.TestConfig("out", nil, "", nil) - ctx := android.PathContextForTesting(config) - globalSoong := GlobalSoongConfigForTests(config) - global := GlobalConfigForTests(ctx) - module := testSystemModuleConfig(ctx, "test") + ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil)) + global, module := GlobalConfigForTests(ctx), testSystemModuleConfig(ctx, "test") - rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module) + rule, err := GenerateDexpreoptRule(ctx, global, module) if err != nil { t.Fatal(err) } @@ -83,9 +80,7 @@ func TestDexPreopt(t *testing.T) { } func TestDexPreoptSystemOther(t *testing.T) { - config := android.TestConfig("out", nil, "", nil) - ctx := android.PathContextForTesting(config) - globalSoong := GlobalSoongConfigForTests(config) + ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil)) global := GlobalConfigForTests(ctx) systemModule := testSystemModuleConfig(ctx, "Stest") systemProductModule := testSystemProductModuleConfig(ctx, "SPtest") @@ -123,7 +118,7 @@ func TestDexPreoptSystemOther(t *testing.T) { for _, test := range tests { global.PatternsOnSystemOther = test.patterns for _, mt := range test.moduleTests { - rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, mt.module) + rule, err := GenerateDexpreoptRule(ctx, global, mt.module) if err != nil { t.Fatal(err) } @@ -143,15 +138,12 @@ func TestDexPreoptSystemOther(t *testing.T) { } func TestDexPreoptProfile(t *testing.T) { - config := android.TestConfig("out", nil, "", nil) - ctx := android.PathContextForTesting(config) - globalSoong := GlobalSoongConfigForTests(config) - global := GlobalConfigForTests(ctx) - module := testSystemModuleConfig(ctx, "test") + ctx := android.PathContextForTesting(android.TestConfig("out", nil, "", nil)) + global, module := GlobalConfigForTests(ctx), testSystemModuleConfig(ctx, "test") module.ProfileClassListing = android.OptionalPathForPath(android.PathForTesting("profile")) - rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module) + rule, err := GenerateDexpreoptRule(ctx, global, module) if err != nil { t.Fatal(err) } diff --git a/java/dexpreopt.go b/java/dexpreopt.go index 0734b3fce..da6866031 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -104,7 +104,6 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo return dexJarFile } - globalSoong := dexpreopt.GetGlobalSoongConfig(ctx) global := dexpreoptGlobalConfig(ctx) bootImage := defaultBootImageConfig(ctx) if global.UseApexImage { @@ -190,7 +189,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo PresignedPrebuilt: d.isPresignedPrebuilt, } - dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(ctx, globalSoong, global, dexpreoptConfig) + dexpreoptRule, err := dexpreopt.GenerateDexpreoptRule(ctx, global, dexpreoptConfig) if err != nil { ctx.ModuleErrorf("error generating dexpreopt rule: %s", err.Error()) return dexJarFile diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index a497b08fc..c6aa7fe0d 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -304,7 +304,6 @@ func buildBootImage(ctx android.SingletonContext, config bootImageConfig) *bootI func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage, arch android.ArchType, profile android.Path, missingDeps []string) android.WritablePaths { - globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) global := dexpreoptGlobalConfig(ctx) symbolsDir := image.symbolsDir.Join(ctx, image.installSubdir, arch.String()) @@ -340,7 +339,7 @@ func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage, invocationPath := outputPath.ReplaceExtension(ctx, "invocation") - cmd.Tool(globalSoong.Dex2oat). + cmd.Tool(global.SoongConfig.Dex2oat). Flag("--avoid-storing-invocation"). FlagWithOutput("--write-invocation-to=", invocationPath).ImplicitOutput(invocationPath). Flag("--runtime-arg").FlagWithArg("-Xms", global.Dex2oatImageXms). @@ -443,7 +442,6 @@ It is likely that the boot classpath is inconsistent. Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verifier" to see verification errors.` func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath { - globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) global := dexpreoptGlobalConfig(ctx) if global.DisableGenerateProfile || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() { @@ -475,7 +473,7 @@ func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missin rule.Command(). Text(`ANDROID_LOG_TAGS="*:e"`). - Tool(globalSoong.Profman). + Tool(global.SoongConfig.Profman). FlagWithInput("--create-profile-from=", bootImageProfile). FlagForEachInput("--apk=", image.dexPathsDeps.Paths()). FlagForEachArg("--dex-location=", image.dexLocationsDeps). @@ -498,7 +496,6 @@ func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missin var bootImageProfileRuleKey = android.NewOnceKey("bootImageProfileRule") func bootFrameworkProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath { - globalSoong := dexpreopt.GetCachedGlobalSoongConfig(ctx) global := dexpreoptGlobalConfig(ctx) if global.DisableGenerateProfile || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() { @@ -525,7 +522,7 @@ func bootFrameworkProfileRule(ctx android.SingletonContext, image *bootImage, mi rule.Command(). Text(`ANDROID_LOG_TAGS="*:e"`). - Tool(globalSoong.Profman). + Tool(global.SoongConfig.Profman). Flag("--generate-boot-profile"). FlagWithInput("--create-profile-from=", bootFrameworkProfile). FlagForEachInput("--apk=", image.dexPathsDeps.Paths()). diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index f776b459f..31bec93eb 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -39,7 +39,8 @@ func dexpreoptGlobalConfigRaw(ctx android.PathContext) globalConfigAndRaw { if data, err := ctx.Config().DexpreoptGlobalConfig(ctx); err != nil { panic(err) } else if data != nil { - globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, data) + soongConfig := dexpreopt.CreateGlobalSoongConfig(ctx) + globalConfig, err := dexpreopt.LoadGlobalConfig(ctx, data, soongConfig) if err != nil { panic(err) } diff --git a/java/java_test.go b/java/java_test.go index b4795c065..a2788cb8e 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -57,13 +57,7 @@ func TestMain(m *testing.M) { } func testConfig(env map[string]string, bp string, fs map[string][]byte) android.Config { - config := TestConfig(buildDir, env, bp, fs) - - // Set up the global Once cache used for dexpreopt.GlobalSoongConfig, so that - // it doesn't create a real one, which would fail. - _ = dexpreopt.GlobalSoongConfigForTests(config) - - return config + return TestConfig(buildDir, env, bp, fs) } func testContext() *android.TestContext { -- cgit v1.2.3-59-g8ed1b