Android P 開啟省電模式後拔USB後繼續保持省電模式
阿新 • • 發佈:2018-11-21
1. 前言
之前一直不知道為什麼老是自動進入省電模式,非常詫異。檢視日誌也沒有直接呼叫PowerManager.setPowerSaveMode。最終發現 adb shell settings get global low_power, 鍵值low_power每次暗屏都是發生改變。一怒一下我,查看了原始碼中對應關鍵字的應用
[email protected]:/home/suhuazhi/9.1# grep -irn "Settings.Global.LOW_POWER_MODE" frameworks/ frameworks/base/services/core/java/com/android/server/BatteryService.java:260: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL), frameworks/base/services/core/java/com/android/server/BatteryService.java:314: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel); frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:158: Settings.Global.LOW_POWER_MODE), frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:161: Settings.Global.LOW_POWER_MODE_STICKY), frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:164: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL), frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:199: Settings.Global.LOW_POWER_MODE, 0) != 0; frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:201: Settings.Global.LOW_POWER_MODE_STICKY, 0) != 0; frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:203: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0); frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java:119: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL), frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java:755: Settings.Global.LOW_POWER_MODE, frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java:758: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java:761: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX, frameworks/base/core/tests/coretests/src/android/provider/SettingsBackupTest.java:280: Settings.Global.LOW_POWER_MODE, frameworks/base/core/tests/coretests/src/android/provider/SettingsBackupTest.java:281: Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL_MAX, frameworks/base/core/tests/coretests/src/android/provider/SettingsBackupTest.java:282: Settings.Global.LOW_POWER_MODE_STICKY, frameworks/base/core/tests/coretests/src/android/provider/SettingsBackupTest.java:283: Settings.Global.LOW_POWER_MODE_SUGGESTION_PARAMS,
然後發現了這個小禽獸 frameworks/base/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java:158: Settings.Global.LOW_POWER_MODE),
2. BatterySaverStateMachine 原始碼-1
原始碼中有一個自動執行省電模式的函式doAutoBatterySaverLocked(),該函式是在key值變化的時候被呼叫。由於目前公司沒有自動進入省電模式的需求。該類的介面邏輯主要是PowerManagerService進行呼叫控制
package com.android.server.power.batterysaver; /** * Decides when to enable / disable battery saver. * * IMPORTANT: This class shares the power manager lock, which is very low in the lock hierarchy. * Do not call out with the lock held. (Settings provider is okay.) * * Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java */ public class BatterySaverStateMachine { /** * Decide whether to auto-start / stop battery saver. */ private void doAutoBatterySaverLocked() { if (DEBUG) { Slog.d(TAG, "doAutoBatterySaverLocked: mBootCompleted=" + mBootCompleted + " mSettingsLoaded=" + mSettingsLoaded + " mBatteryStatusSet=" + mBatteryStatusSet + " mIsBatteryLevelLow=" + mIsBatteryLevelLow + " mBatterySaverSnoozing=" + mBatterySaverSnoozing + " mIsPowered=" + mIsPowered + " mSettingBatterySaverEnabledSticky=" + mSettingBatterySaverEnabledSticky); } if (!(mBootCompleted && mSettingsLoaded && mBatteryStatusSet)) { return; // Not fully initialized yet. } if (!mIsBatteryLevelLow) { updateSnoozingLocked(false, "Battery not low"); } if (mIsPowered) { updateSnoozingLocked(false, "Plugged in"); enableBatterySaverLocked(/*enable=*/ false, /*manual=*/ false, BatterySaverController.REASON_PLUGGED_IN, "Plugged in"); } else if (mSettingBatterySaverEnabledSticky) { // Re-enable BS. enableBatterySaverLocked(/*enable=*/ true, /*manual=*/ true, BatterySaverController.REASON_STICKY_RESTORE, "Sticky restore"); } else if (mIsBatteryLevelLow) { if (!mBatterySaverSnoozing && isAutoBatterySaverConfigured()) { enableBatterySaverLocked(/*enable=*/ true, /*manual=*/ false, BatterySaverController.REASON_AUTOMATIC_ON, "Auto ON"); } } else { // Battery not low enableBatterySaverLocked(/*enable=*/ false, /*manual=*/ false, BatterySaverController.REASON_AUTOMATIC_OFF, "Auto OFF"); } }
相關日誌
- 手動開啟省電模式(reason=Manual ON)
11-06 07:27:14.015: D/BatterySaverStateMachine(978): enableBatterySaver: enable=false manual=false reason=Auto OFF(1)
11-06 07:27:14.015: D/BatterySaverStateMachine(978): Already disabled
11-06 07:27:16.501: D/BatterySaverStateMachine(978): setBatterySaverEnabledManually: enabled=true
11-06 07:27:16.501: D/BatterySaverStateMachine(978): enableBatterySaver: enable=true manual=true reason=Manual ON(2)
11-06 07:27:16.504: D/BatterySaverStateMachine(978): Battery saver: Enabled=true manual=true reason=Manual ON(2)
- 拔充電線(reason=Plugged)
11-06 07:29:03.230: D/BatterySaverStateMachine(978): setBatteryStatus: powered=true level=100 low=false
11-06 07:29:03.230: D/BatterySaverStateMachine(978): doAutoBatterySaverLocked: mBootCompleted=true mSettingsLoaded=true mBatteryStatusSet=true mIsBatteryLevelLow=false mBatterySaverSnoozing=false mIsPowered=true mSettingBatterySaverEnabledSticky=true
11-06 07:29:03.230: D/BatterySaverStateMachine(978): enableBatterySaver: enable=false manual=false reason=Plugged in(7)
11-06 07:29:03.231: D/BatterySaverStateMachine(978): Battery saver: Enabled=false manual=false reason=Plugged in(7)
- 插入充電線 - 進行恢復操作-Sticky restore
11-06 07:29:54.993: D/BatterySaverStateMachine(978): setBatteryStatus: powered=false level=100 low=false
11-06 07:29:54.993: D/BatterySaverStateMachine(978): doAutoBatterySaverLocked: mBootCompleted=true mSettingsLoaded=true mBatteryStatusSet=true mIsBatteryLevelLow=false mBatterySaverSnoozing=false mIsPowered=false mSettingBatterySaverEnabledSticky=true
11-06 07:29:54.993: D/BatterySaverStateMachine(978): enableBatterySaver: enable=true manual=true reason=Sticky restore(4)
11-06 07:29:54.995: D/BatterySaverStateMachine(978): Battery saver: Enabled=true manual=true reason=Sticky restore(4)
- 手動關閉省電模式-reason=Manual OFF
11-06 07:30:36.075: D/BatterySaverStateMachine(978): setBatterySaverEnabledManually: enabled=false
11-06 07:30:36.075: D/BatterySaverStateMachine(978): enableBatterySaver: enable=false manual=true reason=Manual OFF(3)
11-06 07:30:36.078: D/BatterySaverStateMachine(978): Battery saver: Enabled=false manual=true reason=Manual OFF(3)
3. PowerManagerService 原始碼-2
package com.android.server.power;
/**
* The power manager service is responsible for coordinating power management
* functions on the device.
*/
public final class PowerManagerService extends SystemService
implements Watchdog.Monitor {
private boolean setLowPowerModeInternal(boolean enabled) {
synchronized (mLock) {
if (DEBUG) {
Slog.d(TAG, "setLowPowerModeInternal " + enabled + " mIsPowered=" + mIsPowered);
}
if (mIsPowered) {
return false;
}
// 表示使用者手動進行省電模式的設定
mBatterySaverStateMachine.setBatterySaverEnabledManually(enabled);
return true;
}
}
/**
* Updates the value of mIsPowered.
* Sets DIRTY_IS_POWERED if a change occurred.
*/
private void updateIsPoweredLocked(int dirty) {
...
// 充電條件下執行
mBatterySaverStateMachine.setBatteryStatus(mIsPowered, mBatteryLevel, mBatteryLevelLow);
}
4. 修改記錄
將原先退出恢復的邏輯變更為改變為setBatterySaverEnabledManually使用者手動退出
public class BatterySaverStateMachine {
...
if (mIsPowered) {
//fadi add start by suhuazhi powersave
if(fadiPowerSaveConstant.PLUS) {
setBatterySaverEnabledManually(false);
} else {
updateSnoozingLocked(false, "Plugged in");
enableBatterySaverLocked(/*enable=*/ false, /*manual=*/ false,
BatterySaverController.REASON_PLUGGED_IN,
"Plugged in");
}
//fadi add end by suhuazhi powersave