Revert "Revert "Never strip and store dex files uncompressed when they are preopted on system.""
This reverts commit 67e8ec1973700bbdbc4cd68b3493d56d270ca377.
Test: build && atest android.text.cts.EmojiTest#testEmojiGlyphWebView on Cuttlefish
Exempt-From-Owner-Approval: Got +2 from Colin, latest PS is a rebase across conflicts.
Change-Id: I99faf0f2ec698d70c107516bd43756b9ddcb90d0
diff --git a/dexpreopt/config.go b/dexpreopt/config.go
index 8fef010..c7f0638 100644
--- a/dexpreopt/config.go
+++ b/dexpreopt/config.go
@@ -48,7 +48,8 @@
DefaultCompilerFilter string // default compiler filter to pass to dex2oat, overridden by --compiler-filter= in module-specific dex2oat flags
SystemServerCompilerFilter string // default compiler filter to pass to dex2oat for system server jars
- GenerateDMFiles bool // generate Dex Metadata files
+ GenerateDMFiles bool // generate Dex Metadata files
+ NeverAllowStripping bool // whether stripping should not be done - used as build time check to make sure dex files are always available
NoDebugInfo bool // don't generate debug info by default
AlwaysSystemServerDebugInfo bool // always generate mini debug info for system server modules (overrides NoDebugInfo=true)
diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go
index cd931df..68bd3ea 100644
--- a/dexpreopt/dexpreopt.go
+++ b/dexpreopt/dexpreopt.go
@@ -68,6 +68,9 @@
strip := shouldStripDex(module, global)
if strip {
+ if global.NeverAllowStripping {
+ panic(fmt.Errorf("Stripping requested on %q, though the product does not allow it", module.DexLocation))
+ }
// Only strips if the dex files are not already uncompressed
rule.Command().
Textf(`if (zipinfo %s '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then`, module.StripInputPath).
@@ -496,7 +499,7 @@
contains(module.PreoptFlags, "--compiler-filter=verify")
}
-func odexOnSystemOther(module ModuleConfig, global GlobalConfig) bool {
+func OdexOnSystemOtherByName(name string, dexLocation string, global GlobalConfig) bool {
if !global.HasSystemOther {
return false
}
@@ -505,12 +508,12 @@
return false
}
- if contains(global.SpeedApps, module.Name) || contains(global.SystemServerApps, module.Name) {
+ if contains(global.SpeedApps, name) || contains(global.SystemServerApps, name) {
return false
}
for _, f := range global.PatternsOnSystemOther {
- if makefileMatch(filepath.Join(SystemPartition, f), module.DexLocation) {
+ if makefileMatch(filepath.Join(SystemPartition, f), dexLocation) {
return true
}
}
@@ -518,6 +521,10 @@
return false
}
+func odexOnSystemOther(module ModuleConfig, global GlobalConfig) bool {
+ return OdexOnSystemOtherByName(module.Name, module.DexLocation, global)
+}
+
// PathToLocation converts .../system/framework/arm64/boot.art to .../system/framework/boot.art
func PathToLocation(path string, arch android.ArchType) string {
pathArch := filepath.Base(filepath.Dir(path))
diff --git a/dexpreopt/dexpreopt_test.go b/dexpreopt/dexpreopt_test.go
index be86190..ecaf876 100644
--- a/dexpreopt/dexpreopt_test.go
+++ b/dexpreopt/dexpreopt_test.go
@@ -36,6 +36,7 @@
DefaultCompilerFilter: "",
SystemServerCompilerFilter: "",
GenerateDMFiles: false,
+ NeverAllowStripping: false,
NoDebugInfo: false,
AlwaysSystemServerDebugInfo: false,
NeverSystemServerDebugInfo: false,
@@ -109,6 +110,22 @@
}
}
+func TestDexPreoptStrip(t *testing.T) {
+ // Test that we panic if we strip in a configuration where stripping is not allowed.
+ global, module := testGlobalConfig, testModuleConfig
+
+ global.NeverAllowStripping = true
+ module.NoStripping = false
+ module.Name = "test"
+ module.DexLocation = "/system/app/test/test.apk"
+ module.BuildPath = "out/test/test.apk"
+
+ _, err := GenerateStripRule(global, module)
+ if err == nil {
+ t.Errorf("Expected an error when calling GenerateStripRule on a stripped module")
+ }
+}
+
func TestDexPreoptSystemOther(t *testing.T) {
global, module := testGlobalConfig, testModuleConfig
diff --git a/java/app.go b/java/app.go
index 9697582..05d1927 100644
--- a/java/app.go
+++ b/java/app.go
@@ -171,9 +171,18 @@
}
// Uncompress dex in APKs of privileged apps, and modules used by privileged apps.
- return ctx.Config().UncompressPrivAppDex() &&
+ if ctx.Config().UncompressPrivAppDex() &&
(Bool(a.appProperties.Privileged) ||
- inList(ctx.ModuleName(), ctx.Config().ModulesLoadedByPrivilegedModules()))
+ inList(ctx.ModuleName(), ctx.Config().ModulesLoadedByPrivilegedModules())) {
+ return true
+ }
+
+ // Uncompress if the dex files is preopted on /system.
+ if !a.dexpreopter.dexpreoptDisabled(ctx) && (ctx.Host() || !odexOnSystemOther(ctx, a.dexpreopter.installPath)) {
+ return true
+ }
+
+ return false
}
func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) {
@@ -232,7 +241,6 @@
}
func (a *AndroidApp) dexBuildActions(ctx android.ModuleContext) android.Path {
- a.deviceProperties.UncompressDex = a.shouldUncompressDex(ctx)
var installDir string
if ctx.ModuleName() == "framework-res" {
@@ -244,6 +252,9 @@
installDir = filepath.Join("app", a.installApkName)
}
a.dexpreopter.installPath = android.PathForModuleInstall(ctx, installDir, a.installApkName+".apk")
+ a.dexpreopter.isInstallable = Bool(a.properties.Installable)
+ a.dexpreopter.uncompressedDex = a.shouldUncompressDex(ctx)
+ a.deviceProperties.UncompressDex = a.dexpreopter.uncompressedDex
if ctx.ModuleName() != "framework-res" {
a.Module.compile(ctx, a.aaptSrcJar)
diff --git a/java/dexpreopt.go b/java/dexpreopt.go
index cb6427b..a89731a 100644
--- a/java/dexpreopt.go
+++ b/java/dexpreopt.go
@@ -83,11 +83,7 @@
var dexpreoptGlobalConfigKey = android.NewOnceKey("DexpreoptGlobalConfig")
-func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.ModuleOutPath) android.ModuleOutPath {
- if d.dexpreoptDisabled(ctx) {
- return dexJarFile
- }
-
+func getGlobalConfig(ctx android.ModuleContext) dexpreopt.GlobalConfig {
globalConfig := ctx.Config().Once(dexpreoptGlobalConfigKey, func() interface{} {
if f := ctx.Config().DexpreoptGlobalConfig(); f != "" {
ctx.AddNinjaFileDeps(f)
@@ -99,6 +95,19 @@
}
return dexpreopt.GlobalConfig{}
}).(dexpreopt.GlobalConfig)
+ return globalConfig
+}
+
+func odexOnSystemOther(ctx android.ModuleContext, installPath android.OutputPath) bool {
+ return dexpreopt.OdexOnSystemOtherByName(ctx.ModuleName(), android.InstallPathToOnDevicePath(ctx, installPath), getGlobalConfig(ctx))
+}
+
+func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.ModuleOutPath) android.ModuleOutPath {
+ if d.dexpreoptDisabled(ctx) {
+ return dexJarFile
+ }
+
+ globalConfig := getGlobalConfig(ctx)
var archs []android.ArchType
for _, a := range ctx.MultiTargets() {
diff --git a/java/java.go b/java/java.go
index 2c7c1f6..76b41ca 100644
--- a/java/java.go
+++ b/java/java.go
@@ -1239,8 +1239,6 @@
j.dexJarFile = dexOutputFile
// Dexpreopting
- j.dexpreopter.isInstallable = Bool(j.properties.Installable)
- j.dexpreopter.uncompressedDex = j.deviceProperties.UncompressDex
dexOutputFile = j.dexpreopt(ctx, dexOutputFile)
j.maybeStrippedDexJarFile = dexOutputFile
@@ -1417,10 +1415,13 @@
}
func (j *Library) shouldUncompressDex(ctx android.ModuleContext) bool {
- // Store uncompressed (and do not strip) dex files from boot class path jars that are
- // in an apex.
- if inList(ctx.ModuleName(), ctx.Config().BootJars()) &&
- android.DirectlyInAnyApex(ctx, ctx.ModuleName()) {
+ // Store uncompressed (and do not strip) dex files from boot class path jars.
+ if inList(ctx.ModuleName(), ctx.Config().BootJars()) {
+ return true
+ }
+
+ // Store uncompressed dex files that are preopted on /system.
+ if !j.dexpreopter.dexpreoptDisabled(ctx) && (ctx.Host() || !odexOnSystemOther(ctx, j.dexpreopter.installPath)) {
return true
}
if ctx.Config().UncompressPrivAppDex() &&
@@ -1434,7 +1435,9 @@
func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
j.dexpreopter.installPath = android.PathForModuleInstall(ctx, "framework", ctx.ModuleName()+".jar")
j.dexpreopter.isSDKLibrary = j.deviceProperties.IsSDKLibrary
- j.deviceProperties.UncompressDex = j.shouldUncompressDex(ctx)
+ j.dexpreopter.isInstallable = Bool(j.properties.Installable)
+ j.dexpreopter.uncompressedDex = j.shouldUncompressDex(ctx)
+ j.deviceProperties.UncompressDex = j.dexpreopter.uncompressedDex
j.compile(ctx)
if (Bool(j.properties.Installable) || ctx.Host()) && !android.DirectlyInAnyApex(ctx, ctx.ModuleName()) {