diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 20 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 13 |
2 files changed, 19 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 3c117aa2a61c..efea8fad5798 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3429,8 +3429,12 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.writeRuntimePermissionsForUserLPr(userId, false); } - if (READ_EXTERNAL_STORAGE.equals(name) - || WRITE_EXTERNAL_STORAGE.equals(name)) { + // Only need to do this if user is initialized. Otherwise it's a new user + // and there are no processes running as the user yet and there's no need + // to make an expensive call to remount processes for the changed permissions. + if ((READ_EXTERNAL_STORAGE.equals(name) + || WRITE_EXTERNAL_STORAGE.equals(name)) + && sUserManager.isInitialized(userId)) { final long token = Binder.clearCallingIdentity(); try { final StorageManager storage = mContext.getSystemService(StorageManager.class); @@ -15924,16 +15928,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } - void newUserCreatedLILPw(final int userHandle) { - // We cannot grant the default permissions with a lock held as - // we query providers from other components for default handlers - // such as enabled IMEs, etc. - mHandler.post(new Runnable() { - @Override - public void run() { - mDefaultPermissionPolicy.grantDefaultPermissions(userHandle); - } - }); + void newUserCreated(final int userHandle) { + mDefaultPermissionPolicy.grantDefaultPermissions(userHandle); } @Override diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 1a79b4eff6ed..23cb76771b58 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1220,6 +1220,7 @@ public class UserManagerService extends IUserManager.Stub { final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0; final long ident = Binder.clearCallingIdentity(); UserInfo userInfo = null; + final int userId; try { synchronized (mInstallLock) { synchronized (mPackagesLock) { @@ -1240,7 +1241,7 @@ public class UserManagerService extends IUserManager.Stub { if (isGuest && findCurrentGuestUserLocked() != null) { return null; } - int userId = getNextAvailableIdLocked(); + userId = getNextAvailableIdLocked(); userInfo = new UserInfo(userId, name, null, flags); userInfo.serialNumber = mNextSerialNumber++; long now = System.currentTimeMillis(); @@ -1274,9 +1275,9 @@ public class UserManagerService extends IUserManager.Stub { updateUserIdsLocked(); Bundle restrictions = new Bundle(); mUserRestrictions.append(userId, restrictions); - mPm.newUserCreatedLILPw(userId); } } + mPm.newUserCreated(userId); if (userInfo != null) { Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userInfo.id); @@ -2015,4 +2016,12 @@ public class UserManagerService extends IUserManager.Stub { } } } + + /** + * @param userId + * @return whether the user has been initialized yet + */ + boolean isInitialized(int userId) { + return (getUserInfo(userId).flags & UserInfo.FLAG_INITIALIZED) != 0; + } } |