From f81bf7fa7582f55a31435f37e02de5c03014cc19 Mon Sep 17 00:00:00 2001 From: Benjamin Franz Date: Mon, 26 Mar 2018 16:23:04 +0100 Subject: Silently ignore force stop API for protected packages Bug: 75997475 Test: manual Change-Id: I804aafe2404eeaac732fed51cf6d3d2e45a3b5bb --- core/java/android/content/pm/PackageManagerInternal.java | 6 ++++++ .../core/java/com/android/server/am/ActivityManagerService.java | 7 +++++++ .../core/java/com/android/server/pm/PackageManagerService.java | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index c9b78c08202e..27b955ade48e 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -269,6 +269,12 @@ public abstract class PackageManagerInternal { */ public abstract boolean isPackageDataProtected(int userId, String packageName); + /** + * Returns {@code true} if a given package's state is protected, e.g. it cannot be force + * stopped, suspended, disabled or hidden. Otherwise, returns {@code false}. + */ + public abstract boolean isPackageStateProtected(String packageName, int userId); + /** * Returns {@code true} if a given package is installed as ephemeral. Otherwise, returns * {@code false}. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f97c6d617a7e..36cf0033fd22 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -6708,6 +6708,13 @@ public class ActivityManagerService extends IActivityManager.Stub int[] users = userId == UserHandle.USER_ALL ? mUserController.getUsers() : new int[] { userId }; for (int user : users) { + if (getPackageManagerInternalLocked().isPackageStateProtected( + packageName, user)) { + Slog.w(TAG, "Ignoring request to force stop protected package " + + packageName + " u" + user); + return; + } + int pkgUid = -1; try { pkgUid = pm.getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2e530af83190..b6b660cb40ce 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -23841,6 +23841,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return mProtectedPackages.isPackageDataProtected(userId, packageName); } + @Override + public boolean isPackageStateProtected(String packageName, int userId) { + return mProtectedPackages.isPackageStateProtected(userId, packageName); + } + @Override public boolean isPackageEphemeral(int userId, String packageName) { synchronized (mPackages) { -- cgit v1.2.3-59-g8ed1b