Make grant default permission more robust.
Change-Id: If492ee3305774419671bbdb72b438c8e540005e9
This commit is contained in:
@@ -403,6 +403,8 @@ final class DefaultPermissionGrantPolicy {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14023,6 +14023,8 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
|
||||
}
|
||||
|
||||
int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
|
||||
|
||||
synchronized (mPackages) {
|
||||
// Verify that all of the preferred activity components actually
|
||||
// exist. It is possible for applications to be updated and at
|
||||
@@ -14052,15 +14054,19 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
mSettings.mPreferredActivities.keyAt(i));
|
||||
}
|
||||
}
|
||||
|
||||
for (int userId : UserManagerService.getInstance().getUserIds()) {
|
||||
if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) {
|
||||
grantPermissionsUserIds = ArrayUtils.appendInt(
|
||||
grantPermissionsUserIds, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
sUserManager.systemReady();
|
||||
|
||||
// If we upgraded grant all default permissions before kicking off.
|
||||
if (isFirstBoot() || (CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE && mIsUpgrade)) {
|
||||
updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL);
|
||||
for (int userId : UserManagerService.getInstance().getUserIds()) {
|
||||
mDefaultPermissionPolicy.grantDefaultPermissions(userId);
|
||||
}
|
||||
for (int userId : grantPermissionsUserIds) {
|
||||
mDefaultPermissionPolicy.grantDefaultPermissions(userId);
|
||||
}
|
||||
|
||||
// Kick off any messages waiting for system ready
|
||||
|
||||
@@ -195,6 +195,7 @@ final class Settings {
|
||||
private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
|
||||
private static final String ATTR_DOMAIN_VERIFICATON_STATE = "domainVerificationStatus";
|
||||
private static final String ATTR_PACKAGE_NAME= "packageName";
|
||||
private static final String ATTR_FINGERPRINT = "fingerprint";
|
||||
|
||||
private final Object mLock;
|
||||
|
||||
@@ -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}
|
||||
* for apps on internal storage.
|
||||
@@ -4334,15 +4345,33 @@ final class Settings {
|
||||
private final Object mLock;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
|
||||
private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray();
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private SparseLongArray mLastNotWrittenMutationTimesMillis = new SparseLongArray();
|
||||
// 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")
|
||||
// The mapping keys are user ids.
|
||||
private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray();
|
||||
|
||||
public RuntimePermissionPersistence(Object 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) {
|
||||
mHandler.removeMessages(userId);
|
||||
writePermissionsSync(userId);
|
||||
@@ -4427,6 +4456,9 @@ final class Settings {
|
||||
serializer.startDocument(null, true);
|
||||
serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
|
||||
|
||||
String fingerprint = mFingerprints.get(userId);
|
||||
serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
|
||||
|
||||
final int packageCount = permissionsForPackage.size();
|
||||
for (int i = 0; i < packageCount; i++) {
|
||||
String packageName = permissionsForPackage.keyAt(i);
|
||||
@@ -4451,7 +4483,10 @@ final class Settings {
|
||||
serializer.endDocument();
|
||||
destination.finishWrite(out);
|
||||
|
||||
// Any error while writing is fatal.
|
||||
if (Build.FINGERPRINT.equals(fingerprint)) {
|
||||
mDefaultPermissionsGranted.put(userId, true);
|
||||
}
|
||||
// Any error while writing is fatal.
|
||||
} catch (Throwable t) {
|
||||
Slog.wtf(PackageManagerService.TAG,
|
||||
"Failed to write settings, restoring backup", t);
|
||||
@@ -4529,6 +4564,13 @@ final class Settings {
|
||||
}
|
||||
|
||||
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: {
|
||||
String name = parser.getAttributeValue(null, ATTR_NAME);
|
||||
PackageSetting ps = mPackages.get(name);
|
||||
|
||||
Reference in New Issue
Block a user