diff options
| author | 2019-07-25 07:08:22 -0700 | |
|---|---|---|
| committer | 2019-07-25 07:08:22 -0700 | |
| commit | ff3eb22ef4777bfbbedf6a0fee02b423c79f11b0 (patch) | |
| tree | 876d8538f51c12e6fcd72181f08563786d32d9a7 | |
| parent | d4d6f38547fe609e5e2c8d71fd4730cb39403c7a (diff) | |
| parent | 1f9f57cc8feeffdc46e942ab177a524c451c4d62 (diff) | |
Merge "Add support for generating boot profiles."
am: 1f9f57cc8f
Change-Id: Ie452fd1c5abffb7258c26ee965dffe55900cb576
| -rw-r--r-- | dexpreopt/config.go | 1 | ||||
| -rw-r--r-- | dexpreopt/dexpreopt.go | 36 | ||||
| -rw-r--r-- | java/dexpreopt.go | 4 | ||||
| -rw-r--r-- | java/dexpreopt_bootjars.go | 47 | 
4 files changed, 88 insertions, 0 deletions
diff --git a/dexpreopt/config.go b/dexpreopt/config.go index 3e3295849..51f551998 100644 --- a/dexpreopt/config.go +++ b/dexpreopt/config.go @@ -113,6 +113,7 @@ type ModuleConfig struct {  	ProfileClassListing  android.OptionalPath  	ProfileIsTextListing bool +	ProfileBootListing   android.OptionalPath  	EnforceUsesLibraries         bool  	PresentOptionalUsesLibraries []string diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index e02e60f2f..c378f096b 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -108,11 +108,15 @@ func GenerateDexpreoptRule(ctx android.PathContext,  	rule = android.NewRuleBuilder()  	generateProfile := module.ProfileClassListing.Valid() && !global.DisableGenerateProfile +	generateBootProfile := module.ProfileBootListing.Valid() && !global.DisableGenerateProfile  	var profile android.WritablePath  	if generateProfile {  		profile = profileCommand(ctx, global, module, rule)  	} +	if generateBootProfile { +		bootProfileCommand(ctx, global, module, rule) +	}  	if !dexpreoptDisabled(global, module) {  		// Don't preopt individual boot jars, they will be preopted together. @@ -190,6 +194,38 @@ func profileCommand(ctx android.PathContext, global GlobalConfig, module ModuleC  	return profilePath  } +func bootProfileCommand(ctx android.PathContext, global GlobalConfig, module ModuleConfig, +	rule *android.RuleBuilder) android.WritablePath { + +	profilePath := module.BuildPath.InSameDir(ctx, "profile.bprof") +	profileInstalledPath := module.DexLocation + ".bprof" + +	if !module.ProfileIsTextListing { +		rule.Command().FlagWithOutput("touch ", profilePath) +	} + +	cmd := rule.Command(). +		Text(`ANDROID_LOG_TAGS="*:e"`). +		Tool(global.Tools.Profman) + +	// The profile is a test listing of methods. +	// We need to generate the actual binary profile. +	cmd.FlagWithInput("--create-profile-from=", module.ProfileBootListing.Path()) + +	cmd. +		Flag("--generate-boot-profile"). +		FlagWithInput("--apk=", module.DexPath). +		Flag("--dex-location="+module.DexLocation). +		FlagWithOutput("--reference-profile-file=", profilePath) + +	if !module.ProfileIsTextListing { +		cmd.Text(fmt.Sprintf(`|| echo "Profile out of date for %s"`, module.DexPath)) +	} +	rule.Install(profilePath, profileInstalledPath) + +	return profilePath +} +  func dexpreoptCommand(ctx android.PathContext, global GlobalConfig, module ModuleConfig, rule *android.RuleBuilder,  	arch android.ArchType, profile, bootImage android.Path, bootImageDeps android.Paths, appImage, generateDM bool) { diff --git a/java/dexpreopt.go b/java/dexpreopt.go index ed12fe6d2..6214dac44 100644 --- a/java/dexpreopt.go +++ b/java/dexpreopt.go @@ -143,6 +143,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo  	strippedDexJarFile := android.PathForModuleOut(ctx, "dexpreopt", dexJarFile.Base())  	var profileClassListing android.OptionalPath +	var profileBootListing android.OptionalPath  	profileIsTextListing := false  	if BoolDefault(d.dexpreoptProperties.Dex_preopt.Profile_guided, true) {  		// If dex_preopt.profile_guided is not set, default it based on the existence of the @@ -150,6 +151,8 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo  		if String(d.dexpreoptProperties.Dex_preopt.Profile) != "" {  			profileClassListing = android.OptionalPathForPath(  				android.PathForModuleSrc(ctx, String(d.dexpreoptProperties.Dex_preopt.Profile))) +			profileBootListing = android.ExistentPathForSource(ctx, +				ctx.ModuleDir(), String(d.dexpreoptProperties.Dex_preopt.Profile)+"-boot")  			profileIsTextListing = true  		} else {  			profileClassListing = android.ExistentPathForSource(ctx, @@ -169,6 +172,7 @@ func (d *dexpreopter) dexpreopt(ctx android.ModuleContext, dexJarFile android.Mo  		ProfileClassListing:  profileClassListing,  		ProfileIsTextListing: profileIsTextListing, +		ProfileBootListing:   profileBootListing,  		EnforceUsesLibraries:         d.enforceUsesLibs,  		PresentOptionalUsesLibraries: d.optionalUsesLibs, diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 4ef5bcf4b..19e92b730 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -216,6 +216,7 @@ func buildBootImage(ctx android.SingletonContext, config bootImageConfig) *bootI  	}  	profile := bootImageProfileRule(ctx, image, missingDeps) +	bootFrameworkProfileRule(ctx, image, missingDeps)  	var allFiles android.Paths @@ -424,6 +425,52 @@ func bootImageProfileRule(ctx android.SingletonContext, image *bootImage, missin  var bootImageProfileRuleKey = android.NewOnceKey("bootImageProfileRule") +func bootFrameworkProfileRule(ctx android.SingletonContext, image *bootImage, missingDeps []string) android.WritablePath { +	global := dexpreoptGlobalConfig(ctx) + +	if global.DisableGenerateProfile || ctx.Config().IsPdkBuild() || ctx.Config().UnbundledBuild() { +		return nil +	} +	return ctx.Config().Once(bootFrameworkProfileRuleKey, func() interface{} { +		tools := global.Tools + +		rule := android.NewRuleBuilder() +		rule.MissingDeps(missingDeps) + +		// Some branches like master-art-host don't have frameworks/base, so manually +		// handle the case that the default is missing.  Those branches won't attempt to build the profile rule, +		// and if they do they'll get a missing deps error. +		defaultProfile := "frameworks/base/config/boot-profile.txt" +		path := android.ExistentPathForSource(ctx, defaultProfile) +		var bootFrameworkProfile android.Path +		if path.Valid() { +			bootFrameworkProfile = path.Path() +		} else { +			missingDeps = append(missingDeps, defaultProfile) +			bootFrameworkProfile = android.PathForOutput(ctx, "missing") +		} + +		profile := image.dir.Join(ctx, "boot.bprof") + +		rule.Command(). +			Text(`ANDROID_LOG_TAGS="*:e"`). +			Tool(tools.Profman). +			Flag("--generate-boot-profile"). +			FlagWithInput("--create-profile-from=", bootFrameworkProfile). +			FlagForEachInput("--apk=", image.dexPaths.Paths()). +			FlagForEachArg("--dex-location=", image.dexLocations). +			FlagWithOutput("--reference-profile-file=", profile) + +		rule.Install(profile, "/system/etc/boot-image.bprof") +		rule.Build(pctx, ctx, "bootFrameworkProfile", "profile boot framework jars") +		image.profileInstalls = append(image.profileInstalls, rule.Installs()...) + +		return profile +	}).(android.WritablePath) +} + +var bootFrameworkProfileRuleKey = android.NewOnceKey("bootFrameworkProfileRule") +  func dumpOatRules(ctx android.SingletonContext, image *bootImage) {  	var archs []android.ArchType  	for arch := range image.images {  |