summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yasin Kilicdere <tyk@google.com> 2024-07-11 15:47:01 +0000
committer Yasin Kilicdere <tyk@google.com> 2024-07-11 15:47:01 +0000
commitc4bad67ab09bc972b1663e336f64f49d46433187 (patch)
tree00bcf532fea075c2590ff3cdb0956adf6a9e7352
parent0b6b3478031eb589477716a8856cb6515266875f (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.java32
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)) {