From b9e21f719e579e27b5e6e947ba01e70463c48f01 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 9 Feb 2022 00:55:02 +0000 Subject: [PATCH 1/2] Handle supplemental process uid range for uid-based PM apis This change teaches uid-based PackageManager APIs (e.g. getPackagesForUid, getNameForUid, etc.) about supplemental process uid range. These uids are resolved to the "installed" supplemental process uid. Bug: 215241564 Test: atest PackageManagerShellCommandTest Change-Id: Icf9ac7282f6a5309a816be354ef4a7ca427b6c40 --- .../com/android/server/pm/ComputerEngine.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index c942a4357900e..d5ec8f66c49c5 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -2134,6 +2134,9 @@ public class ComputerEngine implements Computer { private String[] getPackagesForUidInternal(int uid, int callingUid) { final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; final int userId = UserHandle.getUserId(uid); + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int appId = UserHandle.getAppId(uid); return getPackagesForUidInternalBody(callingUid, userId, appId, isCallerInstantApp); } @@ -4288,6 +4291,9 @@ public class ComputerEngine implements Computer { if (getInstantAppPackageName(callingUid) != null) { return null; } + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int callingUserId = UserHandle.getUserId(callingUid); final int appId = UserHandle.getAppId(uid); final Object obj = mSettings.getSettingBase(appId); @@ -4320,7 +4326,11 @@ public class ComputerEngine implements Computer { final int callingUserId = UserHandle.getUserId(callingUid); final String[] names = new String[uids.length]; for (int i = uids.length - 1; i >= 0; i--) { - final int appId = UserHandle.getAppId(uids[i]); + int uid = uids[i]; + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } + final int appId = UserHandle.getAppId(uid); final Object obj = mSettings.getSettingBase(appId); if (obj instanceof SharedUserSetting) { final SharedUserSetting sus = (SharedUserSetting) obj; @@ -4366,6 +4376,9 @@ public class ComputerEngine implements Computer { if (getInstantAppPackageName(callingUid) != null) { return 0; } + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int callingUserId = UserHandle.getUserId(callingUid); final int appId = UserHandle.getAppId(uid); final Object obj = mSettings.getSettingBase(appId); @@ -4391,6 +4404,9 @@ public class ComputerEngine implements Computer { if (getInstantAppPackageName(callingUid) != null) { return 0; } + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int callingUserId = UserHandle.getUserId(callingUid); final int appId = UserHandle.getAppId(uid); final Object obj = mSettings.getSettingBase(appId); @@ -4415,6 +4431,9 @@ public class ComputerEngine implements Computer { if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; } + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int appId = UserHandle.getAppId(uid); final Object obj = mSettings.getSettingBase(appId); if (obj instanceof SharedUserSetting) { @@ -5539,6 +5558,9 @@ public class ComputerEngine implements Computer { @Override public int getUidTargetSdkVersion(int uid) { + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int appId = UserHandle.getAppId(uid); final SettingBase settingBase = mSettings.getSettingBase(appId); if (settingBase instanceof SharedUserSetting) { @@ -5565,6 +5587,9 @@ public class ComputerEngine implements Computer { @Nullable @Override public ArrayMap getProcessesForUid(int uid) { + if (Process.isSupplemental(uid)) { + uid = getSupplementalProcessUid(); + } final int appId = UserHandle.getAppId(uid); final SettingBase settingBase = mSettings.getSettingBase(appId); if (settingBase instanceof SharedUserSetting) { @@ -5594,4 +5619,8 @@ public class ComputerEngine implements Computer { return null; } } + + private int getSupplementalProcessUid() { + return getPackage(mService.getSupplementalProcessPackageName()).getUid(); + } } From 07308085efb69a086286e9cf49b323908811cd0b Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Wed, 9 Feb 2022 02:36:25 +0000 Subject: [PATCH 2/2] Add Process.toSupplementalUid to @TestApi Bug: 217545341 Test: m Change-Id: Ief1029cb03c4b7e5746436a97eb5a1a69a170b60 --- core/api/test-current.txt | 1 + core/java/android/os/Process.java | 1 + 2 files changed, 2 insertions(+) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 5bd6ca827e293..7d9d0410282fd 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1748,6 +1748,7 @@ package android.os { public class Process { method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException; + method public static final int toSupplementalUid(int); field public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000; // 0x15f90 field public static final int FIRST_ISOLATED_UID = 99000; // 0x182b8 field public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999; // 0x182b7 diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 2fe0622681127..17b5ec5ca01bd 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -929,6 +929,7 @@ public class Process { * @hide */ @SystemApi(client = MODULE_LIBRARIES) + @TestApi public static final int toSupplementalUid(int uid) { return uid + (FIRST_SUPPLEMENTAL_UID - FIRST_APPLICATION_UID); }