summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2012-10-18 14:57:33 -0700
committerKenny Root <kroot@google.com>2012-10-18 17:21:59 -0700
commitcea3743499f4bb8e5f28a2e57686d7af313169c5 (patch)
treef762b85645c8e05ab1ad5f322e9f45daa7cffc26
parenta3e90798b7ad3ed62e5b31842c699b2f98bd457b (diff)
downloadframeworks_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
-rwxr-xr-xcore/java/com/android/internal/app/IMediaContainerService.aidl1
-rw-r--r--packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java15
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java19
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,