From 15a67111f8f49cd900711ee27d4ae23e88464971 Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Thu, 30 May 2024 00:07:40 +0000 Subject: [PATCH] Make dex_preopt.enable_prof_rewrite=false an error for optimized apps If profile guided dexpreopt _and_ optimization/obfuscation is true, then apps must use the rewritten profile created by r8/d8 Bug: 335418838 Test: m nothing --no-skip-soong-tests Change-Id: Iac45b614f43e52ac40ad1d13df0338bcafa788c3 --- java/base.go | 5 +++++ java/dex.go | 4 ++++ java/dex_test.go | 24 ++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/java/base.go b/java/base.go index 056dbd528..b4f800bbd 100644 --- a/java/base.go +++ b/java/base.go @@ -1650,6 +1650,11 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspath classesJar: implementationAndResourcesJar, jarName: jarName, } + if j.GetProfileGuided() && j.optimizeOrObfuscateEnabled() && !j.EnableProfileRewriting() { + ctx.PropertyErrorf("enable_profile_rewriting", + "Enable_profile_rewriting must be true when profile_guided dexpreopt and R8 optimization/obfuscation is turned on. The attached profile should be sourced from an unoptimized/unobfuscated APK.", + ) + } if j.EnableProfileRewriting() { profile := j.GetProfile() if profile == "" || !j.GetProfileGuided() { diff --git a/java/dex.go b/java/dex.go index f072226f8..32546d985 100644 --- a/java/dex.go +++ b/java/dex.go @@ -119,6 +119,10 @@ func (d *DexProperties) optimizedResourceShrinkingEnabled(ctx android.ModuleCont return d.resourceShrinkingEnabled(ctx) && Bool(d.Optimize.Optimized_shrink_resources) } +func (d *dexer) optimizeOrObfuscateEnabled() bool { + return d.effectiveOptimizeEnabled() && (proptools.Bool(d.dexProperties.Optimize.Optimize) || proptools.Bool(d.dexProperties.Optimize.Obfuscate)) +} + var d8, d8RE = pctx.MultiCommandRemoteStaticRules("d8", blueprint.RuleParams{ Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + diff --git a/java/dex_test.go b/java/dex_test.go index eb017d5e9..4862d06c9 100644 --- a/java/dex_test.go +++ b/java/dex_test.go @@ -689,3 +689,27 @@ func TestR8FlagsArtProfile(t *testing.T) { "--create-profile-from=out/soong/.intermediates/app/android_common/profile.prof.txt --output-profile-type=app", ) } + +// This test checks that users explicitly set `enable_profile_rewriting` to true when the following are true +// 1. optimize or obfuscate is enabled AND +// 2. dex_preopt.profile_guided is enabled +// +// The rewritten profile should be used since the dex signatures in the checked-in profile will not match the optimized binary. +func TestEnableProfileRewritingIsRequiredForOptimizedApps(t *testing.T) { + testJavaError(t, + "Enable_profile_rewriting must be true when profile_guided dexpreopt and R8 optimization/obfuscation is turned on", + ` +android_app { + name: "app", + srcs: ["foo.java"], + platform_apis: true, + dex_preopt: { + profile_guided: true, + profile: "profile.txt.prof", + // enable_profile_rewriting is not set, this is an error + }, + optimize: { + optimize: true, + } +}`) +}