Loading apex/dexpreopt_bootjars_test.go +2 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) { "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof", "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof", "out/soong/dexpreopt/uffd_gc_flag.txt", } expectedOutputs := []string{ Loading Loading @@ -201,6 +202,7 @@ func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) { "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", "out/soong/.intermediates/prebuilt_com.android.art.deapexer/android_common/deapexer/etc/boot-image.prof", "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof", "out/soong/dexpreopt/uffd_gc_flag.txt", } expectedOutputs := []string{ Loading dexpreopt/config.go +51 −4 Original line number Diff line number Diff line Loading @@ -98,7 +98,9 @@ type GlobalConfig struct { // measure, as it masks real errors and affects performance. RelaxUsesLibraryCheck bool EnableUffdGc bool // preopt with the assumption that userfaultfd GC will be used on device. // "true" to force preopt with CMC GC (a.k.a., UFFD GC); "false" to force preopt with CC GC; // "default" to determine the GC type based on the kernel version file. EnableUffdGc string } var allPlatformSystemServerJarsKey = android.NewOnceKey("allPlatformSystemServerJars") Loading Loading @@ -154,6 +156,7 @@ type GlobalSoongConfig struct { Zip2zip android.Path ManifestCheck android.Path ConstructContext android.Path UffdGcFlag android.WritablePath } type ModuleConfig struct { Loading Loading @@ -537,6 +540,7 @@ func createGlobalSoongConfig(ctx android.ModuleContext) *GlobalSoongConfig { Zip2zip: ctx.Config().HostToolPath(ctx, "zip2zip"), ManifestCheck: ctx.Config().HostToolPath(ctx, "manifest_check"), ConstructContext: ctx.Config().HostToolPath(ctx, "construct_context"), UffdGcFlag: getUffdGcFlagPath(ctx), } } Loading Loading @@ -588,6 +592,7 @@ type globalJsonSoongConfig struct { Zip2zip string ManifestCheck string ConstructContext string UffdGcFlag string } // ParseGlobalSoongConfig parses the given data assumed to be read from the Loading @@ -609,6 +614,7 @@ func ParseGlobalSoongConfig(ctx android.PathContext, data []byte) (*GlobalSoongC Zip2zip: constructPath(ctx, jc.Zip2zip), ManifestCheck: constructPath(ctx, jc.ManifestCheck), ConstructContext: constructPath(ctx, jc.ConstructContext), UffdGcFlag: constructWritablePath(ctx, jc.UffdGcFlag), } return config, nil Loading @@ -633,12 +639,15 @@ func checkBootJarsConfigConsistency(ctx android.SingletonContext, dexpreoptConfi } func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonContext) { checkBootJarsConfigConsistency(ctx, GetGlobalConfig(ctx), ctx.Config()) global := GetGlobalConfig(ctx) checkBootJarsConfigConsistency(ctx, global, ctx.Config()) if GetGlobalConfig(ctx).DisablePreopt { if global.DisablePreopt { return } buildUffdGcFlag(ctx, global) config := GetCachedGlobalSoongConfig(ctx) if config == nil { // No module has enabled dexpreopting, so we assume there will be no calls Loading @@ -654,6 +663,7 @@ func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonC Zip2zip: config.Zip2zip.String(), ManifestCheck: config.ManifestCheck.String(), ConstructContext: config.ConstructContext.String(), UffdGcFlag: config.UffdGcFlag.String(), } data, err := json.Marshal(jc) Loading Loading @@ -684,9 +694,32 @@ func (s *globalSoongConfigSingleton) MakeVars(ctx android.MakeVarsContext) { config.Zip2zip.String(), config.ManifestCheck.String(), config.ConstructContext.String(), config.UffdGcFlag.String(), }, " ")) } func buildUffdGcFlag(ctx android.BuilderContext, global *GlobalConfig) { uffdGcFlag := getUffdGcFlagPath(ctx) if global.EnableUffdGc == "true" { android.WriteFileRuleVerbatim(ctx, uffdGcFlag, "--runtime-arg -Xgc:CMC") } else if global.EnableUffdGc == "false" { android.WriteFileRuleVerbatim(ctx, uffdGcFlag, "") } else if global.EnableUffdGc == "default" { // Generated by `build/make/core/Makefile`. kernelVersionFile := android.PathForOutput(ctx, "dexpreopt/kernel_version_for_uffd_gc.txt") // Determine the UFFD GC flag by the kernel version file. rule := android.NewRuleBuilder(pctx, ctx) rule.Command(). Tool(ctx.Config().HostToolPath(ctx, "construct_uffd_gc_flag")). Input(kernelVersionFile). Output(uffdGcFlag) rule.Restat().Build("dexpreopt_uffd_gc_flag", "dexpreopt_uffd_gc_flag") } else { panic(fmt.Sprintf("Unknown value of PRODUCT_ENABLE_UFFD_GC: %s", global.EnableUffdGc)) } } func GlobalConfigForTests(ctx android.PathContext) *GlobalConfig { return &GlobalConfig{ DisablePreopt: false, Loading Loading @@ -731,7 +764,7 @@ func GlobalConfigForTests(ctx android.PathContext) *GlobalConfig { } } func globalSoongConfigForTests() *GlobalSoongConfig { func globalSoongConfigForTests(ctx android.BuilderContext) *GlobalSoongConfig { return &GlobalSoongConfig{ Profman: android.PathForTesting("profman"), Dex2oat: android.PathForTesting("dex2oat"), Loading @@ -740,5 +773,19 @@ func globalSoongConfigForTests() *GlobalSoongConfig { Zip2zip: android.PathForTesting("zip2zip"), ManifestCheck: android.PathForTesting("manifest_check"), ConstructContext: android.PathForTesting("construct_context"), UffdGcFlag: android.PathForOutput(ctx, "dexpreopt_test", "uffd_gc_flag.txt"), } } func GetDexpreoptDirName(ctx android.PathContext) string { prefix := "dexpreopt_" targets := ctx.Config().Targets[android.Android] if len(targets) > 0 { return prefix + targets[0].Arch.ArchType.String() } return prefix + "unknown_target" } func getUffdGcFlagPath(ctx android.PathContext) android.WritablePath { return android.PathForOutput(ctx, "dexpreopt/uffd_gc_flag.txt") } dexpreopt/dexpreopt.go +2 −5 Original line number Diff line number Diff line Loading @@ -390,7 +390,8 @@ func dexpreoptCommand(ctx android.BuilderContext, globalSoong *GlobalSoongConfig Flag("--generate-build-id"). Flag("--abort-on-hard-verifier-error"). Flag("--force-determinism"). FlagWithArg("--no-inline-from=", "core-oj.jar") FlagWithArg("--no-inline-from=", "core-oj.jar"). Text("$(cat").Input(globalSoong.UffdGcFlag).Text(")") var preoptFlags []string if len(module.PreoptFlags) > 0 { Loading Loading @@ -506,10 +507,6 @@ func dexpreoptCommand(ctx android.BuilderContext, globalSoong *GlobalSoongConfig cmd.FlagWithInput("--profile-file=", profile) } if global.EnableUffdGc { cmd.Flag("--runtime-arg").Flag("-Xgc:CMC") } rule.Install(odexPath, odexInstallPath) rule.Install(vdexPath, vdexInstallPath) } Loading dexpreopt/dexpreopt_test.go +62 −7 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ func createTestModuleConfig(name, dexLocation string, buildPath, dexPath, enforc func TestDexPreopt(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemModuleConfig(ctx, "test") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -114,12 +114,15 @@ func TestDexPreopt(t *testing.T) { if rule.Installs().String() != wantInstalls.String() { t.Errorf("\nwant installs:\n %v\ngot:\n %v", wantInstalls, rule.Installs()) } android.AssertStringListContains(t, "", rule.Inputs().RelativeToTop().Strings(), "out/soong/dexpreopt_test/uffd_gc_flag.txt") } func TestDexPreoptSystemOther(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) systemModule := testSystemModuleConfig(ctx, "Stest") systemProductModule := testSystemProductModuleConfig(ctx, "SPtest") Loading Loading @@ -180,7 +183,7 @@ func TestDexPreoptSystemOther(t *testing.T) { func TestDexPreoptApexSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -204,7 +207,7 @@ func TestDexPreoptApexSystemServerJars(t *testing.T) { func TestDexPreoptStandaloneSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testPlatformSystemServerModuleConfig(ctx, "service-A") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -228,7 +231,7 @@ func TestDexPreoptStandaloneSystemServerJars(t *testing.T) { func TestDexPreoptSystemExtSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemExtSystemServerModuleConfig(ctx, "service-A") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -252,7 +255,7 @@ func TestDexPreoptSystemExtSystemServerJars(t *testing.T) { func TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -276,7 +279,7 @@ func TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) { func TestDexPreoptProfile(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemModuleConfig(ctx, "test") productPackages := android.PathForTesting("product_packages.txt") Loading Loading @@ -316,3 +319,55 @@ func TestDexPreoptConfigToJson(t *testing.T) { after := fmt.Sprintf("%v", parsed) android.AssertStringEquals(t, "The result must be the same as the original after marshalling and unmarshalling it.", before, after) } func TestUffdGcFlagForce(t *testing.T) { for _, enableUffdGc := range []string{"true", "false"} { t.Run(enableUffdGc, func(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc(enableUffdGc), ) result := preparers.RunTest(t) ctx := result.TestContext ctx.SingletonForTests("dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt") }) } } func TestUffdGcFlagDefault(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc("default"), ) result := preparers.RunTest(t) ctx := result.TestContext config := ctx.Config() rule := ctx.SingletonForTests("dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag") android.AssertStringDoesContain(t, "", rule.RuleParams.Command, "construct_uffd_gc_flag") android.AssertStringPathsRelativeToTopEquals(t, "", config, []string{ "out/soong/dexpreopt/uffd_gc_flag.txt", }, rule.AllOutputs()) android.AssertPathsRelativeToTopEquals(t, "", []string{ "out/soong/dexpreopt/kernel_version_for_uffd_gc.txt", }, rule.Implicits) } func TestUffdGcFlagBogus(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc("bogus"), ) preparers. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( "Unknown value of PRODUCT_ENABLE_UFFD_GC: bogus")). RunTest(t) } dexpreopt/testing.go +16 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,15 @@ var PrepareForTestByEnablingDexpreopt = android.GroupFixturePreparers( FixtureModifyGlobalConfig(func(android.PathContext, *GlobalConfig) {}), ) var PrepareForTestWithDexpreoptConfig = android.GroupFixturePreparers( android.PrepareForTestWithAndroidBuildComponents, android.FixtureModifyContext(func(ctx *android.TestContext) { ctx.RegisterParallelSingletonType("dexpreopt-soong-config", func() android.Singleton { return &globalSoongConfigSingleton{} }) }), ) // FixtureModifyGlobalConfig enables dexpreopt (unless modified by the mutator) and modifies the // configuration. func FixtureModifyGlobalConfig(configModifier func(ctx android.PathContext, dexpreoptConfig *GlobalConfig)) android.FixturePreparer { Loading Loading @@ -195,3 +204,10 @@ func FixtureDisableDexpreopt(disable bool) android.FixturePreparer { dexpreoptConfig.DisablePreopt = disable }) } // FixtureSetEnableUffdGc sets the EnableUffdGc property in the global config. func FixtureSetEnableUffdGc(value string) android.FixturePreparer { return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { dexpreoptConfig.EnableUffdGc = value }) } Loading
apex/dexpreopt_bootjars_test.go +2 −0 Original line number Diff line number Diff line Loading @@ -164,6 +164,7 @@ func TestDexpreoptBootJarsWithSourceArtApex(t *testing.T) { "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", "out/soong/.intermediates/art-bootclasspath-fragment/android_common_apex10000/art-bootclasspath-fragment/boot.prof", "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof", "out/soong/dexpreopt/uffd_gc_flag.txt", } expectedOutputs := []string{ Loading Loading @@ -201,6 +202,7 @@ func TestDexpreoptBootJarsWithPrebuiltArtApex(t *testing.T) { "out/soong/dexpreopt_arm64/dex_bootjars_input/baz.jar", "out/soong/.intermediates/prebuilt_com.android.art.deapexer/android_common/deapexer/etc/boot-image.prof", "out/soong/.intermediates/default/java/dex_bootjars/android_common/boot/boot.prof", "out/soong/dexpreopt/uffd_gc_flag.txt", } expectedOutputs := []string{ Loading
dexpreopt/config.go +51 −4 Original line number Diff line number Diff line Loading @@ -98,7 +98,9 @@ type GlobalConfig struct { // measure, as it masks real errors and affects performance. RelaxUsesLibraryCheck bool EnableUffdGc bool // preopt with the assumption that userfaultfd GC will be used on device. // "true" to force preopt with CMC GC (a.k.a., UFFD GC); "false" to force preopt with CC GC; // "default" to determine the GC type based on the kernel version file. EnableUffdGc string } var allPlatformSystemServerJarsKey = android.NewOnceKey("allPlatformSystemServerJars") Loading Loading @@ -154,6 +156,7 @@ type GlobalSoongConfig struct { Zip2zip android.Path ManifestCheck android.Path ConstructContext android.Path UffdGcFlag android.WritablePath } type ModuleConfig struct { Loading Loading @@ -537,6 +540,7 @@ func createGlobalSoongConfig(ctx android.ModuleContext) *GlobalSoongConfig { Zip2zip: ctx.Config().HostToolPath(ctx, "zip2zip"), ManifestCheck: ctx.Config().HostToolPath(ctx, "manifest_check"), ConstructContext: ctx.Config().HostToolPath(ctx, "construct_context"), UffdGcFlag: getUffdGcFlagPath(ctx), } } Loading Loading @@ -588,6 +592,7 @@ type globalJsonSoongConfig struct { Zip2zip string ManifestCheck string ConstructContext string UffdGcFlag string } // ParseGlobalSoongConfig parses the given data assumed to be read from the Loading @@ -609,6 +614,7 @@ func ParseGlobalSoongConfig(ctx android.PathContext, data []byte) (*GlobalSoongC Zip2zip: constructPath(ctx, jc.Zip2zip), ManifestCheck: constructPath(ctx, jc.ManifestCheck), ConstructContext: constructPath(ctx, jc.ConstructContext), UffdGcFlag: constructWritablePath(ctx, jc.UffdGcFlag), } return config, nil Loading @@ -633,12 +639,15 @@ func checkBootJarsConfigConsistency(ctx android.SingletonContext, dexpreoptConfi } func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonContext) { checkBootJarsConfigConsistency(ctx, GetGlobalConfig(ctx), ctx.Config()) global := GetGlobalConfig(ctx) checkBootJarsConfigConsistency(ctx, global, ctx.Config()) if GetGlobalConfig(ctx).DisablePreopt { if global.DisablePreopt { return } buildUffdGcFlag(ctx, global) config := GetCachedGlobalSoongConfig(ctx) if config == nil { // No module has enabled dexpreopting, so we assume there will be no calls Loading @@ -654,6 +663,7 @@ func (s *globalSoongConfigSingleton) GenerateBuildActions(ctx android.SingletonC Zip2zip: config.Zip2zip.String(), ManifestCheck: config.ManifestCheck.String(), ConstructContext: config.ConstructContext.String(), UffdGcFlag: config.UffdGcFlag.String(), } data, err := json.Marshal(jc) Loading Loading @@ -684,9 +694,32 @@ func (s *globalSoongConfigSingleton) MakeVars(ctx android.MakeVarsContext) { config.Zip2zip.String(), config.ManifestCheck.String(), config.ConstructContext.String(), config.UffdGcFlag.String(), }, " ")) } func buildUffdGcFlag(ctx android.BuilderContext, global *GlobalConfig) { uffdGcFlag := getUffdGcFlagPath(ctx) if global.EnableUffdGc == "true" { android.WriteFileRuleVerbatim(ctx, uffdGcFlag, "--runtime-arg -Xgc:CMC") } else if global.EnableUffdGc == "false" { android.WriteFileRuleVerbatim(ctx, uffdGcFlag, "") } else if global.EnableUffdGc == "default" { // Generated by `build/make/core/Makefile`. kernelVersionFile := android.PathForOutput(ctx, "dexpreopt/kernel_version_for_uffd_gc.txt") // Determine the UFFD GC flag by the kernel version file. rule := android.NewRuleBuilder(pctx, ctx) rule.Command(). Tool(ctx.Config().HostToolPath(ctx, "construct_uffd_gc_flag")). Input(kernelVersionFile). Output(uffdGcFlag) rule.Restat().Build("dexpreopt_uffd_gc_flag", "dexpreopt_uffd_gc_flag") } else { panic(fmt.Sprintf("Unknown value of PRODUCT_ENABLE_UFFD_GC: %s", global.EnableUffdGc)) } } func GlobalConfigForTests(ctx android.PathContext) *GlobalConfig { return &GlobalConfig{ DisablePreopt: false, Loading Loading @@ -731,7 +764,7 @@ func GlobalConfigForTests(ctx android.PathContext) *GlobalConfig { } } func globalSoongConfigForTests() *GlobalSoongConfig { func globalSoongConfigForTests(ctx android.BuilderContext) *GlobalSoongConfig { return &GlobalSoongConfig{ Profman: android.PathForTesting("profman"), Dex2oat: android.PathForTesting("dex2oat"), Loading @@ -740,5 +773,19 @@ func globalSoongConfigForTests() *GlobalSoongConfig { Zip2zip: android.PathForTesting("zip2zip"), ManifestCheck: android.PathForTesting("manifest_check"), ConstructContext: android.PathForTesting("construct_context"), UffdGcFlag: android.PathForOutput(ctx, "dexpreopt_test", "uffd_gc_flag.txt"), } } func GetDexpreoptDirName(ctx android.PathContext) string { prefix := "dexpreopt_" targets := ctx.Config().Targets[android.Android] if len(targets) > 0 { return prefix + targets[0].Arch.ArchType.String() } return prefix + "unknown_target" } func getUffdGcFlagPath(ctx android.PathContext) android.WritablePath { return android.PathForOutput(ctx, "dexpreopt/uffd_gc_flag.txt") }
dexpreopt/dexpreopt.go +2 −5 Original line number Diff line number Diff line Loading @@ -390,7 +390,8 @@ func dexpreoptCommand(ctx android.BuilderContext, globalSoong *GlobalSoongConfig Flag("--generate-build-id"). Flag("--abort-on-hard-verifier-error"). Flag("--force-determinism"). FlagWithArg("--no-inline-from=", "core-oj.jar") FlagWithArg("--no-inline-from=", "core-oj.jar"). Text("$(cat").Input(globalSoong.UffdGcFlag).Text(")") var preoptFlags []string if len(module.PreoptFlags) > 0 { Loading Loading @@ -506,10 +507,6 @@ func dexpreoptCommand(ctx android.BuilderContext, globalSoong *GlobalSoongConfig cmd.FlagWithInput("--profile-file=", profile) } if global.EnableUffdGc { cmd.Flag("--runtime-arg").Flag("-Xgc:CMC") } rule.Install(odexPath, odexInstallPath) rule.Install(vdexPath, vdexInstallPath) } Loading
dexpreopt/dexpreopt_test.go +62 −7 Original line number Diff line number Diff line Loading @@ -96,7 +96,7 @@ func createTestModuleConfig(name, dexLocation string, buildPath, dexPath, enforc func TestDexPreopt(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemModuleConfig(ctx, "test") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -114,12 +114,15 @@ func TestDexPreopt(t *testing.T) { if rule.Installs().String() != wantInstalls.String() { t.Errorf("\nwant installs:\n %v\ngot:\n %v", wantInstalls, rule.Installs()) } android.AssertStringListContains(t, "", rule.Inputs().RelativeToTop().Strings(), "out/soong/dexpreopt_test/uffd_gc_flag.txt") } func TestDexPreoptSystemOther(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) systemModule := testSystemModuleConfig(ctx, "Stest") systemProductModule := testSystemProductModuleConfig(ctx, "SPtest") Loading Loading @@ -180,7 +183,7 @@ func TestDexPreoptSystemOther(t *testing.T) { func TestDexPreoptApexSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -204,7 +207,7 @@ func TestDexPreoptApexSystemServerJars(t *testing.T) { func TestDexPreoptStandaloneSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testPlatformSystemServerModuleConfig(ctx, "service-A") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -228,7 +231,7 @@ func TestDexPreoptStandaloneSystemServerJars(t *testing.T) { func TestDexPreoptSystemExtSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemExtSystemServerModuleConfig(ctx, "service-A") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -252,7 +255,7 @@ func TestDexPreoptSystemExtSystemServerJars(t *testing.T) { func TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") productPackages := android.PathForTesting("product_packages.txt") Loading @@ -276,7 +279,7 @@ func TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) { func TestDexPreoptProfile(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) globalSoong := globalSoongConfigForTests() globalSoong := globalSoongConfigForTests(ctx) global := GlobalConfigForTests(ctx) module := testSystemModuleConfig(ctx, "test") productPackages := android.PathForTesting("product_packages.txt") Loading Loading @@ -316,3 +319,55 @@ func TestDexPreoptConfigToJson(t *testing.T) { after := fmt.Sprintf("%v", parsed) android.AssertStringEquals(t, "The result must be the same as the original after marshalling and unmarshalling it.", before, after) } func TestUffdGcFlagForce(t *testing.T) { for _, enableUffdGc := range []string{"true", "false"} { t.Run(enableUffdGc, func(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc(enableUffdGc), ) result := preparers.RunTest(t) ctx := result.TestContext ctx.SingletonForTests("dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt") }) } } func TestUffdGcFlagDefault(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc("default"), ) result := preparers.RunTest(t) ctx := result.TestContext config := ctx.Config() rule := ctx.SingletonForTests("dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag") android.AssertStringDoesContain(t, "", rule.RuleParams.Command, "construct_uffd_gc_flag") android.AssertStringPathsRelativeToTopEquals(t, "", config, []string{ "out/soong/dexpreopt/uffd_gc_flag.txt", }, rule.AllOutputs()) android.AssertPathsRelativeToTopEquals(t, "", []string{ "out/soong/dexpreopt/kernel_version_for_uffd_gc.txt", }, rule.Implicits) } func TestUffdGcFlagBogus(t *testing.T) { preparers := android.GroupFixturePreparers( PrepareForTestWithFakeDex2oatd, PrepareForTestWithDexpreoptConfig, FixtureSetEnableUffdGc("bogus"), ) preparers. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( "Unknown value of PRODUCT_ENABLE_UFFD_GC: bogus")). RunTest(t) }
dexpreopt/testing.go +16 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,15 @@ var PrepareForTestByEnablingDexpreopt = android.GroupFixturePreparers( FixtureModifyGlobalConfig(func(android.PathContext, *GlobalConfig) {}), ) var PrepareForTestWithDexpreoptConfig = android.GroupFixturePreparers( android.PrepareForTestWithAndroidBuildComponents, android.FixtureModifyContext(func(ctx *android.TestContext) { ctx.RegisterParallelSingletonType("dexpreopt-soong-config", func() android.Singleton { return &globalSoongConfigSingleton{} }) }), ) // FixtureModifyGlobalConfig enables dexpreopt (unless modified by the mutator) and modifies the // configuration. func FixtureModifyGlobalConfig(configModifier func(ctx android.PathContext, dexpreoptConfig *GlobalConfig)) android.FixturePreparer { Loading Loading @@ -195,3 +204,10 @@ func FixtureDisableDexpreopt(disable bool) android.FixturePreparer { dexpreoptConfig.DisablePreopt = disable }) } // FixtureSetEnableUffdGc sets the EnableUffdGc property in the global config. func FixtureSetEnableUffdGc(value string) android.FixturePreparer { return FixtureModifyGlobalConfig(func(_ android.PathContext, dexpreoptConfig *GlobalConfig) { dexpreoptConfig.EnableUffdGc = value }) }