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
This commit is contained in:
Suprabh Shukla
2018-06-11 15:11:01 -07:00
parent 0b9a87c661
commit 4d74d50f53

View File

@@ -14207,7 +14207,7 @@ public class PackageManagerService extends IPackageManager.Stub
unactionedPackages.add(packageName);
continue;
}
if (!canSuspendPackageForUserLocked(packageName, userId)) {
if (suspended && !canSuspendPackageForUserLocked(packageName, userId)) {
unactionedPackages.add(packageName);
continue;
}
@@ -14362,44 +14362,44 @@ public class PackageManagerService extends IPackageManager.Stub
@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;
}