diff --git a/android/config.go b/android/config.go index b0d8b7fca..e4012fa51 100644 --- a/android/config.go +++ b/android/config.go @@ -216,6 +216,7 @@ func TestConfig(buildDir string, env map[string]string) Config { AAPTPreferredConfig: stringPtr("xhdpi"), AAPTCharacteristics: stringPtr("nosdcard"), AAPTPrebuiltDPI: []string{"xhdpi", "xxhdpi"}, + UncompressPrivAppDex: boolPtr(true), }, buildDir: buildDir, diff --git a/java/app.go b/java/app.go index 42f8bada3..f58b0f836 100644 --- a/java/app.go +++ b/java/app.go @@ -229,15 +229,16 @@ func (a *AndroidApp) shouldUncompressDex(ctx android.ModuleContext) bool { return true } - if ctx.Config().UnbundledBuild() { - return false - } - - // Uncompress dex in APKs of privileged apps + // Uncompress dex in APKs of privileged apps (even for unbundled builds, they may + // be preinstalled as prebuilts). if ctx.Config().UncompressPrivAppDex() && Bool(a.appProperties.Privileged) { return true } + if ctx.Config().UnbundledBuild() { + return false + } + return shouldUncompressDex(ctx, &a.dexpreopter) } diff --git a/java/app_test.go b/java/app_test.go index 2e6d29a57..c7ea338b1 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -1491,3 +1491,86 @@ func TestEmbedNotice(t *testing.T) { t.Errorf("mergeNotices shouldn't have run for baz") } } + +func TestUncompressDex(t *testing.T) { + testCases := []struct { + name string + bp string + + uncompressedPlatform bool + uncompressedUnbundled bool + }{ + { + name: "normal", + bp: ` + android_app { + name: "foo", + srcs: ["a.java"], + } + `, + uncompressedPlatform: true, + uncompressedUnbundled: false, + }, + { + name: "use_embedded_dex", + bp: ` + android_app { + name: "foo", + use_embedded_dex: true, + srcs: ["a.java"], + } + `, + uncompressedPlatform: true, + uncompressedUnbundled: true, + }, + { + name: "privileged", + bp: ` + android_app { + name: "foo", + privileged: true, + srcs: ["a.java"], + } + `, + uncompressedPlatform: true, + uncompressedUnbundled: true, + }, + } + + test := func(t *testing.T, bp string, want bool, unbundled bool) { + t.Helper() + + config := testConfig(nil) + if unbundled { + config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) + } + + ctx := testAppContext(config, bp, nil) + + run(t, ctx, config) + + foo := ctx.ModuleForTests("foo", "android_common") + dex := foo.Rule("r8") + uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0") + aligned := foo.MaybeRule("zipalign").Rule != nil + + if uncompressedInDexJar != want { + t.Errorf("want uncompressed in dex %v, got %v", want, uncompressedInDexJar) + } + + if aligned != want { + t.Errorf("want aligned %v, got %v", want, aligned) + } + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + t.Run("platform", func(t *testing.T) { + test(t, tt.bp, tt.uncompressedPlatform, false) + }) + t.Run("unbundled", func(t *testing.T) { + test(t, tt.bp, tt.uncompressedUnbundled, true) + }) + }) + } +}