Allow unsuspending critical packages
PackageManager prevents certain packages from being suspended to ensure
device is in a sane state. It should not disallow unsuspening these
packages for the same reason.
Test: Existing tests:
atest FrameworksServicesTests:SuspendPackagesTest
Manually, changed the default dialer, then
adb shell pm suspend com.android.dialer
change the default dialer to com.android.dialer, then
adb shell pm unsuspend com.android.dialer
should succeeed.
Bug: 79846500
Change-Id: Ie198f61bf3b092e497f978e60a27f9d52cdda9c7
(cherry picked from commit 4d74d50f53882560ac20c06de53b40f030e31fec)
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 1b8c2cc..9ed2b9c 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -14178,7 +14178,7 @@
unactionedPackages.add(packageName);
continue;
}
- if (!canSuspendPackageForUserLocked(packageName, userId)) {
+ if (suspended && !canSuspendPackageForUserLocked(packageName, userId)) {
unactionedPackages.add(packageName);
continue;
}
@@ -14333,44 +14333,44 @@
@GuardedBy("mPackages")
private boolean canSuspendPackageForUserLocked(String packageName, int userId) {
if (isPackageDeviceAdmin(packageName, userId)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": has an active device admin");
return false;
}
String activeLauncherPackageName = getActiveLauncherPackageName(userId);
if (packageName.equals(activeLauncherPackageName)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": contains the active launcher");
return false;
}
if (packageName.equals(mRequiredInstallerPackage)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": required for package installation");
return false;
}
if (packageName.equals(mRequiredUninstallerPackage)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": required for package uninstallation");
return false;
}
if (packageName.equals(mRequiredVerifierPackage)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": required for package verification");
return false;
}
if (packageName.equals(getDefaultDialerPackageName(userId))) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": is the default dialer");
return false;
}
if (mProtectedPackages.isPackageStateProtected(userId, packageName)) {
- Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": protected package");
return false;
}