1. 前言
之前一直不知道为什么老是自动进入省电模式,非常诧异。查看日志也没有直接调用PowerManager.setPowerSaveMode。最终发现 adb shell settings get global low_power, 键值low_power每次暗屏都是发生改变。一怒一下我,查看了源码中对应关键字的应用
root@69959bbb90c6:/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