From c4bad67ab09bc972b1663e336f64f49d46433187 Mon Sep 17 00:00:00 2001 From: Yasin Kilicdere Date: Thu, 11 Jul 2024 15:47:01 +0000 Subject: 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 --- .../com/android/server/pm/UserManagerService.java | 32 +++++++++++++++++----- 1 file 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 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)) { -- cgit v1.2.3-59-g8ed1b