diff --git a/android/util.go b/android/util.go index 947af699c..8f4c17daa 100644 --- a/android/util.go +++ b/android/util.go @@ -29,6 +29,15 @@ func CopyOf(s []string) []string { return append([]string(nil), s...) } +// Concat returns a new slice concatenated from the two input slices. It does not change the input +// slices. +func Concat[T any](s1, s2 []T) []T { + res := make([]T, 0, len(s1)+len(s2)) + res = append(res, s1...) + res = append(res, s2...) + return res +} + // JoinWithPrefix prepends the prefix to each string in the list and // returns them joined together with " " as separator. func JoinWithPrefix(strs []string, prefix string) string { diff --git a/java/dexpreopt.go b/java/dexpreopt.go index e0a062902..0ffedf6c4 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -293,6 +293,12 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Wr isSystemServerJar := global.AllSystemServerJars(ctx).ContainsJar(moduleName(ctx)) bootImage := defaultBootImageConfig(ctx) + // When `global.PreoptWithUpdatableBcp` is true, `bcpForDexpreopt` below includes the mainline + // boot jars into bootclasspath, so we should include the mainline boot image as well because it's + // generated from those jars. + if global.PreoptWithUpdatableBcp { + bootImage = mainlineBootImageConfig(ctx) + } dexFiles, dexLocations := bcpForDexpreopt(ctx, global.PreoptWithUpdatableBcp) targets := ctx.MultiTargets() diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 40aad0642..f2079b05d 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -16,6 +16,7 @@ package java import ( "path/filepath" + "sort" "strings" "android/soong/android" @@ -312,17 +313,17 @@ type bootImageVariant struct { // All the files that constitute this image variant, i.e. .art, .oat and .vdex files. imagesDeps android.OutputPaths - // The path to the primary image variant's imagePathOnHost field, where primary image variant + // The path to the base image variant's imagePathOnHost field, where base image variant // means the image variant that this extends. // // This is only set for a variant of an image that extends another image. - primaryImages android.OutputPath + baseImages android.OutputPaths - // The paths to the primary image variant's imagesDeps field, where primary image variant + // The paths to the base image variant's imagesDeps field, where base image variant // means the image variant that this extends. // // This is only set for a variant of an image that extends another image. - primaryImagesDeps android.Paths + baseImagesDeps android.Paths // Rules which should be used in make to install the outputs on host. // @@ -511,8 +512,13 @@ func (d *dexpreoptBootJars) GenerateSingletonBuildActions(ctx android.SingletonC defaultImageConfig := defaultBootImageConfig(ctx) d.defaultBootImage = defaultImageConfig - artBootImageConfig := artBootImageConfig(ctx) - d.otherImages = []*bootImageConfig{artBootImageConfig} + imageConfigs := genBootImageConfigs(ctx) + d.otherImages = make([]*bootImageConfig, 0, len(imageConfigs)-1) + for _, config := range imageConfigs { + if config != defaultImageConfig { + d.otherImages = append(d.otherImages, config) + } + } } // shouldBuildBootImages determines whether boot images should be built. @@ -708,9 +714,11 @@ func buildBootImageVariant(ctx android.ModuleContext, image *bootImageVariant, p } if image.extends != nil { - // It is a boot image extension, so it needs the boot image it depends on (in this case the - // primary ART APEX image). - artImage := image.primaryImages + // It is a boot image extension, so it needs the boot images that it depends on. + baseImageLocations := make([]string, 0, len(image.baseImages)) + for _, image := range image.baseImages { + baseImageLocations = append(baseImageLocations, dexpreopt.PathToLocation(image, arch)) + } cmd. Flag("--runtime-arg").FlagWithInputList("-Xbootclasspath:", image.dexPathsDeps.Paths(), ":"). Flag("--runtime-arg").FlagWithList("-Xbootclasspath-locations:", image.dexLocationsDeps, ":"). @@ -718,11 +726,11 @@ func buildBootImageVariant(ctx android.ModuleContext, image *bootImageVariant, p // dex2oat will reconstruct the path to the actual file when it needs it. As the actual path // to the file cannot be passed to the command make sure to add the actual path as an Implicit // dependency to ensure that it is built before the command runs. - FlagWithArg("--boot-image=", dexpreopt.PathToLocation(artImage, arch)).Implicit(artImage). + FlagWithList("--boot-image=", baseImageLocations, ":").Implicits(image.baseImages.Paths()). // Similarly, the dex2oat tool will automatically find the paths to other files in the base // boot image so make sure to add them as implicit dependencies to ensure that they are built // before this command is run. - Implicits(image.primaryImagesDeps) + Implicits(image.baseImagesDeps) } else { // It is a primary image, so it needs a base address. cmd.FlagWithArg("--base=", ctx.Config().LibartImgDeviceBaseAddress()) @@ -1021,6 +1029,8 @@ func (d *dexpreoptBootJars) MakeVars(ctx android.MakeVarsContext) { ctx.Strict("DEXPREOPT_IMAGE_LOCATIONS_ON_DEVICE"+current.name, strings.Join(imageLocationsOnDevice, ":")) ctx.Strict("DEXPREOPT_IMAGE_ZIP_"+current.name, current.zip.String()) } + // Ensure determinism. + sort.Strings(imageNames) ctx.Strict("DEXPREOPT_IMAGE_NAMES", strings.Join(imageNames, " ")) } } diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index 2975130f3..117b660b7 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -44,6 +44,8 @@ var ( bootImageConfigRawKey = android.NewOnceKey("bootImageConfigRaw") artBootImageName = "art" frameworkBootImageName = "boot" + mainlineBootImageName = "mainline" + bootImageStem = "boot" ) func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig { @@ -52,14 +54,16 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig artModules := global.ArtApexJars frameworkModules := global.BootJars.RemoveList(artModules) + mainlineBcpModules := global.ApexBootJars + frameworkSubdir := "system/framework" // ART config for the primary boot image in the ART apex. // It includes the Core Libraries. artCfg := bootImageConfig{ name: artBootImageName, - stem: "boot", + stem: bootImageStem, installDirOnHost: "apex/art_boot_images/javalib", - installDirOnDevice: "system/framework", + installDirOnDevice: frameworkSubdir, profileInstallPathInApex: "etc/boot-image.prof", modules: artModules, preloadedClassesFile: "art/build/boot/preloaded-classes", @@ -68,11 +72,10 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig // Framework config for the boot image extension. // It includes framework libraries and depends on the ART config. - frameworkSubdir := "system/framework" frameworkCfg := bootImageConfig{ extends: &artCfg, name: frameworkBootImageName, - stem: "boot", + stem: bootImageStem, installDirOnHost: frameworkSubdir, installDirOnDevice: frameworkSubdir, modules: frameworkModules, @@ -80,9 +83,20 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig compilerFilter: "speed-profile", } + mainlineCfg := bootImageConfig{ + extends: &frameworkCfg, + name: mainlineBootImageName, + stem: bootImageStem, + installDirOnHost: frameworkSubdir, + installDirOnDevice: frameworkSubdir, + modules: mainlineBcpModules, + compilerFilter: "verify", + } + return map[string]*bootImageConfig{ artBootImageName: &artCfg, frameworkBootImageName: &frameworkCfg, + mainlineBootImageName: &mainlineCfg, } }).(map[string]*bootImageConfig) } @@ -94,10 +108,7 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { deviceDir := android.PathForOutput(ctx, ctx.Config().DeviceName()) configs := genBootImageConfigRaw(ctx) - artCfg := configs[artBootImageName] - frameworkCfg := configs[frameworkBootImageName] - // common to all configs for _, c := range configs { c.dir = deviceDir.Join(ctx, "dex_"+c.name+"jars") c.symbolsDir = deviceDir.Join(ctx, "dex_"+c.name+"jars_unstripped") @@ -133,18 +144,42 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { c.zip = c.dir.Join(ctx, c.name+".zip") } - // specific to the framework config - frameworkCfg.dexPathsDeps = append(artCfg.dexPathsDeps, frameworkCfg.dexPathsDeps...) - for i := range targets { - frameworkCfg.variants[i].primaryImages = artCfg.variants[i].imagePathOnHost - frameworkCfg.variants[i].primaryImagesDeps = artCfg.variants[i].imagesDeps.Paths() - frameworkCfg.variants[i].dexLocationsDeps = append(artCfg.variants[i].dexLocations, frameworkCfg.variants[i].dexLocationsDeps...) + visited := make(map[string]bool) + for _, c := range configs { + calculateDepsRecursive(c, targets, visited) } return configs }).(map[string]*bootImageConfig) } +// calculateDepsRecursive calculates the dependencies of the given boot image config and all its +// ancestors, if they are not visited. +// The boot images are supposed to form a tree, where the root is the primary boot image. We do not +// expect loops (e.g., A extends B, B extends C, C extends A), and we let them crash soong with a +// stack overflow. +// Note that a boot image config only has a pointer to the parent, not to children. Therefore, we +// first go up through the parent chain, and then go back down to visit every code along the path. +// `visited` is a map where a key is a boot image name and the value indicates whether the boot +// image config is visited. The boot image names are guaranteed to be unique because they come from +// `genBootImageConfigRaw` above, which also returns a map and would fail in the first place if the +// names were not unique. +func calculateDepsRecursive(c *bootImageConfig, targets []android.Target, visited map[string]bool) { + if c.extends == nil || visited[c.name] { + return + } + if c.extends.extends != nil { + calculateDepsRecursive(c.extends, targets, visited) + } + visited[c.name] = true + c.dexPathsDeps = android.Concat(c.extends.dexPathsDeps, c.dexPathsDeps) + for i := range targets { + c.variants[i].baseImages = android.Concat(c.extends.variants[i].baseImages, android.OutputPaths{c.extends.variants[i].imagePathOnHost}) + c.variants[i].baseImagesDeps = android.Concat(c.extends.variants[i].baseImagesDeps, c.extends.variants[i].imagesDeps.Paths()) + c.variants[i].dexLocationsDeps = android.Concat(c.extends.variants[i].dexLocationsDeps, c.variants[i].dexLocationsDeps) + } +} + func artBootImageConfig(ctx android.PathContext) *bootImageConfig { return genBootImageConfigs(ctx)[artBootImageName] } @@ -153,6 +188,10 @@ func defaultBootImageConfig(ctx android.PathContext) *bootImageConfig { return genBootImageConfigs(ctx)[frameworkBootImageName] } +func mainlineBootImageConfig(ctx android.PathContext) *bootImageConfig { + return genBootImageConfigs(ctx)[mainlineBootImageName] +} + // Apex boot config allows to access build/install paths of apex boot jars without going // through the usual trouble of registering dependencies on those modules and extracting build paths // from those dependencies. diff --git a/java/dexpreopt_config_test.go b/java/dexpreopt_config_test.go index b704d09d2..cd7f295c8 100644 --- a/java/dexpreopt_config_test.go +++ b/java/dexpreopt_config_test.go @@ -28,8 +28,10 @@ func TestBootImageConfig(t *testing.T) { result := android.GroupFixturePreparers( PrepareForBootImageConfigTest, + PrepareApexBootJarConfigs, ).RunTest(t) CheckArtBootImageConfig(t, result) CheckFrameworkBootImageConfig(t, result) + CheckMainlineBootImageConfig(t, result) } diff --git a/java/dexpreopt_config_testing.go b/java/dexpreopt_config_testing.go index 1c236d8af..c27f4c6da 100644 --- a/java/dexpreopt_config_testing.go +++ b/java/dexpreopt_config_testing.go @@ -39,6 +39,78 @@ var PrepareForBootImageConfigTest = android.GroupFixturePreparers( FixtureConfigureBootJars("com.android.art:core1", "com.android.art:core2", "platform:framework"), ) +var PrepareApexBootJarConfigs = FixtureConfigureApexBootJars( + "com.android.foo:framework-foo", "com.android.bar:framework-bar") + +var PrepareApexBootJarConfigsAndModules = android.GroupFixturePreparers( + PrepareApexBootJarConfigs, + prepareApexBootJarModule("com.android.foo", "framework-foo"), + prepareApexBootJarModule("com.android.bar", "framework-bar"), +) + +var ApexBootJarFragmentsForPlatformBootclasspath = fmt.Sprintf(` + { + apex: "%[1]s", + module: "%[1]s-bootclasspathfragment", + }, + { + apex: "%[2]s", + module: "%[2]s-bootclasspathfragment", + }, +`, "com.android.foo", "com.android.bar") + +var ApexBootJarDexJarPaths = []string{ + "out/soong/.intermediates/packages/modules/com.android.bar/framework-bar/android_common_apex10000/aligned/framework-bar.jar", + "out/soong/.intermediates/packages/modules/com.android.foo/framework-foo/android_common_apex10000/aligned/framework-foo.jar", +} + +func prepareApexBootJarModule(apexName string, moduleName string) android.FixturePreparer { + moduleSourceDir := fmt.Sprintf("packages/modules/%s", apexName) + return android.GroupFixturePreparers( + android.FixtureAddTextFile(moduleSourceDir+"/Android.bp", fmt.Sprintf(` + apex { + name: "%[1]s", + key: "%[1]s.key", + bootclasspath_fragments: [ + "%[1]s-bootclasspathfragment", + ], + updatable: false, + } + + apex_key { + name: "%[1]s.key", + public_key: "%[1]s.avbpubkey", + private_key: "%[1]s.pem", + } + + bootclasspath_fragment { + name: "%[1]s-bootclasspathfragment", + contents: ["%[2]s"], + apex_available: ["%[1]s"], + hidden_api: { + split_packages: ["*"], + }, + } + + java_library { + name: "%[2]s", + srcs: ["%[2]s.java"], + system_modules: "none", + sdk_version: "none", + compile_dex: true, + apex_available: ["%[1]s"], + } + `, apexName, moduleName)), + android.FixtureMergeMockFs(android.MockFS{ + fmt.Sprintf("%s/apex_manifest.json", moduleSourceDir): nil, + fmt.Sprintf("%s/%s.avbpubkey", moduleSourceDir, apexName): nil, + fmt.Sprintf("%s/%s.pem", moduleSourceDir, apexName): nil, + fmt.Sprintf("system/sepolicy/apex/%s-file_contexts", apexName): nil, + fmt.Sprintf("%s/%s.java", moduleSourceDir, moduleName): nil, + }), + ) +} + // normalizedInstall represents a android.RuleBuilderInstall that has been normalized to remove // test specific parts of the From path. type normalizedInstall struct { @@ -100,8 +172,8 @@ type expectedVariant struct { imagePathOnHost string imagePathOnDevice string imagesDeps []string - primaryImages string - primaryImagesDeps []string + baseImages []string + baseImagesDeps []string // Mutated fields installs []normalizedInstall @@ -413,8 +485,8 @@ func checkFrameworkBootImageConfig(t *testing.T, result *android.TestResult, mut "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.oat", "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.vdex", }, - primaryImages: "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art", - primaryImagesDeps: []string{ + baseImages: []string{"out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art"}, + baseImagesDeps: []string{ "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art", "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat", "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex", @@ -461,8 +533,8 @@ func checkFrameworkBootImageConfig(t *testing.T, result *android.TestResult, mut "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.oat", "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.vdex", }, - primaryImages: "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art", - primaryImagesDeps: []string{ + baseImages: []string{"out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art"}, + baseImagesDeps: []string{ "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art", "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat", "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex", @@ -509,8 +581,8 @@ func checkFrameworkBootImageConfig(t *testing.T, result *android.TestResult, mut "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.oat", "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.vdex", }, - primaryImages: "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.art", - primaryImagesDeps: []string{ + baseImages: []string{"out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.art"}, + baseImagesDeps: []string{ "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.art", "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.oat", "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.vdex", @@ -557,8 +629,8 @@ func checkFrameworkBootImageConfig(t *testing.T, result *android.TestResult, mut "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.oat", "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.vdex", }, - primaryImages: "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art", - primaryImagesDeps: []string{ + baseImages: []string{"out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art"}, + baseImagesDeps: []string{ "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art", "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.oat", "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.vdex", @@ -601,6 +673,366 @@ func checkFrameworkBootImageConfig(t *testing.T, result *android.TestResult, mut checkBootImageConfig(t, imageConfig, mutated, expected) } +// getMainlineImageConfig gets the framework bootImageConfig that was created during the test. +func getMainlineImageConfig(result *android.TestResult) *bootImageConfig { + pathCtx := &android.TestPathContext{TestResult: result} + imageConfig := mainlineBootImageConfig(pathCtx) + return imageConfig +} + +// CheckMainlineBootImageConfig checks the status of the fields of the bootImageConfig and +// bootImageVariant structures that are returned from mainlineBootImageConfig. +// +// This is before any fields are mutated. +func CheckMainlineBootImageConfig(t *testing.T, result *android.TestResult) { + expectedLicenseMetadataFile := "" + imageConfig := getMainlineImageConfig(result) + + expected := &expectedConfig{ + name: "mainline", + stem: "boot", + dir: "out/soong/test_device/dex_mainlinejars", + symbolsDir: "out/soong/test_device/dex_mainlinejars_unstripped", + installDirOnDevice: "system/framework", + installDirOnHost: "system/framework", + profileInstallPathInApex: "", + modules: android.CreateTestConfiguredJarList([]string{ + "com.android.foo:framework-foo", + "com.android.bar:framework-bar", + }), + dexPaths: []string{ + "out/soong/test_device/dex_mainlinejars_input/framework-foo.jar", + "out/soong/test_device/dex_mainlinejars_input/framework-bar.jar", + }, + dexPathsDeps: []string{ + "out/soong/test_device/dex_artjars_input/core1.jar", + "out/soong/test_device/dex_artjars_input/core2.jar", + "out/soong/test_device/dex_bootjars_input/framework.jar", + "out/soong/test_device/dex_mainlinejars_input/framework-foo.jar", + "out/soong/test_device/dex_mainlinejars_input/framework-bar.jar", + }, + zip: "out/soong/test_device/dex_mainlinejars/mainline.zip", + variants: []*expectedVariant{ + { + archType: android.Arm64, + dexLocations: []string{ + "/apex/com.android.foo/javalib/framework-foo.jar", + "/apex/com.android.bar/javalib/framework-bar.jar", + }, + dexLocationsDeps: []string{ + "/apex/com.android.art/javalib/core1.jar", + "/apex/com.android.art/javalib/core2.jar", + "/system/framework/framework.jar", + "/apex/com.android.foo/javalib/framework-foo.jar", + "/apex/com.android.bar/javalib/framework-bar.jar", + }, + imagePathOnHost: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art", + imagePathOnDevice: "/system/framework/arm64/boot-framework-foo.art", + imagesDeps: []string{ + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.oat", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.vdex", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.art", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.oat", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.vdex", + }, + baseImages: []string{ + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art", + "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.art", + }, + baseImagesDeps: []string{ + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.art", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.oat", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.vdex", + "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.art", + "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.oat", + "out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.vdex", + }, + installs: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art", + to: "/system/framework/arm64/boot-framework-foo.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.oat", + to: "/system/framework/arm64/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.art", + to: "/system/framework/arm64/boot-framework-bar.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.oat", + to: "/system/framework/arm64/boot-framework-bar.oat", + }, + }, + vdexInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.vdex", + to: "/system/framework/arm64/boot-framework-foo.vdex", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.vdex", + to: "/system/framework/arm64/boot-framework-bar.vdex", + }, + }, + unstrippedInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm64/boot-framework-foo.oat", + to: "/system/framework/arm64/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm64/boot-framework-bar.oat", + to: "/system/framework/arm64/boot-framework-bar.oat", + }, + }, + licenseMetadataFile: expectedLicenseMetadataFile, + }, + { + archType: android.Arm, + dexLocations: []string{ + "/apex/com.android.foo/javalib/framework-foo.jar", + "/apex/com.android.bar/javalib/framework-bar.jar", + }, + dexLocationsDeps: []string{ + "/apex/com.android.art/javalib/core1.jar", + "/apex/com.android.art/javalib/core2.jar", + "/system/framework/framework.jar", + "/apex/com.android.foo/javalib/framework-foo.jar", + "/apex/com.android.bar/javalib/framework-bar.jar", + }, + imagePathOnHost: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art", + imagePathOnDevice: "/system/framework/arm/boot-framework-foo.art", + imagesDeps: []string{ + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.oat", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.vdex", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.art", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.oat", + "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.vdex", + }, + baseImages: []string{ + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art", + "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.art", + }, + baseImagesDeps: []string{ + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.art", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.oat", + "out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.vdex", + "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.art", + "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.oat", + "out/soong/test_device/dex_bootjars/android/system/framework/arm/boot-framework.vdex", + }, + installs: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art", + to: "/system/framework/arm/boot-framework-foo.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.oat", + to: "/system/framework/arm/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.art", + to: "/system/framework/arm/boot-framework-bar.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.oat", + to: "/system/framework/arm/boot-framework-bar.oat", + }, + }, + vdexInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.vdex", + to: "/system/framework/arm/boot-framework-foo.vdex", + }, + { + from: "out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.vdex", + to: "/system/framework/arm/boot-framework-bar.vdex", + }, + }, + unstrippedInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm/boot-framework-foo.oat", + to: "/system/framework/arm/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm/boot-framework-bar.oat", + to: "/system/framework/arm/boot-framework-bar.oat", + }, + }, + licenseMetadataFile: expectedLicenseMetadataFile, + }, + { + archType: android.X86_64, + dexLocations: []string{ + "host/linux-x86/apex/com.android.foo/javalib/framework-foo.jar", + "host/linux-x86/apex/com.android.bar/javalib/framework-bar.jar", + }, + dexLocationsDeps: []string{ + "host/linux-x86/apex/com.android.art/javalib/core1.jar", + "host/linux-x86/apex/com.android.art/javalib/core2.jar", + "host/linux-x86/system/framework/framework.jar", + "host/linux-x86/apex/com.android.foo/javalib/framework-foo.jar", + "host/linux-x86/apex/com.android.bar/javalib/framework-bar.jar", + }, + imagePathOnHost: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art", + imagePathOnDevice: "/system/framework/x86_64/boot-framework-foo.art", + imagesDeps: []string{ + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.oat", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.vdex", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.art", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.oat", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.vdex", + }, + baseImages: []string{ + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.art", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.art", + }, + baseImagesDeps: []string{ + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.art", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.oat", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot.vdex", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot-core2.art", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot-core2.oat", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86_64/boot-core2.vdex", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.art", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.oat", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.vdex", + }, + installs: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art", + to: "/system/framework/x86_64/boot-framework-foo.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.oat", + to: "/system/framework/x86_64/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.art", + to: "/system/framework/x86_64/boot-framework-bar.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.oat", + to: "/system/framework/x86_64/boot-framework-bar.oat", + }, + }, + vdexInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.vdex", + to: "/system/framework/x86_64/boot-framework-foo.vdex", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.vdex", + to: "/system/framework/x86_64/boot-framework-bar.vdex", + }, + }, + unstrippedInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86_64/boot-framework-foo.oat", + to: "/system/framework/x86_64/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86_64/boot-framework-bar.oat", + to: "/system/framework/x86_64/boot-framework-bar.oat", + }, + }, + licenseMetadataFile: expectedLicenseMetadataFile, + }, + { + archType: android.X86, + dexLocations: []string{ + "host/linux-x86/apex/com.android.foo/javalib/framework-foo.jar", + "host/linux-x86/apex/com.android.bar/javalib/framework-bar.jar", + }, + dexLocationsDeps: []string{ + "host/linux-x86/apex/com.android.art/javalib/core1.jar", + "host/linux-x86/apex/com.android.art/javalib/core2.jar", + "host/linux-x86/system/framework/framework.jar", + "host/linux-x86/apex/com.android.foo/javalib/framework-foo.jar", + "host/linux-x86/apex/com.android.bar/javalib/framework-bar.jar", + }, + imagePathOnHost: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art", + imagePathOnDevice: "/system/framework/x86/boot-framework-foo.art", + imagesDeps: []string{ + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.oat", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.vdex", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.art", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.oat", + "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.vdex", + }, + baseImages: []string{ + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.art", + }, + baseImagesDeps: []string{ + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.oat", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.vdex", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.art", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.oat", + "out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.vdex", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.art", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.oat", + "out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.vdex", + }, + installs: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art", + to: "/system/framework/x86/boot-framework-foo.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.oat", + to: "/system/framework/x86/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.art", + to: "/system/framework/x86/boot-framework-bar.art", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.oat", + to: "/system/framework/x86/boot-framework-bar.oat", + }, + }, + vdexInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.vdex", + to: "/system/framework/x86/boot-framework-foo.vdex", + }, + { + from: "out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.vdex", + to: "/system/framework/x86/boot-framework-bar.vdex", + }, + }, + unstrippedInstalls: []normalizedInstall{ + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86/boot-framework-foo.oat", + to: "/system/framework/x86/boot-framework-foo.oat", + }, + { + from: "out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86/boot-framework-bar.oat", + to: "/system/framework/x86/boot-framework-bar.oat", + }, + }, + licenseMetadataFile: expectedLicenseMetadataFile, + }, + }, + profileInstalls: []normalizedInstall{}, + profileLicenseMetadataFile: expectedLicenseMetadataFile, + } + + checkBootImageConfig(t, imageConfig, false, expected) +} + // clearMutatedFields clears fields in the expectedConfig that correspond to fields in the // bootImageConfig/bootImageVariant structs which are mutated outside the call to // genBootImageConfigs. @@ -664,8 +1096,8 @@ func nestedCheckBootImageConfig(t *testing.T, imageConfig *bootImageConfig, expe android.AssertPathRelativeToTopEquals(t, "imagePathOnHost", expectedVariant.imagePathOnHost, variant.imagePathOnHost) android.AssertStringEquals(t, "imagePathOnDevice", expectedVariant.imagePathOnDevice, variant.imagePathOnDevice) android.AssertPathsRelativeToTopEquals(t, "imagesDeps", expectedVariant.imagesDeps, variant.imagesDeps.Paths()) - android.AssertPathRelativeToTopEquals(t, "primaryImages", expectedVariant.primaryImages, variant.primaryImages) - android.AssertPathsRelativeToTopEquals(t, "primaryImagesDeps", expectedVariant.primaryImagesDeps, variant.primaryImagesDeps) + android.AssertPathsRelativeToTopEquals(t, "baseImages", expectedVariant.baseImages, variant.baseImages.Paths()) + android.AssertPathsRelativeToTopEquals(t, "baseImagesDeps", expectedVariant.baseImagesDeps, variant.baseImagesDeps) assertInstallsEqual(t, "installs", expectedVariant.installs, variant.installs) assertInstallsEqual(t, "vdexInstalls", expectedVariant.vdexInstalls, variant.vdexInstalls) assertInstallsEqual(t, "unstrippedInstalls", expectedVariant.unstrippedInstalls, variant.unstrippedInstalls) @@ -712,6 +1144,10 @@ DEXPREOPT_IMAGE_BUILT_INSTALLED_boot_arm=out/soong/test_device/dex_bootjars/andr DEXPREOPT_IMAGE_BUILT_INSTALLED_boot_arm64=out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.art:/system/framework/arm64/boot-framework.art out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.oat:/system/framework/arm64/boot-framework.oat DEXPREOPT_IMAGE_BUILT_INSTALLED_boot_host_x86=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.art:/system/framework/x86/boot-framework.art out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.oat:/system/framework/x86/boot-framework.oat DEXPREOPT_IMAGE_BUILT_INSTALLED_boot_host_x86_64=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.art:/system/framework/x86_64/boot-framework.art out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.oat:/system/framework/x86_64/boot-framework.oat +DEXPREOPT_IMAGE_BUILT_INSTALLED_mainline_arm=out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art:/system/framework/arm/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.oat:/system/framework/arm/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.art:/system/framework/arm/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.oat:/system/framework/arm/boot-framework-bar.oat +DEXPREOPT_IMAGE_BUILT_INSTALLED_mainline_arm64=out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art:/system/framework/arm64/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.oat:/system/framework/arm64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.art:/system/framework/arm64/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.oat:/system/framework/arm64/boot-framework-bar.oat +DEXPREOPT_IMAGE_BUILT_INSTALLED_mainline_host_x86=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art:/system/framework/x86/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.oat:/system/framework/x86/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.art:/system/framework/x86/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.oat:/system/framework/x86/boot-framework-bar.oat +DEXPREOPT_IMAGE_BUILT_INSTALLED_mainline_host_x86_64=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art:/system/framework/x86_64/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.oat:/system/framework/x86_64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.art:/system/framework/x86_64/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.oat:/system/framework/x86_64/boot-framework-bar.oat DEXPREOPT_IMAGE_DEPS_art_arm=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.oat out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.art out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.oat out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.vdex DEXPREOPT_IMAGE_DEPS_art_arm64=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.oat out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.art out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.oat out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.vdex DEXPREOPT_IMAGE_DEPS_art_host_x86=out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.oat out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.vdex out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.art out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.oat out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.vdex @@ -720,6 +1156,10 @@ DEXPREOPT_IMAGE_DEPS_boot_arm=out/soong/test_device/dex_bootjars/android/system/ DEXPREOPT_IMAGE_DEPS_boot_arm64=out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.art out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.oat out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.vdex DEXPREOPT_IMAGE_DEPS_boot_host_x86=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.art out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.oat out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.vdex DEXPREOPT_IMAGE_DEPS_boot_host_x86_64=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.art out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.oat out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.vdex +DEXPREOPT_IMAGE_DEPS_mainline_arm=out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.vdex +DEXPREOPT_IMAGE_DEPS_mainline_arm64=out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.oat out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.vdex +DEXPREOPT_IMAGE_DEPS_mainline_host_x86=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.vdex +DEXPREOPT_IMAGE_DEPS_mainline_host_x86_64=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.art out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.oat out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.vdex DEXPREOPT_IMAGE_LICENSE_METADATA_art_arm=%[1]s DEXPREOPT_IMAGE_LICENSE_METADATA_art_arm64=%[1]s DEXPREOPT_IMAGE_LICENSE_METADATA_art_host_x86=%[1]s @@ -728,11 +1168,17 @@ DEXPREOPT_IMAGE_LICENSE_METADATA_boot_arm=out/soong/.intermediates/frameworks/ba DEXPREOPT_IMAGE_LICENSE_METADATA_boot_arm64=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic DEXPREOPT_IMAGE_LICENSE_METADATA_boot_host_x86=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic DEXPREOPT_IMAGE_LICENSE_METADATA_boot_host_x86_64=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic +DEXPREOPT_IMAGE_LICENSE_METADATA_mainline_arm=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic +DEXPREOPT_IMAGE_LICENSE_METADATA_mainline_arm64=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic +DEXPREOPT_IMAGE_LICENSE_METADATA_mainline_host_x86=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic +DEXPREOPT_IMAGE_LICENSE_METADATA_mainline_host_x86_64=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic DEXPREOPT_IMAGE_LOCATIONS_ON_DEVICEart=/system/framework/boot.art DEXPREOPT_IMAGE_LOCATIONS_ON_DEVICEboot=/system/framework/boot.art:/system/framework/boot-framework.art +DEXPREOPT_IMAGE_LOCATIONS_ON_DEVICEmainline=/system/framework/boot.art:/system/framework/boot-framework.art:/system/framework/boot-framework-foo.art DEXPREOPT_IMAGE_LOCATIONS_ON_HOSTart=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/boot.art DEXPREOPT_IMAGE_LOCATIONS_ON_HOSTboot=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/boot.art:out/soong/test_device/dex_bootjars/android/system/framework/boot-framework.art -DEXPREOPT_IMAGE_NAMES=art boot +DEXPREOPT_IMAGE_LOCATIONS_ON_HOSTmainline=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/boot.art:out/soong/test_device/dex_bootjars/android/system/framework/boot-framework.art:out/soong/test_device/dex_mainlinejars/android/system/framework/boot-framework-foo.art +DEXPREOPT_IMAGE_NAMES=art boot mainline DEXPREOPT_IMAGE_PROFILE_BUILT_INSTALLED=out/soong/test_device/dex_bootjars/boot.bprof:/system/etc/boot-image.bprof out/soong/test_device/dex_bootjars/boot.prof:/system/etc/boot-image.prof DEXPREOPT_IMAGE_PROFILE_LICENSE_METADATA=out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_art_arm=out/soong/test_device/dex_artjars_unstripped/android/apex/art_boot_images/javalib/arm/boot.oat:/apex/art_boot_images/javalib/arm/boot.oat out/soong/test_device/dex_artjars_unstripped/android/apex/art_boot_images/javalib/arm/boot-core2.oat:/apex/art_boot_images/javalib/arm/boot-core2.oat @@ -743,6 +1189,10 @@ DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_boot_arm=out/soong/test_device/dex_bo DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_boot_arm64=out/soong/test_device/dex_bootjars_unstripped/android/system/framework/arm64/boot-framework.oat:/system/framework/arm64/boot-framework.oat DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_boot_host_x86=out/soong/test_device/dex_bootjars_unstripped/linux_glibc/system/framework/x86/boot-framework.oat:/system/framework/x86/boot-framework.oat DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_boot_host_x86_64=out/soong/test_device/dex_bootjars_unstripped/linux_glibc/system/framework/x86_64/boot-framework.oat:/system/framework/x86_64/boot-framework.oat +DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_mainline_arm=out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm/boot-framework-foo.oat:/system/framework/arm/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm/boot-framework-bar.oat:/system/framework/arm/boot-framework-bar.oat +DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_mainline_arm64=out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm64/boot-framework-foo.oat:/system/framework/arm64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars_unstripped/android/system/framework/arm64/boot-framework-bar.oat:/system/framework/arm64/boot-framework-bar.oat +DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_mainline_host_x86=out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86/boot-framework-foo.oat:/system/framework/x86/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86/boot-framework-bar.oat:/system/framework/x86/boot-framework-bar.oat +DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_mainline_host_x86_64=out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86_64/boot-framework-foo.oat:/system/framework/x86_64/boot-framework-foo.oat out/soong/test_device/dex_mainlinejars_unstripped/linux_glibc/system/framework/x86_64/boot-framework-bar.oat:/system/framework/x86_64/boot-framework-bar.oat DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_art_arm=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.vdex:/apex/art_boot_images/javalib/arm/boot.vdex out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot-core2.vdex:/apex/art_boot_images/javalib/arm/boot-core2.vdex DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_art_arm64=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.vdex:/apex/art_boot_images/javalib/arm64/boot.vdex out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot-core2.vdex:/apex/art_boot_images/javalib/arm64/boot-core2.vdex DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_art_host_x86=out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.vdex:/apex/art_boot_images/javalib/x86/boot.vdex out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot-core2.vdex:/apex/art_boot_images/javalib/x86/boot-core2.vdex @@ -751,8 +1201,13 @@ DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_boot_arm=out/soong/test_device/dex_bootjars DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_boot_arm64=out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.vdex:/system/framework/arm64/boot-framework.vdex DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_boot_host_x86=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.vdex:/system/framework/x86/boot-framework.vdex DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_boot_host_x86_64=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.vdex:/system/framework/x86_64/boot-framework.vdex +DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_mainline_arm=out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.vdex:/system/framework/arm/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-bar.vdex:/system/framework/arm/boot-framework-bar.vdex +DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_mainline_arm64=out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.vdex:/system/framework/arm64/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-bar.vdex:/system/framework/arm64/boot-framework-bar.vdex +DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_mainline_host_x86=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.vdex:/system/framework/x86/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-bar.vdex:/system/framework/x86/boot-framework-bar.vdex +DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_mainline_host_x86_64=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.vdex:/system/framework/x86_64/boot-framework-foo.vdex out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-bar.vdex:/system/framework/x86_64/boot-framework-bar.vdex DEXPREOPT_IMAGE_ZIP_art=out/soong/test_device/dex_artjars/art.zip DEXPREOPT_IMAGE_ZIP_boot=out/soong/test_device/dex_bootjars/boot.zip +DEXPREOPT_IMAGE_ZIP_mainline=out/soong/test_device/dex_mainlinejars/mainline.zip DEXPREOPT_IMAGE_art_arm=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm/boot.art DEXPREOPT_IMAGE_art_arm64=out/soong/test_device/dex_artjars/android/apex/art_boot_images/javalib/arm64/boot.art DEXPREOPT_IMAGE_art_host_x86=out/soong/test_device/dex_artjars/linux_glibc/apex/art_boot_images/javalib/x86/boot.art @@ -761,6 +1216,10 @@ DEXPREOPT_IMAGE_boot_arm=out/soong/test_device/dex_bootjars/android/system/frame DEXPREOPT_IMAGE_boot_arm64=out/soong/test_device/dex_bootjars/android/system/framework/arm64/boot-framework.art DEXPREOPT_IMAGE_boot_host_x86=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86/boot-framework.art DEXPREOPT_IMAGE_boot_host_x86_64=out/soong/test_device/dex_bootjars/linux_glibc/system/framework/x86_64/boot-framework.art +DEXPREOPT_IMAGE_mainline_arm=out/soong/test_device/dex_mainlinejars/android/system/framework/arm/boot-framework-foo.art +DEXPREOPT_IMAGE_mainline_arm64=out/soong/test_device/dex_mainlinejars/android/system/framework/arm64/boot-framework-foo.art +DEXPREOPT_IMAGE_mainline_host_x86=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86/boot-framework-foo.art +DEXPREOPT_IMAGE_mainline_host_x86_64=out/soong/test_device/dex_mainlinejars/linux_glibc/system/framework/x86_64/boot-framework-foo.art ` expected := strings.TrimSpace(fmt.Sprintf(format, expectedLicenseMetadataFile)) actual := strings.TrimSpace(out.String()) diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index f0de7a4d8..0ea360979 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -129,7 +129,7 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto // Add dependencies on all the non-updatable module configured in the "boot" boot image. That does // not include modules configured in the "art" boot image. - bootImageConfig := b.getImageConfig(ctx) + bootImageConfig := defaultBootImageConfig(ctx) addDependenciesOntoBootImageModules(ctx, bootImageConfig.modules, platformBootclasspathBootJarDepTag) // Add dependencies on all the apex jars. @@ -205,7 +205,7 @@ func (b *platformBootclasspathModule) generateClasspathProtoBuildActions(ctx and func (b *platformBootclasspathModule) configuredJars(ctx android.ModuleContext) android.ConfiguredJarList { // Include all non APEX jars - jars := b.getImageConfig(ctx).modules + jars := defaultBootImageConfig(ctx).modules // Include jars from APEXes that don't populate their classpath proto config. remainingJars := dexpreopt.GetGlobalConfig(ctx).ApexBootJars @@ -266,10 +266,6 @@ func (b *platformBootclasspathModule) checkApexModules(ctx android.ModuleContext } } -func (b *platformBootclasspathModule) getImageConfig(ctx android.EarlyModuleContext) *bootImageConfig { - return defaultBootImageConfig(ctx) -} - // generateHiddenAPIBuildActions generates all the hidden API related build rules. func (b *platformBootclasspathModule) generateHiddenAPIBuildActions(ctx android.ModuleContext, modules []android.Module, fragments []android.Module) bootDexJarByModule { @@ -410,27 +406,25 @@ func (b *platformBootclasspathModule) generateBootImageBuildActions(ctx android. // GenerateSingletonBuildActions method as it cannot create it for itself. dexpreopt.GetGlobalSoongConfig(ctx) - imageConfig := b.getImageConfig(ctx) - if imageConfig == nil { - return - } - global := dexpreopt.GetGlobalConfig(ctx) if !shouldBuildBootImages(ctx.Config(), global) { return } - // Generate the framework profile rule - bootFrameworkProfileRule(ctx, imageConfig) + frameworkBootImageConfig := defaultBootImageConfig(ctx) + bootFrameworkProfileRule(ctx, frameworkBootImageConfig) + b.generateBootImage(ctx, frameworkBootImageName, platformModules) + b.generateBootImage(ctx, mainlineBootImageName, apexModules) + b.copyApexBootJarsForAppsDexpreopt(ctx, apexModules) + dumpOatRules(ctx, frameworkBootImageConfig) +} - // Copy platform module dex jars to their predefined locations. - platformBootDexJarsByModule := extractEncodedDexJarsFromModules(ctx, platformModules) - copyBootJarsToPredefinedLocations(ctx, platformBootDexJarsByModule, imageConfig.dexPathsByModule) +func (b *platformBootclasspathModule) generateBootImage(ctx android.ModuleContext, imageName string, modules []android.Module) { + imageConfig := genBootImageConfigs(ctx)[imageName] - // Copy apex module dex jars to their predefined locations. - config := GetApexBootConfig(ctx) - apexBootDexJarsByModule := extractEncodedDexJarsFromModules(ctx, apexModules) - copyBootJarsToPredefinedLocations(ctx, apexBootDexJarsByModule, config.dexPathsByModule) + // Copy module dex jars to their predefined locations. + bootDexJarsByModule := extractEncodedDexJarsFromModules(ctx, modules) + copyBootJarsToPredefinedLocations(ctx, bootDexJarsByModule, imageConfig.dexPathsByModule) // Build a profile for the image config and then use that to build the boot image. profile := bootImageProfileRule(ctx, imageConfig) @@ -443,6 +437,11 @@ func (b *platformBootclasspathModule) generateBootImageBuildActions(ctx android. // Build boot image files for the host variants. There are use directly by ART host side tests. buildBootImageVariantsForBuildOs(ctx, imageConfig, profile) - - dumpOatRules(ctx, imageConfig) +} + +// Copy apex module dex jars to their predefined locations. They will be used for dexpreopt for apps. +func (b *platformBootclasspathModule) copyApexBootJarsForAppsDexpreopt(ctx android.ModuleContext, apexModules []android.Module) { + config := GetApexBootConfig(ctx) + apexBootDexJarsByModule := extractEncodedDexJarsFromModules(ctx, apexModules) + copyBootJarsToPredefinedLocations(ctx, apexBootDexJarsByModule, config.dexPathsByModule) } diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index d81635ebf..efb97be37 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -27,6 +27,11 @@ import ( // fixtureAddPlatformBootclasspathForBootclasspathFragment adds a platform_bootclasspath module that // references the bootclasspath fragment. func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment string) android.FixturePreparer { + return fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, "") +} + +// fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra is the same as above, but also adds extra fragments. +func fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra(apex, fragment, extraFragments string) android.FixturePreparer { return android.GroupFixturePreparers( // Add a platform_bootclasspath module. android.FixtureAddTextFile("frameworks/base/boot/Android.bp", fmt.Sprintf(` @@ -37,9 +42,10 @@ func fixtureAddPlatformBootclasspathForBootclasspathFragment(apex, fragment stri apex: "%s", module: "%s", }, + %s ], } - `, apex, fragment)), + `, apex, fragment, extraFragments)), android.FixtureAddFile("frameworks/base/config/boot-profile.txt", nil), android.FixtureAddFile("frameworks/base/config/boot-image-profile.txt", nil), android.FixtureAddFile("build/soong/scripts/check_boot_jars/package_allowed_list.txt", nil), @@ -79,9 +85,11 @@ func TestSnapshotWithBootclasspathFragment_ImageName(t *testing.T) { }), // Add a platform_bootclasspath that depends on the fragment. - fixtureAddPlatformBootclasspathForBootclasspathFragment("com.android.art", "mybootclasspathfragment"), + fixtureAddPlatformBootclasspathForBootclasspathFragmentWithExtra( + "com.android.art", "mybootclasspathfragment", java.ApexBootJarFragmentsForPlatformBootclasspath), java.PrepareForBootImageConfigTest, + java.PrepareApexBootJarConfigsAndModules, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", @@ -196,9 +204,15 @@ java_import { snapshotTestChecker(checkSnapshotWithoutSource, func(t *testing.T, result *android.TestResult) { // Make sure that the boot jars package check rule includes the dex jars retrieved from the prebuilt apex. checkBootJarsPackageCheckRule(t, result, - "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core1.jar", - "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core2.jar", - "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar") + append( + []string{ + "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core1.jar", + "out/soong/.intermediates/prebuilts/apex/com.android.art.deapexer/android_common/deapexer/javalib/core2.jar", + "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar", + }, + java.ApexBootJarDexJarPaths..., + )..., + ) java.CheckMutatedArtBootImageConfig(t, result, "out/soong/.intermediates/snapshot/mybootclasspathfragment/android_common_com.android.art/meta_lic") java.CheckMutatedFrameworkBootImageConfig(t, result, "out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/meta_lic") }), @@ -222,9 +236,15 @@ java_import { // Make sure that the boot jars package check rule includes the dex jars created from the source. checkBootJarsPackageCheckRule(t, result, - "out/soong/.intermediates/core1/android_common_apex10000/aligned/core1.jar", - "out/soong/.intermediates/core2/android_common_apex10000/aligned/core2.jar", - "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar") + append( + []string{ + "out/soong/.intermediates/core1/android_common_apex10000/aligned/core1.jar", + "out/soong/.intermediates/core2/android_common_apex10000/aligned/core2.jar", + "out/soong/.intermediates/default/java/framework/android_common/aligned/framework.jar", + }, + java.ApexBootJarDexJarPaths..., + )..., + ) } // checkBootJarsPackageCheckRule checks that the supplied module is an input to the boot jars