summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManager.java15
-rw-r--r--core/java/android/app/IActivityManager.aidl1
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java13
3 files changed, 27 insertions, 2 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 521bf05d9d4f..e57a7a2c4e4b 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4432,6 +4432,21 @@ public class ActivityManager {
}
/**
+ * Similar to {@link #forceStopPackageAsUser(String, int)} but will also stop the package even
+ * when the user is in the stopping state.
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES)
+ public void forceStopPackageAsUserEvenWhenStopping(String packageName, @UserIdInt int userId) {
+ try {
+ getService().forceStopPackageEvenWhenStopping(packageName, userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Sets the current locales of the device. Calling app must have the permission
* {@code android.permission.CHANGE_CONFIGURATION} and
* {@code android.permission.WRITE_SETTINGS}.
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 91eb4c44cda5..b8e72a7e947e 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -299,6 +299,7 @@ interface IActivityManager {
boolean registerForegroundServiceObserver(in IForegroundServiceObserver callback);
@UnsupportedAppUsage
void forceStopPackage(in String packageName, int userId);
+ void forceStopPackageEvenWhenStopping(in String packageName, int userId);
boolean killPids(in int[] pids, in String reason, boolean secure);
@UnsupportedAppUsage
List<ActivityManager.RunningServiceInfo> getServices(int maxNum, int flags);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a54e8e95b155..7dcd6d23588a 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3740,6 +3740,15 @@ public class ActivityManagerService extends IActivityManager.Stub
@Override
public void forceStopPackage(final String packageName, int userId) {
+ forceStopPackage(packageName, userId, /*flags=*/ 0);
+ }
+
+ @Override
+ public void forceStopPackageEvenWhenStopping(final String packageName, int userId) {
+ forceStopPackage(packageName, userId, ActivityManager.FLAG_OR_STOPPED);
+ }
+
+ private void forceStopPackage(final String packageName, int userId, int userRunningFlags) {
if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
!= PackageManager.PERMISSION_GRANTED) {
String msg = "Permission Denial: forceStopPackage() from pid="
@@ -3755,7 +3764,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = AppGlobals.getPackageManager();
- synchronized(this) {
+ synchronized (this) {
int[] users = userId == UserHandle.USER_ALL
? mUserController.getUsers() : new int[] { userId };
for (int user : users) {
@@ -3783,7 +3792,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Slog.w(TAG, "Failed trying to unstop package "
+ packageName + ": " + e);
}
- if (mUserController.isUserRunning(user, 0)) {
+ if (mUserController.isUserRunning(user, userRunningFlags)) {
forceStopPackageLocked(packageName, pkgUid, "from pid " + callingPid);
finishForceStopPackageLocked(packageName, pkgUid);
}