Use boot image extension in the JIT-zygote experiment.

Test: temporarily enable JIT-zygote configuration, build, boot the
  device and ensure that the JIT-zygote specific boot image
  apex-framework.art is mapped in the zygote address space:

  1. enable Jit zygote in the product device config (in my case
    device/google/muskie/aosp_walleye.mk):

    +# System server should not contain compiled code.
    +PRODUCT_SYSTEM_SERVER_COMPILER_FILTER := verify
    +
    +# Use the apex image for preopting.
    +DEXPREOPT_USE_APEX_IMAGE := true
    +
    +# Have the runtime pick up the apex image.
    +PRODUCT_PROPERTY_OVERRIDES += \
    +    dalvik.vm.boot-image=/apex/com.android.art/javalib/apex.art:/system/framework/apex-framework.art

  2. lunch aosp_walleye-userdebug \
    && m \
    && adb reboot bootloader \
    && fastboot flashall -w

  3. adb shell cat /proc/`adb shell ps | grep zygote64 | awk {'print $2'}`/maps | grep apex-framework.art
  6fe44000-7025c000 rw-p 00000000 fc:02 1179718                            /data/dalvik-cache/arm64/apex@com.android.art@javalib@apex-framework.art
  70571000-70696000 rw-p 0072d000 fc:02 1179718                            /data/dalvik-cache/arm64/apex@com.android.art@javalib@apex-framework.art
  75a339f000-75a33ac000 r--p 00852000 fc:02 1179718                        /data/dalvik-cache/arm64/apex@com.android.art@javalib@apex-framework.art

Change-Id: I5493e575ebf90bad1d5ad2850004d54590bbc079
This commit is contained in:
Ulya Trafimovich
2019-12-09 15:40:17 +00:00
parent a773c39bfc
commit 57547452cf
3 changed files with 41 additions and 24 deletions

View File

@@ -101,9 +101,8 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo
global := dexpreoptGlobalConfig(ctx) global := dexpreoptGlobalConfig(ctx)
bootImage := defaultBootImageConfig(ctx) bootImage := defaultBootImageConfig(ctx)
defaultBootImage := bootImage
if global.UseApexImage { if global.UseApexImage {
bootImage = apexBootImageConfig(ctx) bootImage = frameworkJZBootImageConfig(ctx)
} }
var archs []android.ArchType var archs []android.ArchType
@@ -174,11 +173,8 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo
DexPreoptImagesDeps: imagesDeps, DexPreoptImagesDeps: imagesDeps,
DexPreoptImageLocations: bootImage.imageLocations, DexPreoptImageLocations: bootImage.imageLocations,
// We use the dex paths and dex locations of the default boot image, as it PreoptBootClassPathDexFiles: bootImage.dexPathsDeps.Paths(),
// contains the full dexpreopt boot classpath. Other images may just contain a subset of PreoptBootClassPathDexLocations: bootImage.dexLocationsDeps,
// the dexpreopt boot classpath.
PreoptBootClassPathDexFiles: defaultBootImage.dexPathsDeps.Paths(),
PreoptBootClassPathDexLocations: defaultBootImage.dexLocationsDeps,
PreoptExtractedApk: false, PreoptExtractedApk: false,

View File

