Loading services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -431,6 +431,8 @@ final class DefaultPermissionGrantPolicy { } } } } } } mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId); } } } } Loading services/core/java/com/android/server/pm/PackageManagerService.java +11 −5 Original line number Original line Diff line number Diff line Loading @@ -14110,6 +14110,8 @@ public class PackageManagerService extends IPackageManager.Stub { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } } int[] grantPermissionsUserIds = EMPTY_INT_ARRAY; synchronized (mPackages) { synchronized (mPackages) { // Verify that all of the preferred activity components actually // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // exist. It is possible for applications to be updated and at Loading Loading @@ -14139,16 +14141,20 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mPreferredActivities.keyAt(i)); mSettings.mPreferredActivities.keyAt(i)); } } } } for (int userId : UserManagerService.getInstance().getUserIds()) { if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) { grantPermissionsUserIds = ArrayUtils.appendInt( grantPermissionsUserIds, userId); } } } } sUserManager.systemReady(); sUserManager.systemReady(); // If we upgraded grant all default permissions before kicking off. // If we upgraded grant all default permissions before kicking off. if (isFirstBoot() || (CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE && mIsUpgrade)) { for (int userId : grantPermissionsUserIds) { updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL); for (int userId : UserManagerService.getInstance().getUserIds()) { mDefaultPermissionPolicy.grantDefaultPermissions(userId); mDefaultPermissionPolicy.grantDefaultPermissions(userId); } } } // Kick off any messages waiting for system ready // Kick off any messages waiting for system ready if (mPostSystemReadyMessages != null) { if (mPostSystemReadyMessages != null) { services/core/java/com/android/server/pm/Settings.java +45 −3 Original line number Original line Diff line number Diff line Loading @@ -195,6 +195,7 @@ final class Settings { private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall"; private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall"; private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus"; private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus"; private static final String ATTR_PACKAGE_NAME= "packageName"; private static final String ATTR_PACKAGE_NAME= "packageName"; private static final String ATTR_FINGERPRINT = "fingerprint"; private final Object mLock; private final Object mLock; Loading Loading @@ -1177,6 +1178,16 @@ final class Settings { } } } } boolean areDefaultRuntimePermissionsGrantedLPr(int userId) { return mRuntimePermissionsPersistence .areDefaultRuntimPermissionsGrantedLPr(userId); } void onDefaultRuntimePermissionsGrantedLPr(int userId) { mRuntimePermissionsPersistence .onDefaultRuntimePermissionsGrantedLPr(userId); } /** /** * Returns whether the current database has is older than {@code version} * Returns whether the current database has is older than {@code version} * for apps on internal storage. * for apps on internal storage. Loading Loading @@ -4364,15 +4375,33 @@ final class Settings { private final Object mLock; private final Object mLock; @GuardedBy("mLock") @GuardedBy("mLock") private SparseBooleanArray mWriteScheduled = new SparseBooleanArray(); private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray(); @GuardedBy("mLock") // The mapping keys are user ids. private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray(); @GuardedBy("mLock") // The mapping keys are user ids. private final SparseArray<String> mFingerprints = new SparseArray<>(); @GuardedBy("mLock") @GuardedBy("mLock") private SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray(); // The mapping keys are user ids. private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray(); public RuntimePermissionPersistence(Object lock) { public RuntimePermissionPersistence(Object lock) { mLock = lock; mLock = lock; } } public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) { return mDefaultPermissionsGranted.get(userId); } public void onDefaultRuntimePermissionsGrantedLPr(int userId) { mFingerprints.put(userId, Build.FINGERPRINT); writePermissionsForUserAsyncLPr(userId); } public void writePermissionsForUserSyncLPr(int userId) { public void writePermissionsForUserSyncLPr(int userId) { mHandler.removeMessages(userId); mHandler.removeMessages(userId); writePermissionsSync(userId); writePermissionsSync(userId); Loading Loading @@ -4457,6 +4486,9 @@ final class Settings { serializer.startDocument(null, true); serializer.startDocument(null, true); serializer.startTag(null, TAG_RUNTIME_PERMISSIONS); serializer.startTag(null, TAG_RUNTIME_PERMISSIONS); String fingerprint = mFingerprints.get(userId); serializer.attribute(null, ATTR_FINGERPRINT, fingerprint); final int packageCount = permissionsForPackage.size(); final int packageCount = permissionsForPackage.size(); for (int i = 0; i < packageCount; i++) { for (int i = 0; i < packageCount; i++) { String packageName = permissionsForPackage.keyAt(i); String packageName = permissionsForPackage.keyAt(i); Loading @@ -4481,6 +4513,9 @@ final class Settings { serializer.endDocument(); serializer.endDocument(); destination.finishWrite(out); destination.finishWrite(out); if (Build.FINGERPRINT.equals(fingerprint)) { mDefaultPermissionsGranted.put(userId, true); } // Any error while writing is fatal. // Any error while writing is fatal. } catch (Throwable t) { } catch (Throwable t) { Slog.wtf(PackageManagerService.TAG, Slog.wtf(PackageManagerService.TAG, Loading Loading @@ -4559,6 +4594,13 @@ final class Settings { } } switch (parser.getName()) { switch (parser.getName()) { case TAG_RUNTIME_PERMISSIONS: { String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT); mFingerprints.put(userId, fingerprint); final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultsGranted); } break; case TAG_PACKAGE: { case TAG_PACKAGE: { String name = parser.getAttributeValue(null, ATTR_NAME); String name = parser.getAttributeValue(null, ATTR_NAME); PackageSetting ps = mPackages.get(name); PackageSetting ps = mPackages.get(name); Loading Loading
services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -431,6 +431,8 @@ final class DefaultPermissionGrantPolicy { } } } } } } mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId); } } } } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +11 −5 Original line number Original line Diff line number Diff line Loading @@ -14110,6 +14110,8 @@ public class PackageManagerService extends IPackageManager.Stub { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } } int[] grantPermissionsUserIds = EMPTY_INT_ARRAY; synchronized (mPackages) { synchronized (mPackages) { // Verify that all of the preferred activity components actually // Verify that all of the preferred activity components actually // exist. It is possible for applications to be updated and at // exist. It is possible for applications to be updated and at Loading Loading @@ -14139,16 +14141,20 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mPreferredActivities.keyAt(i)); mSettings.mPreferredActivities.keyAt(i)); } } } } for (int userId : UserManagerService.getInstance().getUserIds()) { if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) { grantPermissionsUserIds = ArrayUtils.appendInt( grantPermissionsUserIds, userId); } } } } sUserManager.systemReady(); sUserManager.systemReady(); // If we upgraded grant all default permissions before kicking off. // If we upgraded grant all default permissions before kicking off. if (isFirstBoot() || (CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE && mIsUpgrade)) { for (int userId : grantPermissionsUserIds) { updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL); for (int userId : UserManagerService.getInstance().getUserIds()) { mDefaultPermissionPolicy.grantDefaultPermissions(userId); mDefaultPermissionPolicy.grantDefaultPermissions(userId); } } } // Kick off any messages waiting for system ready // Kick off any messages waiting for system ready if (mPostSystemReadyMessages != null) { if (mPostSystemReadyMessages != null) {
services/core/java/com/android/server/pm/Settings.java +45 −3 Original line number Original line Diff line number Diff line Loading @@ -195,6 +195,7 @@ final class Settings { private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall"; private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall"; private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus"; private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus"; private static final String ATTR_PACKAGE_NAME= "packageName"; private static final String ATTR_PACKAGE_NAME= "packageName"; private static final String ATTR_FINGERPRINT = "fingerprint"; private final Object mLock; private final Object mLock; Loading Loading @@ -1177,6 +1178,16 @@ final class Settings { } } } } boolean areDefaultRuntimePermissionsGrantedLPr(int userId) { return mRuntimePermissionsPersistence .areDefaultRuntimPermissionsGrantedLPr(userId); } void onDefaultRuntimePermissionsGrantedLPr(int userId) { mRuntimePermissionsPersistence .onDefaultRuntimePermissionsGrantedLPr(userId); } /** /** * Returns whether the current database has is older than {@code version} * Returns whether the current database has is older than {@code version} * for apps on internal storage. * for apps on internal storage. Loading Loading @@ -4364,15 +4375,33 @@ final class Settings { private final Object mLock; private final Object mLock; @GuardedBy("mLock") @GuardedBy("mLock") private SparseBooleanArray mWriteScheduled = new SparseBooleanArray(); private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray(); @GuardedBy("mLock") // The mapping keys are user ids. private final SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray(); @GuardedBy("mLock") // The mapping keys are user ids. private final SparseArray<String> mFingerprints = new SparseArray<>(); @GuardedBy("mLock") @GuardedBy("mLock") private SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray(); // The mapping keys are user ids. private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray(); public RuntimePermissionPersistence(Object lock) { public RuntimePermissionPersistence(Object lock) { mLock = lock; mLock = lock; } } public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) { return mDefaultPermissionsGranted.get(userId); } public void onDefaultRuntimePermissionsGrantedLPr(int userId) { mFingerprints.put(userId, Build.FINGERPRINT); writePermissionsForUserAsyncLPr(userId); } public void writePermissionsForUserSyncLPr(int userId) { public void writePermissionsForUserSyncLPr(int userId) { mHandler.removeMessages(userId); mHandler.removeMessages(userId); writePermissionsSync(userId); writePermissionsSync(userId); Loading Loading @@ -4457,6 +4486,9 @@ final class Settings { serializer.startDocument(null, true); serializer.startDocument(null, true); serializer.startTag(null, TAG_RUNTIME_PERMISSIONS); serializer.startTag(null, TAG_RUNTIME_PERMISSIONS); String fingerprint = mFingerprints.get(userId); serializer.attribute(null, ATTR_FINGERPRINT, fingerprint); final int packageCount = permissionsForPackage.size(); final int packageCount = permissionsForPackage.size(); for (int i = 0; i < packageCount; i++) { for (int i = 0; i < packageCount; i++) { String packageName = permissionsForPackage.keyAt(i); String packageName = permissionsForPackage.keyAt(i); Loading @@ -4481,6 +4513,9 @@ final class Settings { serializer.endDocument(); serializer.endDocument(); destination.finishWrite(out); destination.finishWrite(out); if (Build.FINGERPRINT.equals(fingerprint)) { mDefaultPermissionsGranted.put(userId, true); } // Any error while writing is fatal. // Any error while writing is fatal. } catch (Throwable t) { } catch (Throwable t) { Slog.wtf(PackageManagerService.TAG, Slog.wtf(PackageManagerService.TAG, Loading Loading @@ -4559,6 +4594,13 @@ final class Settings { } } switch (parser.getName()) { switch (parser.getName()) { case TAG_RUNTIME_PERMISSIONS: { String fingerprint = parser.getAttributeValue(null, ATTR_FINGERPRINT); mFingerprints.put(userId, fingerprint); final boolean defaultsGranted = Build.FINGERPRINT.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultsGranted); } break; case TAG_PACKAGE: { case TAG_PACKAGE: { String name = parser.getAttributeValue(null, ATTR_NAME); String name = parser.getAttributeValue(null, ATTR_NAME); PackageSetting ps = mPackages.get(name); PackageSetting ps = mPackages.get(name); Loading