aboutsummaryrefslogtreecommitdiff
path: root/dexpreopt
diff options
context:
space:
mode:
authorAdrian Roos <roosa@google.com>2021-09-15 14:11:07 +0000
committerAdrian Roos <roosa@google.com>2021-09-15 14:11:07 +0000
commit92346c483249726164f4bd140413d60391121763 (patch)
treedbfcb43369c2e014c83676633aa4da9b6c8fb212 /dexpreopt
parentca9bc98e0cfe9a519cfdd13450a68f1ed7ad5b02 (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.go54
-rw-r--r--dexpreopt/dexpreopt_test.go49
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)