Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fd531f5 authored by Spandan Das's avatar Spandan Das
Browse files

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 <path_in_product_out>/com.android.art.apex | grep
boot-image
$ deapexer list <path_in_product_out>/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 <apex> # verified that
boot-image.prof exists

Bug: 345173231
Bug: 295311875

Change-Id: I5a0e8f74725388f05343c64f268260b1eb139ae5
parent 6c9fa022
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -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,
+10 −4
Original line number Diff line number Diff line
@@ -524,12 +524,18 @@ 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)
	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
			}
		}
	}

	return ""
}