Dump install permission states for non-system users.

If they are different from the system user. This helps debugging, or
otherwise the information won't be available anywhere.

Fixes: 178339792
Test: adb shell dumpsys package
Change-Id: If8831842d8631fb17e4cf89c3f2ac7862d1ef693
(cherry picked from commit 63d811f444)
This commit is contained in:
Hai Zhang
2021-01-29 16:31:36 -08:00
parent 9ee2e0d368
commit d2a1feba7f
2 changed files with 91 additions and 24 deletions

View File

@@ -4881,7 +4881,7 @@ public final class Settings implements Watchable, Snappable {
}
if (ps.sharedUser == null || permissionNames != null || dumpAll) {
dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState, users);
}
if (dumpAllComponents) {
@@ -5131,9 +5131,12 @@ public final class Settings implements Watchable, Snappable {
continue;
}
dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState);
List<UserInfo> users = getAllUsers(UserManagerService.getInstance());
for (int userId : UserManagerService.getInstance().getUserIds()) {
dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState, users);
for (UserInfo user : users) {
final int userId = user.id;
final int[] gids = mPermissionDataProvider.getGidsForUid(UserHandle.getUid(
userId, su.userId));
final Collection<PermissionState> permissions =
@@ -5247,31 +5250,55 @@ public final class Settings implements Watchable, Snappable {
}
}
void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
LegacyPermissionState permissionsState) {
Collection<PermissionState> permissionStates = permissionsState.getPermissionStates(
UserHandle.USER_SYSTEM);
boolean hasInstallPermissions = false;
for (PermissionState permissionState : permissionStates) {
if (!permissionState.isRuntime()) {
hasInstallPermissions = true;
break;
}
}
if (hasInstallPermissions) {
pw.print(prefix); pw.println("install permissions:");
void dumpInstallPermissionsLPr(PrintWriter pw, String prefix,
ArraySet<String> filterPermissionNames, LegacyPermissionState permissionsState,
List<UserInfo> users) {
ArraySet<String> dumpPermissionNames = new ArraySet<>();
for (UserInfo user : users) {
int userId = user.id;
Collection<PermissionState> permissionStates = permissionsState.getPermissionStates(
userId);
for (PermissionState permissionState : permissionStates) {
if (permissionState.isRuntime()) {
continue;
}
if (permissionNames != null
&& !permissionNames.contains(permissionState.getName())) {
String permissionName = permissionState.getName();
if (filterPermissionNames != null
&& !filterPermissionNames.contains(permissionName)) {
continue;
}
pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
pw.print(": granted="); pw.print(permissionState.isGranted());
pw.println(permissionFlagsToString(", flags=",
permissionState.getFlags()));
dumpPermissionNames.add(permissionName);
}
}
boolean printedSomething = false;
for (String permissionName : dumpPermissionNames) {
PermissionState systemPermissionState = permissionsState.getPermissionState(
permissionName, UserHandle.USER_SYSTEM);
for (UserInfo user : users) {
int userId = user.id;
PermissionState permissionState;
if (userId == UserHandle.USER_SYSTEM) {
permissionState = systemPermissionState;
} else {
permissionState = permissionsState.getPermissionState(permissionName, userId);
if (Objects.equals(permissionState, systemPermissionState)) {
continue;
}
}
if (!printedSomething) {
pw.print(prefix); pw.println("install permissions:");
printedSomething = true;
}
pw.print(prefix); pw.print(" "); pw.print(permissionName);
pw.print(": granted="); pw.print(
permissionState != null && permissionState.isGranted());
pw.print(permissionFlagsToString(", flags=",
permissionState != null ? permissionState.getFlags() : 0));
if (userId == UserHandle.USER_SYSTEM) {
pw.println();
} else {
pw.print(", userId="); pw.println(userId);
}
}
}
}

View File

@@ -103,6 +103,26 @@ public final class LegacyPermissionState {
return Objects.equals(mMissing, other.mMissing);
}
/**
* Get the permission state for a permission and a user.
*
* @param permissionName the permission name
* @param userId the user ID
* @return the permission state
*
* @hide
*/
@Nullable
public PermissionState getPermissionState(@NonNull String permissionName,
@UserIdInt int userId) {
checkUserId(userId);
UserState userState = mUserStates.get(userId);
if (userState == null) {
return null;
}
return userState.getPermissionState(permissionName);
}
/**
* Put a permission state for a user.
*
@@ -142,10 +162,10 @@ public final class LegacyPermissionState {
}
/**
* Get all the runtime permission states for a user.
* Get all the permission states for a user.
*
* @param userId the user ID
* @return the runtime permission states
* @return the permission states
*/
@NonNull
public Collection<PermissionState> getPermissionStates(@UserIdInt int userId) {
@@ -301,5 +321,25 @@ public final class LegacyPermissionState {
public int getFlags() {
return mFlags;
}
@Override
public boolean equals(@Nullable Object object) {
if (this == object) {
return true;
}
if (object == null || getClass() != object.getClass()) {
return false;
}
PermissionState that = (PermissionState) object;
return mRuntime == that.mRuntime
&& mGranted == that.mGranted
&& mFlags == that.mFlags
&& Objects.equals(mName, that.mName);
}
@Override
public int hashCode() {
return Objects.hash(mName, mRuntime, mGranted, mFlags);
}
}
}