diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 101d3cad9..585f81887 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -1291,7 +1291,7 @@ func (module *PrebuiltBootclasspathFragmentModule) produceBootImageFiles(ctx and } return bootImageFiles } else { - if profile == nil { + if profile == nil && imageConfig.isProfileGuided() { ctx.ModuleErrorf("Unable to produce boot image files: neither boot image files nor profiles exists in the prebuilt apex") return bootImageOutputs{} } diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 3effff649..40aad0642 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -287,6 +287,9 @@ type bootImageConfig struct { // Path of the preloaded classes file. preloadedClassesFile string + + // The "--compiler-filter" argument. + compilerFilter string } // Target-dependent description of a boot image. @@ -443,6 +446,10 @@ func (image *bootImageVariant) imageLocations() (imageLocationsOnHost []string, append(imageLocationsOnDevice, dexpreopt.PathStringToLocation(image.imagePathOnDevice, image.target.Arch.ArchType)) } +func (image *bootImageConfig) isProfileGuided() bool { + return image.compilerFilter == "speed-profile" +} + func dexpreoptBootJarsFactory() android.SingletonModule { m := &dexpreoptBootJars{} android.InitAndroidModule(m) @@ -721,11 +728,13 @@ func buildBootImageVariant(ctx android.ModuleContext, image *bootImageVariant, p cmd.FlagWithArg("--base=", ctx.Config().LibartImgDeviceBaseAddress()) } - // We always expect a preloaded classes file to be available. However, if we cannot find it, it's - // OK to not pass the flag to dex2oat. - preloadedClassesPath := android.ExistentPathForSource(ctx, image.preloadedClassesFile) - if preloadedClassesPath.Valid() { - cmd.FlagWithInput("--preloaded-classes=", preloadedClassesPath.Path()) + if len(image.preloadedClassesFile) > 0 { + // We always expect a preloaded classes file to be available. However, if we cannot find it, it's + // OK to not pass the flag to dex2oat. + preloadedClassesPath := android.ExistentPathForSource(ctx, image.preloadedClassesFile) + if preloadedClassesPath.Valid() { + cmd.FlagWithInput("--preloaded-classes=", preloadedClassesPath.Path()) + } } cmd. @@ -743,7 +752,8 @@ func buildBootImageVariant(ctx android.ModuleContext, image *bootImageVariant, p FlagWithArg("--android-root=", global.EmptyDirectory). FlagWithArg("--no-inline-from=", "core-oj.jar"). Flag("--force-determinism"). - Flag("--abort-on-hard-verifier-error") + Flag("--abort-on-hard-verifier-error"). + FlagWithArg("--compiler-filter=", image.compilerFilter) // Use the default variant/features for host builds. // The map below contains only device CPU info (which might be x86 on some devices). @@ -828,6 +838,10 @@ 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.ModuleContext, image *bootImageConfig) android.WritablePath { + if !image.isProfileGuided() { + return nil + } + globalSoong := dexpreopt.GetGlobalSoongConfig(ctx) global := dexpreopt.GetGlobalConfig(ctx) diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index 4d0bd09c6..2975130f3 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -63,6 +63,7 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig profileInstallPathInApex: "etc/boot-image.prof", modules: artModules, preloadedClassesFile: "art/build/boot/preloaded-classes", + compilerFilter: "speed-profile", } // Framework config for the boot image extension. @@ -76,6 +77,7 @@ func genBootImageConfigRaw(ctx android.PathContext) map[string]*bootImageConfig installDirOnDevice: frameworkSubdir, modules: frameworkModules, preloadedClassesFile: "frameworks/base/config/preloaded-classes", + compilerFilter: "speed-profile", } return map[string]*bootImageConfig{