summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Suprabh Shukla <suprabh@google.com> 2020-07-01 21:02:00 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2020-07-01 21:02:00 +0000
commitee2fa23453caf7e29cf06a2d80d60f9c2e4d67a0 (patch)
treee55cb5d997ff90ccd50d7f0fbc0ef9aa8c34184d
parent0bf4463e8bae5cf1e61a942021ee59d187bbc8b2 (diff)
parent118790bb0e316eca702c13dac15370c85eda4f36 (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.java18
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java38
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");