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
This commit is contained in:
parent
6c9fa02204
commit
7fd531f5d1
2 changed files with 36 additions and 4 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue