Merge "Add preopt profile logic for compiling during first boot" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
28e0dd177a
@@ -3312,6 +3312,24 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
removeCodePathLI(dstCodePath);
|
removeCodePathLI(dstCodePath);
|
||||||
return null;
|
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;
|
return dstCodePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9723,7 +9741,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
* and {@code numberOfPackagesFailed}.
|
* and {@code numberOfPackagesFailed}.
|
||||||
*/
|
*/
|
||||||
private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
|
private int[] performDexOptUpgrade(List<PackageParser.Package> pkgs, boolean showDialog,
|
||||||
String compilerFilter, boolean bootComplete) {
|
final String compilerFilter, boolean bootComplete) {
|
||||||
|
|
||||||
int numberOfPackagesVisited = 0;
|
int numberOfPackagesVisited = 0;
|
||||||
int numberOfPackagesOptimized = 0;
|
int numberOfPackagesOptimized = 0;
|
||||||
@@ -9734,6 +9752,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
for (PackageParser.Package pkg : pkgs) {
|
for (PackageParser.Package pkg : pkgs) {
|
||||||
numberOfPackagesVisited++;
|
numberOfPackagesVisited++;
|
||||||
|
|
||||||
|
boolean useProfileForDexopt = false;
|
||||||
|
|
||||||
if ((isFirstBoot() || isUpgrade()) && isSystemApp(pkg)) {
|
if ((isFirstBoot() || isUpgrade()) && isSystemApp(pkg)) {
|
||||||
// Copy over initial preopt profiles since we won't get any JIT samples for methods
|
// Copy over initial preopt profiles since we won't get any JIT samples for methods
|
||||||
// that are already compiled.
|
// that are already compiled.
|
||||||
@@ -9747,11 +9767,28 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
if (!mInstaller.copySystemProfile(profileFile.getAbsolutePath(),
|
if (!mInstaller.copySystemProfile(profileFile.getAbsolutePath(),
|
||||||
pkg.applicationInfo.uid, pkg.packageName)) {
|
pkg.applicationInfo.uid, pkg.packageName)) {
|
||||||
Log.e(TAG, "Installer failed to copy system profile!");
|
Log.e(TAG, "Installer failed to copy system profile!");
|
||||||
|
} else {
|
||||||
|
useProfileForDexopt = true;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath() + " ",
|
Log.e(TAG, "Failed to copy profile " + profileFile.getAbsolutePath() + " ",
|
||||||
e);
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9780,6 +9817,14 @@ 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);
|
||||||
|
}
|
||||||
// If the OTA updates a system app which was previously preopted to a non-preopted state
|
// If the OTA updates a system app which was previously preopted to a non-preopted state
|
||||||
// the app might end up being verified at runtime. That's because by default the apps
|
// the app might end up being verified at runtime. That's because by default the apps
|
||||||
// are verify-profile but for preopted apps there's no profile.
|
// are verify-profile but for preopted apps there's no profile.
|
||||||
@@ -9788,9 +9833,9 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
// filter (by default 'quicken').
|
// filter (by default 'quicken').
|
||||||
// Note that at this stage unused apps are already filtered.
|
// Note that at this stage unused apps are already filtered.
|
||||||
if (isSystemApp(pkg) &&
|
if (isSystemApp(pkg) &&
|
||||||
DexFile.isProfileGuidedCompilerFilter(compilerFilter) &&
|
DexFile.isProfileGuidedCompilerFilter(pkgCompilerFilter) &&
|
||||||
!Environment.getReferenceProfile(pkg.packageName).exists()) {
|
!Environment.getReferenceProfile(pkg.packageName).exists()) {
|
||||||
compilerFilter = getNonProfileGuidedCompilerFilter(compilerFilter);
|
pkgCompilerFilter = getNonProfileGuidedCompilerFilter(pkgCompilerFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkProfiles is false to avoid merging profiles during boot which
|
// checkProfiles is false to avoid merging profiles during boot which
|
||||||
@@ -9801,7 +9846,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
|
int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
|
||||||
int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
|
int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
|
||||||
pkg.packageName,
|
pkg.packageName,
|
||||||
compilerFilter,
|
pkgCompilerFilter,
|
||||||
dexoptFlags));
|
dexoptFlags));
|
||||||
|
|
||||||
switch (primaryDexOptStaus) {
|
switch (primaryDexOptStaus) {
|
||||||
|
|||||||
Reference in New Issue
Block a user