From 48aa86bd0b30815f4c02561f713bd33b032ef2b7 Mon Sep 17 00:00:00 2001 From: Jeff Davidson Date: Wed, 10 Feb 2016 14:15:42 -0800 Subject: [PATCH] Expose APIs to analyze UIDs in UserHandle/Process. Clients of the NetworkStatsManager public APIs may get UIDs belonging to other users, and UIDs which don't actually represent applications. These APIs allow clients to understand whether a given ID belongs to the same user as themselves, and whether an ID represents an application or something else (e.g. a system UID). Change-Id: Ia56d5891521ce98e5594c41da8f9d756819deb66 --- api/current.txt | 2 ++ api/system-current.txt | 2 ++ api/test-current.txt | 2 ++ core/java/android/os/Process.java | 10 ++++++++++ core/java/android/os/UserHandle.java | 9 +++++++++ 5 files changed, 25 insertions(+) diff --git a/api/current.txt b/api/current.txt index 8b9274cbce9c7..0d031bc429c06 100644 --- a/api/current.txt +++ b/api/current.txt @@ -29061,6 +29061,7 @@ package android.os { method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException; method public static final int getUidForName(java.lang.String); method public static final boolean is64Bit(); + method public static boolean isApplicationUid(int); method public static final void killProcess(int); method public static final int myPid(); method public static final int myTid(); @@ -29241,6 +29242,7 @@ package android.os { public final class UserHandle implements android.os.Parcelable { ctor public UserHandle(android.os.Parcel); method public int describeContents(); + method public static android.os.UserHandle getUserHandleForUid(int); method public static android.os.UserHandle readFromParcel(android.os.Parcel); method public void writeToParcel(android.os.Parcel, int); method public static void writeToParcel(android.os.UserHandle, android.os.Parcel); diff --git a/api/system-current.txt b/api/system-current.txt index 43a787f4486eb..1af8150c035f8 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -31354,6 +31354,7 @@ package android.os { method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException; method public static final int getUidForName(java.lang.String); method public static final boolean is64Bit(); + method public static boolean isApplicationUid(int); method public static final void killProcess(int); method public static final int myPid(); method public static final int myTid(); @@ -31580,6 +31581,7 @@ package android.os { ctor public UserHandle(android.os.Parcel); method public int describeContents(); method public int getIdentifier(); + method public static android.os.UserHandle getUserHandleForUid(int); method public deprecated boolean isOwner(); method public boolean isSystem(); method public static int myUserId(); diff --git a/api/test-current.txt b/api/test-current.txt index 428b359be05e9..b6b8697fdaaee 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -29070,6 +29070,7 @@ package android.os { method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException; method public static final int getUidForName(java.lang.String); method public static final boolean is64Bit(); + method public static boolean isApplicationUid(int); method public static final void killProcess(int); method public static final int myPid(); method public static final int myTid(); @@ -29251,6 +29252,7 @@ package android.os { ctor public UserHandle(android.os.Parcel); method public int describeContents(); method public static int getAppId(int); + method public static android.os.UserHandle getUserHandleForUid(int); method public static android.os.UserHandle readFromParcel(android.os.Parcel); method public void writeToParcel(android.os.Parcel, int); method public static void writeToParcel(android.os.UserHandle, android.os.Parcel); diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index b51d2dfb86941..9984755d316fb 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -822,6 +822,16 @@ public class Process { return UserHandle.of(UserHandle.getUserId(myUid())); } + /** + * Returns whether the given uid belongs to an application. + * @param uid A kernel uid. + * @return Whether the uid corresponds to an application sandbox running in + * a specific user. + */ + public static boolean isApplicationUid(int uid) { + return UserHandle.isApp(uid); + } + /** * Returns whether the current process is in an isolated sandbox. * @hide diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index 24666fe71724f..b3f44536214bb 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -129,6 +129,15 @@ public final class UserHandle implements Parcelable { } } + /** + * Returns the user for a given uid. + * @param uid A uid for an application running in a particular user. + * @return A {@link UserHandle} for that user. + */ + public static UserHandle getUserHandleForUid(int uid) { + return of(getUserId(uid)); + } + /** * Returns the user id for a given uid. * @hide