From 84f1b808664b9f764de6e97ba312911d3834e2a1 Mon Sep 17 00:00:00 2001 From: Jaewoong Jung Date: Fri, 4 Dec 2020 11:51:29 -0800 Subject: [PATCH] No matching variant android_app_import fix This fixes a bug where android_app_import or android_test_import without a matching variant or a default apk property value breaks the build. Test: app_test.go Fixes: 152343232 Change-Id: I8215aa1a6dad74b503eaa1169a64f8c30dda287c --- android/prebuilt.go | 3 +++ java/app.go | 7 +++++++ java/app_test.go | 24 ++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/android/prebuilt.go b/android/prebuilt.go index 294a6e080..98cb5723a 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -178,6 +178,9 @@ func InitSingleSourcePrebuiltModule(module PrebuiltInterface, srcProps interface srcPropertyName := proptools.PropertyNameForField(srcField) srcsSupplier := func(ctx BaseModuleContext) []string { + if !ctx.Module().Enabled() { + return nil + } value := srcPropsValue.FieldByIndex(srcFieldIndex) if value.Kind() == reflect.Ptr { value = value.Elem() diff --git a/java/app.go b/java/app.go index 4bf9d33ea..e6d9550ec 100755 --- a/java/app.go +++ b/java/app.go @@ -1400,6 +1400,13 @@ func (a *AndroidAppImport) processVariants(ctx android.LoadHookContext) { archProps := reflect.ValueOf(a.archVariants).Elem().FieldByName("Arch") archType := ctx.Config().AndroidFirstDeviceTarget.Arch.ArchType MergePropertiesFromVariant(ctx, &a.properties, archProps, archType.Name) + + if String(a.properties.Apk) == "" { + // Disable this module since the apk property is still empty after processing all matching + // variants. This likely means there is no matching variant, and the default variant doesn't + // have an apk property value either. + a.Disable() + } } func MergePropertiesFromVariant(ctx android.EarlyModuleContext, diff --git a/java/app_test.go b/java/app_test.go index 6efb0dcb3..c9abc6177 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -2524,6 +2524,24 @@ func TestAndroidAppImport_ArchVariants(t *testing.T) { `, expected: "prebuilts/apk/app.apk", }, + { + name: "no matching arch without default", + bp: ` + android_app_import { + name: "foo", + arch: { + arm: { + apk: "prebuilts/apk/app_arm.apk", + }, + }, + presigned: true, + dex_preopt: { + enabled: true, + }, + } + `, + expected: "", + }, } jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)") @@ -2531,6 +2549,12 @@ func TestAndroidAppImport_ArchVariants(t *testing.T) { ctx, _ := testJava(t, test.bp) variant := ctx.ModuleForTests("foo", "android_common") + if test.expected == "" { + if variant.Module().Enabled() { + t.Error("module should have been disabled, but wasn't") + } + continue + } jniRuleCommand := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command matches := jniRuleRe.FindStringSubmatch(jniRuleCommand) if len(matches) != 2 {