diff --git a/apex/apex.go b/apex/apex.go index 629cbbf2e..28935f28e 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -613,6 +613,7 @@ type apexBundle struct { testApex bool vndkApex bool + artApex bool // intermediate path for apex_manifest.json manifestOut android.WritablePath @@ -1213,6 +1214,19 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { return false }) + // Specific to the ART apex: dexpreopt artifacts for libcore Java libraries. + // Build rules are generated by the dexpreopt singleton, and here we access build artifacts + // via the global boot image config. + if a.artApex { + for arch, files := range java.DexpreoptedArtApexJars(ctx) { + dirInApex := filepath.Join("dexpreopt", arch.String()) + for _, f := range files { + localModule := "dexpreopt_" + arch.String() + "_" + filepath.Base(f.String()) + filesInfo = append(filesInfo, apexFile{f, localModule, dirInApex, etc, nil, nil}) + } + } + } + if a.private_key_file == nil { ctx.PropertyErrorf("key", "private_key for %q could not be found", String(a.properties.Key)) return @@ -1811,9 +1825,10 @@ func newApexBundle() *apexBundle { return module } -func ApexBundleFactory(testApex bool) android.Module { +func ApexBundleFactory(testApex bool, artApex bool) android.Module { bundle := newApexBundle() bundle.testApex = testApex + bundle.artApex = artApex return bundle } diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 2a142baee..2fbc30c92 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -165,6 +165,8 @@ func (d *dexpreoptBootJars) GenerateBuildActions(ctx android.SingletonContext) { // Always create the default boot image first, to get a unique profile rule for all images. d.defaultBootImage = buildBootImage(ctx, defaultBootImageConfig(ctx)) + // Create boot image for the ART apex (build artifacts are accessed via the global boot image config). + buildBootImage(ctx, artBootImageConfig(ctx)) if global.GenerateApexImage { d.otherImages = append(d.otherImages, buildBootImage(ctx, apexBootImageConfig(ctx))) } diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index 429bbdba6..86ad5c81a 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -96,15 +96,17 @@ func dexpreoptTargets(ctx android.PathContext) []android.Target { return targets } +// Construct a variant of the global config for dexpreopted bootclasspath jars. The variants differ +// in the list of input jars (libcore, framework, or both), in the naming scheme for the dexpreopt +// files (ART recognizes "apex" names as special), and whether to include a zip archive. func getBootImageConfig(ctx android.PathContext, key android.OnceKey, name string, - needZip bool) bootImageConfig { + needZip bool, artApexJarsOnly bool) bootImageConfig { + return ctx.Config().Once(key, func() interface{} { global := dexpreoptGlobalConfig(ctx) artModules := global.ArtApexJars - nonFrameworkModules := concat(artModules, global.ProductUpdatableBootModules) - frameworkModules := android.RemoveListFromList(global.BootJars, nonFrameworkModules) - imageModules := concat(artModules, frameworkModules) + imageModules := artModules var bootLocations []string @@ -113,11 +115,19 @@ func getBootImageConfig(ctx android.PathContext, key android.OnceKey, name strin filepath.Join("/apex/com.android.art/javalib", m+".jar")) } - for _, m := range frameworkModules { - bootLocations = append(bootLocations, - filepath.Join("/system/framework", m+".jar")) + if !artApexJarsOnly { + nonFrameworkModules := concat(artModules, global.ProductUpdatableBootModules) + frameworkModules := android.RemoveListFromList(global.BootJars, nonFrameworkModules) + imageModules = concat(imageModules, frameworkModules) + + for _, m := range frameworkModules { + bootLocations = append(bootLocations, + filepath.Join("/system/framework", m+".jar")) + } } + dirStem := "dex_" + name + "jars" + // The path to bootclasspath dex files needs to be known at module GenerateAndroidBuildAction time, before // the bootclasspath modules have been compiled. Set up known paths for them, the singleton rules will copy // them there. @@ -125,11 +135,11 @@ func getBootImageConfig(ctx android.PathContext, key android.OnceKey, name strin var bootDexPaths android.WritablePaths for _, m := range imageModules { bootDexPaths = append(bootDexPaths, - android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_"+name+"jars_input", m+".jar")) + android.PathForOutput(ctx, ctx.Config().DeviceName(), dirStem+"_input", m+".jar")) } - dir := android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_"+name+"jars") - symbolsDir := android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_"+name+"jars_unstripped") + dir := android.PathForOutput(ctx, ctx.Config().DeviceName(), dirStem) + symbolsDir := android.PathForOutput(ctx, ctx.Config().DeviceName(), dirStem+"_unstripped") var zip android.WritablePath if needZip { @@ -166,15 +176,30 @@ func getBootImageConfig(ctx android.PathContext, key android.OnceKey, name strin }).(bootImageConfig) } +// Default config is the one that goes in the system image. It includes both libcore and framework. var defaultBootImageConfigKey = android.NewOnceKey("defaultBootImageConfig") -var apexBootImageConfigKey = android.NewOnceKey("apexBootImageConfig") func defaultBootImageConfig(ctx android.PathContext) bootImageConfig { - return getBootImageConfig(ctx, defaultBootImageConfigKey, "boot", true) + return getBootImageConfig(ctx, defaultBootImageConfigKey, "boot", true, false) } +// Apex config is used for the JIT-zygote experiment. It includes both libcore and framework, but AOT-compiles only libcore. +var apexBootImageConfigKey = android.NewOnceKey("apexBootImageConfig") + func apexBootImageConfig(ctx android.PathContext) bootImageConfig { - return getBootImageConfig(ctx, apexBootImageConfigKey, "apex", false) + return getBootImageConfig(ctx, apexBootImageConfigKey, "apex", false, false) +} + +// ART config is the one used for the ART apex. It includes only libcore. +var artBootImageConfigKey = android.NewOnceKey("artBootImageConfig") + +func artBootImageConfig(ctx android.PathContext) bootImageConfig { + return getBootImageConfig(ctx, artBootImageConfigKey, "boot-art", false, true) +} + +// Accessor function for the apex package. +func DexpreoptedArtApexJars(ctx android.BuilderContext) map[android.ArchType]android.Paths { + return artBootImageConfig(ctx).imagesDeps } func defaultBootclasspath(ctx android.PathContext) []string {