summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Patrick Baumann <patb@google.com> 2018-11-09 12:50:50 -0800
committer Patrick Baumann <patb@google.com> 2018-11-13 13:41:30 -0800
commitae61ce09c635d08b5bf31fb68cbaed21dd031dbd (patch)
treec1a24e9b93c9cae11480955495dab38fdd10288e
parent97dbb7b9684c741ad1c3718fb1cc1e62dc9457e6 (diff)
Begins refactoring delete into test and execute steps
This change is the first in a series that breaks the deletePackageLIF method into two distinct steps: testing for ability to delete and actual execution of the delete. This is part of the larger effort of removing exception cases during atomic install commit. Bug: 109941548 Test: install, uninstall still work Change-Id: Ib4f7799044cb7d6a346da35160046ee5d9ce0b0c
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java77
1 files changed, 49 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 77045fb11b1f..41f6068fd057 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -17774,30 +17774,58 @@ public class PackageManagerService extends IPackageManager.Stub
return true;
}
+ private static class DeletePackageAction {
+ public final PackageSetting deletingPs;
+
+ private DeletePackageAction(PackageSetting deletingPs) {
+ this.deletingPs = deletingPs;
+ }
+ }
+
+ /**
+ * @return a {@link DeletePackageAction} if the provided package may be deleted, {@code null}
+ * otherwise.
+ */
+ @Nullable
+ private DeletePackageAction mayDeletePackageLIF(@NonNull String packageName) {
+ synchronized (mPackages) {
+ final PackageSetting ps;
+ ps = mSettings.mPackages.get(packageName);
+ if (ps == null) {
+ return null;
+ }
+ return new DeletePackageAction(ps);
+ }
+ }
+
/*
* This method handles package deletion in general
*/
- private boolean deletePackageLIF(String packageName, UserHandle user,
+ private boolean deletePackageLIF(@NonNull String packageName, UserHandle user,
boolean deleteCodeAndResources, int[] allUserHandles, int flags,
PackageRemovedInfo outInfo, boolean writeSettings,
PackageParser.Package replacingPackage) {
- if (packageName == null) {
- Slog.w(TAG, "Attempt to delete null packageName.");
+ final DeletePackageAction action = mayDeletePackageLIF(packageName);
+ if (null == action) {
return false;
}
if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageLI: " + packageName + " user " + user);
- PackageSetting ps;
+ return executeDeletePackageLIF(action, packageName, user, deleteCodeAndResources,
+ allUserHandles, flags, outInfo, writeSettings, replacingPackage);
+ }
+
+ private boolean executeDeletePackageLIF(DeletePackageAction action,
+ String packageName, UserHandle user, boolean deleteCodeAndResources,
+ int[] allUserHandles, int flags, PackageRemovedInfo outInfo,
+ boolean writeSettings, PackageParser.Package replacingPackage) {
+ final PackageSetting ps = action.deletingPs;
+ final boolean systemApp = isSystemApp(ps);
synchronized (mPackages) {
- ps = mSettings.mPackages.get(packageName);
- if (ps == null) {
- Slog.w(TAG, "Package named '" + packageName + "' doesn't exist.");
- return false;
- }
- if (ps.parentPackageName != null && (!isSystemApp(ps)
- || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)) {
+ if (ps.parentPackageName != null
+ && (!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)) {
if (DEBUG_REMOVE) {
Slog.d(TAG, "Uninstalled child package:" + packageName + " for user:"
+ ((user == null) ? UserHandle.USER_ALL : user));
@@ -17805,9 +17833,7 @@ public class PackageManagerService extends IPackageManager.Stub
final int removedUserId = (user != null) ? user.getIdentifier()
: UserHandle.USER_ALL;
- if (!clearPackageStateForUserLIF(ps, removedUserId, outInfo)) {
- return false;
- }
+ clearPackageStateForUserLIF(ps, removedUserId, outInfo);
markPackageUninstalledForUserLPw(ps, user);
scheduleWritePackageRestrictionsLocked(user);
return true;
@@ -17820,7 +17846,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
- if (((!isSystemApp(ps) || (flags&PackageManager.DELETE_SYSTEM_APP) != 0) && user != null
+ if (((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0) && user != null
&& user.getIdentifier() != UserHandle.USER_ALL)) {
// The caller is asking that the package only be deleted for a single
// user. To do this, we just mark its uninstalled state and delete
@@ -17829,7 +17855,7 @@ public class PackageManagerService extends IPackageManager.Stub
// semantics than normal for uninstalling system apps.
markPackageUninstalledForUserLPw(ps, user);
- if (!isSystemApp(ps)) {
+ if (!systemApp) {
// Do not uninstall the APK if an app should be cached
boolean keepUninstalledPackage = shouldKeepUninstalledPackageLPr(packageName);
if (ps.isAnyInstalled(sUserManager.getUserIds()) || keepUninstalledPackage) {
@@ -17837,9 +17863,7 @@ public class PackageManagerService extends IPackageManager.Stub
// we need to do is clear this user's data and save that
// it is uninstalled.
if (DEBUG_REMOVE) Slog.d(TAG, "Still installed by other users");
- if (!clearPackageStateForUserLIF(ps, user.getIdentifier(), outInfo)) {
- return false;
- }
+ clearPackageStateForUserLIF(ps, user.getIdentifier(), outInfo);
scheduleWritePackageRestrictionsLocked(user);
return true;
} else {
@@ -17855,9 +17879,7 @@ public class PackageManagerService extends IPackageManager.Stub
// we need to do is clear this user's data and save that
// it is uninstalled.
if (DEBUG_REMOVE) Slog.d(TAG, "Deleting system app");
- if (!clearPackageStateForUserLIF(ps, user.getIdentifier(), outInfo)) {
- return false;
- }
+ clearPackageStateForUserLIF(ps, user.getIdentifier(), outInfo);
scheduleWritePackageRestrictionsLocked(user);
return true;
}
@@ -17883,8 +17905,9 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
- boolean ret = false;
- if (isSystemApp(ps)) {
+ // TODO(b/109941548): break reasons for ret = false out into mayDelete method
+ final boolean ret;
+ if (systemApp) {
if (DEBUG_REMOVE) Slog.d(TAG, "Removing system package: " + ps.name);
// When an updated system application is deleted we delete the existing resources
// as well and fall back to existing code in system partition
@@ -17913,7 +17936,7 @@ public class PackageManagerService extends IPackageManager.Stub
// If we uninstalled an update to a system app there may be some
// child packages that appeared as they are declared in the system
// app but were not declared in the update.
- if (isSystemApp(ps)) {
+ if (systemApp) {
synchronized (mPackages) {
PackageSetting updatedPs = mSettings.getPackageLPr(ps.name);
final int childCount = (updatedPs.childPackageNames != null)
@@ -17974,7 +17997,7 @@ public class PackageManagerService extends IPackageManager.Stub
mSettings.writeKernelMappingLPr(ps);
}
- private boolean clearPackageStateForUserLIF(PackageSetting ps, int userId,
+ private void clearPackageStateForUserLIF(PackageSetting ps, int userId,
PackageRemovedInfo outInfo) {
final PackageParser.Package pkg;
synchronized (mPackages) {
@@ -18010,8 +18033,6 @@ public class PackageManagerService extends IPackageManager.Stub
outInfo.removedUsers = userIds;
outInfo.broadcastUsers = userIds;
}
-
- return true;
}
@Override