Merge "Revert "Revert "Add preopt profile logic for compiling during first boot""" into oc-mr1-dev am: 00579bd49a
am: 7fe00cc2e7
Change-Id: I99f84825f0a3bcbc584fffff84ba67cdc24ba9d5
This commit is contained in:
@@ -3315,6 +3315,24 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
removeCodePathLI(dstCodePath);
|
||||
return null;
|
||||
}
|
||||
|
||||
// If we have a profile for a compressed APK, copy it to the reference location.
|
||||
// Since the package is the stub one, remove the stub suffix to get the normal package and
|
||||
// APK name.
|
||||
File profileFile = new File(getPrebuildProfilePath(pkg).replace(STUB_SUFFIX, ""));
|
||||
if (profileFile.exists()) {
|
||||
try {
|
||||
// We could also do this lazily before calling dexopt in
|
||||
// PackageDexOptimizer to prevent this happening on first boot. The issue
|
||||
// is that we don't have a good way to say "do this only once".
|
||||
if (!mInstaller.copySystemProfile(profileFile.getAbsolutePath(),
|
||||
pkg.applicationInfo.uid, pkg.packageName)) {
|
||||
Log.e(TAG, "decompressPackage failed to copy system profile!");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath() + " ", e);
|
||||
}
|
||||
}
|
||||
return dstCodePath;
|
||||
}
|
||||
|
||||
@@ -9739,7 +9757,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
* and {@code numberOfPackagesFailed}.
|
||||
*/
|
||||
private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
|
||||
String compilerFilter, boolean bootComplete) {
|
||||
final String compilerFilter, boolean bootComplete) {
|
||||
|
||||
int numberOfPackagesVisited = 0;
|
||||
int numberOfPackagesOptimized = 0;
|
||||
@@ -9750,6 +9768,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
for (PackageParser.Package pkg : pkgs) {
|
||||
numberOfPackagesVisited++;
|
||||
|
||||
boolean useProfileForDexopt = false;
|
||||
|
||||
if ((isFirstBoot() || isUpgrade()) && isSystemApp(pkg)) {
|
||||
// Copy over initial preopt profiles since we won't get any JIT samples for methods
|
||||
// that are already compiled.
|
||||
@@ -9763,11 +9783,30 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
if (!mInstaller.copySystemProfile(profileFile.getAbsolutePath(),
|
||||
pkg.applicationInfo.uid, pkg.packageName)) {
|
||||
Log.e(TAG, "Installer failed to copy system profile!");
|
||||
} else {
|
||||
// Disabled as this causes speed-profile compilation during first boot
|
||||
// even if things are already compiled.
|
||||
// useProfileForDexopt = true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath() + " ",
|
||||
e);
|
||||
}
|
||||
} else {
|
||||
PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(pkg.packageName);
|
||||
// Handle compressed APKs in this path. Only do this for stubs with profiles to
|
||||
// minimize the number off apps being speed-profile compiled during first boot.
|
||||
// The other paths will not change the filter.
|
||||
if (disabledPs != null && disabledPs.pkg.isStub) {
|
||||
// The package is the stub one, remove the stub suffix to get the normal
|
||||
// package and APK names.
|
||||
String systemProfilePath =
|
||||
getPrebuildProfilePath(disabledPs.pkg).replace(STUB_SUFFIX, "");
|
||||
File systemProfile = new File(systemProfilePath);
|
||||
// Use the profile for compilation if there exists one for the same package
|
||||
// in the system partition.
|
||||
useProfileForDexopt = systemProfile.exists();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9796,6 +9835,15 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
String pkgCompilerFilter = compilerFilter;
|
||||
if (useProfileForDexopt) {
|
||||
// Use background dexopt mode to try and use the profile. Note that this does not
|
||||
// guarantee usage of the profile.
|
||||
pkgCompilerFilter =
|
||||
PackageManagerServiceCompilerMapping.getCompilerFilterForReason(
|
||||
PackageManagerService.REASON_BACKGROUND_DEXOPT);
|
||||
}
|
||||
|
||||
// checkProfiles is false to avoid merging profiles during boot which
|
||||
// might interfere with background compilation (b/28612421).
|
||||
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
|
||||
@@ -9804,7 +9852,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
|
||||
int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
|
||||
pkg.packageName,
|
||||
compilerFilter,
|
||||
pkgCompilerFilter,
|
||||
dexoptFlags));
|
||||
|
||||
switch (primaryDexOptStaus) {
|
||||
|
||||
Reference in New Issue
Block a user