Merge "Support including apk inside an apex"

This commit is contained in:
Treehugger Robot 2019-09-05 23:43:33 +00:00 committed by Gerrit Code Review
commit 5afe2d6869
3 changed files with 89 additions and 25 deletions

View File

@ -142,6 +142,7 @@ var (
keyTag = dependencyTag{name: "key"} keyTag = dependencyTag{name: "key"}
certificateTag = dependencyTag{name: "certificate"} certificateTag = dependencyTag{name: "certificate"}
usesTag = dependencyTag{name: "uses"} usesTag = dependencyTag{name: "uses"}
androidAppTag = dependencyTag{name: "androidApp"}
) )
var ( var (
@ -333,6 +334,9 @@ type apexBundleProperties struct {
// A txt file containing list of files that are whitelisted to be included in this APEX. // A txt file containing list of files that are whitelisted to be included in this APEX.
Whitelisted_files *string Whitelisted_files *string
// List of APKs to package inside APEX
Apps []string
} }
type apexTargetBundleProperties struct { type apexTargetBundleProperties struct {
@ -367,6 +371,7 @@ const (
goBinary goBinary
javaSharedLib javaSharedLib
nativeTest nativeTest
app
) )
type apexPackaging int type apexPackaging int
@ -431,6 +436,8 @@ func (class apexFileClass) NameInMake() string {
return "JAVA_LIBRARIES" return "JAVA_LIBRARIES"
case nativeTest: case nativeTest:
return "NATIVE_TESTS" return "NATIVE_TESTS"
case app:
return "APPS"
default: default:
panic(fmt.Errorf("unknown class %d", class)) panic(fmt.Errorf("unknown class %d", class))
} }
@ -633,6 +640,10 @@ func (a *apexBundle) DepsMutator(ctx android.BottomUpMutatorContext) {
{Mutator: "arch", Variation: "android_common"}, {Mutator: "arch", Variation: "android_common"},
}, javaLibTag, a.properties.Java_libs...) }, javaLibTag, a.properties.Java_libs...)
ctx.AddFarVariationDependencies([]blueprint.Variation{
{Mutator: "arch", Variation: "android_common"},
}, androidAppTag, a.properties.Apps...)
if String(a.properties.Key) == "" { if String(a.properties.Key) == "" {
ctx.ModuleErrorf("key is missing") ctx.ModuleErrorf("key is missing")
return return
@ -813,6 +824,12 @@ func getCopyManifestForPrebuiltEtc(prebuilt *android.PrebuiltEtc) (fileToCopy an
return return
} }
func getCopyManifestForAndroidApp(app *java.AndroidApp, pkgName string) (fileToCopy android.Path, dirInApex string) {
dirInApex = filepath.Join("app", pkgName)
fileToCopy = app.OutputFile()
return
}
// Context "decorator", overriding the InstallBypassMake method to always reply `true`. // Context "decorator", overriding the InstallBypassMake method to always reply `true`.
type flattenedApexContext struct { type flattenedApexContext struct {
android.ModuleContext android.ModuleContext
@ -977,6 +994,14 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if prebuilt, ok := child.(*Prebuilt); ok && prebuilt.isForceDisabled() { if prebuilt, ok := child.(*Prebuilt); ok && prebuilt.isForceDisabled() {
a.prebuiltFileToDelete = prebuilt.InstallFilename() a.prebuiltFileToDelete = prebuilt.InstallFilename()
} }
case androidAppTag:
if ap, ok := child.(*java.AndroidApp); ok {
fileToCopy, dirInApex := getCopyManifestForAndroidApp(ap, ctx.DeviceConfig().OverridePackageNameFor(depName))
filesInfo = append(filesInfo, apexFile{fileToCopy, depName, dirInApex, app, ap, nil})
return true
} else {
ctx.PropertyErrorf("apps", "%q is not an android_app module", depName)
}
} }
} else { } else {
// indirect dependencies // indirect dependencies

View File

@ -103,6 +103,7 @@ func testApexContext(t *testing.T, bp string) (*android.TestContext, android.Con
ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory)) ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory)) ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory))
ctx.RegisterModuleType("java_import", android.ModuleFactoryAdaptor(java.ImportFactory)) ctx.RegisterModuleType("java_import", android.ModuleFactoryAdaptor(java.ImportFactory))
ctx.RegisterModuleType("android_app", android.ModuleFactoryAdaptor(java.AndroidAppFactory))
ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) { ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel() ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
@ -235,6 +236,8 @@ func testApexContext(t *testing.T, bp string) (*android.TestContext, android.Con
"myapex-arm64.apex": nil, "myapex-arm64.apex": nil,
"myapex-arm.apex": nil, "myapex-arm.apex": nil,
"frameworks/base/api/current.txt": nil, "frameworks/base/api/current.txt": nil,
"build/make/core/proguard.flags": nil,
"build/make/core/proguard_basic_keeps.flags": nil,
}) })
return ctx, config return ctx, config
@ -1977,6 +1980,38 @@ func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
`) `)
} }
func TestApexWithApps(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",
}
`)
module := ctx.ModuleForTests("myapex", "android_common_myapex")
apexRule := module.Rule("apexRule")
copyCmds := apexRule.Args["copy_commands"]
ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
}
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
run := func() int { run := func() int {
setUp() setUp()

View File

@ -139,6 +139,10 @@ func (a *AndroidApp) ExportedStaticPackages() android.Paths {
return nil return nil
} }
func (a *AndroidApp) OutputFile() android.Path {
return a.outputFile
}
var _ AndroidLibraryDependency = (*AndroidApp)(nil) var _ AndroidLibraryDependency = (*AndroidApp)(nil)
type Certificate struct { type Certificate struct {