From 8f146b99e6a37cce6bedb664ab12bd992ff688ce Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Mon, 12 Apr 2021 17:24:18 +0100 Subject: [PATCH] prebuilt_apex created ApexInfo must not include prebuilt_ prefix As part of the work to modularize the hiddenAPI processing the generation of the monolithic hidden API index file needs to be moved to the platform_bootclasspath module type. Doing that broke the TestBootDexJarsFromSourcesAndPrebuilts tests which checks the inputs to the rule that creates that file. Fixing that required added a platform_bootclasspath module to the test fixture for those tests which highlighted an issue with the prebuilt_apex module. Previously, when the prebuilt_apex created apex variants it would use its own name as the apex variant name, even when that name included the prebuilt_ prefix. That broke the platform_bootclasspath logic as it was looking for apex variants for "myapex" but the only ones available were "prebuilt_myapex". This change ensures that it always uses the unprefixed name and fixes the TestNoUpdatableJarsInBootImage to match. This also adds some improved error reporting in platform_bootclasspath which helped debug this problem. Bug: 177892522 Test: m nothing Change-Id: I3e88b5cec767f77dcc0e94b3ae38b499d07eadf0 --- apex/apex_test.go | 15 ++++++++++----- apex/prebuilt.go | 2 +- java/platform_bootclasspath.go | 25 ++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index 61e886499..f39c7e318 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -4826,7 +4826,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { name: "myapex", enabled: false, key: "myapex.key", - java_libs: ["libfoo"], + java_libs: ["libfoo", "libbar"], } apex_key { @@ -4884,8 +4884,8 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file. checkHiddenAPIIndexInputs(t, ctx, ` -.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv -.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv +.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv +.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv `) }) } @@ -6555,6 +6555,11 @@ func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.F PrepareForTestWithApexBuildComponents, preparer, fs.AddToFixture(), + android.FixtureAddTextFile("frameworks/base/boot/Android.bp", ` + platform_bootclasspath { + name: "platform-bootclasspath", + } + `), ). ExtendWithErrorHandler(errorHandler). RunTestWithBp(t, bp) @@ -6657,13 +6662,13 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { }) t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) { - err := "failed to find a dex jar path for module 'nonexistent'" + err := `"platform-bootclasspath" depends on undefined module "nonexistent"` preparer := java.FixtureConfigureBootJars("platform:nonexistent") testNoUpdatableJarsInBootImage(t, err, preparer) }) t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) { - err := "failed to find a dex jar path for module 'nonexistent'" + err := `"platform-bootclasspath" depends on undefined module "nonexistent"` preparer := java.FixtureConfigureBootJars("platform:nonexistent") testNoUpdatableJarsInBootImage(t, err, preparer) }) diff --git a/apex/prebuilt.go b/apex/prebuilt.go index 10a70a3b7..a9d24a7c5 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -172,7 +172,7 @@ func (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { // Create an ApexInfo for the prebuilt_apex. apexInfo := android.ApexInfo{ - ApexVariationName: mctx.ModuleName(), + ApexVariationName: android.RemoveOptionalPrebuiltPrefix(mctx.ModuleName()), InApexes: []string{mctx.ModuleName()}, ApexContents: []*android.ApexContents{apexContents}, ForPrebuiltApex: true, diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index d98ce6719..d70098080 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -208,7 +208,30 @@ func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex st // error, unless missing dependencies are allowed. The simplest way to handle that is to add a // dependency that will not be satisfied and the default behavior will handle it. if !addedDep { - ctx.AddFarVariationDependencies(variations, tag, name) + // Add dependency on the unprefixed (i.e. source or renamed prebuilt) module which we know does + // not exist. The resulting error message will contain useful information about the available + // variants. + reportMissingVariationDependency(ctx, variations, name) + + // Add dependency on the missing prefixed prebuilt variant too if a module with that name exists + // so that information about its available variants will be reported too. + if ctx.OtherModuleExists(prebuiltName) { + reportMissingVariationDependency(ctx, variations, prebuiltName) + } + } +} + +// reportMissingVariationDependency intentionally adds a dependency on a missing variation in order +// to generate an appropriate error message with information about the available variations. +func reportMissingVariationDependency(ctx android.BottomUpMutatorContext, variations []blueprint.Variation, name string) { + modules := ctx.AddFarVariationDependencies(variations, nil, name) + if len(modules) != 1 { + panic(fmt.Errorf("Internal Error: expected one module, found %d", len(modules))) + return + } + if modules[0] != nil { + panic(fmt.Errorf("Internal Error: expected module to be missing but was found: %q", modules[0])) + return } }