am b5c5354f: am 63360780: Merge "Stop boot dexopt when low on memory." into lmp-mr1-dev

* commit 'b5c5354fdab213c28d0817169d4ed100cc3e0215':
  Stop boot dexopt when low on memory.
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 1059f0b..b79e157 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4538,14 +4538,24 @@
             filterRecentlyUsedApps(pkgs);
             // Add all remaining apps.
             for (PackageParser.Package pkg : pkgs) {
+                if (DEBUG_DEXOPT) {
+                    Log.i(TAG, "Adding app " + sortedPkgs.size() + ": " + pkg.packageName);
+                }
                 sortedPkgs.add(pkg);
             }
 
             int i = 0;
             int total = sortedPkgs.size();
+            File dataDir = Environment.getDataDirectory();
+            long lowThreshold = StorageManager.from(mContext).getStorageLowBytes(dataDir);
+            if (lowThreshold == 0) {
+                throw new IllegalStateException("Invalid low memory threshold");
+            }
             for (PackageParser.Package pkg : sortedPkgs) {
-                if (DEBUG_DEXOPT) {
-                    Log.i(TAG, "Adding app " + sortedPkgs.size() + ": " + pkg.packageName);
+                long usableSpace = dataDir.getUsableSpace();
+                if (usableSpace < lowThreshold) {
+                    Log.w(TAG, "Not running dexopt on remaining apps due to low memory: " + usableSpace);
+                    break;
                 }
                 performBootDexOpt(pkg, ++i, total);
             }