Loading services/core/java/android/content/pm/PackageManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.util.ArraySet; import android.util.SparseArray; import com.android.internal.util.function.pooled.PooledLambda; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.pm.Installer.LegacyDexoptDisabledException; import com.android.server.pm.KnownPackages; import com.android.server.pm.PackageList; Loading Loading @@ -1077,9 +1078,16 @@ public abstract class PackageManagerInternal { /** * Read legacy permission definitions for permissions migration to new permission subsystem. * Note that this api is supposed to be used for permissions migration only. */ public abstract LegacyPermissionSettings getLegacyPermissions(); /** * Read legacy permission states for permissions migration to new permission subsystem. * Note that this api is supposed to be used for permissions state migration only. */ public abstract RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId); /** * Returns {@code true} if the caller is the installer of record for the given package. * Otherwise, {@code false}. Loading services/core/java/com/android/server/pm/PackageManagerService.java +11 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,7 @@ import com.android.internal.util.Preconditions; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import com.android.permission.persistence.RuntimePermissionsPersistence; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalManagerRegistry; Loading Loading @@ -6747,6 +6748,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } /** * Read legacy permission states for permissions migration to new permission subsystem. */ @Override public RuntimePermissionsState getLegacyPermissionsState(int userId) { synchronized (mLock) { return mSettings.getLegacyPermissionsState(userId); } } @Override @SuppressWarnings("GuardedBy") public boolean isPermissionUpgradeNeeded(int userId) { Loading services/core/java/com/android/server/pm/Settings.java +71 −32 Original line number Diff line number Diff line Loading @@ -3292,6 +3292,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mPackages, mSharedUsers, getUserRuntimePermissionsFile(userId)); } RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId) { return mRuntimePermissionsPersistence.getLegacyPermissionsState( userId, mPackages, mSharedUsers); } void applyDefaultPreferredAppsLPw(int userId) { // First pull data from any pre-installed apps. final PackageManagerInternal pmInternal = Loading Loading @@ -5726,17 +5731,67 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile Runnable writer = () -> { boolean isLegacyPermissionStateStale = mIsLegacyPermissionStateStale.getAndSet( false); Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions; Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions; final Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = new ArrayMap<>(); final Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); synchronized (pmLock) { if (sync || isLegacyPermissionStateStale) { legacyPermissionDataProvider.writeLegacyPermissionStateTEMP(); } int packagesSize = packageStates.size(); packagePermissions = getPackagePermissions(userId, packageStates); sharedUserPermissions = getShareUsersPermissions(userId, sharedUsers); } synchronized (mLock) { int version = mVersions.get(userId, INITIAL_VERSION); String fingerprint = mFingerprints.get(userId); RuntimePermissionsState runtimePermissions = new RuntimePermissionsState( version, fingerprint, packagePermissions, sharedUserPermissions); mPendingStatesToWrite.put(userId, runtimePermissions); } if (pmHandler != null) { // Async version. mPersistenceHandler.obtainMessage(userId).sendToTarget(); } else { // Sync version. writePendingStates(); } }; if (pmHandler != null) { // Async version, use pmHandler. pmHandler.post(writer); } else { // Sync version, use caller's thread. writer.run(); } } @NonNull RuntimePermissionsState getLegacyPermissionsState(int userId, @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) { int version; String fingerprint; synchronized (mLock) { version = mVersions.get(userId, INITIAL_VERSION); fingerprint = mFingerprints.get(userId); } return new RuntimePermissionsState( version, fingerprint, getPackagePermissions(userId, packageStates), getShareUsersPermissions(userId, sharedUsers)); } @NonNull private Map<String, List<RuntimePermissionsState.PermissionState>> getPackagePermissions( int userId, @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates) { final Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = new ArrayMap<>(); final int packagesSize = packageStates.size(); for (int i = 0; i < packagesSize; i++) { String packageName = packageStates.keyAt(i); PackageStateInternal packageState = packageStates.valueAt(i); Loading @@ -5754,6 +5809,14 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile packagePermissions.put(packageName, permissions); } } return packagePermissions; } @NonNull private Map<String, List<RuntimePermissionsState.PermissionState>> getShareUsersPermissions( int userId, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) { final Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); final int sharedUsersSize = sharedUsers.size(); for (int i = 0; i < sharedUsersSize; i++) { Loading @@ -5764,31 +5827,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile sharedUserSetting.getLegacyPermissionState(), userId); sharedUserPermissions.put(sharedUserName, permissions); } } synchronized (mLock) { int version = mVersions.get(userId, INITIAL_VERSION); String fingerprint = mFingerprints.get(userId); RuntimePermissionsState runtimePermissions = new RuntimePermissionsState( version, fingerprint, packagePermissions, sharedUserPermissions); mPendingStatesToWrite.put(userId, runtimePermissions); } if (pmHandler != null) { // Async version. mPersistenceHandler.obtainMessage(userId).sendToTarget(); } else { // Sync version. writePendingStates(); } }; if (pmHandler != null) { // Async version, use pmHandler. pmHandler.post(writer); } else { // Sync version, use caller's thread. writer.run(); } return sharedUserPermissions; } private void writePendingStates() { Loading services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java +4 −9 Original line number Diff line number Diff line Loading @@ -18,11 +18,9 @@ package com.android.server.pm.permission; import android.annotation.NonNull; import android.content.pm.PackageManagerInternal; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import com.android.permission.persistence.RuntimePermissionsPersistence; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; Loading Loading @@ -81,15 +79,12 @@ public class PermissionMigrationHelperImpl implements PermissionMigrationHelper */ @NonNull public Map<Integer, Map<String, LegacyPermissionState>> getLegacyPermissionStates(int userId) { RuntimePermissionsPersistence legacyPersistence = RuntimePermissionsPersistence.createInstance(); PackageManagerInternal mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); Map<Integer, Map<String, LegacyPermissionState>> appIdPermissionStates = new ArrayMap<>(); RuntimePermissionsState legacyState = legacyPersistence.readForUser(UserHandle.of(userId)); if (legacyState == null) { return appIdPermissionStates; } RuntimePermissionsState legacyState = mPackageManagerInternal.getLegacyPermissionsState(userId); PackageManagerLocal packageManagerLocal = LocalManagerRegistry.getManager(PackageManagerLocal.class); Loading Loading
services/core/java/android/content/pm/PackageManagerInternal.java +8 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.util.ArraySet; import android.util.SparseArray; import com.android.internal.util.function.pooled.PooledLambda; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.pm.Installer.LegacyDexoptDisabledException; import com.android.server.pm.KnownPackages; import com.android.server.pm.PackageList; Loading Loading @@ -1077,9 +1078,16 @@ public abstract class PackageManagerInternal { /** * Read legacy permission definitions for permissions migration to new permission subsystem. * Note that this api is supposed to be used for permissions migration only. */ public abstract LegacyPermissionSettings getLegacyPermissions(); /** * Read legacy permission states for permissions migration to new permission subsystem. * Note that this api is supposed to be used for permissions state migration only. */ public abstract RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId); /** * Returns {@code true} if the caller is the installer of record for the given package. * Otherwise, {@code false}. Loading
services/core/java/com/android/server/pm/PackageManagerService.java +11 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,7 @@ import com.android.internal.util.Preconditions; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import com.android.permission.persistence.RuntimePermissionsPersistence; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.EventLogTags; import com.android.server.FgThread; import com.android.server.LocalManagerRegistry; Loading Loading @@ -6747,6 +6748,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } /** * Read legacy permission states for permissions migration to new permission subsystem. */ @Override public RuntimePermissionsState getLegacyPermissionsState(int userId) { synchronized (mLock) { return mSettings.getLegacyPermissionsState(userId); } } @Override @SuppressWarnings("GuardedBy") public boolean isPermissionUpgradeNeeded(int userId) { Loading
services/core/java/com/android/server/pm/Settings.java +71 −32 Original line number Diff line number Diff line Loading @@ -3292,6 +3292,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile mPackages, mSharedUsers, getUserRuntimePermissionsFile(userId)); } RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId) { return mRuntimePermissionsPersistence.getLegacyPermissionsState( userId, mPackages, mSharedUsers); } void applyDefaultPreferredAppsLPw(int userId) { // First pull data from any pre-installed apps. final PackageManagerInternal pmInternal = Loading Loading @@ -5726,17 +5731,67 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile Runnable writer = () -> { boolean isLegacyPermissionStateStale = mIsLegacyPermissionStateStale.getAndSet( false); Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions; Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions; final Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = new ArrayMap<>(); final Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); synchronized (pmLock) { if (sync || isLegacyPermissionStateStale) { legacyPermissionDataProvider.writeLegacyPermissionStateTEMP(); } int packagesSize = packageStates.size(); packagePermissions = getPackagePermissions(userId, packageStates); sharedUserPermissions = getShareUsersPermissions(userId, sharedUsers); } synchronized (mLock) { int version = mVersions.get(userId, INITIAL_VERSION); String fingerprint = mFingerprints.get(userId); RuntimePermissionsState runtimePermissions = new RuntimePermissionsState( version, fingerprint, packagePermissions, sharedUserPermissions); mPendingStatesToWrite.put(userId, runtimePermissions); } if (pmHandler != null) { // Async version. mPersistenceHandler.obtainMessage(userId).sendToTarget(); } else { // Sync version. writePendingStates(); } }; if (pmHandler != null) { // Async version, use pmHandler. pmHandler.post(writer); } else { // Sync version, use caller's thread. writer.run(); } } @NonNull RuntimePermissionsState getLegacyPermissionsState(int userId, @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) { int version; String fingerprint; synchronized (mLock) { version = mVersions.get(userId, INITIAL_VERSION); fingerprint = mFingerprints.get(userId); } return new RuntimePermissionsState( version, fingerprint, getPackagePermissions(userId, packageStates), getShareUsersPermissions(userId, sharedUsers)); } @NonNull private Map<String, List<RuntimePermissionsState.PermissionState>> getPackagePermissions( int userId, @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates) { final Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions = new ArrayMap<>(); final int packagesSize = packageStates.size(); for (int i = 0; i < packagesSize; i++) { String packageName = packageStates.keyAt(i); PackageStateInternal packageState = packageStates.valueAt(i); Loading @@ -5754,6 +5809,14 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile packagePermissions.put(packageName, permissions); } } return packagePermissions; } @NonNull private Map<String, List<RuntimePermissionsState.PermissionState>> getShareUsersPermissions( int userId, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) { final Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions = new ArrayMap<>(); final int sharedUsersSize = sharedUsers.size(); for (int i = 0; i < sharedUsersSize; i++) { Loading @@ -5764,31 +5827,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile sharedUserSetting.getLegacyPermissionState(), userId); sharedUserPermissions.put(sharedUserName, permissions); } } synchronized (mLock) { int version = mVersions.get(userId, INITIAL_VERSION); String fingerprint = mFingerprints.get(userId); RuntimePermissionsState runtimePermissions = new RuntimePermissionsState( version, fingerprint, packagePermissions, sharedUserPermissions); mPendingStatesToWrite.put(userId, runtimePermissions); } if (pmHandler != null) { // Async version. mPersistenceHandler.obtainMessage(userId).sendToTarget(); } else { // Sync version. writePendingStates(); } }; if (pmHandler != null) { // Async version, use pmHandler. pmHandler.post(writer); } else { // Sync version, use caller's thread. writer.run(); } return sharedUserPermissions; } private void writePendingStates() { Loading
services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java +4 −9 Original line number Diff line number Diff line Loading @@ -18,11 +18,9 @@ package com.android.server.pm.permission; import android.annotation.NonNull; import android.content.pm.PackageManagerInternal; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import com.android.permission.persistence.RuntimePermissionsPersistence; import com.android.permission.persistence.RuntimePermissionsState; import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; Loading Loading @@ -81,15 +79,12 @@ public class PermissionMigrationHelperImpl implements PermissionMigrationHelper */ @NonNull public Map<Integer, Map<String, LegacyPermissionState>> getLegacyPermissionStates(int userId) { RuntimePermissionsPersistence legacyPersistence = RuntimePermissionsPersistence.createInstance(); PackageManagerInternal mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); Map<Integer, Map<String, LegacyPermissionState>> appIdPermissionStates = new ArrayMap<>(); RuntimePermissionsState legacyState = legacyPersistence.readForUser(UserHandle.of(userId)); if (legacyState == null) { return appIdPermissionStates; } RuntimePermissionsState legacyState = mPackageManagerInternal.getLegacyPermissionsState(userId); PackageManagerLocal packageManagerLocal = LocalManagerRegistry.getManager(PackageManagerLocal.class); Loading