diff --git a/services/core/java/android/os/UserManagerInternal.java b/services/core/java/android/os/UserManagerInternal.java index 94f5741fe8282..fbe8c04bd59cd 100644 --- a/services/core/java/android/os/UserManagerInternal.java +++ b/services/core/java/android/os/UserManagerInternal.java @@ -27,6 +27,7 @@ import com.android.server.pm.RestrictionsSet; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; /** * @hide Only for use within the system server. @@ -218,6 +219,13 @@ public abstract class UserManagerInternal { */ public abstract int[] getUserIds(); + /** + * Internal implementation of getUsers does not check permissions. + * This improves performance for calls from inside system server which already have permissions + * checked. + */ + public abstract @NonNull List getUsers(boolean excludeDying); + /** * Checks if the {@code callingUserId} and {@code targetUserId} are same or in same group * and that the {@code callingUserId} is not a profile and {@code targetUserId} is enabled. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5125c491cf2b1..dc7ed34fb0bec 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2988,7 +2988,7 @@ public class PackageManagerService extends IPackageManager.Stub t.traceEnd(); t.traceBegin("read user settings"); - mFirstBoot = !mSettings.readLPw(mUserManager.getUsers(false)); + mFirstBoot = !mSettings.readLPw(mInjector.getUserManagerInternal().getUsers(false)); t.traceEnd(); // Clean up orphaned packages for which the code path doesn't exist @@ -3431,7 +3431,7 @@ public class PackageManagerService extends IPackageManager.Stub // boot, then we need to initialize the default preferred apps across // all defined users. if (!mOnlyCore && (mPromoteSystemApps || mFirstBoot)) { - for (UserInfo user : mUserManager.getUsers(true)) { + for (UserInfo user : mInjector.getUserManagerInternal().getUsers(true)) { mSettings.applyDefaultPreferredAppsLPw(user.id); primeDomainVerificationsLPw(user.id); } @@ -22143,7 +22143,7 @@ public class PackageManagerService extends IPackageManager.Stub } for (String packageName : apkList) { setSystemAppHiddenUntilInstalled(packageName, true); - for (UserInfo user : mUserManager.getUsers(false)) { + for (UserInfo user : mInjector.getUserManagerInternal().getUsers(false)) { setSystemAppInstallState(packageName, false, user.id); } } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 398ff4b8b9f95..27924a68ff485 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -751,13 +751,19 @@ public class UserManagerService extends IUserManager.Stub { } public @NonNull List getUsers(boolean excludeDying) { - return getUsers(/*excludePartial= */ true, excludeDying, /* excludePreCreated= */ true); + return getUsers(/*excludePartial= */ true, excludeDying, /* excludePreCreated= */ + true); } @Override public @NonNull List getUsers(boolean excludePartial, boolean excludeDying, boolean excludePreCreated) { checkManageOrCreateUsersPermission("query users"); + return getUsersInternal(excludePartial, excludeDying, excludePreCreated); + } + + private @NonNull List getUsersInternal(boolean excludePartial, boolean excludeDying, + boolean excludePreCreated) { synchronized (mUsersLock) { ArrayList users = new ArrayList(mUsers.size()); final int userSize = mUsers.size(); @@ -5044,6 +5050,12 @@ public class UserManagerService extends IUserManager.Stub { return UserManagerService.this.getUserIds(); } + @Override + public @NonNull List getUsers(boolean excludeDying) { + return UserManagerService.this.getUsersInternal(/*excludePartial= */ true, + excludeDying, /* excludePreCreated= */ true); + } + @Override public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) { int state;