From 9c9045241a4da37b94617fa24a2be2013931fe62 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Wed, 12 Jan 2022 14:27:25 +0100 Subject: [PATCH] Add a new UID range for supplemental processes. These are processes that are spawned alongside regular app processes. They have their own UID range, such that they can be properly isolated from applications. Add some APIs in Process that allows the system and mainline modules to verify that a particular UID belongs to a supplemental process, and to map between the supplemental process and the corresponding app process. Bug: 215012578 Test: N/A Change-Id: I02aaaa1c2bcf9d141ddc97747eb6d7edd52d7b92 --- core/api/current.txt | 1 + core/api/module-lib-current.txt | 3 ++ core/java/android/os/Process.java | 60 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 0ce315adc3104..f58e4260a09ed 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -32515,6 +32515,7 @@ package android.os { method public static final boolean is64Bit(); method public static boolean isApplicationUid(int); method public static final boolean isIsolated(); + method public static final boolean isSupplemental(); method public static final void killProcess(int); method public static final int myPid(); method @NonNull public static String myProcessName(); diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 9abf00bb250b8..dbb26ac647a55 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -376,6 +376,9 @@ package android.os { } public class Process { + method public static final boolean isSupplemental(int); + method public static final int toAppUid(int); + method public static final int toSupplementalUid(int); field public static final int NFC_UID = 1027; // 0x403 field public static final int VPN_UID = 1016; // 0x3f8 } diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index a63f68a343d27..2fe0622681127 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -279,6 +279,26 @@ public class Process { */ public static final int LAST_APPLICATION_UID = 19999; + /** + * Defines the start of a range of UIDs going from this number to + * {@link #LAST_SUPPLEMENTAL_UID} that are reserved for assigning to + * supplemental processes. There is a 1-1 mapping between a supplemental + * process UID and the app that it belongs to, which can be computed by + * subtracting (FIRST_SUPPLEMENTAL_UID - FIRST_APPLICATION_UID) from the + * uid of a supplemental process. + * + * Note that there are no GIDs associated with these processes; storage + * attribution for them will be done using project IDs. + * @hide + */ + public static final int FIRST_SUPPLEMENTAL_UID = 20000; + + /** + * Last UID that is used for supplemental processes. + * @hide + */ + public static final int LAST_SUPPLEMENTAL_UID = 29999; + /** * First uid used for fully isolated sandboxed processes spawned from an app zygote * @hide @@ -880,6 +900,46 @@ public class Process { || (uid >= FIRST_APP_ZYGOTE_ISOLATED_UID && uid <= LAST_APP_ZYGOTE_ISOLATED_UID); } + /** + * Returns whether the provided UID belongs to a supplemental process. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static final boolean isSupplemental(int uid) { + uid = UserHandle.getAppId(uid); + return (uid >= FIRST_SUPPLEMENTAL_UID && uid <= LAST_SUPPLEMENTAL_UID); + } + + /** + * + * Returns the app process corresponding to a supplemental process. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static final int toAppUid(int uid) { + return uid - (FIRST_SUPPLEMENTAL_UID - FIRST_APPLICATION_UID); + } + + /** + * + * Returns the supplemental process corresponding to an app process. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static final int toSupplementalUid(int uid) { + return uid + (FIRST_SUPPLEMENTAL_UID - FIRST_APPLICATION_UID); + } + + /** + * Returns whether the current process is a supplemental process. + */ + public static final boolean isSupplemental() { + return isSupplemental(myUid()); + } + /** * Returns the UID assigned to a particular user name, or -1 if there is * none. If the given string consists of only numbers, it is converted