From 7c5bd835d07168dd6349eec20de25e7e41f2974d Mon Sep 17 00:00:00 2001 From: Jaewoong Jung Date: Mon, 13 Jan 2020 09:55:39 -0800 Subject: [PATCH] Keep signatures of presigned prebuilt test apps. Skip the JNI uncompress step for presigned prebuilt test apps. They don't need it, and they can invalidate the signature. Also, fix the install partition of prebuilt test apps. Fixes: 143472191 Test: app_test.go Test: Converted CtsShimPrivUpgradePrebuilt to bp and checked the final output apk signature. Change-Id: Ied7d3576b5db4de40a9ca9e388336229d07212f5 --- java/app.go | 16 ++++++++++++++++ java/app_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/java/app.go b/java/app.go index 05fa50598..581723850 100755 --- a/java/app.go +++ b/java/app.go @@ -925,6 +925,16 @@ func (a *AndroidAppImport) DepsMutator(ctx android.BottomUpMutatorContext) { func (a *AndroidAppImport) uncompressEmbeddedJniLibs( ctx android.ModuleContext, inputPath android.Path, outputPath android.OutputPath) { + // Test apps don't need their JNI libraries stored uncompressed. As a matter of fact, messing + // with them may invalidate pre-existing signature data. + if ctx.InstallInTestcases() && Bool(a.properties.Presigned) { + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Output: outputPath, + Input: inputPath, + }) + return + } rule := android.NewRuleBuilder() rule.Command(). Textf(`if (zipinfo %s 'lib/*.so' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then`, inputPath). @@ -1002,6 +1012,8 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext var installDir android.InstallPath if Bool(a.properties.Privileged) { installDir = android.PathForModuleInstall(ctx, "priv-app", a.BaseModuleName()) + } else if ctx.InstallInTestcases() { + installDir = android.PathForModuleInstall(ctx, a.BaseModuleName(), ctx.DeviceConfig().DeviceArch()) } else { installDir = android.PathForModuleInstall(ctx, "app", a.BaseModuleName()) } @@ -1158,6 +1170,10 @@ func (a *AndroidTestImport) GenerateAndroidBuildActions(ctx android.ModuleContex a.data = android.PathsForModuleSrc(ctx, a.testProperties.Data) } +func (a *AndroidTestImport) InstallInTestcases() bool { + return true +} + // android_test_import imports a prebuilt test apk with additional processing specified in the // module. DPI or arch variant configurations can be made as with android_app_import. func AndroidTestImportFactory() android.Module { diff --git a/java/app_test.go b/java/app_test.go index 9bdef4e92..862af774a 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -1628,6 +1628,40 @@ func TestAndroidTestImport(t *testing.T) { } } +func TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) { + ctx, _ := testJava(t, ` + android_test_import { + name: "foo", + apk: "prebuilts/apk/app.apk", + certificate: "cert/new_cert", + data: [ + "testdata/data", + ], + } + + android_test_import { + name: "foo_presigned", + apk: "prebuilts/apk/app.apk", + presigned: true, + data: [ + "testdata/data", + ], + } + `) + + variant := ctx.ModuleForTests("foo", "android_common") + jniRule := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command + if !strings.HasPrefix(jniRule, "if (zipinfo") { + t.Errorf("Unexpected JNI uncompress rule command: " + jniRule) + } + + variant = ctx.ModuleForTests("foo_presigned", "android_common") + jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String() + if jniRule != android.Cp.String() { + t.Errorf("Unexpected JNI uncompress rule: " + jniRule) + } +} + func TestStl(t *testing.T) { ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+` cc_library {