diff options
Diffstat (limited to 'java')
-rw-r--r-- | java/app.go | 49 | ||||
-rw-r--r-- | java/app_test.go | 72 | ||||
-rw-r--r-- | java/java.go | 1 | ||||
-rw-r--r-- | java/java_test.go | 2 | ||||
-rw-r--r-- | java/sdk_library.go | 4 |
5 files changed, 118 insertions, 10 deletions
diff --git a/java/app.go b/java/app.go index 8f5d010c2..b31f2323b 100644 --- a/java/app.go +++ b/java/app.go @@ -33,16 +33,13 @@ func init() { android.RegisterModuleType("android_test", AndroidTestFactory) android.RegisterModuleType("android_test_helper_app", AndroidTestHelperAppFactory) android.RegisterModuleType("android_app_certificate", AndroidAppCertificateFactory) + android.RegisterModuleType("override_android_app", OverrideAndroidAppModuleFactory) } // AndroidManifest.xml merging // package splits type appProperties struct { - // The name of a certificate in the default certificate directory, blank to use the default product certificate, - // or an android_app_certificate module name in the form ":module". - Certificate *string - // Names of extra android_app_certificate modules to sign the apk with in the form ":module". Additional_certificates []string @@ -79,14 +76,24 @@ type appProperties struct { Use_embedded_dex *bool } +// android_app properties that can be overridden by override_android_app +type overridableAppProperties struct { + // The name of a certificate in the default certificate directory, blank to use the default product certificate, + // or an android_app_certificate module name in the form ":module". + Certificate *string +} + type AndroidApp struct { Library aapt + android.OverridableModuleBase certificate Certificate appProperties appProperties + overridableAppProperties overridableAppProperties + installJniLibs []jniLib bundleFile android.Path @@ -320,7 +327,7 @@ func (a *AndroidApp) certificateBuildActions(certificateDeps []Certificate, ctx func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { // Check if the install APK name needs to be overridden. - a.installApkName = ctx.DeviceConfig().OverridePackageNameFor(ctx.ModuleName()) + a.installApkName = ctx.DeviceConfig().OverridePackageNameFor(a.Name()) // Process all building blocks, from AAPT to certificates. a.aaptBuildActions(ctx) @@ -339,6 +346,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { certificates := a.certificateBuildActions(certificateDeps, ctx) // Build a final signed app package. + // TODO(jungjw): Consider changing this to installApkName. packageFile := android.PathForModuleOut(ctx, ctx.ModuleName()+".apk") CreateAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates) a.outputFile = packageFile @@ -413,7 +421,7 @@ func (a *AndroidApp) getCertString(ctx android.BaseContext) string { if overridden { return ":" + certificate } - return String(a.appProperties.Certificate) + return String(a.overridableAppProperties.Certificate) } // android_app compiles sources and Android resources into an Android application package `.apk` file. @@ -432,7 +440,8 @@ func AndroidAppFactory() android.Module { &module.Module.dexpreoptProperties, &module.Module.protoProperties, &module.aaptProperties, - &module.appProperties) + &module.appProperties, + &module.overridableAppProperties) module.Prefer32(func(ctx android.BaseModuleContext, base *android.ModuleBase, class android.OsClass) bool { return class == android.Device && ctx.Config().DevicePrefer32BitApps() @@ -440,6 +449,7 @@ func AndroidAppFactory() android.Module { android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) + android.InitOverridableModule(module, &module.appProperties.Overrides) return module } @@ -503,6 +513,7 @@ func AndroidTestFactory() android.Module { &module.aaptProperties, &module.appProperties, &module.appTestProperties, + &module.overridableAppProperties, &module.testProperties) android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) @@ -541,7 +552,8 @@ func AndroidTestHelperAppFactory() android.Module { &module.Module.protoProperties, &module.aaptProperties, &module.appProperties, - &module.appTestHelperAppProperties) + &module.appTestHelperAppProperties, + &module.overridableAppProperties) android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) @@ -575,3 +587,24 @@ func (c *AndroidAppCertificate) GenerateAndroidBuildActions(ctx android.ModuleCo android.PathForModuleSrc(ctx, cert+".pk8"), } } + +type OverrideAndroidApp struct { + android.ModuleBase + android.OverrideModuleBase +} + +func (i *OverrideAndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { + // All the overrides happen in the base module. + // TODO(jungjw): Check the base module type. +} + +// override_android_app is used to create an android_app module based on another android_app by overriding +// some of its properties. +func OverrideAndroidAppModuleFactory() android.Module { + m := &OverrideAndroidApp{} + m.AddProperties(&overridableAppProperties{}) + + android.InitAndroidModule(m) + android.InitOverrideModule(m) + return m +} diff --git a/java/app_test.go b/java/app_test.go index 1bad12377..cf57c809a 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -827,3 +827,75 @@ func TestInstrumentationTargetOverridden(t *testing.T) { t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags) } } + +func TestOverrideAndroidApp(t *testing.T) { + ctx := testJava(t, ` + android_app { + name: "foo", + srcs: ["a.java"], + overrides: ["baz"], + } + + override_android_app { + name: "bar", + base: "foo", + certificate: ":new_certificate", + } + + android_app_certificate { + name: "new_certificate", + certificate: "cert/new_cert", + } + `) + + expectedVariants := []struct { + variantName string + apkName string + apkPath string + signFlag string + overrides []string + }{ + { + variantName: "android_common", + apkPath: "/target/product/test_device/system/app/foo/foo.apk", + signFlag: "build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8", + overrides: []string{"baz"}, + }, + { + variantName: "bar_android_common", + apkPath: "/target/product/test_device/system/app/bar/bar.apk", + signFlag: "cert/new_cert.x509.pem cert/new_cert.pk8", + overrides: []string{"baz", "foo"}, + }, + } + for _, expected := range expectedVariants { + variant := ctx.ModuleForTests("foo", expected.variantName) + + // Check the final apk name + outputs := variant.AllOutputs() + expectedApkPath := buildDir + expected.apkPath + found := false + for _, o := range outputs { + if o == expectedApkPath { + found = true + break + } + } + if !found { + t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs) + } + + // Check the certificate paths + signapk := variant.Output("foo.apk") + signFlag := signapk.Args["certificates"] + if expected.signFlag != signFlag { + t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.signFlag, signFlag) + } + + mod := variant.Module().(*AndroidApp) + if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) { + t.Errorf("Incorrect overrides property value, expected: %q, got: %q", + expected.overrides, mod.appProperties.Overrides) + } + } +} diff --git a/java/java.go b/java/java.go index e0da00636..3eae93294 100644 --- a/java/java.go +++ b/java/java.go @@ -2068,6 +2068,7 @@ func DefaultsFactory(props ...interface{}) android.Module { &androidLibraryProperties{}, &appProperties{}, &appTestProperties{}, + &overridableAppProperties{}, &ImportProperties{}, &AARImportProperties{}, &sdkLibraryProperties{}, diff --git a/java/java_test.go b/java/java_test.go index 35dd696be..ec6d27a89 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -86,10 +86,12 @@ func testContext(config android.Config, bp string, ctx.RegisterModuleType("droiddoc_host", android.ModuleFactoryAdaptor(DroiddocHostFactory)) ctx.RegisterModuleType("droiddoc_template", android.ModuleFactoryAdaptor(ExportedDroiddocDirFactory)) ctx.RegisterModuleType("java_sdk_library", android.ModuleFactoryAdaptor(SdkLibraryFactory)) + ctx.RegisterModuleType("override_android_app", android.ModuleFactoryAdaptor(OverrideAndroidAppModuleFactory)) ctx.RegisterModuleType("prebuilt_apis", android.ModuleFactoryAdaptor(PrebuiltApisFactory)) ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators) ctx.PreArchMutators(android.RegisterPrebuiltsPostDepsMutators) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) + ctx.PreArchMutators(android.RegisterOverridePreArchMutators) ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) { ctx.TopDown("prebuilt_apis", PrebuiltApisMutator).Parallel() ctx.TopDown("java_sdk_library", SdkLibraryMutator).Parallel() diff --git a/java/sdk_library.go b/java/sdk_library.go index 18866d57e..72cce5794 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -668,11 +668,11 @@ func SdkLibraryMutator(mctx android.TopDownMutatorContext) { } func (module *SdkLibrary) createInternalModules(mctx android.TopDownMutatorContext) { - if module.Library.Module.properties.Srcs == nil { + if len(module.Library.Module.properties.Srcs) == 0 { mctx.PropertyErrorf("srcs", "java_sdk_library must specify srcs") } - if module.sdkLibraryProperties.Api_packages == nil { + if len(module.sdkLibraryProperties.Api_packages) == 0 { mctx.PropertyErrorf("api_packages", "java_sdk_library must specify api_packages") } |