apex: respect filename property for apk-in-apex

android_app_import supports filename: property, which overrides .apk
filename.

Now, apex packaging rule respects it too.
(Previously, apex packaging ignored it)

Bug: 152163837
Test: m  (soong tests amended)
Merged-In: I72e2f1c923f4d01c42a87bf2232a025adca4c918
Change-Id: I72e2f1c923f4d01c42a87bf2232a025adca4c918
(cherry picked from commit 39ee119de2)
This commit is contained in:
Jooyung Han
2020-03-23 20:21:11 +09:00
parent 40b286ceea
commit 65cd0f0caa
3 changed files with 62 additions and 12 deletions

View File

@@ -1755,15 +1755,16 @@ func apexFileForCompatConfig(ctx android.BaseModuleContext, config java.Platform
func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface { func apexFileForAndroidApp(ctx android.BaseModuleContext, aapp interface {
android.Module android.Module
Privileged() bool Privileged() bool
InstallApkName() string
OutputFile() android.Path OutputFile() android.Path
JacocoReportClassesFile() android.Path JacocoReportClassesFile() android.Path
Certificate() java.Certificate Certificate() java.Certificate
}, pkgName string) apexFile { }) apexFile {
appDir := "app" appDir := "app"
if aapp.Privileged() { if aapp.Privileged() {
appDir = "priv-app" appDir = "priv-app"
} }
dirInApex := filepath.Join(appDir, pkgName) dirInApex := filepath.Join(appDir, aapp.InstallApkName())
fileToCopy := aapp.OutputFile() fileToCopy := aapp.OutputFile()
af := newApexFile(ctx, fileToCopy, aapp.Name(), dirInApex, app, aapp) af := newApexFile(ctx, fileToCopy, aapp.Name(), dirInApex, app, aapp)
af.jacocoReportClassesFile = aapp.JacocoReportClassesFile() af.jacocoReportClassesFile = aapp.JacocoReportClassesFile()
@@ -2044,14 +2045,13 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
ctx.PropertyErrorf("java_libs", "%q of type %q is not supported", depName, ctx.OtherModuleType(child)) ctx.PropertyErrorf("java_libs", "%q of type %q is not supported", depName, ctx.OtherModuleType(child))
} }
case androidAppTag: case androidAppTag:
pkgName := ctx.DeviceConfig().OverridePackageNameFor(depName)
if ap, ok := child.(*java.AndroidApp); ok { if ap, ok := child.(*java.AndroidApp); ok {
filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap, pkgName)) filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap))
return true // track transitive dependencies return true // track transitive dependencies
} else if ap, ok := child.(*java.AndroidAppImport); ok { } else if ap, ok := child.(*java.AndroidAppImport); ok {
filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap, pkgName)) filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap))
} else if ap, ok := child.(*java.AndroidTestHelperApp); ok { } else if ap, ok := child.(*java.AndroidTestHelperApp); ok {
filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap, pkgName)) filesInfo = append(filesInfo, apexFileForAndroidApp(ctx, ap))
} else { } else {
ctx.PropertyErrorf("apps", "%q is not an android_app module", depName) ctx.PropertyErrorf("apps", "%q is not an android_app module", depName)
} }

View File

@@ -3413,6 +3413,7 @@ func TestApexWithAppImports(t *testing.T) {
dex_preopt: { dex_preopt: {
enabled: false, enabled: false,
}, },
filename: "AwesomePrebuiltAppFooPriv.apk",
} }
`) `)
@@ -3421,7 +3422,47 @@ func TestApexWithAppImports(t *testing.T) {
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk") ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AppFooPrivPrebuilt.apk") ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
}
func TestApexWithAppImportsPrefer(t *testing.T) {
ctx, _ := testApex(t, `
apex {
name: "myapex",
key: "myapex.key",
apps: [
"AppFoo",
],
}
apex_key {
name: "myapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
android_app {
name: "AppFoo",
srcs: ["foo/bar/MyClass.java"],
sdk_version: "none",
system_modules: "none",
apex_available: [ "myapex" ],
}
android_app_import {
name: "AppFoo",
apk: "AppFooPrebuilt.apk",
filename: "AppFooPrebuilt.apk",
presigned: true,
prefer: true,
}
`, withFiles(map[string][]byte{
"AppFooPrebuilt.apk": nil,
}))
ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
"app/AppFoo/AppFooPrebuilt.apk",
})
} }
func TestApexWithTestHelperApp(t *testing.T) { func TestApexWithTestHelperApp(t *testing.T) {
@@ -3754,7 +3795,7 @@ func TestOverrideApex(t *testing.T) {
copyCmds := apexRule.Args["copy_commands"] copyCmds := apexRule.Args["copy_commands"]
ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk") ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
ensureContains(t, copyCmds, "image.apex/app/app/override_app.apk") ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
apexBundle := module.Module().(*apexBundle) apexBundle := module.Module().(*apexBundle)
name := apexBundle.Name() name := apexBundle.Name()

View File

@@ -500,6 +500,10 @@ func processMainCert(m android.ModuleBase, certPropValue string, certificates []
return certificates return certificates
} }
func (a *AndroidApp) InstallApkName() string {
return a.installApkName
}
func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
var apkDeps android.Paths var apkDeps android.Paths
@@ -1110,6 +1114,10 @@ func (a *AndroidAppImport) GenerateAndroidBuildActions(ctx android.ModuleContext
a.generateAndroidBuildActions(ctx) a.generateAndroidBuildActions(ctx)
} }
func (a *AndroidAppImport) InstallApkName() string {
return a.BaseModuleName()
}
func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext) { func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext) {
numCertPropsSet := 0 numCertPropsSet := 0
if String(a.properties.Certificate) != "" { if String(a.properties.Certificate) != "" {
@@ -1167,6 +1175,8 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
dexOutput = dexUncompressed dexOutput = dexUncompressed
} }
apkFilename := proptools.StringDefault(a.properties.Filename, a.BaseModuleName()+".apk")
// Sign or align the package // Sign or align the package
// TODO: Handle EXTERNAL // TODO: Handle EXTERNAL
if !Bool(a.properties.Presigned) { if !Bool(a.properties.Presigned) {
@@ -1177,11 +1187,11 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
ctx.ModuleErrorf("Unexpected number of certificates were extracted: %q", certificates) ctx.ModuleErrorf("Unexpected number of certificates were extracted: %q", certificates)
} }
a.certificate = certificates[0] a.certificate = certificates[0]
signed := android.PathForModuleOut(ctx, "signed", ctx.ModuleName()+".apk") signed := android.PathForModuleOut(ctx, "signed", apkFilename)
SignAppPackage(ctx, signed, dexOutput, certificates, nil) 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", apkFilename)
TransformZipAlign(ctx, alignedApk, dexOutput) TransformZipAlign(ctx, alignedApk, dexOutput)
a.outputFile = alignedApk a.outputFile = alignedApk
a.certificate = presignedCertificate a.certificate = presignedCertificate
@@ -1189,8 +1199,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
// TODO: Optionally compress the output apk. // TODO: Optionally compress the output apk.
a.installPath = ctx.InstallFile(installDir, a.installPath = ctx.InstallFile(installDir, apkFilename, a.outputFile)
proptools.StringDefault(a.properties.Filename, a.BaseModuleName()+".apk"), a.outputFile)
// TODO: androidmk converter jni libs // TODO: androidmk converter jni libs
} }