From 26ec8484e45134f985cd2a97e4cc02389ccc8c26 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Wed, 31 Jul 2024 15:04:05 +0900 Subject: [PATCH] apex: respect PRODUCT_COMPRESSED_APEX for prebuilt APEXes If a prebuilt APEX is compressed, it's installed without decompression even when PRODUCT_COMPRESSED_APEX is false. This change decompresses the prebuilt/compressed APEX. Bug: 356533488 Test: OVERRIDE_PRODUCT_COMPRESSED_APEX=false m Change-Id: Ifdde074e383837df92d172bc483bfca9a97cb6f8 --- apex/apex_test.go | 24 ++++++++++++++++++++++++ apex/prebuilt.go | 13 ++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 261d2ce59..cdf16ddce 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -8993,6 +8993,30 @@ func TestCompressedApex(t *testing.T) { ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n") } +func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) { + for _, compressionEnabled := range []bool{true, false} { + t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) { + ctx := testApex(t, ` + apex_set { + name: "com.company.android.myapex", + apex_name: "com.android.myapex", + set: "company-myapex.apks", + } + `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.CompressedApex = proptools.BoolPtr(compressionEnabled) + }), + ) + + build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex") + if compressionEnabled { + ensureEquals(t, build.Rule.String(), "android/soong/android.Cp") + } else { + ensureEquals(t, build.Rule.String(), "android/apex.decompressApex") + } + }) + } +} + func TestPreferredPrebuiltSharedLibDep(t *testing.T) { ctx := testApex(t, ` apex { diff --git a/apex/prebuilt.go b/apex/prebuilt.go index b9cc09ba7..5e46bab60 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -42,6 +42,11 @@ var ( CommandDeps: []string{"${extract_apks}"}, }, "abis", "allow-prereleased", "sdk-version", "skip-sdk-check") + decompressApex = pctx.StaticRule("decompressApex", blueprint.RuleParams{ + Command: `${deapexer} decompress --copy-if-uncompressed --input ${in} --output ${out}`, + CommandDeps: []string{"${deapexer}"}, + Description: "decompress", + }) ) type prebuilt interface { @@ -1072,8 +1077,14 @@ func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { inputApex := android.OptionalPathForModuleSrc(ctx, a.prebuiltCommonProperties.Selected_apex).Path() a.outputApex = android.PathForModuleOut(ctx, a.installFilename) + + // Build the output APEX. If compression is not enabled, make sure the output is not compressed even if the input is compressed + buildRule := android.Cp + if !ctx.Config().ApexCompressionEnabled() { + buildRule = decompressApex + } ctx.Build(pctx, android.BuildParams{ - Rule: android.Cp, + Rule: buildRule, Input: inputApex, Output: a.outputApex, })