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

Commit 72892f10 authored by Nicolas Geoffray's avatar Nicolas Geoffray
Browse files

Support for install multiple boot images.

Bug: 119800099
Test: m && /system/framework/arm/apex*.art files exist
Change-Id: I8b708a0c495193e5455e03eaa575ce55a482a95d
parent e91a0782
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ type GlobalConfig struct {

	OnlyPreoptBootImageAndSystemServer bool // only preopt jars in the boot image or system server

	GenerateApexImage bool // generate an extra boot image only containing jars from the runtime apex

	HasSystemOther        bool     // store odex files that match PatternsOnSystemOther on the system_other partition
	PatternsOnSystemOther []string // patterns (using '%' to denote a prefix match) to put odex on the system_other partition

+62 −50
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ type bootImage struct {

func newBootImage(ctx android.PathContext, config bootImageConfig) *bootImage {
	image := &bootImage{
		bootImageConfig: defaultBootImageConfig(ctx),
		bootImageConfig: config,

		installs:           make(map[android.ArchType]android.RuleBuilderInstalls),
		vdexInstalls:       make(map[android.ArchType]android.RuleBuilderInstalls),
@@ -111,6 +111,7 @@ func skipDexpreoptBootJars(ctx android.PathContext) bool {

type dexpreoptBootJars struct {
	defaultBootImage *bootImage
	otherImages      []*bootImage
}

// dexpreoptBoot singleton rules
@@ -131,7 +132,11 @@ func (d *dexpreoptBootJars) GenerateBuildActions(ctx android.SingletonContext) {
		return
	}

	// Always create the default boot image first, to get a unique profile rule for all images.
	d.defaultBootImage = buildBootImage(ctx, defaultBootImageConfig(ctx))
	if global.GenerateApexImage {
		d.otherImages = append(d.otherImages, buildBootImage(ctx, apexBootImageConfig(ctx)))
	}
}

// buildBootImage takes a bootImageConfig, creates rules to build it, and returns a *bootImage.
@@ -199,7 +204,7 @@ func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage,
	global := dexpreoptGlobalConfig(ctx)

	symbolsDir := image.symbolsDir.Join(ctx, "system/framework", arch.String())
	symbolsFile := symbolsDir.Join(ctx, "boot.oat")
	symbolsFile := symbolsDir.Join(ctx, image.name+".oat")
	outputDir := image.dir.Join(ctx, "system/framework", arch.String())
	outputPath := image.images[arch]
	oatLocation := pathtools.ReplaceExtension(dexpreopt.PathToLocation(outputPath, arch), "oat")
@@ -283,8 +288,8 @@ func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage,
	var unstrippedInstalls android.RuleBuilderInstalls

	// dex preopt on the bootclasspath produces multiple files.  The first dex file
	// is converted into to boot.art (to match the legacy assumption that boot.art
	// exists), and the rest are converted to boot-<name>.art.
	// is converted into to 'name'.art (to match the legacy assumption that 'name'.art
	// exists), and the rest are converted to 'name'-<jar>.art.
	// In addition, each .art file has an associated .oat and .vdex file, and an
	// unstripped .oat file
	for i, m := range image.modules {
@@ -330,6 +335,7 @@ It is likely that the boot classpath is inconsistent.
Rebuild with ART_BOOT_IMAGE_EXTRA_ARGS="--runtime-arg -verbose:verifier" to see verification errors.`

func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath {
	return ctx.Config().Once(bootImageProfileRuleKey, func() interface{} {
		global := dexpreoptGlobalConfig(ctx)

		if !global.UseProfileForBootImage || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() {
@@ -379,23 +385,29 @@ func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missin
		image.profileInstalls = rule.Installs()

		return profile
	}).(android.WritablePath)
}

var bootImageProfileRuleKey = android.NewOnceKey("bootImageProfileRule")

// Export paths for default boot image to Make
func (d *dexpreoptBootJars) MakeVars(ctx android.MakeVarsContext) {
	image := d.defaultBootImage
	if image != nil {
		for arch, _ := range image.images {
			ctx.Strict("DEXPREOPT_IMAGE_"+arch.String(), image.images[arch].String())

			ctx.Strict("DEXPREOPT_IMAGE_BUILT_INSTALLED_"+arch.String(), image.installs[arch].String())
			ctx.Strict("DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_"+arch.String(), image.unstrippedInstalls[arch].String())
			ctx.Strict("DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_"+arch.String(), image.vdexInstalls[arch].String())
		}

		ctx.Strict("DEXPREOPT_IMAGE_PROFILE_BUILT_INSTALLED", image.profileInstalls.String())

		ctx.Strict("DEXPREOPT_BOOTCLASSPATH_DEX_FILES", strings.Join(image.dexPaths.Strings(), " "))
		ctx.Strict("DEXPREOPT_BOOTCLASSPATH_DEX_LOCATIONS", strings.Join(image.dexLocations, " "))

		var imageNames []string
		for _, current := range append(d.otherImages, image) {
			imageNames = append(imageNames, current.name)
			for arch, _ := range current.images {
				ctx.Strict("DEXPREOPT_IMAGE_VDEX_BUILT_INSTALLED_"+current.name+"_"+arch.String(), current.vdexInstalls[arch].String())
				ctx.Strict("DEXPREOPT_IMAGE_"+current.name+"_"+arch.String(), current.images[arch].String())
				ctx.Strict("DEXPREOPT_IMAGE_BUILT_INSTALLED_"+current.name+"_"+arch.String(), current.installs[arch].String())
				ctx.Strict("DEXPREOPT_IMAGE_UNSTRIPPED_BUILT_INSTALLED_"+current.name+"_"+arch.String(), current.unstrippedInstalls[arch].String())
			}
		}
		ctx.Strict("DEXPREOPT_IMAGE_NAMES", strings.Join(imageNames, " "))
	}
}
+46 −0
Original line number Diff line number Diff line
@@ -131,6 +131,52 @@ func defaultBootImageConfig(ctx android.PathContext) bootImageConfig {

var defaultBootImageConfigKey = android.NewOnceKey("defaultBootImageConfig")

func apexBootImageConfig(ctx android.PathContext) bootImageConfig {
	return ctx.Config().Once(apexBootImageConfigKey, func() interface{} {
		global := dexpreoptGlobalConfig(ctx)

		runtimeModules := global.RuntimeApexJars

		var runtimeBootLocations []string

		for _, m := range runtimeModules {
			runtimeBootLocations = append(runtimeBootLocations,
				filepath.Join("/apex/com.android.runtime/javalib", m+".jar"))
		}

		// 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.
		// TODO: use module dependencies instead
		var runtimeBootDexPaths android.WritablePaths
		for _, m := range runtimeModules {
			runtimeBootDexPaths = append(runtimeBootDexPaths,
				android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_apexjars_input", m+".jar"))
		}

		dir := android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_apexjars")
		symbolsDir := android.PathForOutput(ctx, ctx.Config().DeviceName(), "dex_apexjars_unstripped")
		images := make(map[android.ArchType]android.OutputPath)

		for _, target := range ctx.Config().Targets[android.Android] {
			images[target.Arch.ArchType] = dir.Join(ctx,
				"system/framework", target.Arch.ArchType.String(), "apex.art")
		}

		return bootImageConfig{
			name:         "apex",
			modules:      runtimeModules,
			dexLocations: runtimeBootLocations,
			dexPaths:     runtimeBootDexPaths,
			dir:          dir,
			symbolsDir:   symbolsDir,
			images:       images,
		}
	}).(bootImageConfig)
}

var apexBootImageConfigKey = android.NewOnceKey("apexBootImageConfig")

func defaultBootclasspath(ctx android.PathContext) []string {
	return ctx.Config().OnceStringSlice(defaultBootclasspathKey, func() []string {
		global := dexpreoptGlobalConfig(ctx)