Merge "Change app selection policy for post-OTA verification" into nyc-dev

This commit is contained in:
David Brazdil
2016-04-26 12:22:14 +00:00
committed by Android (Google) Code Review
3 changed files with 62 additions and 29 deletions

View File

@@ -5096,6 +5096,19 @@ public class PackageParser {
return latestUse; return latestUse;
} }
public long getLatestForegroundPackageUseTimeInMills() {
int[] foregroundReasons = {
PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY,
PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE
};
long latestUse = 0L;
for (int reason : foregroundReasons) {
latestUse = Math.max(latestUse, mLastPackageUsageTimeInMills[reason]);
}
return latestUse;
}
public String toString() { public String toString() {
return "Package{" return "Package{"
+ Integer.toHexString(System.identityHashCode(this)) + Integer.toHexString(System.identityHashCode(this))

View File

@@ -137,10 +137,7 @@ class PackageDexOptimizer {
boolean isProfileGuidedFilter = DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter); boolean isProfileGuidedFilter = DexFile.isProfileGuidedCompilerFilter(targetCompilerFilter);
// If any part of the app is used by other apps, we cannot use profile-guided // If any part of the app is used by other apps, we cannot use profile-guided
// compilation. // compilation.
// Skip the check for forward locked packages since they don't share their code. if (isProfileGuidedFilter && isUsedByOtherApps(pkg)) {
if (isProfileGuidedFilter && !pkg.isForwardLocked()) {
for (String path : paths) {
if (isUsedByOtherApps(path)) {
checkProfiles = false; checkProfiles = false;
targetCompilerFilter = getNonProfileGuidedCompilerFilter(targetCompilerFilter); targetCompilerFilter = getNonProfileGuidedCompilerFilter(targetCompilerFilter);
@@ -148,10 +145,6 @@ class PackageDexOptimizer {
throw new IllegalStateException(targetCompilerFilter); throw new IllegalStateException(targetCompilerFilter);
} }
isProfileGuidedFilter = false; isProfileGuidedFilter = false;
break;
}
}
} }
// If we're asked to take profile updates into account, check now. // If we're asked to take profile updates into account, check now.
@@ -281,7 +274,19 @@ class PackageDexOptimizer {
mSystemReady = true; mSystemReady = true;
} }
private boolean isUsedByOtherApps(String apkPath) { /**
* Returns true if the profiling data collected for the given app indicate
* that the apps's APK has been loaded by another app.
* Note that this returns false for all forward-locked apps and apps without
* any collected profiling data.
*/
public static boolean isUsedByOtherApps(PackageParser.Package pkg) {
if (pkg.isForwardLocked()) {
// Skip the check for forward locked packages since they don't share their code.
return false;
}
for (String apkPath : pkg.getAllCodePathsExcludingResourceOnly()) {
try { try {
apkPath = new File(apkPath).getCanonicalPath(); apkPath = new File(apkPath).getCanonicalPath();
} catch (IOException e) { } catch (IOException e) {
@@ -291,12 +296,14 @@ class PackageDexOptimizer {
String useMarker = apkPath.replace('/', '@'); String useMarker = apkPath.replace('/', '@');
final int[] currentUserIds = UserManagerService.getInstance().getUserIds(); final int[] currentUserIds = UserManagerService.getInstance().getUserIds();
for (int i = 0; i < currentUserIds.length; i++) { for (int i = 0; i < currentUserIds.length; i++) {
File profileDir = Environment.getDataProfilesDeForeignDexDirectory(currentUserIds[i]); File profileDir =
Environment.getDataProfilesDeForeignDexDirectory(currentUserIds[i]);
File foreignUseMark = new File(profileDir, useMarker); File foreignUseMark = new File(profileDir, useMarker);
if (foreignUseMark.exists()) { if (foreignUseMark.exists()) {
return true; return true;
} }
} }
}
return false; return false;
} }

View File

@@ -69,10 +69,11 @@ public class PackageManagerServiceUtils {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
for (Iterator<PackageParser.Package> i = pkgs.iterator(); i.hasNext();) { for (Iterator<PackageParser.Package> i = pkgs.iterator(); i.hasNext();) {
PackageParser.Package pkg = i.next(); PackageParser.Package pkg = i.next();
long then = pkg.getLatestPackageUseTimeInMills(); long then = pkg.getLatestForegroundPackageUseTimeInMills();
if (then + dexOptLRUThresholdInMills < now) { if (then + dexOptLRUThresholdInMills < now) {
if (DEBUG_DEXOPT) { if (DEBUG_DEXOPT) {
Log.i(TAG, "Skipping dexopt of " + pkg.packageName + " last resumed: " + Log.i(TAG, "Skipping dexopt of " + pkg.packageName +
" last used in foreground: " +
((then == 0) ? "never" : new Date(then))); ((then == 0) ? "never" : new Date(then)));
} }
i.remove(); i.remove();
@@ -117,6 +118,18 @@ public class PackageManagerServiceUtils {
} }
remainingPkgs.removeAll(result); remainingPkgs.removeAll(result);
// Give priority to apps used by other apps.
for (PackageParser.Package pkg : remainingPkgs) {
if (PackageDexOptimizer.isUsedByOtherApps(pkg)) {
if (DEBUG_DEXOPT) {
Log.i(TAG, "Adding app used by other apps " + result.size() + ": " +
pkg.packageName);
}
result.add(pkg);
}
}
remainingPkgs.removeAll(result);
// Filter out packages that aren't recently used, add all remaining apps. // Filter out packages that aren't recently used, add all remaining apps.
// TODO: add a property to control this? // TODO: add a property to control this?
if (packageManagerService.isHistoricalPackageUsageAvailable()) { if (packageManagerService.isHistoricalPackageUsageAvailable()) {