Expand the dexpreopt image dependencies to entire image
Instead of just depending on the main .art file (boot.art, etc), also expose the dependencies to the .oat/.vdex files (boot.oat/boot.vdex), and all of the module files that get implicitly loading (boot-ext.*, boot-framework.*, etc) This is necessary for RBE, where the rule only gets the files that it depends upon. Test: treehugger Test: build a system image with RBE Change-Id: I0c7051f18582f1891d3398b46763b1521e4326c8
This commit is contained in:
@@ -58,9 +58,32 @@ type bootImageConfig struct {
|
||||
symbolsDir android.OutputPath
|
||||
targets []android.Target
|
||||
images map[android.ArchType]android.OutputPath
|
||||
imagesDeps map[android.ArchType]android.Paths
|
||||
zip android.WritablePath
|
||||
}
|
||||
|
||||
func (image bootImageConfig) moduleFiles(ctx android.PathContext, dir android.OutputPath, exts ...string) []android.OutputPath {
|
||||
ret := make([]android.OutputPath, 0, len(image.modules)*len(exts))
|
||||
|
||||
// dex preopt on the bootclasspath produces multiple files. The first dex file
|
||||
// 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 {
|
||||
name := image.name
|
||||
if i != 0 {
|
||||
name += "-" + m
|
||||
}
|
||||
|
||||
for _, ext := range exts {
|
||||
ret = append(ret, dir.Join(ctx, name+ext))
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
type bootImage struct {
|
||||
bootImageConfig
|
||||
|
||||
@@ -302,49 +325,38 @@ func buildBootImageRuleForArch(ctx android.SingletonContext, image *bootImage,
|
||||
installDir := filepath.Join("/system/framework", arch.String())
|
||||
vdexInstallDir := filepath.Join("/system/framework")
|
||||
|
||||
var extraFiles android.WritablePaths
|
||||
var vdexInstalls android.RuleBuilderInstalls
|
||||
var unstrippedInstalls android.RuleBuilderInstalls
|
||||
|
||||
var zipFiles android.WritablePaths
|
||||
|
||||
// dex preopt on the bootclasspath produces multiple files. The first dex file
|
||||
// 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 {
|
||||
name := image.name
|
||||
if i != 0 {
|
||||
name += "-" + m
|
||||
}
|
||||
for _, artOrOat := range image.moduleFiles(ctx, outputDir, ".art", ".oat") {
|
||||
cmd.ImplicitOutput(artOrOat)
|
||||
zipFiles = append(zipFiles, artOrOat)
|
||||
|
||||
art := outputDir.Join(ctx, name+".art")
|
||||
oat := outputDir.Join(ctx, name+".oat")
|
||||
vdex := outputDir.Join(ctx, name+".vdex")
|
||||
unstrippedOat := symbolsDir.Join(ctx, name+".oat")
|
||||
// Install the .oat and .art files
|
||||
rule.Install(artOrOat, filepath.Join(installDir, artOrOat.Base()))
|
||||
}
|
||||
|
||||
extraFiles = append(extraFiles, art, oat, vdex, unstrippedOat)
|
||||
|
||||
zipFiles = append(zipFiles, art, oat, vdex)
|
||||
|
||||
// Install the .oat and .art files.
|
||||
rule.Install(art, filepath.Join(installDir, art.Base()))
|
||||
rule.Install(oat, filepath.Join(installDir, oat.Base()))
|
||||
for _, vdex := range image.moduleFiles(ctx, outputDir, ".vdex") {
|
||||
cmd.ImplicitOutput(vdex)
|
||||
zipFiles = append(zipFiles, vdex)
|
||||
|
||||
// The vdex files are identical between architectures, install them to a shared location. The Make rules will
|
||||
// only use the install rules for one architecture, and will create symlinks into the architecture-specific
|
||||
// directories.
|
||||
vdexInstalls = append(vdexInstalls,
|
||||
android.RuleBuilderInstall{vdex, filepath.Join(vdexInstallDir, vdex.Base())})
|
||||
}
|
||||
|
||||
for _, unstrippedOat := range image.moduleFiles(ctx, symbolsDir, ".oat") {
|
||||
cmd.ImplicitOutput(unstrippedOat)
|
||||
|
||||
// Install the unstripped oat files. The Make rules will put these in $(TARGET_OUT_UNSTRIPPED)
|
||||
unstrippedInstalls = append(unstrippedInstalls,
|
||||
android.RuleBuilderInstall{unstrippedOat, filepath.Join(installDir, unstrippedOat.Base())})
|
||||
}
|
||||
|
||||
cmd.ImplicitOutputs(extraFiles)
|
||||
|
||||
rule.Build(pctx, ctx, image.name+"JarsDexpreopt_"+arch.String(), "dexpreopt "+image.name+" jars "+arch.String())
|
||||
|
||||
// save output and installed files for makevars
|
||||
@@ -496,6 +508,7 @@ func (d *dexpreoptBootJars) MakeVars(ctx android.MakeVarsContext) {
|
||||
for _, arch := range arches {
|
||||
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_DEPS_"+current.name+"_"+arch.String(), strings.Join(current.imagesDeps[arch].Strings(), " "))
|
||||
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())
|
||||
if current.zip != nil {
|
||||
|
Reference in New Issue
Block a user