diff --git a/apex/apex_test.go b/apex/apex_test.go index 4829029b3..7b01b9481 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -6568,6 +6568,73 @@ func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.F return result.TestContext } +func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) { + preparers := android.GroupFixturePreparers( + java.PrepareForTestWithJavaDefaultModules, + PrepareForTestWithApexBuildComponents, + ). + ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( + `Ambiguous duplicate deapexer module dependencies "com.android.myapex.deapexer" and "com.mycompany.android.myapex.deapexer"`)) + + bpBase := ` + apex_set { + name: "com.android.myapex", + exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], + set: "myapex.apks", + } + + apex_set { + name: "com.mycompany.android.myapex", + apex_name: "com.android.myapex", + exported_bootclasspath_fragments: ["my-bootclasspath-fragment"], + set: "company-myapex.apks", + } + + prebuilt_bootclasspath_fragment { + name: "my-bootclasspath-fragment", + apex_available: ["com.android.myapex"], + %s + } + ` + + t.Run("java_import", func(t *testing.T) { + _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+` + java_import { + name: "libfoo", + jars: ["libfoo.jar"], + apex_available: ["com.android.myapex"], + } + `) + }) + + t.Run("java_sdk_library_import", func(t *testing.T) { + _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+` + java_sdk_library_import { + name: "libfoo", + public: { + jars: ["libbar.jar"], + }, + apex_available: ["com.android.myapex"], + } + `) + }) + + t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) { + _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, ` + image_name: "art", + contents: ["libfoo"], + `)+` + java_sdk_library_import { + name: "libfoo", + public: { + jars: ["libbar.jar"], + }, + apex_available: ["com.android.myapex"], + } + `) + }) +} + func TestUpdatable_should_set_min_sdk_version(t *testing.T) { testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, ` apex { diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 73dcd1951..35eb1f042 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -933,11 +933,15 @@ func (module *prebuiltBootclasspathFragmentModule) produceBootImageFiles(ctx and } var deapexerModule android.Module - ctx.VisitDirectDeps(func(module android.Module) { - tag := ctx.OtherModuleDependencyTag(module) + ctx.VisitDirectDeps(func(to android.Module) { + tag := ctx.OtherModuleDependencyTag(to) // Save away the `deapexer` module on which this depends, if any. if tag == android.DeapexerTag { - deapexerModule = module + if deapexerModule != nil { + ctx.ModuleErrorf("Ambiguous duplicate deapexer module dependencies %q and %q", + deapexerModule.Name(), to.Name()) + } + deapexerModule = to } }) diff --git a/java/java.go b/java/java.go index 71c1b3324..ca63782ed 100644 --- a/java/java.go +++ b/java/java.go @@ -1283,6 +1283,10 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Save away the `deapexer` module on which this depends, if any. if tag == android.DeapexerTag { + if deapexerModule != nil { + ctx.ModuleErrorf("Ambiguous duplicate deapexer module dependencies %q and %q", + deapexerModule.Name(), module.Name()) + } deapexerModule = module } }) diff --git a/java/sdk_library.go b/java/sdk_library.go index d7f53ec04..f2d0c597e 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2160,6 +2160,10 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo // Save away the `deapexer` module on which this depends, if any. if tag == android.DeapexerTag { + if deapexerModule != nil { + ctx.ModuleErrorf("Ambiguous duplicate deapexer module dependencies %q and %q", + deapexerModule.Name(), to.Name()) + } deapexerModule = to } })