Loading services/core/java/com/android/server/pm/ComputerEngine.java +7 −3 Original line number Diff line number Diff line Loading @@ -1476,14 +1476,18 @@ public class ComputerEngine implements Computer { // Compute GIDs only if requested final int[] gids = (flags & PackageManager.GET_GIDS) == 0 ? EMPTY_INT_ARRAY : mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.getAppId())); // Compute installed permissions only if requested final Set<String> installedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 || ArrayUtils.isEmpty(p.getPermissions())) ? Collections.emptySet() : mPermissionManager.getInstalledPermissions(ps.getPackageName()); // Compute granted permissions only if package has requested permissions final Set<String> permissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 final Set<String> grantedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 || ArrayUtils.isEmpty(p.getRequestedPermissions())) ? Collections.emptySet() : mPermissionManager.getGrantedPermissions(ps.getPackageName(), userId); PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags, state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), permissions, state, userId, ps); state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), installedPermissions, grantedPermissions, state, userId, ps); if (packageInfo == null) { return null; Loading services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +13 −7 Original line number Diff line number Diff line Loading @@ -104,10 +104,11 @@ public class PackageInfoUtils { @Nullable public static PackageInfo generate(AndroidPackage pkg, int[] gids, @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, state, userId, pkgSetting); installedPermissions, grantedPermissions, state, userId, pkgSetting); } /** Loading @@ -115,8 +116,9 @@ public class PackageInfoUtils { */ private static PackageInfo generateWithComponents(AndroidPackage pkg, int[] gids, @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting); if (applicationInfo == null) { Loading Loading @@ -174,8 +176,12 @@ public class PackageInfoUtils { if (size > 0) { info.permissions = new PermissionInfo[size]; for (int i = 0; i < size; i++) { info.permissions[i] = generatePermissionInfo(pkg.getPermissions().get(i), flags); final var permission = pkg.getPermissions().get(i); final var permissionInfo = generatePermissionInfo(permission, flags); if (installedPermissions.contains(permission.getName())) { permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; } info.permissions[i] = permissionInfo; } } final List<ParsedUsesPermission> usesPermissions = pkg.getUsesPermissions(); Loading services/core/java/com/android/server/pm/permission/Permission.java +2 −7 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.util.Log; import android.util.Slog; import com.android.server.pm.PackageManagerService; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.component.ParsedPermission; Loading Loading @@ -215,10 +214,6 @@ public final class Permission { == PermissionInfo.PROTECTION_DANGEROUS; } public boolean isInstalled() { return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0; } public boolean isRemoved() { return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0; } Loading Loading @@ -423,7 +418,6 @@ public final class Permission { if (packageState.isSystem()) { if (permission.mType == Permission.TYPE_CONFIG && !permission.mReconciled) { // It's a built-in permission and no owner, take ownership now permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; permission.mPermissionInfo = permissionInfo; permission.mReconciled = true; permission.mUid = packageState.getAppId(); Loading Loading @@ -451,7 +445,6 @@ public final class Permission { final Permission tree = findPermissionTree(permissionTrees, permissionInfo.name); if (tree == null || tree.mPermissionInfo.packageName.equals(permissionInfo.packageName)) { permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; permission.mPermissionInfo = permissionInfo; permission.mReconciled = true; permission.mUid = packageState.getAppId(); Loading Loading @@ -562,6 +555,8 @@ public final class Permission { permissionInfo.packageName = mPermissionInfo.packageName; permissionInfo.nonLocalizedLabel = mPermissionInfo.name; } // A Permission in PermissionRegistry is always installed. permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; if (targetSdkVersion >= Build.VERSION_CODES.O) { permissionInfo.protectionLevel = mPermissionInfo.protectionLevel; } else { Loading services/core/java/com/android/server/pm/permission/PermissionManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -760,6 +760,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @NonNull @Override public Set<String> getInstalledPermissions(@NonNull String packageName) { return mPermissionManagerServiceImpl.getInstalledPermissions(packageName); } @NonNull @Override public Set<String> getGrantedPermissions(@NonNull String packageName, @UserIdInt int userId) { return mPermissionManagerServiceImpl.getGrantedPermissions(packageName, userId); Loading services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +15 −7 Original line number Diff line number Diff line Loading @@ -2345,9 +2345,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt for (int i=0; i<N; i++) { ParsedPermission p = pkg.getPermissions().get(i); // Assume by default that we did not install this permission into the system. ComponentMutateUtils.setExactFlags(p, p.getFlags() & ~PermissionInfo.FLAG_INSTALLED); final PermissionInfo permissionInfo; final Permission oldPermission; synchronized (mLock) { Loading Loading @@ -2384,10 +2381,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt } else { mRegistry.addPermission(permission); } if (permission.isInstalled()) { ComponentMutateUtils.setExactFlags(p, p.getFlags() | PermissionInfo.FLAG_INSTALLED); } if (permission.isDefinitionChanged()) { definitionChangedPermissions.add(p.getName()); permission.setDefinitionChanged(false); Loading Loading @@ -5141,6 +5134,21 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt return isPermissionsReviewRequiredInternal(packageName, userId); } @NonNull @Override public Set<String> getInstalledPermissions(@NonNull String packageName) { Objects.requireNonNull(packageName, "packageName"); final Set<String> installedPermissions = new ArraySet<>(); synchronized (mLock) { for (final Permission permission : mRegistry.getPermissions()) { if (Objects.equals(permission.getPackageName(), packageName)) { installedPermissions.add(permission.getName()); } } } return installedPermissions; } @NonNull @Override public Set<String> getGrantedPermissions(@NonNull String packageName, Loading Loading
services/core/java/com/android/server/pm/ComputerEngine.java +7 −3 Original line number Diff line number Diff line Loading @@ -1476,14 +1476,18 @@ public class ComputerEngine implements Computer { // Compute GIDs only if requested final int[] gids = (flags & PackageManager.GET_GIDS) == 0 ? EMPTY_INT_ARRAY : mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.getAppId())); // Compute installed permissions only if requested final Set<String> installedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 || ArrayUtils.isEmpty(p.getPermissions())) ? Collections.emptySet() : mPermissionManager.getInstalledPermissions(ps.getPackageName()); // Compute granted permissions only if package has requested permissions final Set<String> permissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 final Set<String> grantedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0 || ArrayUtils.isEmpty(p.getRequestedPermissions())) ? Collections.emptySet() : mPermissionManager.getGrantedPermissions(ps.getPackageName(), userId); PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags, state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), permissions, state, userId, ps); state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), installedPermissions, grantedPermissions, state, userId, ps); if (packageInfo == null) { return null; Loading
services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +13 −7 Original line number Diff line number Diff line Loading @@ -104,10 +104,11 @@ public class PackageInfoUtils { @Nullable public static PackageInfo generate(AndroidPackage pkg, int[] gids, @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, state, userId, pkgSetting); installedPermissions, grantedPermissions, state, userId, pkgSetting); } /** Loading @@ -115,8 +116,9 @@ public class PackageInfoUtils { */ private static PackageInfo generateWithComponents(AndroidPackage pkg, int[] gids, @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions, PackageUserStateInternal state, @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) { ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId, pkgSetting); if (applicationInfo == null) { Loading Loading @@ -174,8 +176,12 @@ public class PackageInfoUtils { if (size > 0) { info.permissions = new PermissionInfo[size]; for (int i = 0; i < size; i++) { info.permissions[i] = generatePermissionInfo(pkg.getPermissions().get(i), flags); final var permission = pkg.getPermissions().get(i); final var permissionInfo = generatePermissionInfo(permission, flags); if (installedPermissions.contains(permission.getName())) { permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; } info.permissions[i] = permissionInfo; } } final List<ParsedUsesPermission> usesPermissions = pkg.getUsesPermissions(); Loading
services/core/java/com/android/server/pm/permission/Permission.java +2 −7 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.util.Log; import android.util.Slog; import com.android.server.pm.PackageManagerService; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.component.ParsedPermission; Loading Loading @@ -215,10 +214,6 @@ public final class Permission { == PermissionInfo.PROTECTION_DANGEROUS; } public boolean isInstalled() { return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0; } public boolean isRemoved() { return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0; } Loading Loading @@ -423,7 +418,6 @@ public final class Permission { if (packageState.isSystem()) { if (permission.mType == Permission.TYPE_CONFIG && !permission.mReconciled) { // It's a built-in permission and no owner, take ownership now permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; permission.mPermissionInfo = permissionInfo; permission.mReconciled = true; permission.mUid = packageState.getAppId(); Loading Loading @@ -451,7 +445,6 @@ public final class Permission { final Permission tree = findPermissionTree(permissionTrees, permissionInfo.name); if (tree == null || tree.mPermissionInfo.packageName.equals(permissionInfo.packageName)) { permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; permission.mPermissionInfo = permissionInfo; permission.mReconciled = true; permission.mUid = packageState.getAppId(); Loading Loading @@ -562,6 +555,8 @@ public final class Permission { permissionInfo.packageName = mPermissionInfo.packageName; permissionInfo.nonLocalizedLabel = mPermissionInfo.name; } // A Permission in PermissionRegistry is always installed. permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED; if (targetSdkVersion >= Build.VERSION_CODES.O) { permissionInfo.protectionLevel = mPermissionInfo.protectionLevel; } else { Loading
services/core/java/com/android/server/pm/permission/PermissionManagerService.java +5 −0 Original line number Diff line number Diff line Loading @@ -760,6 +760,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @NonNull @Override public Set<String> getInstalledPermissions(@NonNull String packageName) { return mPermissionManagerServiceImpl.getInstalledPermissions(packageName); } @NonNull @Override public Set<String> getGrantedPermissions(@NonNull String packageName, @UserIdInt int userId) { return mPermissionManagerServiceImpl.getGrantedPermissions(packageName, userId); Loading
services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +15 −7 Original line number Diff line number Diff line Loading @@ -2345,9 +2345,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt for (int i=0; i<N; i++) { ParsedPermission p = pkg.getPermissions().get(i); // Assume by default that we did not install this permission into the system. ComponentMutateUtils.setExactFlags(p, p.getFlags() & ~PermissionInfo.FLAG_INSTALLED); final PermissionInfo permissionInfo; final Permission oldPermission; synchronized (mLock) { Loading Loading @@ -2384,10 +2381,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt } else { mRegistry.addPermission(permission); } if (permission.isInstalled()) { ComponentMutateUtils.setExactFlags(p, p.getFlags() | PermissionInfo.FLAG_INSTALLED); } if (permission.isDefinitionChanged()) { definitionChangedPermissions.add(p.getName()); permission.setDefinitionChanged(false); Loading Loading @@ -5141,6 +5134,21 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt return isPermissionsReviewRequiredInternal(packageName, userId); } @NonNull @Override public Set<String> getInstalledPermissions(@NonNull String packageName) { Objects.requireNonNull(packageName, "packageName"); final Set<String> installedPermissions = new ArraySet<>(); synchronized (mLock) { for (final Permission permission : mRegistry.getPermissions()) { if (Objects.equals(permission.getPackageName(), packageName)) { installedPermissions.add(permission.getName()); } } } return installedPermissions; } @NonNull @Override public Set<String> getGrantedPermissions(@NonNull String packageName, Loading