diff options
| author | Kenny Root <kroot@google.com> | 2012-10-18 14:57:33 -0700 |
|---|---|---|
| committer | Kenny Root <kroot@google.com> | 2012-10-18 17:21:59 -0700 |
| commit | cea3743499f4bb8e5f28a2e57686d7af313169c5 (patch) | |
| tree | f762b85645c8e05ab1ad5f322e9f45daa7cffc26 | |
| parent | a3e90798b7ad3ed62e5b31842c699b2f98bd457b (diff) | |
| download | frameworks_base-cea3743499f4bb8e5f28a2e57686d7af313169c5.zip frameworks_base-cea3743499f4bb8e5f28a2e57686d7af313169c5.tar.gz frameworks_base-cea3743499f4bb8e5f28a2e57686d7af313169c5.tar.bz2 | |
Try to free cache before giving up on install
Try to get installd to free up cache before giving up when there is too
little space free.
Bug: 7232123
Change-Id: Ie3c8ca8dfc190abbb9a29a7baee31f32e9de7d69
3 files changed, 33 insertions, 2 deletions
diff --git a/core/java/com/android/internal/app/IMediaContainerService.aidl b/core/java/com/android/internal/app/IMediaContainerService.aidl index c82834f7..03d3b22 100755 --- a/core/java/com/android/internal/app/IMediaContainerService.aidl +++ b/core/java/com/android/internal/app/IMediaContainerService.aidl @@ -36,4 +36,5 @@ interface IMediaContainerService { /** Return file system stats: [0] is total bytes, [1] is available bytes */ long[] getFileSystemStats(in String path); void clearDirectory(in String directory); + long calculateInstalledSize(in String packagePath, boolean isForwardLocked); } diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java index 76b1ec6..cf56cba 100644 --- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java +++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java @@ -259,6 +259,21 @@ public class DefaultContainerService extends IntentService { eraseFiles(directory); } } + + @Override + public long calculateInstalledSize(String packagePath, boolean isForwardLocked) + throws RemoteException { + final File packageFile = new File(packagePath); + try { + return calculateContainerSize(packageFile, isForwardLocked) * 1024 * 1024; + } catch (IOException e) { + /* + * Okay, something failed, so let's just estimate it to be 2x + * the file size. Note this will be 0 if the file doesn't exist. + */ + return packageFile.length() * 2; + } + } }; public DefaultContainerService() { diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 2d69c74..977437b 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -6330,8 +6330,23 @@ public class PackageManagerService extends IPackageManager.Stub { if (packageFile != null) { // Remote call to find out default install location - pkgLite = mContainerService.getMinimalPackageInfo( - packageFile.getAbsolutePath(), flags, lowThreshold); + final String packageFilePath = packageFile.getAbsolutePath(); + pkgLite = mContainerService.getMinimalPackageInfo(packageFilePath, flags, + lowThreshold); + + /* + * If we have too little free space, try to free cache + * before giving up. + */ + if (pkgLite.recommendedInstallLocation + == PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE) { + final long size = mContainerService.calculateInstalledSize( + packageFilePath, isForwardLocked()); + if (mInstaller.freeCache(size + lowThreshold) >= 0) { + pkgLite = mContainerService.getMinimalPackageInfo(packageFilePath, + flags, lowThreshold); + } + } } } finally { mContext.revokeUriPermission(mPackageURI, |
