diff options
| author | 2020-07-01 21:02:00 +0000 | |
|---|---|---|
| committer | 2020-07-01 21:02:00 +0000 | |
| commit | ee2fa23453caf7e29cf06a2d80d60f9c2e4d67a0 (patch) | |
| tree | e55cb5d997ff90ccd50d7f0fbc0ef9aa8c34184d | |
| parent | 0bf4463e8bae5cf1e61a942021ee59d187bbc8b2 (diff) | |
| parent | 118790bb0e316eca702c13dac15370c85eda4f36 (diff) | |
Merge "Fix cleanup when an app with SUSPEND_APPS is deleted" into rvc-dev am: 118790bb0e
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12002736
Change-Id: Ic1616b2b9c0aed276904bd0f8d2b2f4ac29d57dc
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 18 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerShellCommand.java | 38 |
2 files changed, 37 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e734ed443189..f533eb2cf2be 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19165,9 +19165,7 @@ public class PackageManagerService extends IPackageManager.Stub final boolean systemApp = isSystemApp(ps); final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier(); - if (ps.getPermissionsState().hasPermission(Manifest.permission.SUSPEND_APPS, userId)) { - unsuspendForSuspendingPackage(packageName, userId); - } + if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0) && userId != UserHandle.USER_ALL) { // The caller is asking that the package only be deleted for a single @@ -19225,6 +19223,20 @@ public class PackageManagerService extends IPackageManager.Stub outInfo, writeSettings); } + // If the package removed had SUSPEND_APPS, unset any restrictions that might have been in + // place for all affected users. + int[] affectedUserIds = (outInfo != null) ? outInfo.removedUsers : null; + if (affectedUserIds == null) { + affectedUserIds = resolveUserIds(userId); + } + for (final int affectedUserId : affectedUserIds) { + if (ps.getPermissionsState().hasPermission(Manifest.permission.SUSPEND_APPS, + affectedUserId)) { + unsuspendForSuspendingPackage(packageName, affectedUserId); + removeAllDistractingPackageRestrictions(affectedUserId); + } + } + // Take a note whether we deleted the package for all users if (outInfo != null) { outInfo.removedForAllUsers = mPackages.get(ps.name) == null; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 1a7490e8b327..8bbe9cc01ada 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -125,7 +125,6 @@ import java.util.Base64; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -291,7 +290,8 @@ class PackageManagerShellCommand extends ShellCommand { case "get-stagedsessions": return runListStagedSessions(); case "uninstall-system-updates": - return uninstallSystemUpdates(); + String packageName = getNextArg(); + return uninstallSystemUpdates(packageName); case "rollback-app": return runRollbackApp(); case "get-moduleinfo": @@ -409,15 +409,22 @@ class PackageManagerShellCommand extends ShellCommand { } } - private int uninstallSystemUpdates() { + private int uninstallSystemUpdates(String packageName) { final PrintWriter pw = getOutPrintWriter(); - List<String> failedUninstalls = new LinkedList<>(); + boolean failedUninstalls = false; try { - final ParceledListSlice<ApplicationInfo> packages = - mInterface.getInstalledApplications( - PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); final IPackageInstaller installer = mInterface.getPackageInstaller(); - List<ApplicationInfo> list = packages.getList(); + final List<ApplicationInfo> list; + if (packageName == null) { + final ParceledListSlice<ApplicationInfo> packages = + mInterface.getInstalledApplications( + PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); + list = packages.getList(); + } else { + list = new ArrayList<>(1); + list.add(mInterface.getApplicationInfo(packageName, + PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM)); + } for (ApplicationInfo info : list) { if (info.isUpdatedSystemApp()) { pw.println("Uninstalling updates to " + info.packageName + "..."); @@ -430,7 +437,8 @@ class PackageManagerShellCommand extends ShellCommand { final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE); if (status != PackageInstaller.STATUS_SUCCESS) { - failedUninstalls.add(info.packageName); + failedUninstalls = true; + pw.println("Couldn't uninstall package: " + info.packageName); } } } @@ -440,10 +448,7 @@ class PackageManagerShellCommand extends ShellCommand { + e.getMessage() + "]"); return 0; } - if (!failedUninstalls.isEmpty()) { - pw.println("Failure [Couldn't uninstall packages: " - + TextUtils.join(", ", failedUninstalls) - + "]"); + if (failedUninstalls) { return 0; } pw.println("Success"); @@ -3824,9 +3829,10 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" get-harmful-app-warning [--user <USER_ID>] <PACKAGE>"); pw.println(" Return the harmful app warning message for the given app, if present"); pw.println(); - pw.println(" uninstall-system-updates"); - pw.println(" Remove updates to all system applications and fall back to their /system " + - "version."); + pw.println(" uninstall-system-updates [<PACKAGE>]"); + pw.println(" Removes updates to the given system application and falls back to its"); + pw.println(" /system version. Does nothing if the given package is not a system app."); + pw.println(" If no package is specified, removes updates to all system applications."); pw.println(""); pw.println(" get-moduleinfo [--all | --installed] [module-name]"); pw.println(" Displays module info. If module-name is specified only that info is shown"); |