Merge "Don't write settings multiple times when unmounting." into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
1073e3fa72
@@ -5466,7 +5466,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
deletePackageLI(
|
deletePackageLI(
|
||||||
pkgName, false,
|
pkgName, false,
|
||||||
dataDirExists ? PackageManager.DONT_DELETE_DATA : 0,
|
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
|
// First delete the existing package while retaining the data directory
|
||||||
if (!deletePackageLI(pkgName, true, PackageManager.DONT_DELETE_DATA,
|
if (!deletePackageLI(pkgName, true, PackageManager.DONT_DELETE_DATA,
|
||||||
res.removedInfo)) {
|
res.removedInfo, true)) {
|
||||||
// If the existing package was'nt successfully deleted
|
// If the existing package was'nt successfully deleted
|
||||||
res.returnCode = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
|
res.returnCode = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
|
||||||
deletedPkg = false;
|
deletedPkg = false;
|
||||||
@@ -5541,7 +5541,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
deletePackageLI(
|
deletePackageLI(
|
||||||
pkgName, true,
|
pkgName, true,
|
||||||
PackageManager.DONT_DELETE_DATA,
|
PackageManager.DONT_DELETE_DATA,
|
||||||
res.removedInfo);
|
res.removedInfo, true);
|
||||||
}
|
}
|
||||||
// Since we failed to install the new package we need to restore the old
|
// Since we failed to install the new package we need to restore the old
|
||||||
// package that we deleted.
|
// package that we deleted.
|
||||||
@@ -6009,7 +6009,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
|
|
||||||
synchronized (mInstallLock) {
|
synchronized (mInstallLock) {
|
||||||
res = deletePackageLI(packageName, deleteCodeAndResources,
|
res = deletePackageLI(packageName, deleteCodeAndResources,
|
||||||
flags | REMOVE_CHATTY, info);
|
flags | REMOVE_CHATTY, info, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(res && sendBroadCast) {
|
if(res && sendBroadCast) {
|
||||||
@@ -6070,7 +6070,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
* delete a partially installed application.
|
* delete a partially installed application.
|
||||||
*/
|
*/
|
||||||
private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo,
|
private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo,
|
||||||
int flags) {
|
int flags, boolean writeSettings) {
|
||||||
String packageName = p.packageName;
|
String packageName = p.packageName;
|
||||||
if (outInfo != null) {
|
if (outInfo != null) {
|
||||||
outInfo.removedPackage = packageName;
|
outInfo.removedPackage = packageName;
|
||||||
@@ -6123,8 +6123,10 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
mSettings.mPreferredActivities.removeFilter(pa);
|
mSettings.mPreferredActivities.removeFilter(pa);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Save settings now
|
if (writeSettings) {
|
||||||
mSettings.writeLP();
|
// Save settings now
|
||||||
|
mSettings.writeLP();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6132,7 +6134,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
* Tries to delete system package.
|
* Tries to delete system package.
|
||||||
*/
|
*/
|
||||||
private boolean deleteSystemPackageLI(PackageParser.Package p,
|
private boolean deleteSystemPackageLI(PackageParser.Package p,
|
||||||
int flags, PackageRemovedInfo outInfo) {
|
int flags, PackageRemovedInfo outInfo, boolean writeSettings) {
|
||||||
ApplicationInfo applicationInfo = p.applicationInfo;
|
ApplicationInfo applicationInfo = p.applicationInfo;
|
||||||
//applicable for non-partially installed applications only
|
//applicable for non-partially installed applications only
|
||||||
if (applicationInfo == null) {
|
if (applicationInfo == null) {
|
||||||
@@ -6164,7 +6166,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
deleteCodeAndResources = false;
|
deleteCodeAndResources = false;
|
||||||
flags |= PackageManager.DONT_DELETE_DATA;
|
flags |= PackageManager.DONT_DELETE_DATA;
|
||||||
}
|
}
|
||||||
boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
|
boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
|
||||||
|
writeSettings);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -6185,13 +6188,16 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
}
|
}
|
||||||
synchronized (mPackages) {
|
synchronized (mPackages) {
|
||||||
updatePermissionsLP(newPkg.packageName, newPkg, true, true, false);
|
updatePermissionsLP(newPkg.packageName, newPkg, true, true, false);
|
||||||
mSettings.writeLP();
|
if (writeSettings) {
|
||||||
|
mSettings.writeLP();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean deleteInstalledPackageLI(PackageParser.Package p,
|
private boolean deleteInstalledPackageLI(PackageParser.Package p,
|
||||||
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
|
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
|
||||||
|
boolean writeSettings) {
|
||||||
ApplicationInfo applicationInfo = p.applicationInfo;
|
ApplicationInfo applicationInfo = p.applicationInfo;
|
||||||
if (applicationInfo == null) {
|
if (applicationInfo == null) {
|
||||||
Slog.w(TAG, "Package " + p.packageName + " has no applicationInfo.");
|
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
|
// 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
|
// Delete application code and resources
|
||||||
if (deleteCodeAndResources) {
|
if (deleteCodeAndResources) {
|
||||||
@@ -6219,7 +6225,8 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
* This method handles package deletion in general
|
* This method handles package deletion in general
|
||||||
*/
|
*/
|
||||||
private boolean deletePackageLI(String packageName,
|
private boolean deletePackageLI(String packageName,
|
||||||
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
|
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo,
|
||||||
|
boolean writeSettings) {
|
||||||
if (packageName == null) {
|
if (packageName == null) {
|
||||||
Slog.w(TAG, "Attempt to delete null packageName.");
|
Slog.w(TAG, "Attempt to delete null packageName.");
|
||||||
return false;
|
return false;
|
||||||
@@ -6246,7 +6253,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
|
|
||||||
if (dataOnly) {
|
if (dataOnly) {
|
||||||
// Delete application data first
|
// Delete application data first
|
||||||
removePackageDataLI(p, outInfo, flags);
|
removePackageDataLI(p, outInfo, flags, writeSettings);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// At this point the package should have ApplicationInfo associated with it
|
// 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);
|
Log.i(TAG, "Removing system package:"+p.packageName);
|
||||||
// When an updated system application is deleted we delete the existing resources as well and
|
// When an updated system application is deleted we delete the existing resources as well and
|
||||||
// fall back to existing code in system partition
|
// fall back to existing code in system partition
|
||||||
ret = deleteSystemPackageLI(p, flags, outInfo);
|
ret = deleteSystemPackageLI(p, flags, outInfo, writeSettings);
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, "Removing non-system package:"+p.packageName);
|
Log.i(TAG, "Removing non-system package:"+p.packageName);
|
||||||
// Kill application pre-emptively especially for apps on sd.
|
// Kill application pre-emptively especially for apps on sd.
|
||||||
killApplication(packageName, p.applicationInfo.uid);
|
killApplication(packageName, p.applicationInfo.uid);
|
||||||
ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
|
ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo,
|
||||||
|
writeSettings);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -9738,7 +9746,7 @@ class PackageManagerService extends IPackageManager.Stub {
|
|||||||
PackageRemovedInfo outInfo = new PackageRemovedInfo();
|
PackageRemovedInfo outInfo = new PackageRemovedInfo();
|
||||||
synchronized (mInstallLock) {
|
synchronized (mInstallLock) {
|
||||||
boolean res = deletePackageLI(pkgName, false,
|
boolean res = deletePackageLI(pkgName, false,
|
||||||
PackageManager.DONT_DELETE_DATA, outInfo);
|
PackageManager.DONT_DELETE_DATA, outInfo, false);
|
||||||
if (res) {
|
if (res) {
|
||||||
pkgList.add(pkgName);
|
pkgList.add(pkgName);
|
||||||
} else {
|
} 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
|
// We have to absolutely send UPDATED_MEDIA_STATUS only
|
||||||
// after confirming that all the receivers processed the ordered
|
// after confirming that all the receivers processed the ordered
|
||||||
// broadcast when packages get disabled, force a gc to clean things up.
|
// broadcast when packages get disabled, force a gc to clean things up.
|
||||||
|
|||||||
Reference in New Issue
Block a user