diff options
| author | 2018-11-09 12:50:50 -0800 | |
|---|---|---|
| committer | 2018-11-13 13:41:30 -0800 | |
| commit | ae61ce09c635d08b5bf31fb68cbaed21dd031dbd (patch) | |
| tree | c1a24e9b93c9cae11480955495dab38fdd10288e | |
| parent | 97dbb7b9684c741ad1c3718fb1cc1e62dc9457e6 (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.java | 77 |
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 |