diff --git a/core/java/com/android/internal/content/InstallLocationUtils.java b/core/java/com/android/internal/content/InstallLocationUtils.java index c456cf3a4bb6c..a173ce16feea8 100644 --- a/core/java/com/android/internal/content/InstallLocationUtils.java +++ b/core/java/com/android/internal/content/InstallLocationUtils.java @@ -31,6 +31,7 @@ import android.os.Environment; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; @@ -261,12 +262,12 @@ public class InstallLocationUtils { // We're left with new installations with either preferring external or auto, so just pick // volume with most space + String bestCandidate = !volumePaths.isEmpty() ? volumePaths.keyAt(0) : null; if (volumePaths.size() == 1) { if (checkFitOnVolume(storageManager, volumePaths.valueAt(0), params)) { - return volumePaths.keyAt(0); + return bestCandidate; } } else { - String bestCandidate = null; long bestCandidateAvailBytes = Long.MIN_VALUE; for (String vol : volumePaths.keySet()) { final String volumePath = volumePaths.get(vol); @@ -289,6 +290,14 @@ public class InstallLocationUtils { } + // For new installations of a predefined size, check property to let it through + // regardless of the actual free space. + if (!volumePaths.isEmpty() && Integer.MAX_VALUE == params.sizeBytes + && SystemProperties.getBoolean("debug.pm.install_skip_size_check_for_maxint", + false)) { + return bestCandidate; + } + throw new IOException("No special requests, but no room on allowed volumes. " + " allow3rdPartyOnInternal? " + allow3rdPartyOnInternal); }