From 7fd531f5d1a92a473ebd6bf3c06d4351c743d569 Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Wed, 5 Jun 2024 19:27:18 +0000 Subject: [PATCH] Identify profile providing apexes using ApexInfo `com.android.art` and its overrides include a `etc/boot-image.prof` which is used on device for profile guided dexopt. ``` $ deapexer list /com.android.art.apex | grep boot-image $ deapexer list /com.google.android.art.apex | grep boot-image ``` To identify that we should include a boot-image.prof in the override apexes, we currently look at ApexInfo.InApexVariants in the context of art's bootclasspath fragment module. InApexVariants are colated based on the min_sdk_version of the top-level apex. At ToT, we have a single variant of `art-bootlcasspath-fragment` for aosp art apex, google art apex and google go art apex. When google go art apex overrides the min_sdk_version, ApexInfo is cleaved, and two distinct variants of art-bootclasspath-fragment are created. The one corresponding to go art apex does not know we should include boot-image.prof To fix this, use AllApexInfoProvider instead. If any of the apexInfos corresponds to com.android.art, include etc/boot-image.prof Test: Added a unit test Test: With https://b.corp.google.com/issues/345173231#comment2 reverted, m com.google.android.go.art && deapexer list # verified that boot-image.prof exists Bug: 345173231 Bug: 295311875 Change-Id: I5a0e8f74725388f05343c64f268260b1eb139ae5 --- apex/bootclasspath_fragment_test.go | 26 ++++++++++++++++++++++++++ java/bootclasspath_fragment.go | 14 ++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/apex/bootclasspath_fragment_test.go b/apex/bootclasspath_fragment_test.go index 778c20a56..af9123e70 100644 --- a/apex/bootclasspath_fragment_test.go +++ b/apex/bootclasspath_fragment_test.go @@ -197,6 +197,12 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { updatable: false, } + override_apex { + name: "com.mycompany.android.art", + base: "com.android.art", + min_sdk_version: "33", // mycompany overrides the min_sdk_version + } + apex_key { name: "com.android.art.key", public_key: "testkey.avbpubkey", @@ -325,6 +331,26 @@ func TestBootclasspathFragmentInArtApex(t *testing.T) { checkCopiesToPredefinedLocationForArt(t, result.Config, module, "bar", "foo") }) + t.Run("boot image files from source of override apex", func(t *testing.T) { + result := android.GroupFixturePreparers( + commonPreparer, + + // Configure some libraries in the art bootclasspath_fragment that match the source + // bootclasspath_fragment's contents property. + java.FixtureConfigureBootJars("com.android.art:foo", "com.android.art:bar"), + dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:foo", "com.android.art:bar"), + addSource("foo", "bar"), + java.FixtureSetBootImageInstallDirOnDevice("art", "apex/com.android.art/javalib"), + ).RunTest(t) + + ensureExactContents(t, result.TestContext, "com.android.art", "android_common_com.mycompany.android.art_com.mycompany.android.art", []string{ + "etc/boot-image.prof", + "etc/classpaths/bootclasspath.pb", + "javalib/bar.jar", + "javalib/foo.jar", + }) + }) + t.Run("generate boot image profile even if dexpreopt is disabled", func(t *testing.T) { result := android.GroupFixturePreparers( commonPreparer, diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 4d3d794d8..16209b72e 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -524,10 +524,16 @@ func (b *BootclasspathFragmentModule) getProfileProviderApex(ctx android.BaseMod } // Bootclasspath fragment modules that are for the platform do not produce boot related files. - apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) - for _, apex := range apexInfo.InApexVariants { - if isProfileProviderApex(ctx, apex) { - return apex + apexInfos, _ := android.ModuleProvider(ctx, android.AllApexInfoProvider) + if apexInfos == nil { + return "" + } + + for _, apexInfo := range apexInfos.ApexInfos { + for _, apex := range apexInfo.InApexVariants { + if isProfileProviderApex(ctx, apex) { + return apex + } } }