summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java75
1 files changed, 45 insertions, 30 deletions
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 2b33aced7151..984f22f01465 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -345,40 +345,55 @@ public class BackgroundDexOptService extends JobService {
private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
long lowStorageThreshold, boolean isForPrimaryDex) {
ArraySet<String> updatedPackages = new ArraySet<>();
- Set<String> unusedPackages = pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
- boolean hadSomeLowSpaceFailure = false;
- Log.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
- // Only downgrade apps when space is low on device.
- // Threshold is selected above the lowStorageThreshold so that we can pro-actively clean
- // up disk before user hits the actual lowStorageThreshold.
- final long lowStorageThresholdForDowngrade = LOW_THRESHOLD_MULTIPLIER_FOR_DOWNGRADE *
- lowStorageThreshold;
- boolean shouldDowngrade = shouldDowngrade(lowStorageThresholdForDowngrade);
- Log.d(TAG, "Should Downgrade " + shouldDowngrade);
- boolean dex_opt_performed = false;
- for (String pkg : pkgs) {
- int abort_code = abortIdleOptimizations(lowStorageThreshold);
- if (abort_code == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) {
- return abort_code;
- }
- // Downgrade unused packages.
- if (unusedPackages.contains(pkg) && shouldDowngrade) {
- dex_opt_performed = downgradePackage(pm, pkg, isForPrimaryDex);
- } else {
- if (abort_code == OPTIMIZE_ABORT_NO_SPACE_LEFT) {
- // can't dexopt because of low space.
- hadSomeLowSpaceFailure = true;
- continue;
+
+ try {
+ // Only downgrade apps when space is low on device.
+ // Threshold is selected above the lowStorageThreshold so that we can pro-actively clean
+ // up disk before user hits the actual lowStorageThreshold.
+ final long lowStorageThresholdForDowngrade = LOW_THRESHOLD_MULTIPLIER_FOR_DOWNGRADE
+ * lowStorageThreshold;
+ boolean shouldDowngrade = shouldDowngrade(lowStorageThresholdForDowngrade);
+ Log.d(TAG, "Should Downgrade " + shouldDowngrade);
+ if (shouldDowngrade) {
+ Set<String> unusedPackages =
+ pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
+ Log.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
+
+ for (String pkg : unusedPackages) {
+ int abortCode = abortIdleOptimizations(/*lowStorageThreshold*/ -1);
+ if (abortCode != OPTIMIZE_CONTINUE) {
+ // Should be aborted by the scheduler.
+ return abortCode;
+ }
+ if (downgradePackage(pm, pkg, isForPrimaryDex)) {
+ updatedPackages.add(pkg);
+ }
+ }
+
+ if (!unusedPackages.isEmpty()) {
+ pkgs = new ArraySet<>(pkgs);
+ pkgs.removeAll(unusedPackages);
}
- dex_opt_performed = optimizePackage(pm, pkg, isForPrimaryDex);
}
- if (dex_opt_performed) {
- updatedPackages.add(pkg);
+
+ for (String pkg : pkgs) {
+ int abortCode = abortIdleOptimizations(lowStorageThreshold);
+ if (abortCode != OPTIMIZE_CONTINUE) {
+ // Either aborted by the scheduler or no space left.
+ return abortCode;
+ }
+
+ boolean dexOptPerformed = optimizePackage(pm, pkg, isForPrimaryDex);
+ if (dexOptPerformed) {
+ updatedPackages.add(pkg);
+ }
}
- }
- notifyPinService(updatedPackages);
- return hadSomeLowSpaceFailure ? OPTIMIZE_ABORT_NO_SPACE_LEFT : OPTIMIZE_PROCESSED;
+ return OPTIMIZE_PROCESSED;
+ } finally {
+ // Always let the pinner service know about changes.
+ notifyPinService(updatedPackages);
+ }
}