summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2016-08-17 22:07:12 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-08-17 22:07:13 +0000
commit712dde29fff4b7387cfed2e3fff64e51c5b329cd (patch)
tree314a2ec55fcb44809decac2ad36949badf58a4fa
parentc1a36814e5b49c6450442df727e15e9b2945f730 (diff)
parent8735f07a698218d311826a140d08d611d3c23db1 (diff)
Merge "BackgroundDexOptService: Check for low storage conditions." into nyc-mr1-dev
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java40
1 files changed, 40 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 87f0581a7879..cec105816b36 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -28,10 +28,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
+import android.os.Environment;
import android.os.ServiceManager;
+import android.os.storage.StorageManager;
import android.util.ArraySet;
import android.util.Log;
+import java.io.File;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
@@ -66,6 +69,8 @@ public class BackgroundDexOptService extends JobService {
*/
final AtomicBoolean mExitPostBootUpdate = new AtomicBoolean(false);
+ private final File dataDir = Environment.getDataDirectory();
+
public static void schedule(Context context) {
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
@@ -113,6 +118,16 @@ public class BackgroundDexOptService extends JobService {
return (100 * level / scale);
}
+ private long getLowStorageThreshold() {
+ @SuppressWarnings("deprecation")
+ final long lowThreshold = StorageManager.from(this).getStorageLowBytes(dataDir);
+ if (lowThreshold == 0) {
+ Log.e(TAG, "Invalid low storage threshold");
+ }
+
+ return lowThreshold;
+ }
+
private boolean runPostBootUpdate(final JobParameters jobParams,
final PackageManagerService pm, final ArraySet<String> pkgs) {
if (mExitPostBootUpdate.get()) {
@@ -124,6 +139,8 @@ public class BackgroundDexOptService extends JobService {
final int lowBatteryThreshold = getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
+ final long lowThreshold = getLowStorageThreshold();
+
mAbortPostBootUpdate.set(false);
new Thread("BackgroundDexOptService_PostBootUpdate") {
@Override
@@ -141,6 +158,14 @@ public class BackgroundDexOptService extends JobService {
// Rather bail than completely drain the battery.
break;
}
+ long usableSpace = dataDir.getUsableSpace();
+ if (usableSpace < lowThreshold) {
+ // Rather bail than completely fill up the disk.
+ Log.w(TAG, "Aborting background dex opt job due to low storage: " +
+ usableSpace);
+ break;
+ }
+
if (DEBUG_DEXOPT) {
Log.i(TAG, "Updating package " + pkg);
}
@@ -171,6 +196,9 @@ public class BackgroundDexOptService extends JobService {
mExitPostBootUpdate.set(true);
mAbortIdleOptimization.set(false);
+
+ final long lowThreshold = getLowStorageThreshold();
+
new Thread("BackgroundDexOptService_IdleOptimization") {
@Override
public void run() {
@@ -183,6 +211,15 @@ public class BackgroundDexOptService extends JobService {
// Skip previously failing package
continue;
}
+
+ long usableSpace = dataDir.getUsableSpace();
+ if (usableSpace < lowThreshold) {
+ // Rather bail than completely fill up the disk.
+ Log.w(TAG, "Aborting background dex opt job due to low storage: " +
+ usableSpace);
+ break;
+ }
+
// Conservatively add package to the list of failing ones in case performDexOpt
// never returns.
synchronized (sFailedPackageNames) {
@@ -213,6 +250,9 @@ public class BackgroundDexOptService extends JobService {
Log.i(TAG, "onStartJob");
}
+ // NOTE: PackageManagerService.isStorageLow uses a different set of criteria from
+ // the checks above. This check is not "live" - the value is determined by a background
+ // restart with a period of ~1 minute.
PackageManagerService pm = (PackageManagerService)ServiceManager.getService("package");
if (pm.isStorageLow()) {
if (DEBUG_DEXOPT) {