From 8a2c56c5165e90174dffc158fe9c76e13b00ba3d Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Mon, 26 Aug 2024 22:59:55 +0000 Subject: [PATCH] dexpreopt rules for google mainline prebuilts with missing source AddFarVariationDependencies runs into issues in partner workspaces which do not contain the sources of google mainline prebuilts, since the prebuilt would be renamed in a prior prebuilt_rename mutator. To account for this rename, add `prebuilt_` prefix in `addDependenciesOntoSelectedBootImageApexes` to ensure that the prebuilt apex does not get elided Test: m nothing --no-skip-soong-tests Test: in v-aml-prebuilt dev, aninja -t query out/soong/dexpreopt_arm64/dex_bootjars_input/okhttp.jar | head -n3 out/soong/dexpreopt_arm64/dex_bootjars_input/okhttp.jar: input: g.android.Cp out/soong/.intermediates/vendor/partner_modules/ArtPrebuilt/prebuilt_com.google.android.art_compressed.deapexer/android_common/deapexer/javalib/okhttp.jar (uses the prebuilt deapexed boot jar, and no the source apex boot jar) Bug: 362163831 Change-Id: Ie94a36911ab40ac09a470efe505fd00ef3a5bf9c --- apex/dexpreopt_bootjars_test.go | 103 ++++++++++++++++++++++++++++++++ java/dexpreopt_bootjars.go | 4 ++ 2 files changed, 107 insertions(+) diff --git a/apex/dexpreopt_bootjars_test.go b/apex/dexpreopt_bootjars_test.go index 95db37d0a..d8ee4ba6c 100644 --- a/apex/dexpreopt_bootjars_test.go +++ b/apex/dexpreopt_bootjars_test.go @@ -409,3 +409,106 @@ func TestDexpreoptProfileWithMultiplePrebuiltArtApexes(t *testing.T) { android.AssertStringListContains(t, tc.desc, inputs, tc.expectedProfile) } } + +// Check that dexpreopt works with Google mainline prebuilts even in workspaces where source is missing +func TestDexpreoptWithMainlinePrebuiltNoSource(t *testing.T) { + bp := ` + // Platform. + + platform_bootclasspath { + name: "platform-bootclasspath", + fragments: [ + { + apex: "com.android.art", + module: "art-bootclasspath-fragment", + }, + ], + } + + // Source AOSP ART apex + java_library { + name: "core-oj", + srcs: ["core-oj.java"], + installable: true, + apex_available: [ + "com.android.art", + ], + } + + bootclasspath_fragment { + name: "art-bootclasspath-fragment", + image_name: "art", + contents: ["core-oj"], + apex_available: [ + "com.android.art", + ], + hidden_api: { + split_packages: ["*"], + }, + } + + apex_key { + name: "com.android.art.key", + public_key: "com.android.art.avbpubkey", + private_key: "com.android.art.pem", + } + + apex { + name: "com.android.art", + key: "com.android.art.key", + bootclasspath_fragments: ["art-bootclasspath-fragment"], + updatable: false, + } + + + // Prebuilt Google ART APEX. + + java_import { + name: "core-oj", + jars: ["core-oj.jar"], + apex_available: [ + "com.android.art", + ], + } + + prebuilt_bootclasspath_fragment { + name: "art-bootclasspath-fragment", + image_name: "art", + contents: ["core-oj"], + hidden_api: { + annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv", + metadata: "my-bootclasspath-fragment/metadata.csv", + index: "my-bootclasspath-fragment/index.csv", + stub_flags: "my-bootclasspath-fragment/stub-flags.csv", + all_flags: "my-bootclasspath-fragment/all-flags.csv", + }, + apex_available: [ + "com.android.art", + ], + } + + prebuilt_apex { + name: "com.google.android.art", + apex_name: "com.android.art", + src: "com.android.art-arm.apex", + exported_bootclasspath_fragments: ["art-bootclasspath-fragment"], + } + + apex_contributions { + name: "art.prebuilt.contributions", + api_domain: "com.android.art", + contents: ["prebuilt_com.google.android.art"], + } + ` + res := android.GroupFixturePreparers( + java.PrepareForTestWithDexpreopt, + java.PrepareForTestWithJavaSdkLibraryFiles, + java.FixtureConfigureBootJars("com.android.art:core-oj"), + PrepareForTestWithApexBuildComponents, + prepareForTestWithArtApex, + android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ART", "art.prebuilt.contributions"), + ).RunTestWithBp(t, bp) + if !java.CheckModuleHasDependency(t, res.TestContext, "dex_bootjars", "android_common", "prebuilt_com.google.android.art") { + t.Errorf("Expected dexpreopt to use prebuilt apex") + } +} diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index a81ab8316..a2e473469 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -558,6 +558,10 @@ func addDependenciesOntoSelectedBootImageApexes(ctx android.BottomUpMutatorConte apexVariationOfSelected := append(ctx.Target().Variations(), blueprint.Variation{Mutator: "apex", Variation: apex}) if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, selected) { ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected) + } else if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, android.RemoveOptionalPrebuiltPrefix(selected)) { + // The prebuilt might have been renamed by prebuilt_rename mutator if the source module does not exist. + // Remove the prebuilt_ prefix. + ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, android.RemoveOptionalPrebuiltPrefix(selected)) } } }