diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-01-22 14:46:21 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2010-01-22 14:46:21 -0800 |
commit | e6620b2d993a8372f63d1c0ca0f1c8be6ab9ad0f (patch) | |
tree | ef8e30a13415d93493b5395a35a10dbfb04bfe6e | |
parent | b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7 (diff) | |
download | base-e6620b2d993a8372f63d1c0ca0f1c8be6ab9ad0f.tar.gz |
Fix issue #2391429: Crash during boot if fwd locked app is incompletely installed
We need to remove left-over .apk when cleaning up a partially installed app.
Change-Id: I94264549670a2ad01622f746c40c82c30dd3da8d
-rw-r--r-- | services/java/com/android/server/PackageManagerService.java | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 93821464c243..86504a095daf 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -573,7 +573,7 @@ class PackageManagerService extends IPackageManager.Stub { mAppInstallDir.mkdirs(); // scanDirLI() assumes this dir exists } //look for any incomplete package installations - ArrayList<String> deletePkgsList = mSettings.getListOfIncompleteInstallPackages(); + ArrayList<PackageSetting> deletePkgsList = mSettings.getListOfIncompleteInstallPackages(); //clean up list for(int i = 0; i < deletePkgsList.size(); i++) { //clean up here @@ -628,20 +628,31 @@ class PackageManagerService extends IPackageManager.Stub { } } - void cleanupInstallFailedPackage(String packageName) { + void cleanupInstallFailedPackage(PackageSetting ps) { + Log.i(TAG, "Cleaning up incompletely installed app: " + ps.name); if (mInstaller != null) { - int retCode = mInstaller.remove(packageName); + int retCode = mInstaller.remove(ps.name); if (retCode < 0) { Log.w(TAG, "Couldn't remove app data directory for package: " - + packageName + ", retcode=" + retCode); + + ps.name + ", retcode=" + retCode); } } else { //for emulator - PackageParser.Package pkg = mPackages.get(packageName); + PackageParser.Package pkg = mPackages.get(ps.name); File dataDir = new File(pkg.applicationInfo.dataDir); dataDir.delete(); } - mSettings.removePackageLP(packageName); + if (ps.codePath != null) { + if (!ps.codePath.delete()) { + Log.w(TAG, "Unable to remove old code file: " + ps.codePath); + } + } + if (ps.resourcePath != null) { + if (!ps.resourcePath.delete() && !ps.resourcePath.equals(ps.codePath)) { + Log.w(TAG, "Unable to remove old code file: " + ps.resourcePath); + } + } + mSettings.removePackageLP(ps.name); } void readPermissions() { @@ -6732,15 +6743,15 @@ class PackageManagerService extends IPackageManager.Stub { return mReadMessages.toString(); } - ArrayList<String> getListOfIncompleteInstallPackages() { + ArrayList<PackageSetting> getListOfIncompleteInstallPackages() { HashSet<String> kList = new HashSet<String>(mPackages.keySet()); Iterator<String> its = kList.iterator(); - ArrayList<String> ret = new ArrayList<String>(); + ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>(); while(its.hasNext()) { String key = its.next(); PackageSetting ps = mPackages.get(key); if(ps.getInstallStatus() == PKG_INSTALL_INCOMPLETE) { - ret.add(key); + ret.add(ps); } } return ret; |