summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/PackageManagerService.java49
1 files changed, 32 insertions, 17 deletions
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index d66e5cedc3ef..dbf92ba2aaf2 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -5466,7 +5466,7 @@ class PackageManagerService extends IPackageManager.Stub {
deletePackageLI(
pkgName, false,
dataDirExists ? PackageManager.DONT_DELETE_DATA : 0,
- res.removedInfo);
+ res.removedInfo, true);
}
}
}
@@ -5511,7 +5511,7 @@ class PackageManagerService extends IPackageManager.Stub {
// First delete the existing package while retaining the data directory
if (!deletePackageLI(pkgName, true, PackageManager.DONT_DELETE_DATA,
- res.removedInfo)) {
+ res.removedInfo, true)) {
// If the existing package was'nt successfully deleted
res.returnCode = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
deletedPkg = false;
@@ -5541,7 +5541,7 @@ class PackageManagerService extends IPackageManager.Stub {
deletePackageLI(
pkgName, true,
PackageManager.DONT_DELETE_DATA,
- res.removedInfo);
+ res.removedInfo, true);
}
// Since we failed to install the new package we need to restore the old
// package that we deleted.
@@ -6009,7 +6009,7 @@ class PackageManagerService extends IPackageManager.Stub {
synchronized (mInstallLock) {
res = deletePackageLI(packageName, deleteCodeAndResources,
- flags | REMOVE_CHATTY, info);
+ flags | REMOVE_CHATTY, info, true);
}
if(res && sendBroadCast) {
@@ -6070,7 +6070,7 @@ class PackageManagerService extends IPackageManager.Stub {
* delete a partially installed application.
*/
private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo,
- int flags) {
+ int flags, boolean writeSettings) {
String packageName = p.packageName;
if (outInfo != null) {
outInfo.removedPackage = packageName;
@@ -6123,8 +6123,10 @@ class PackageManagerService extends IPackageManager.Stub {
mSettings.mPreferredActivities.removeFilter(pa);
}
}
- // Save settings now
- mSettings.writeLP();
+ if (writeSettings) {
+ // Save settings now
+ mSettings.writeLP();
+ }
}
}
@@ -6132,7 +6134,7 @@ class PackageManagerService extends IPackageManager.Stub {
* Tries to delete system package.
*/
private boolean deleteSystemPackageLI(PackageParser.Package p,
- int flags, PackageRemovedInfo outInfo) {
+ int flags, PackageRemovedInfo outInfo, boolean writeSettings) {
ApplicationInfo applicationInfo = p.applicationInfo;
//applicable for non-partially installed applications only
if (applicationInfo == null) {
@@ -6164,7 +6166,8 @@ class PackageManagerService extends IPackageManager.Stub {
deleteCodeAndResources = false;
flags |= PackageManager.DONT_DELETE_DATA;
}
- boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
+ boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
+ writeSettings);
if (!ret) {
return false;
}
@@ -6185,13 +6188,16 @@ class PackageManagerService extends IPackageManager.Stub {
}
synchronized (mPackages) {
updatePermissionsLP(newPkg.packageName, newPkg, true, true, false);
- mSettings.writeLP();
+ if (writeSettings) {
+ mSettings.writeLP();
+ }
}
return true;
}
private boolean deleteInstalledPackageLI(PackageParser.Package p,
- boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
+ boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
+ boolean writeSettings) {
ApplicationInfo applicationInfo = p.applicationInfo;
if (applicationInfo == null) {
Slog.w(TAG, "Package " + p.packageName + " has no applicationInfo.");
@@ -6202,7 +6208,7 @@ class PackageManagerService extends IPackageManager.Stub {
}
// Delete package data from internal structures and also remove data if flag is set
- removePackageDataLI(p, outInfo, flags);
+ removePackageDataLI(p, outInfo, flags, writeSettings);
// Delete application code and resources
if (deleteCodeAndResources) {
@@ -6219,7 +6225,8 @@ class PackageManagerService extends IPackageManager.Stub {
* This method handles package deletion in general
*/
private boolean deletePackageLI(String packageName,
- boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
+ boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
+ boolean writeSettings) {
if (packageName == null) {
Slog.w(TAG, "Attempt to delete null packageName.");
return false;
@@ -6246,7 +6253,7 @@ class PackageManagerService extends IPackageManager.Stub {
if (dataOnly) {
// Delete application data first
- removePackageDataLI(p, outInfo, flags);
+ removePackageDataLI(p, outInfo, flags, writeSettings);
return true;
}
// At this point the package should have ApplicationInfo associated with it
@@ -6259,12 +6266,13 @@ class PackageManagerService extends IPackageManager.Stub {
Log.i(TAG, "Removing system package:"+p.packageName);
// When an updated system application is deleted we delete the existing resources as well and
// fall back to existing code in system partition
- ret = deleteSystemPackageLI(p, flags, outInfo);
+ ret = deleteSystemPackageLI(p, flags, outInfo, writeSettings);
} else {
Log.i(TAG, "Removing non-system package:"+p.packageName);
// Kill application pre-emptively especially for apps on sd.
killApplication(packageName, p.applicationInfo.uid);
- ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
+ ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
+ writeSettings);
}
return ret;
}
@@ -9738,7 +9746,7 @@ class PackageManagerService extends IPackageManager.Stub {
PackageRemovedInfo outInfo = new PackageRemovedInfo();
synchronized (mInstallLock) {
boolean res = deletePackageLI(pkgName, false,
- PackageManager.DONT_DELETE_DATA, outInfo);
+ PackageManager.DONT_DELETE_DATA, outInfo, false);
if (res) {
pkgList.add(pkgName);
} else {
@@ -9747,6 +9755,13 @@ class PackageManagerService extends IPackageManager.Stub {
}
}
}
+
+ synchronized (mPackages) {
+ // We didn't update the settings after removing each package;
+ // write them now for all packages.
+ mSettings.writeLP();
+ }
+
// We have to absolutely send UPDATED_MEDIA_STATUS only
// after confirming that all the receivers processed the ordered
// broadcast when packages get disabled, force a gc to clean things up.