Create new system API in UserHandle to get uid

For the incoming connectivity mainline, it need to compute the
intersection of a set of uids and appIds for the permission
control. As @UserIdInt values are internal implementation details
of the OS, any mainline modules should use strongly-typed
UserHandle arguments. Thus, create a new API that accepts
UserHandle and appId to get the computed uid.

Bug: 170598012
Test: atest FrameworksNetTests
Change-Id: I046546d2c5c76eac7a251e63e4234776975bf2bc
This commit is contained in:
Chiachang Wang
2021-02-04 14:55:45 +08:00
parent 454e15dc12
commit 8f43b2be54
3 changed files with 22 additions and 2 deletions

View File

@@ -7593,6 +7593,7 @@ package android.os {
method @NonNull public static String formatUid(int);
method public static int getAppId(int);
method public int getIdentifier();
method public static int getUid(@NonNull android.os.UserHandle, int);
method @Deprecated public boolean isOwner();
method public boolean isSystem();
method public static int myUserId();

View File

@@ -294,6 +294,19 @@ public final class UserHandle implements Parcelable {
}
}
/**
* Returns the uid that is composed from the userHandle and the appId.
*
* @param userHandle the UserHandle to compose the uid
* @param appId the AppId to compose the uid
* @return the uid that is composed from the userHandle and the appId
* @hide
*/
@SystemApi
public static int getUid(@NonNull UserHandle userHandle, @AppIdInt int appId) {
return getUid(userHandle.getIdentifier(), appId);
}
/**
* Returns the app id (or base uid) for a given uid, stripping out the user id from it.
* @hide

View File

@@ -265,7 +265,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse
for (Entry<Integer, Boolean> app : apps.entrySet()) {
List<Integer> list = app.getValue() ? system : network;
for (int user : users) {
list.add(UserHandle.getUid(user, app.getKey()));
final UserHandle handle = UserHandle.of(user);
if (handle == null) continue;
list.add(UserHandle.getUid(handle, app.getKey()));
}
}
try {
@@ -550,7 +553,10 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse
for (UidRange range : ranges) {
for (int userId = range.getStartUser(); userId <= range.getEndUser(); userId++) {
for (int appId : appIds) {
final int uid = UserHandle.getUid(userId, appId);
final UserHandle handle = UserHandle.of(userId);
if (handle == null) continue;
final int uid = UserHandle.getUid(handle, appId);
if (range.contains(uid)) {
result.add(uid);
}