From 83249ec4f17494484f7923c90b3800a966fd6da3 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 12 Apr 2017 10:54:03 -0700 Subject: [PATCH] Add API to get a uid's current importance. This is kind-of useful to go along with monitoring uid importance changes. Test: none yet Change-Id: Ic0f8418955d17ea21d06f49dcd9641bc5f32387b --- api/system-current.txt | 1 + api/test-current.txt | 1 + core/java/android/app/ActivityManager.java | 20 +++++++++++++++++++ core/java/android/app/IActivityManager.aidl | 1 + .../server/am/ActivityManagerService.java | 13 ++++++++++++ 5 files changed, 36 insertions(+) diff --git a/api/system-current.txt b/api/system-current.txt index 99a579321c791..7c4e1564007c0 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3980,6 +3980,7 @@ package android.app { method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException; method public java.util.List getRunningServices(int) throws java.lang.SecurityException; method public deprecated java.util.List getRunningTasks(int) throws java.lang.SecurityException; + method public int getUidImportance(int); method public deprecated boolean isInLockTaskMode(); method public boolean isLowRamDevice(); method public static boolean isRunningInTestHarness(); diff --git a/api/test-current.txt b/api/test-current.txt index 570855fb00435..c91e880b911e2 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3848,6 +3848,7 @@ package android.app { method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException; method public java.util.List getRunningServices(int) throws java.lang.SecurityException; method public deprecated java.util.List getRunningTasks(int) throws java.lang.SecurityException; + method public int getUidImportance(int); method public deprecated boolean isInLockTaskMode(); method public boolean isLowRamDevice(); method public static boolean isRunningInTestHarness(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 4004bd6686b1f..76ba133e3028e 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3346,6 +3346,26 @@ public class ActivityManager { } } + /** + * Return the importance of a given uid, based on the processes that are + * currently running. The return value is one of the importance constants defined + * in {@link RunningAppProcessInfo}, giving you the highest importance of all the + * processes that this uid has running. If there are no processes + * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. + * @hide + */ + @SystemApi @TestApi + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + public int getUidImportance(int uid) { + try { + int procState = getService().getUidProcessState(uid, + mContext.getOpPackageName()); + return RunningAppProcessInfo.procStateToImportance(procState); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Callback to get reports about changes to the importance of a uid. Use with * {@link #addOnUidImportanceListener}. diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 079bbcdd4951c..42a70ecfb2cb4 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -463,6 +463,7 @@ interface IActivityManager { * etc. */ void keyguardGoingAway(int flags); + int getUidProcessState(int uid, in String callingPackage); void registerUidObserver(in IUidObserver observer, int which, int cutpoint, String callingPackage); void unregisterUidObserver(in IUidObserver observer); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 35654d76dee5b..d67822523900c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13024,6 +13024,19 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public int getUidProcessState(int uid, String callingPackage) { + if (!hasUsageStatsPermission(callingPackage)) { + enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, + "getUidProcessState"); + } + + synchronized (this) { + UidRecord uidRec = mActiveUids.get(uid); + return uidRec != null ? uidRec.curProcState : ActivityManager.PROCESS_STATE_NONEXISTENT; + } + } + @Override public void registerUidObserver(IUidObserver observer, int which, int cutpoint, String callingPackage) {