summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Benjamin Franz <bfranz@google.com> 2018-04-13 07:37:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-04-13 07:37:25 +0000
commitdf88614db2c408a45518bd51a28705b542525c73 (patch)
treeb08d7e6dd50226fafdb40808f50219ba330fe60e
parent2bc6f2e46afbeca482f5fa4ea3ef43f7f7dd6e8f (diff)
parentf81bf7fa7582f55a31435f37e02de5c03014cc19 (diff)
Merge "Silently ignore force stop API for protected packages" into pi-dev
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java5
3 files changed, 18 insertions, 0 deletions
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index a9d0911065f5..0c5f228782ae 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -302,6 +302,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 47284cba8c3d..f620c77d779a 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -6771,6 +6771,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 a0476041787a..57c2b75a0f4b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -23856,6 +23856,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
@Override
+ public boolean isPackageStateProtected(String packageName, int userId) {
+ return mProtectedPackages.isPackageStateProtected(userId, packageName);
+ }
+
+ @Override
public boolean isPackageEphemeral(int userId, String packageName) {
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);