Merge "[soong] new field in Android.bp to request APK signing V4"
This commit is contained in:
22
java/app.go
22
java/app.go
@@ -529,14 +529,28 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
|
|
||||||
// Build a final signed app package.
|
// Build a final signed app package.
|
||||||
packageFile := android.PathForModuleOut(ctx, a.installApkName+".apk")
|
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
|
a.outputFile = packageFile
|
||||||
|
if v4SigningRequested {
|
||||||
|
a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
|
||||||
|
}
|
||||||
|
|
||||||
for _, split := range a.aapt.splits {
|
for _, split := range a.aapt.splits {
|
||||||
// Sign the split APKs
|
// Sign the split APKs
|
||||||
packageFile := android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk")
|
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)
|
a.extraOutputFiles = append(a.extraOutputFiles, packageFile)
|
||||||
|
if v4SigningRequested {
|
||||||
|
a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build an app bundle.
|
// Build an app bundle.
|
||||||
@@ -1156,7 +1170,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
|
|||||||
}
|
}
|
||||||
a.certificate = certificates[0]
|
a.certificate = certificates[0]
|
||||||
signed := android.PathForModuleOut(ctx, "signed", ctx.ModuleName()+".apk")
|
signed := android.PathForModuleOut(ctx, "signed", ctx.ModuleName()+".apk")
|
||||||
SignAppPackage(ctx, signed, dexOutput, certificates)
|
SignAppPackage(ctx, signed, dexOutput, certificates, nil)
|
||||||
a.outputFile = signed
|
a.outputFile = signed
|
||||||
} else {
|
} else {
|
||||||
alignedApk := android.PathForModuleOut(ctx, "zip-aligned", ctx.ModuleName()+".apk")
|
alignedApk := android.PathForModuleOut(ctx, "zip-aligned", ctx.ModuleName()+".apk")
|
||||||
@@ -1361,7 +1375,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC
|
|||||||
_, certificates := collectAppDeps(ctx, false, false)
|
_, certificates := collectAppDeps(ctx, false, false)
|
||||||
certificates = processMainCert(r.ModuleBase, String(r.properties.Certificate), certificates, ctx)
|
certificates = processMainCert(r.ModuleBase, String(r.properties.Certificate), certificates, ctx)
|
||||||
signed := android.PathForModuleOut(ctx, "signed", r.Name()+".apk")
|
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.certificate = certificates[0]
|
||||||
|
|
||||||
r.outputFile = signed
|
r.outputFile = signed
|
||||||
|
@@ -45,7 +45,7 @@ var combineApk = pctx.AndroidStaticRule("combineApk",
|
|||||||
})
|
})
|
||||||
|
|
||||||
func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.WritablePath,
|
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"
|
unsignedApkName := strings.TrimSuffix(outputFile.Base(), ".apk") + "-unsigned.apk"
|
||||||
unsignedApk := android.PathForModuleOut(ctx, unsignedApkName)
|
unsignedApk := android.PathForModuleOut(ctx, unsignedApkName)
|
||||||
@@ -66,10 +66,10 @@ func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.Writa
|
|||||||
Implicits: deps,
|
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 certificateArgs []string
|
||||||
var deps android.Paths
|
var deps android.Paths
|
||||||
@@ -78,14 +78,22 @@ func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, u
|
|||||||
deps = append(deps, c.Pem, c.Key)
|
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{
|
ctx.Build(pctx, android.BuildParams{
|
||||||
Rule: Signapk,
|
Rule: Signapk,
|
||||||
Description: "signapk",
|
Description: "signapk",
|
||||||
Output: signedApk,
|
Outputs: outputFiles,
|
||||||
Input: unsignedApk,
|
Input: unsignedApk,
|
||||||
Implicits: deps,
|
Implicits: deps,
|
||||||
Args: map[string]string{
|
Args: map[string]string{
|
||||||
"certificates": strings.Join(certificateArgs, " "),
|
"certificates": strings.Join(certificateArgs, " "),
|
||||||
|
"flags": flag,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -1074,6 +1074,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) {
|
func TestPackageNameOverride(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
@@ -325,6 +325,10 @@ type CompilerDeviceProperties struct {
|
|||||||
|
|
||||||
UncompressDex bool `blueprint:"mutated"`
|
UncompressDex bool `blueprint:"mutated"`
|
||||||
IsSDKLibrary 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 {
|
func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool {
|
||||||
|
Reference in New Issue
Block a user