summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yasin Kilicdere <tyk@google.com> 2024-02-14 15:52:24 +0000
committer Yasin Kilicdere <tyk@google.com> 2024-02-14 17:53:53 +0000
commit449fc406c8e47e4644c200dc0156c3ff971cf123 (patch)
treebc60b1531c831cf30af6826e20a66e796cbac99b
parent1207214670662078a49b6c133ffe795b5129a1eb (diff)
Set power mode to MODE_FIXED_PERFORMANCE during a user switch.
This reduces average duration of UserController.startUser-fg part of the user switch by 32% from 269.39ms to 184.65ms. Bug: 311070231 Bug: 325249845 Test: Run user switch 100 times in a row with flag on and off Flag: ACONFIG android.multiuser.set_power_mode_during_user_switch DEVELOPMENT Change-Id: I91c68cbe7dfabdd9dc1d63a9d763040474b02177
-rw-r--r--services/core/java/com/android/server/am/UserController.java23
1 files changed, 22 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 55ac4cf37283..34ba7f0debb0 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -97,6 +97,7 @@ import android.os.IProgressListener;
import android.os.IRemoteCallback;
import android.os.IUserManager;
import android.os.Message;
+import android.os.PowerManagerInternal;
import android.os.PowerWhitelistManager;
import android.os.Process;
import android.os.RemoteCallbackList;
@@ -1934,9 +1935,12 @@ class UserController implements Handler.Callback {
}
/**
- * Start user, if its not already running, and bring it to foreground.
+ * Start user, if it's not already running, and bring it to foreground.
*/
void startUserInForeground(@UserIdInt int targetUserId) {
+ if (android.multiuser.Flags.setPowerModeDuringUserSwitch()) {
+ mInjector.setPerformancePowerMode(true);
+ }
boolean success = startUser(targetUserId, USER_START_MODE_FOREGROUND);
if (!success) {
mInjector.getWindowManager().setSwitchingUser(false);
@@ -2146,6 +2150,9 @@ class UserController implements Handler.Callback {
}
private void endUserSwitch() {
+ if (android.multiuser.Flags.setPowerModeDuringUserSwitch()) {
+ mInjector.setPerformancePowerMode(false);
+ }
final int nextUserId;
synchronized (mLock) {
nextUserId = ObjectUtils.getOrElse(mPendingTargetUserIds.poll(), UserHandle.USER_NULL);
@@ -3535,6 +3542,7 @@ class UserController implements Handler.Callback {
private final ActivityManagerService mService;
private UserManagerService mUserManager;
private UserManagerInternal mUserManagerInternal;
+ private PowerManagerInternal mPowerManagerInternal;
private Handler mHandler;
private final Object mUserSwitchingDialogLock = new Object();
@GuardedBy("mUserSwitchingDialogLock")
@@ -3636,6 +3644,13 @@ class UserController implements Handler.Callback {
return mUserManagerInternal;
}
+ PowerManagerInternal getPowerManagerInternal() {
+ if (mPowerManagerInternal == null) {
+ mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
+ }
+ return mPowerManagerInternal;
+ }
+
KeyguardManager getKeyguardManager() {
return mService.mContext.getSystemService(KeyguardManager.class);
}
@@ -3829,6 +3844,12 @@ class UserController implements Handler.Callback {
getSystemServiceManager().onUserStarting(TimingsTraceAndSlog.newAsyncLog(), userId);
}
+ void setPerformancePowerMode(boolean enabled) {
+ Slogf.i(TAG, "Setting power mode MODE_FIXED_PERFORMANCE to " + enabled);
+ getPowerManagerInternal().setPowerMode(
+ PowerManagerInternal.MODE_FIXED_PERFORMANCE, enabled);
+ }
+
void onSystemUserVisibilityChanged(boolean visible) {
getUserManagerInternal().onSystemUserVisibilityChanged(visible);
}