diff options
| author | 2024-07-11 15:47:01 +0000 | |
|---|---|---|
| committer | 2024-07-11 15:47:01 +0000 | |
| commit | c4bad67ab09bc972b1663e336f64f49d46433187 (patch) | |
| tree | 00bcf532fea075c2590ff3cdb0956adf6a9e7352 | |
| parent | 0b6b3478031eb589477716a8856cb6515266875f (diff) | |
Do not remove auto-created not-yet-logged-in ephemeral guest users during boot.
We don't need to remove this type ephemeral users because:
1. It will be recreated again anyway.
2. It doesn't have any user data because it hasn't been switched to yet.
This avoids unnecessary operations, and improves boot duration.
Bug: 341165986
Change-Id: Id5d3659ad3377e85a901c0d7ef706ff615eb765b
Test: atest CtsMultiUserHostTestCases
Flag: EXEMPT bugfix
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index b9a9d64fc50e..05d8bf44895e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1176,6 +1176,30 @@ public class UserManagerService extends IUserManager.Stub { } } + /** Marks the user as slated for deletion during boot if necessary. **/ + @GuardedBy("mUsersLock") + private void markUserForRemovalIfNecessaryLU(UserInfo ui) { + if (!ui.isEphemeral()) { + // User should be ephemeral to be marked for removal. + return; + } + if (ui.preCreated) { + // Avoid marking pre-created users for removal. + return; + } + if (ui.lastLoggedInTime == 0 && ui.isGuest() && Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_guestUserAutoCreated)) { + // Avoid marking auto-created but not-yet-logged-in guest user for removal. Because a + // new one will be created anyway, and this one doesn't have any personal data in it yet + // due to not being logged in. + return; + } + // Mark the user for removal. + addRemovingUserIdLocked(ui.id); + ui.partial = true; + ui.flags |= UserInfo.FLAG_DISABLED; + } + /* Prunes out any partially created or partially removed users. */ private void cleanupPartialUsers() { ArrayList<UserInfo> partials = new ArrayList<>(); @@ -4340,13 +4364,7 @@ public class UserManagerService extends IUserManager.Stub { || mNextSerialNumber <= userData.info.id) { mNextSerialNumber = userData.info.id + 1; } - if (userData.info.isEphemeral() && !userData.info.preCreated - && userData.info.id != UserHandle.USER_SYSTEM) { - // Mark ephemeral user as slated for deletion. - addRemovingUserIdLocked(userData.info.id); - userData.info.partial = true; - userData.info.flags |= UserInfo.FLAG_DISABLED; - } + markUserForRemovalIfNecessaryLU(userData.info); } } } else if (name.equals(TAG_GUEST_RESTRICTIONS)) { |