Loading services/core/java/com/android/server/pm/Settings.java +80 −35 Original line number Diff line number Diff line Loading @@ -5233,11 +5233,9 @@ public final class Settings { List<RuntimePermissionsState.PermissionState> permissions = getPermissionsFromPermissionsState( packageSetting.getPermissionsState(), userId); if (permissions != null) { packagePermissions.put(packageName, permissions); } } } Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); Loading @@ -5248,10 +5246,8 @@ public final class Settings { List<RuntimePermissionsState.PermissionState> permissions = getPermissionsFromPermissionsState( sharedUserSetting.getPermissionsState(), userId); if (permissions != null) { sharedUserPermissions.put(sharedUserName, permissions); } } runtimePermissions = new RuntimePermissionsState(version, fingerprint, packagePermissions, sharedUserPermissions); Loading @@ -5260,15 +5256,11 @@ public final class Settings { mPersistence.write(runtimePermissions, UserHandle.of(userId)); } @Nullable @NonNull private List<RuntimePermissionsState.PermissionState> getPermissionsFromPermissionsState( @NonNull PermissionsState permissionsState, @UserIdInt int userId) { List<PermissionState> permissionStates = permissionsState.getRuntimePermissionStates( userId); if (permissionStates.isEmpty()) { return null; } List<RuntimePermissionsState.PermissionState> permissions = new ArrayList<>(); int permissionStatesSize = permissionStates.size(); Loading Loading @@ -5340,31 +5332,60 @@ public final class Settings { boolean defaultPermissionsGranted = Build.FINGERPRINT.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultPermissionsGranted); for (Map.Entry<String, List<RuntimePermissionsState.PermissionState>> entry : runtimePermissions.getPackagePermissions().entrySet()) { String packageName = entry.getKey(); List<RuntimePermissionsState.PermissionState> permissions = entry.getValue(); boolean isUpgradeToR = getInternalVersion().sdkVersion < Build.VERSION_CODES.R; PackageSetting packageSetting = mPackages.get(packageName); if (packageSetting == null) { Slog.w(PackageManagerService.TAG, "Unknown package:" + packageName); continue; Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = runtimePermissions.getPackagePermissions(); int packagesSize = mPackages.size(); for (int i = 0; i < packagesSize; i++) { String packageName = mPackages.keyAt(i); PackageSetting packageSetting = mPackages.valueAt(i); List<RuntimePermissionsState.PermissionState> permissions = packagePermissions.get(packageName); if (permissions != null) { readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), userId); } else if (packageSetting.sharedUser == null && !isUpgradeToR) { Slog.w(TAG, "Missing permission state for package: " + packageName); generateFallbackPermissionsStateLpr( packageSetting.pkg.getRequestedPermissions(), packageSetting.pkg.getTargetSdkVersion(), packageSetting.getPermissionsState(), userId); } readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), userId); } for (Map.Entry<String, List<RuntimePermissionsState.PermissionState>> entry : runtimePermissions.getSharedUserPermissions().entrySet()) { String sharedUserName = entry.getKey(); List<RuntimePermissionsState.PermissionState> permissions = entry.getValue(); Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = runtimePermissions.getSharedUserPermissions(); int sharedUsersSize = mSharedUsers.size(); for (int i = 0; i < sharedUsersSize; i++) { String sharedUserName = mSharedUsers.keyAt(i); SharedUserSetting sharedUserSetting = mSharedUsers.valueAt(i); SharedUserSetting sharedUserSetting = mSharedUsers.get(sharedUserName); if (sharedUserSetting == null) { Slog.w(PackageManagerService.TAG, "Unknown shared user:" + sharedUserName); continue; } List<RuntimePermissionsState.PermissionState> permissions = sharedUserPermissions.get(sharedUserName); if (permissions != null) { readPermissionsStateLpr(permissions, sharedUserSetting.getPermissionsState(), userId); } else if (!isUpgradeToR) { Slog.w(TAG, "Missing permission state for shared user: " + sharedUserName); ArraySet<String> requestedPermissions = new ArraySet<>(); int targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; int sharedUserPackagesSize = sharedUserSetting.packages.size(); for (int packagesI = 0; packagesI < sharedUserPackagesSize; packagesI++) { PackageSetting packageSetting = sharedUserSetting.packages.valueAt( packagesI); if (packageSetting == null || packageSetting.pkg == null || !packageSetting.getInstalled(userId)) { continue; } AndroidPackage pkg = packageSetting.pkg; requestedPermissions.addAll(pkg.getRequestedPermissions()); targetSdkVersion = Math.min(targetSdkVersion, pkg.getTargetSdkVersion()); } generateFallbackPermissionsStateLpr(requestedPermissions, targetSdkVersion, sharedUserSetting.getPermissionsState(), userId); } } } Loading Loading @@ -5395,6 +5416,30 @@ public final class Settings { } } private void generateFallbackPermissionsStateLpr( @NonNull Collection<String> requestedPermissions, int targetSdkVersion, @NonNull PermissionsState permissionsState, @UserIdInt int userId) { for (String permissionName : requestedPermissions) { BasePermission permission = mPermissions.getPermission(permissionName); if (Objects.equals(permission.getSourcePackageName(), PLATFORM_PACKAGE_NAME) && permission.isRuntime() && !permission.isRemoved()) { if (permission.isHardOrSoftRestricted() || permission.isImmutablyRestricted()) { permissionsState.updatePermissionFlags(permission, userId, PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT); } if (targetSdkVersion < Build.VERSION_CODES.M) { permissionsState.updatePermissionFlags(permission, userId, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT); permissionsState.grantRuntimePermission(permission, userId); } } } } @GuardedBy("Settings.this.mLock") private void readLegacyStateForUserSyncLPr(int userId) { File permissionsFile = getUserRuntimePermissionsFile(userId); Loading Loading
services/core/java/com/android/server/pm/Settings.java +80 −35 Original line number Diff line number Diff line Loading @@ -5233,11 +5233,9 @@ public final class Settings { List<RuntimePermissionsState.PermissionState> permissions = getPermissionsFromPermissionsState( packageSetting.getPermissionsState(), userId); if (permissions != null) { packagePermissions.put(packageName, permissions); } } } Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); Loading @@ -5248,10 +5246,8 @@ public final class Settings { List<RuntimePermissionsState.PermissionState> permissions = getPermissionsFromPermissionsState( sharedUserSetting.getPermissionsState(), userId); if (permissions != null) { sharedUserPermissions.put(sharedUserName, permissions); } } runtimePermissions = new RuntimePermissionsState(version, fingerprint, packagePermissions, sharedUserPermissions); Loading @@ -5260,15 +5256,11 @@ public final class Settings { mPersistence.write(runtimePermissions, UserHandle.of(userId)); } @Nullable @NonNull private List<RuntimePermissionsState.PermissionState> getPermissionsFromPermissionsState( @NonNull PermissionsState permissionsState, @UserIdInt int userId) { List<PermissionState> permissionStates = permissionsState.getRuntimePermissionStates( userId); if (permissionStates.isEmpty()) { return null; } List<RuntimePermissionsState.PermissionState> permissions = new ArrayList<>(); int permissionStatesSize = permissionStates.size(); Loading Loading @@ -5340,31 +5332,60 @@ public final class Settings { boolean defaultPermissionsGranted = Build.FINGERPRINT.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultPermissionsGranted); for (Map.Entry<String, List<RuntimePermissionsState.PermissionState>> entry : runtimePermissions.getPackagePermissions().entrySet()) { String packageName = entry.getKey(); List<RuntimePermissionsState.PermissionState> permissions = entry.getValue(); boolean isUpgradeToR = getInternalVersion().sdkVersion < Build.VERSION_CODES.R; PackageSetting packageSetting = mPackages.get(packageName); if (packageSetting == null) { Slog.w(PackageManagerService.TAG, "Unknown package:" + packageName); continue; Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = runtimePermissions.getPackagePermissions(); int packagesSize = mPackages.size(); for (int i = 0; i < packagesSize; i++) { String packageName = mPackages.keyAt(i); PackageSetting packageSetting = mPackages.valueAt(i); List<RuntimePermissionsState.PermissionState> permissions = packagePermissions.get(packageName); if (permissions != null) { readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), userId); } else if (packageSetting.sharedUser == null && !isUpgradeToR) { Slog.w(TAG, "Missing permission state for package: " + packageName); generateFallbackPermissionsStateLpr( packageSetting.pkg.getRequestedPermissions(), packageSetting.pkg.getTargetSdkVersion(), packageSetting.getPermissionsState(), userId); } readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), userId); } for (Map.Entry<String, List<RuntimePermissionsState.PermissionState>> entry : runtimePermissions.getSharedUserPermissions().entrySet()) { String sharedUserName = entry.getKey(); List<RuntimePermissionsState.PermissionState> permissions = entry.getValue(); Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = runtimePermissions.getSharedUserPermissions(); int sharedUsersSize = mSharedUsers.size(); for (int i = 0; i < sharedUsersSize; i++) { String sharedUserName = mSharedUsers.keyAt(i); SharedUserSetting sharedUserSetting = mSharedUsers.valueAt(i); SharedUserSetting sharedUserSetting = mSharedUsers.get(sharedUserName); if (sharedUserSetting == null) { Slog.w(PackageManagerService.TAG, "Unknown shared user:" + sharedUserName); continue; } List<RuntimePermissionsState.PermissionState> permissions = sharedUserPermissions.get(sharedUserName); if (permissions != null) { readPermissionsStateLpr(permissions, sharedUserSetting.getPermissionsState(), userId); } else if (!isUpgradeToR) { Slog.w(TAG, "Missing permission state for shared user: " + sharedUserName); ArraySet<String> requestedPermissions = new ArraySet<>(); int targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; int sharedUserPackagesSize = sharedUserSetting.packages.size(); for (int packagesI = 0; packagesI < sharedUserPackagesSize; packagesI++) { PackageSetting packageSetting = sharedUserSetting.packages.valueAt( packagesI); if (packageSetting == null || packageSetting.pkg == null || !packageSetting.getInstalled(userId)) { continue; } AndroidPackage pkg = packageSetting.pkg; requestedPermissions.addAll(pkg.getRequestedPermissions()); targetSdkVersion = Math.min(targetSdkVersion, pkg.getTargetSdkVersion()); } generateFallbackPermissionsStateLpr(requestedPermissions, targetSdkVersion, sharedUserSetting.getPermissionsState(), userId); } } } Loading Loading @@ -5395,6 +5416,30 @@ public final class Settings { } } private void generateFallbackPermissionsStateLpr( @NonNull Collection<String> requestedPermissions, int targetSdkVersion, @NonNull PermissionsState permissionsState, @UserIdInt int userId) { for (String permissionName : requestedPermissions) { BasePermission permission = mPermissions.getPermission(permissionName); if (Objects.equals(permission.getSourcePackageName(), PLATFORM_PACKAGE_NAME) && permission.isRuntime() && !permission.isRemoved()) { if (permission.isHardOrSoftRestricted() || permission.isImmutablyRestricted()) { permissionsState.updatePermissionFlags(permission, userId, PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT); } if (targetSdkVersion < Build.VERSION_CODES.M) { permissionsState.updatePermissionFlags(permission, userId, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT); permissionsState.grantRuntimePermission(permission, userId); } } } } @GuardedBy("Settings.this.mLock") private void readLegacyStateForUserSyncLPr(int userId) { File permissionsFile = getUserRuntimePermissionsFile(userId); Loading