Merge "[soong] new field in Android.bp to request APK signing V4" into rvc-dev
This commit is contained in:
commit
0ed9a7d674
4 changed files with 94 additions and 8 deletions
22
java/app.go
22
java/app.go
|
@ -510,14 +510,28 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
|
|||
|
||||
// Build a final signed app package.
|
||||
packageFile := android.PathForModuleOut(ctx, a.installApkName+".apk")
|
||||
CreateAndSignAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates, apkDeps)
|
||||
v4SigningRequested := Bool(a.Module.deviceProperties.V4_signature)
|
||||
var v4SignatureFile android.WritablePath = nil
|
||||
if v4SigningRequested {
|
||||
v4SignatureFile = android.PathForModuleOut(ctx, a.installApkName+".apk.idsig")
|
||||
}
|
||||
CreateAndSignAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates, apkDeps, v4SignatureFile)
|
||||
a.outputFile = packageFile
|
||||
if v4SigningRequested {
|
||||
a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
|
||||
}
|
||||
|
||||
for _, split := range a.aapt.splits {
|
||||
// Sign the split APKs
|
||||
packageFile := android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk")
|
||||
CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps)
|
||||
if v4SigningRequested {
|
||||
v4SignatureFile = android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk.idsig")
|
||||
}
|
||||
CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps, v4SignatureFile)
|
||||
a.extraOutputFiles = append(a.extraOutputFiles, packageFile)
|
||||
if v4SigningRequested {
|
||||
a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
|
||||
}
|
||||
}
|
||||
|
||||
// Build an app bundle.
|
||||
|
@ -1105,7 +1119,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
|
|||
}
|
||||
a.certificate = certificates[0]
|
||||
signed := android.PathForModuleOut(ctx, "signed", ctx.ModuleName()+".apk")
|
||||
SignAppPackage(ctx, signed, dexOutput, certificates)
|
||||
SignAppPackage(ctx, signed, dexOutput, certificates, nil)
|
||||
a.outputFile = signed
|
||||
} else {
|
||||
alignedApk := android.PathForModuleOut(ctx, "zip-aligned", ctx.ModuleName()+".apk")
|
||||
|
@ -1310,7 +1324,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC
|
|||
_, certificates := collectAppDeps(ctx, false)
|
||||
certificates = processMainCert(r.ModuleBase, String(r.properties.Certificate), certificates, ctx)
|
||||
signed := android.PathForModuleOut(ctx, "signed", r.Name()+".apk")
|
||||
SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates)
|
||||
SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates, nil)
|
||||
r.certificate = certificates[0]
|
||||
|
||||
r.outputFile = signed
|
||||
|
|
|
@ -45,7 +45,7 @@ var combineApk = pctx.AndroidStaticRule("combineApk",
|
|||
})
|
||||
|
||||
func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.WritablePath,
|
||||
packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths) {
|
||||
packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths, v4SignatureFile android.WritablePath) {
|
||||
|
||||
unsignedApkName := strings.TrimSuffix(outputFile.Base(), ".apk") + "-unsigned.apk"
|
||||
unsignedApk := android.PathForModuleOut(ctx, unsignedApkName)
|
||||
|
@ -66,10 +66,10 @@ func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.Writa
|
|||
Implicits: deps,
|
||||
})
|
||||
|
||||
SignAppPackage(ctx, outputFile, unsignedApk, certificates)
|
||||
SignAppPackage(ctx, outputFile, unsignedApk, certificates, v4SignatureFile)
|
||||
}
|
||||
|
||||
func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, unsignedApk android.Path, certificates []Certificate) {
|
||||
func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, unsignedApk android.Path, certificates []Certificate, v4SignatureFile android.WritablePath) {
|
||||
|
||||
var certificateArgs []string
|
||||
var deps android.Paths
|
||||
|
@ -78,14 +78,22 @@ func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, u
|
|||
deps = append(deps, c.Pem, c.Key)
|
||||
}
|
||||
|
||||
outputFiles := android.WritablePaths{signedApk}
|
||||
var flag string = ""
|
||||
if v4SignatureFile != nil {
|
||||
outputFiles = append(outputFiles, v4SignatureFile)
|
||||
flag = "--enable-v4"
|
||||
}
|
||||
|
||||
ctx.Build(pctx, android.BuildParams{
|
||||
Rule: Signapk,
|
||||
Description: "signapk",
|
||||
Output: signedApk,
|
||||
Outputs: outputFiles,
|
||||
Input: unsignedApk,
|
||||
Implicits: deps,
|
||||
Args: map[string]string{
|
||||
"certificates": strings.Join(certificateArgs, " "),
|
||||
"flags": flag,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1073,6 +1073,66 @@ func TestCertificates(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestRequestV4SigningFlag(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
bp string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "default",
|
||||
bp: `
|
||||
android_app {
|
||||
name: "foo",
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
}
|
||||
`,
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
name: "default",
|
||||
bp: `
|
||||
android_app {
|
||||
name: "foo",
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
v4_signature: false,
|
||||
}
|
||||
`,
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
name: "module certificate property",
|
||||
bp: `
|
||||
android_app {
|
||||
name: "foo",
|
||||
srcs: ["a.java"],
|
||||
sdk_version: "current",
|
||||
v4_signature: true,
|
||||
}
|
||||
`,
|
||||
expected: "--enable-v4",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
config := testAppConfig(nil, test.bp, nil)
|
||||
ctx := testContext()
|
||||
|
||||
run(t, ctx, config)
|
||||
foo := ctx.ModuleForTests("foo", "android_common")
|
||||
|
||||
signapk := foo.Output("foo.apk")
|
||||
signFlags := signapk.Args["flags"]
|
||||
if test.expected != signFlags {
|
||||
t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestPackageNameOverride(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
|
|
|
@ -319,6 +319,10 @@ type CompilerDeviceProperties struct {
|
|||
|
||||
UncompressDex bool `blueprint:"mutated"`
|
||||
IsSDKLibrary bool `blueprint:"mutated"`
|
||||
|
||||
// If true, generate the signature file of APK Signing Scheme V4, along side the signed APK file.
|
||||
// Defaults to false.
|
||||
V4_signature *bool
|
||||
}
|
||||
|
||||
func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool {
|
||||
|
|
Loading…
Reference in a new issue