@@ -220,7 +220,8 @@ func (d *dexpreoptBootJars) GenerateBuildActions(ctx android.SingletonContext) {
d.otherImages = append(d.otherImages, buildBootImage(ctx, artBootImageConfig(ctx))) d.otherImages = append(d.otherImages, buildBootImage(ctx, artBootImageConfig(ctx)))
if global.GenerateApexImage { if global.GenerateApexImage {
// Create boot images for the JIT-zygote experiment. // Create boot images for the JIT-zygote experiment.
d.otherImages = append(d.otherImages, buildBootImage(ctx, apexBootImageConfig(ctx))) d.otherImages = append(d.otherImages, buildBootImage(ctx, artJZBootImageConfig(ctx)))
d.otherImages = append(d.otherImages, buildBootImage(ctx, frameworkJZBootImageConfig(ctx)))
} }
dumpOatRules(ctx, d.defaultBootImage) dumpOatRules(ctx, d.defaultBootImage)

View File

@@ -124,7 +124,8 @@ var (
bootImageConfigKey = android.NewOnceKey("bootImageConfig") bootImageConfigKey = android.NewOnceKey("bootImageConfig")
artBootImageName = "art" artBootImageName = "art"
frameworkBootImageName = "boot" frameworkBootImageName = "boot"
apexBootImageName = "apex" artJZBootImageName = "jitzygote-art"
frameworkJZBootImageName = "jitzygote-boot"
) )
// Construct the global boot image configs. // Construct the global boot image configs.
@@ -178,22 +179,33 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig {
dexLocationsDeps: append(artLocations, frameworkLocations...), dexLocationsDeps: append(artLocations, frameworkLocations...),
} }
// Apex config for the boot image used in the JIT-zygote experiment. // ART config for JIT-zygote boot image.
// It includes both the Core libraries and framework. artJZCfg := bootImageConfig{
apexCfg := bootImageConfig{
extension: false, extension: false,
name: apexBootImageName, name: artJZBootImageName,
stem: "apex",
installSubdir: artSubdir,
modules: artModules,
dexLocations: artLocations,
dexLocationsDeps: artLocations,
}
// Framework config for JIT-zygote boot image extension.
frameworkJZCfg := bootImageConfig{
extension: true,
name: frameworkJZBootImageName,
stem: "apex", stem: "apex",
installSubdir: frameworkSubdir, installSubdir: frameworkSubdir,
modules: concat(artModules, frameworkModules), modules: frameworkModules,
dexLocations: concat(artLocations, frameworkLocations), dexLocations: frameworkLocations,
dexLocationsDeps: concat(artLocations, frameworkLocations), dexLocationsDeps: append(artLocations, frameworkLocations...),
} }
configs := map[string]*bootImageConfig{ configs := map[string]*bootImageConfig{
artBootImageName: &artCfg, artBootImageName: &artCfg,
frameworkBootImageName: &frameworkCfg, frameworkBootImageName: &frameworkCfg,
apexBootImageName: &apexCfg, artJZBootImageName: &artJZCfg,
frameworkJZBootImageName: &frameworkJZCfg,
} }
// common to all configs // common to all configs
@@ -235,6 +247,10 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig {
frameworkCfg.dexPathsDeps = append(artCfg.dexPathsDeps, frameworkCfg.dexPathsDeps...) frameworkCfg.dexPathsDeps = append(artCfg.dexPathsDeps, frameworkCfg.dexPathsDeps...)
frameworkCfg.imageLocations = append(artCfg.imageLocations, frameworkCfg.imageLocations...) frameworkCfg.imageLocations = append(artCfg.imageLocations, frameworkCfg.imageLocations...)
// specific to the jitzygote-framework config
frameworkJZCfg.dexPathsDeps = append(artJZCfg.dexPathsDeps, frameworkJZCfg.dexPathsDeps...)
frameworkJZCfg.imageLocations = append(artJZCfg.imageLocations, frameworkJZCfg.imageLocations...)
return configs return configs
}).(map[string]*bootImageConfig) }).(map[string]*bootImageConfig)
} }
@@ -247,8 +263,12 @@ func defaultBootImageConfig(ctx android.PathContext) bootImageConfig {
return *genBootImageConfigs(ctx)[frameworkBootImageName] return *genBootImageConfigs(ctx)[frameworkBootImageName]
} }
func apexBootImageConfig(ctx android.PathContext) bootImageConfig { func artJZBootImageConfig(ctx android.PathContext) bootImageConfig {
return *genBootImageConfigs(ctx)[apexBootImageName] return *genBootImageConfigs(ctx)[artJZBootImageName]
}
func frameworkJZBootImageConfig(ctx android.PathContext) bootImageConfig {
return *genBootImageConfigs(ctx)[frameworkJZBootImageName]
} }
func defaultBootclasspath(ctx android.PathContext) []string { func defaultBootclasspath(ctx android.PathContext) []string {