diff options
author | 2024-02-14 15:52:24 +0000 | |
---|---|---|
committer | 2024-02-14 17:53:53 +0000 | |
commit | 449fc406c8e47e4644c200dc0156c3ff971cf123 (patch) | |
tree | bc60b1531c831cf30af6826e20a66e796cbac99b | |
parent | 1207214670662078a49b6c133ffe795b5129a1eb (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.java | 23 |
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); } |