Android P 开启省电模式后拔USB后继续保持省电模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/su749520/article/details/83785648

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

猜你喜欢

转载自blog.csdn.net/su749520/article/details/83785648