diff options
| author | Adrian Roos <roosa@google.com> | 2021-09-15 14:11:07 +0000 |
|---|---|---|
| committer | Adrian Roos <roosa@google.com> | 2021-09-15 14:11:07 +0000 |
| commit | 92346c483249726164f4bd140413d60391121763 (patch) | |
| tree | dbfcb43369c2e014c83676633aa4da9b6c8fb212 /dexpreopt | |
| parent | ca9bc98e0cfe9a519cfdd13450a68f1ed7ad5b02 (diff) | |
Revert "Preopt APEX system server jars."
This reverts commit ca9bc98e0cfe9a519cfdd13450a68f1ed7ad5b02.
Reason for revert: breaks build
Bug: 200024131
Change-Id: Ide07b4c4d267370ae31107b1598b2f878c701282
Diffstat (limited to 'dexpreopt')
| -rw-r--r-- | dexpreopt/dexpreopt.go | 54 | ||||
| -rw-r--r-- | dexpreopt/dexpreopt_test.go | 49 |
2 files changed, 25 insertions, 78 deletions
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index 7733c1b43..1401c75d9 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -110,12 +110,17 @@ func dexpreoptDisabled(ctx android.PathContext, global *GlobalConfig, module *Mo return true } + // Don't preopt system server jars that are updatable. + if global.ApexSystemServerJars.ContainsJar(module.Name) { + return true + } + // If OnlyPreoptBootImageAndSystemServer=true and module is not in boot class path skip // Also preopt system server jars since selinux prevents system server from loading anything from // /data. If we don't do this they will need to be extracted which is not favorable for RAM usage // or performance. If PreoptExtractedApk is true, we ignore the only preopt boot image options. if global.OnlyPreoptBootImageAndSystemServer && !global.BootJars.ContainsJar(module.Name) && - !AllSystemServerJars(ctx, global).ContainsJar(module.Name) && !module.PreoptExtractedApk { + !global.SystemServerJars.ContainsJar(module.Name) && !module.PreoptExtractedApk { return true } @@ -196,14 +201,6 @@ func bootProfileCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, return profilePath } -// Returns the dex location of a system server java library. -func GetSystemServerDexLocation(global *GlobalConfig, lib string) string { - if apex := global.ApexSystemServerJars.ApexOfJar(lib); apex != "" { - return fmt.Sprintf("/apex/%s/javalib/%s.jar", apex, lib) - } - return fmt.Sprintf("/system/framework/%s.jar", lib) -} - func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, global *GlobalConfig, module *ModuleConfig, rule *android.RuleBuilder, archIdx int, profile android.WritablePath, appImage bool, generateDM bool) { @@ -219,13 +216,6 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g } toOdexPath := func(path string) string { - if global.ApexSystemServerJars.ContainsJar(module.Name) { - return filepath.Join( - "/system/framework/oat", - arch.String(), - strings.ReplaceAll(path[1:], "/", "@")+"@classes.odex") - } - return filepath.Join( filepath.Dir(path), "oat", @@ -244,21 +234,20 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g invocationPath := odexPath.ReplaceExtension(ctx, "invocation") - systemServerJars := AllSystemServerJars(ctx, global) + systemServerJars := NonApexSystemServerJars(ctx, global) rule.Command().FlagWithArg("mkdir -p ", filepath.Dir(odexPath.String())) rule.Command().FlagWithOutput("rm -f ", odexPath) - if jarIndex := systemServerJars.IndexOfJar(module.Name); jarIndex >= 0 { + if jarIndex := android.IndexList(module.Name, systemServerJars); jarIndex >= 0 { // System server jars should be dexpreopted together: class loader context of each jar // should include all preceding jars on the system server classpath. var clcHost android.Paths var clcTarget []string - for i := 0; i < jarIndex; i++ { - lib := systemServerJars.Jar(i) + for _, lib := range systemServerJars[:jarIndex] { clcHost = append(clcHost, SystemServerDexJarHostPath(ctx, lib)) - clcTarget = append(clcTarget, GetSystemServerDexLocation(global, lib)) + clcTarget = append(clcTarget, filepath.Join("/system/framework", lib+".jar")) } // Copy the system server jar to a predefined location where dex2oat will find it. @@ -373,7 +362,7 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g if !android.PrefixInList(preoptFlags, "--compiler-filter=") { var compilerFilter string - if systemServerJars.ContainsJar(module.Name) { + if global.SystemServerJars.ContainsJar(module.Name) { // Jars of system server, use the product option if it is set, speed otherwise. if global.SystemServerCompilerFilter != "" { compilerFilter = global.SystemServerCompilerFilter @@ -427,7 +416,7 @@ func dexpreoptCommand(ctx android.PathContext, globalSoong *GlobalSoongConfig, g // PRODUCT_SYSTEM_SERVER_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO. // PRODUCT_OTHER_JAVA_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO. - if systemServerJars.ContainsJar(module.Name) { + if global.SystemServerJars.ContainsJar(module.Name) { if global.AlwaysSystemServerDebugInfo { debugInfo = true } else if global.NeverSystemServerDebugInfo { @@ -529,15 +518,14 @@ func makefileMatch(pattern, s string) bool { } } -var allSystemServerJarsKey = android.NewOnceKey("allSystemServerJars") +var nonApexSystemServerJarsKey = android.NewOnceKey("nonApexSystemServerJars") // TODO: eliminate the superficial global config parameter by moving global config definition // from java subpackage to dexpreopt. -func AllSystemServerJars(ctx android.PathContext, global *GlobalConfig) *android.ConfiguredJarList { - return ctx.Config().Once(allSystemServerJarsKey, func() interface{} { - allSystemServerJars := global.SystemServerJars.AppendList(global.ApexSystemServerJars) - return &allSystemServerJars - }).(*android.ConfiguredJarList) +func NonApexSystemServerJars(ctx android.PathContext, global *GlobalConfig) []string { + return ctx.Config().Once(nonApexSystemServerJarsKey, func() interface{} { + return android.RemoveListFromList(global.SystemServerJars.CopyOfJars(), global.ApexSystemServerJars.CopyOfJars()) + }).([]string) } // A predefined location for the system server dex jars. This is needed in order to generate @@ -563,12 +551,12 @@ func checkSystemServerOrder(ctx android.PathContext, jarIndex int) { mctx, isModule := ctx.(android.ModuleContext) if isModule { config := GetGlobalConfig(ctx) - jars := AllSystemServerJars(ctx, config) + jars := NonApexSystemServerJars(ctx, config) mctx.WalkDeps(func(dep android.Module, parent android.Module) bool { - depIndex := jars.IndexOfJar(dep.Name()) + depIndex := android.IndexList(dep.Name(), jars) if jarIndex < depIndex && !config.BrokenSuboptimalOrderOfSystemServerJars { - jar := jars.Jar(jarIndex) - dep := jars.Jar(depIndex) + jar := jars[jarIndex] + dep := jars[depIndex] mctx.ModuleErrorf("non-optimal order of jars on the system server classpath:"+ " '%s' precedes its dependency '%s', so dexpreopt is unable to resolve any"+ " references from '%s' to '%s'.\n", jar, dep, jar, dep) diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go index 798d77604..4ee61b6b0 100644 --- a/dexpreopt/dexpreopt_test.go +++ b/dexpreopt/dexpreopt_test.go @@ -33,35 +33,17 @@ func testProductModuleConfig(ctx android.PathContext, name string) *ModuleConfig } func testModuleConfig(ctx android.PathContext, name, partition string) *ModuleConfig { - return createTestModuleConfig( - name, - fmt.Sprintf("/%s/app/test/%s.apk", partition, name), - android.PathForOutput(ctx, fmt.Sprintf("%s/%s.apk", name, name)), - android.PathForOutput(ctx, fmt.Sprintf("%s/dex/%s.jar", name, name)), - android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) -} - -func testApexModuleConfig(ctx android.PathContext, name, apexName string) *ModuleConfig { - return createTestModuleConfig( - name, - fmt.Sprintf("/apex/%s/javalib/%s.jar", apexName, name), - android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)), - android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)), - android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) -} - -func createTestModuleConfig(name, dexLocation string, buildPath, dexPath, enforceUsesLibrariesStatusFile android.OutputPath) *ModuleConfig { return &ModuleConfig{ Name: name, - DexLocation: dexLocation, - BuildPath: buildPath, - DexPath: dexPath, + DexLocation: fmt.Sprintf("/%s/app/test/%s.apk", partition, name), + BuildPath: android.PathForOutput(ctx, fmt.Sprintf("%s/%s.apk", name, name)), + DexPath: android.PathForOutput(ctx, fmt.Sprintf("%s/dex/%s.jar", name, name)), UncompressedDex: false, HasApkLibraries: false, PreoptFlags: nil, ProfileClassListing: android.OptionalPath{}, ProfileIsTextListing: false, - EnforceUsesLibrariesStatusFile: enforceUsesLibrariesStatusFile, + EnforceUsesLibrariesStatusFile: android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name)), EnforceUsesLibraries: false, ClassLoaderContexts: nil, Archs: []android.ArchType{android.Arm}, @@ -158,29 +140,6 @@ func TestDexPreoptSystemOther(t *testing.T) { } -func TestDexPreoptApexSystemServerJars(t *testing.T) { - config := android.TestConfig("out", nil, "", nil) - ctx := android.BuilderContextForTesting(config) - globalSoong := globalSoongConfigForTests() - global := GlobalConfigForTests(ctx) - module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") - - global.ApexSystemServerJars = android.CreateTestConfiguredJarList( - []string{"com.android.apex1:service-A"}) - - rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module) - if err != nil { - t.Fatal(err) - } - - wantInstalls := android.RuleBuilderInstalls{ - {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/apex@com.android.apex1@javalib@service-A.jar@classes.odex"}, - {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/apex@com.android.apex1@javalib@service-A.jar@classes.vdex"}, - } - - android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) -} - func TestDexPreoptProfile(t *testing.T) { config := android.TestConfig("out", nil, "", nil) ctx := android.BuilderContextForTesting(config) |
