1 展讯Sprd设置-电池-setPowerSaveMode 接口

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

1. 接口传递逻辑

展讯Sprd设置-电池-setPowerSaveMode 接口

2. 界面入口-SprdBatterySaverSettings

package com.android.settings.fuelgauge;

public class SprdBatterySaverSettings extends SettingsPreferenceFragment {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.sprd_battery_saver_settings);

2. 界面布局-sprd_battery_saver_settings

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
        android:title="@string/choose_battery_saver"
        android:key="battery_saver_list">
    <com.sprd.settings.RadioButtonPreference
            android:key="smart_power_saving_mode"
            android:title="@string/smart_power_saving_mode"
            android:summary="@string/smart_power_saving_mode_summary" />
    <com.sprd.settings.RadioButtonPreference
            android:key="low_power_mode"
            android:title="@string/low_power_mode"
            android:summary="@string/low_power_mode_summary" />
    <com.sprd.settings.RadioButtonPreference
            android:key="super_power_saving_mode"
            android:title="@string/super_power_saving_mode"
            android:summary="@string/super_power_saving_mode_summary" />
</PreferenceScreen>

3. 界面的开关事件-mSmartPowerModePreference

package com.android.settings.fuelgauge;

public class SprdBatterySaverSettings extends SettingsPreferenceFragment {

    private static final String KEY_SMART_POWER_SAVING = "smart_power_saving_mode";

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.sprd_battery_saver_settings);
        ...
        mSmartPowerModePreference = (RadioButtonPreference) findPreference(
                KEY_SMART_POWER_SAVING);
    }
    
    private void setPowerSavingMode(String key) {
        int mode;
        switch (key) {
            case KEY_SMART_POWER_SAVING:
                mode = MODE_SMART;
                break;
            case KEY_SUPER_POWER_SAVING:
                mode = MODE_ULTRASAVING;
                break;
            case KEY_LOW_POWER_SAVING:
                mode = MODE_LOWPOWER;
                break;
            default:
                mode = MODE_POWERSAVING;
        }
        Log.d(TAG, "setPowerSavingMode: " + key + " mode:" + mode);
        try {
            mPowerManagerEx.setPowerSaveMode(mode);
        } catch (RemoteException e) {
            // Not much we can do here
        }
    }

mPowerManagerEx.setPowerSaveMode(mode); 智能省电模式的调用接口

4. 智能省电模式接口-PowerManagerEx.setPowerSaveMode

查看接口名称 IPowerManagerEx.aidl

  • root@69959bbb90c6:/home/suhuazhi/8.1/op54# find vendor/ -name “IPowerManagerEx.aidl”
  • vendor/sprd/platform/frameworks/base/ex-interface/core/java/android/os/IPowerManagerEx.aidl
package android.os;

import android.os.AppPowerSaveConfig;

/**
 * SPRD added for PowerOff Alarm
 * @hide
 */
interface IPowerManagerEx{
    ...
    boolean setPowerSaveMode(int mode);
    ...

根据跨进程服务,命名的通用规则,实现的逻辑服务名称一般是 PowerManagerExService.java,或者看下如下

    mPowerManagerEx = IPowerManagerEx.Stub.asInterface(ServiceManager.getService("power_ex"));

5. 智能省电模式-查看ServiceManager服务定义

  • root@69959bbb90c6:/home/suhuazhi/8.1/op54# grep -irn “power_ex” vendor/sprd/platform/frameworks/

  • vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerManagerServiceEx.java:76: ServiceManager.addService(“power_ex”,this);

package com.android.server.power;

public class PowerManagerServiceEx extends IPowerManagerEx.Stub{


    private PowerManagerServiceEx(Context context){

        mContext = context;
        mDisplayManagerServiceEx = DisplayManagerServiceEx.getInstance(context);
        mPowerControllerInternal = LocalServices.getService(PowerController.LocalService.class);

        ServiceManager.addService("power_ex", PowerManagerServiceEx.this);

    }

ServiceManager.addService(“power_ex”, PowerManagerServiceEx.this); 和之前的猜想差不多,PowerManagerServiceEx 进行了智能省电接口的逻辑实现,便于上层通过IPowerManagerEx.setPowerSaveMode 调用

6. 智能省电模式-PowerManagerServiceEx.setPowerSaveMode

package com.android.server.power;

public class PowerManagerServiceEx extends IPowerManagerEx.Stub{

    // varibles for powercontroller
    // 看到这个接口名称,想起我自己做的省电接口名称,几乎一样的名称。神奇的偶遇
    final PowerController.LocalService mPowerControllerInternal;

    /**
     * set the current power save mode
     * @param mode link {@PowerManagerEx#MODE_LOWPOWER, #MODE_SMART, #MODE_ULTRASAVING}
     * @return Returns true for success, false for fail.
     */
    public boolean setPowerSaveMode(int mode) {
        return mPowerControllerInternal.setPowerSaveMode(mode);
    }

7. 智能省电模式-PowerController.LocalService.setPowerSaveMode

  • root@69959bbb90c6:/home/suhuazhi/8.1/op54# find vendor/sprd/platform/ -name “PowerController.java”
  • vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerController.java
package com.android.server.power;

public class PowerController //extends IPowerController.Stub

    // local service
    public final class LocalService  {
        ...
        //called by setting from powermanagerex
        boolean setPowerSaveMode(int mode) {
            if (DEBUG) Slog.d(TAG, "setPowerSaveMode(" + mode + "), user mode: " + mModeConfigArray[MODECONFIG_USER].mMode);

            if ((mode < PowerManagerEx.MODE_PERFORMANCE) || (mode > PowerManagerEx.MODE_ULTRASAVING)) {
                Slog.e(TAG, "invalid mode: " + mode);
                return false;
            }

            if ((mode == PowerManagerEx.MODE_ULTRASAVING) && !mUltraSavingEnabled) {
                Slog.e(TAG, "ULTRASAVING mode is disabled");
                return false;
            }
            msgHandler.removeMessages(MSG_SET_POWERSAVE_MODE);
            return msgHandler.sendMessage(msgHandler.obtainMessage(MSG_SET_POWERSAVE_MODE, mode, 0));
        }

其中上述的Msg事件

    final class MyHandler extends Handler {
        MyHandler(Looper looper) {
            super(looper);
        }
        
        switch (msg.what) {
            case MSG_SET_POWERSAVE_MODE:
            setPowerSaveModeInternal(msg.arg1);
            break;
        }

8. 智能省电模式-PowerController.setPowerSaveModeInternal

    //called by setting from powermanagerex
    //update mModeConfigArray[MODECONFIG_USER].mMode
    private void setPowerSaveModeInternal(int mode) {
        if (DEBUG) Slog.d(TAG, "setPowerSaveModeInternal() E, new mode: " + mode + ", old mode: " + mPowerSaveMode + ", [" + ModeConfig2Str(mModeConfigIndex) + "]");
        // exit force low power
        if (mForcePowerSave) {
            if (mPowerSaveMode != mode) {
                mForcePowerSave = false;

                mModeConfigArray[MODECONFIG_USER].mMode = mode;
                updatePowerSaveMode();
                msgHandler.removeMessages(MSG_SET_POWERSAVE_MODE);
                msgHandler.sendMessage(msgHandler.obtainMessage(MSG_SET_POWERSAVE_MODE, mode, 0));
                return;
            }
        }

        if (mModeConfigArray[mModeConfigIndex].mMode != mode) {
            if (showAlert(mode)) return;
        }

        mModeConfigArray[MODECONFIG_USER].mMode = mode;
        updatePowerSaveMode();
    }

状态开关保存,mModeConfigArray[MODECONFIG_USER].mMode = mode

9. 智能省电模式-PowerController.updatePowerSaveMode

下述也不关于智能省电相关

    // judge which powersave mode should be set
    // 1. if battery is low and without power, set to MODECONFIG_AUTOLOWPOWER
    // 2. if in pre-define period, set to MODECONFIG_SCHEDULE
    // 3. else set to MODECONFIG_USER
    private void updatePowerSaveMode() {
        final boolean wasPowered = mBatteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY);
        if (DEBUG) Slog.d(TAG, "updatePowerSaveMode(), wasPowered: " + wasPowered + ", mBatteryLevelLow: " + mBatteryLevelLow);

        // Add for bug#797412
        int preModeConfigIndex = mModeConfigIndex;

        if (wasPowered || !mBatteryLevelLow)
            mForcePowerSave = false;

        mModeConfigArray[MODECONFIG_AUTOLOWPOWER].mDependencyMet = false;
        mModeConfigArray[MODECONFIG_SCHEDULE].mDependencyMet = false;

        if (mBatteryLevelLow && mModeConfigArray[MODECONFIG_AUTOLOWPOWER].mEnable
            && mBootCompleted && mCurrentUserId == UserHandle.USER_SYSTEM) {
            if (!mExitLowPower_WithPower || !wasPowered) {
                Slog.d(TAG, "updatePowerSaveMode(), autoLowPower met");
                mModeConfigArray[MODECONFIG_AUTOLOWPOWER].mDependencyMet = true;
            }
        }

        if (mModeConfigArray[MODECONFIG_SCHEDULE].mEnable && isMeetModeSwitchSchedule()
            && mBootCompleted && mCurrentUserId == UserHandle.USER_SYSTEM) {
            Slog.d(TAG, "updatePowerSaveMode(), schedule met");
            mModeConfigArray[MODECONFIG_SCHEDULE].mDependencyMet = true;
        }

        if (mForcePowerSave) {
            mModeConfigIndex = MODECONFIG_USER;
            Slog.d(TAG, "updatePowerSaveMode(), force low power, set to " + ModeConfig2Str(mModeConfigIndex));
            mModeConfigArray[MODECONFIG_USER].mMode = PowerManagerEx.MODE_LOWPOWER;
        } else {
            // get the available highest priority mode
            for (int i=0; i<mModeConfigArray.length; i++) {
                if (mModeConfigArray[i].mDependencyMet && mModeConfigArray[i].mEnable) {
                    mModeConfigIndex = i;
                    Slog.d(TAG, "updatePowerSaveMode(), set to " + ModeConfig2Str(mModeConfigIndex));
                    break;
                }
            }
        }

        // Add for bug#797412 --START
        showToastIfNeed(preModeConfigIndex);
        // Add for bug#797412 --END

        updatePowerSaveModeInternal(mModeConfigArray[mModeConfigIndex].mMode);
        return;
    }

10. 智能省电模式-PowerController.updatePowerSaveModeInternal

    private boolean updatePowerSaveModeInternal(int mode) {
        if (DEBUG) Slog.d(TAG, "updatePowerSaveModeInternal(" + mode + "), pre-mode: " + mPowerSaveMode);

        // 防止重复调用
        if (mInitFinished && mPowerSaveMode == mode) {
            Slog.d(TAG, "updatePowerSaveModeInternal(), no change, return true");
            return true; //just return
        }

        handlePowerSaveModeChanged(mode);

        // private static final String CONFIG_FILENAME = "powercontroller.xml";
        writeConfig();
        return true;
    }
  • 手机存放的位置-system/etc/powercontroller.xml
Z51:/ # find system -name "powercontroller.xml"
find system -name "powercontroller.xml"
system/etc/powercontroller.xml
  • 系统源码存放的位置
root@69959bbb90c6:/home/suhuazhi/8.1/op54# find vendor/sprd/ -name "powercontroller.xml"
vendor/sprd/platform/frameworks/native/data/etc/powercontroller.xml

内容

扫描二维码关注公众号,回复: 3672561 查看本文章
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<powercontroller>
<applist_in_ultrasave>
<appname>com.android.dialer/.app.DialtactsActivity#0</appname>
<appname>com.android.messaging/.ui.conversationlist.ConversationListActivity#1</appname>
<appname>com.android.contacts/.activities.PeopleActivity#2</appname>
</applist_in_ultrasave>
</powercontroller>

11. 智能省电模式-PowerController.handlePowerSaveModeChanged

    // handle the power save mode changed
    private void handlePowerSaveModeChanged(int newMode) {

        if (mInitFinished && mPowerSaveMode == newMode) return;

        // notify helpers power save mode changing
        // 所有注册 onPowerSaveModeChanging 接口通知变化
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanging(newMode);
        }

        // 退出之前的状态
        exitPowerSaveMode(mPowerSaveMode);
        
        enterPowerSaveMode(newMode);
        if (mPowerSaveMode != newMode) {
            Slog.e(TAG, "Something error!! mPowerSaveMode change fail!!old mode:" + mPowerSaveMode
                + " new mode:" + newMode);
        }

        // notify helpers power save mode changed
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanged(newMode);
        }

    }

11.1 PowerController.handlePowerSaveModeChanged.onPowerSaveModeChanging

  • vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerController.java

消息通知监听 onPowerSaveModeChanging 改变对应的省电状态

        // notify helpers power save mode changing
        // 所有注册 onPowerSaveModeChanging 接口通知变化
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanging(newMode);
        }

11.2 PowerController.handlePowerSaveModeChanged.exitForceIdleIfNeed

    private void exitPowerSaveMode(int oldMode) {
        switch (oldMode) {
            case PowerManagerEx.MODE_LOWPOWER:
            case PowerManagerEx.MODE_ULTRASAVING:
            case PowerManagerEx.MODE_INVALID: // default mode is MODE_INVALID, so it must be the first time coming here. We should do reset lowpower mode
                mPowerManager.setPowerSaveMode(false);
                exitForceIdleIfNeed();
                break;
            case PowerManagerEx.MODE_PERFORMANCE:
                break;
            // 假如当前不是doze模式,则判断是否需要强制进入doze模式
            case PowerManagerEx.MODE_SMART:
                 if (!mDozeEnabled) {
                    exitForceIdleIfNeed();
                 }
                break;
            case PowerManagerEx.MODE_POWERSAVING:
                break;
        }
    }
    
    private void exitForceIdleIfNeed() {
        if (mForceIdle) {
            if (mLocalDeviceIdleController != null)
                mLocalDeviceIdleController.forceDoze(false, true);
            mForceIdle = false;
        }
    }

11.3 PowerController.handlePowerSaveModeChanged.enterPowerSaveMode

进入智能省电模式

    private void enterPowerSaveMode(int newMode) {
        Slog.d(TAG, "enterPowerSaveMode(), " + newMode);
        mPrePowerSaveMode = mPowerSaveMode;
        mPowerSaveMode = newMode;

        notifyPowerModeListeners(newMode);

        // send broadcast
        postModeChangeBroadcast(newMode, mPrePowerSaveMode);

        switch (newMode) {
            case PowerManagerEx.MODE_ULTRASAVING:
                try {
                    ActivityManager.getService().resizeStack(ActivityManager.StackId.DOCKED_STACK_ID, null, true, true, false, -1);
                } catch (RemoteException e) {
                    Slog.w(TAG, "Failed to resize stack: " + e);
                }
            case PowerManagerEx.MODE_LOWPOWER:
                mPowerManager.setPowerSaveMode(true);
                break;
            case PowerManagerEx.MODE_PERFORMANCE:
                break;
            case PowerManagerEx.MODE_SMART:
                break;
            case PowerManagerEx.MODE_POWERSAVING:
                break;
        }

        // if lowpower mode, aosp code will call powerHint() interface
        if (PowerManagerEx.MODE_LOWPOWER != mPowerSaveMode) {
            mLocalPowerManager.powerHint(getPowerHintMode(mPowerSaveMode),  1);
        }

    }
    
    private int getPowerHintMode(int powerSaveMode) {
        switch (powerSaveMode) {
            case PowerManagerEx.MODE_LOWPOWER:
                return PowerManagerInternal.POWER_HINT_VENDOR_MODE_LOW_POWER;
            case PowerManagerEx.MODE_PERFORMANCE:
                return PowerManagerInternal.POWER_HINT_VENDOR_MODE_PERFORMANCE;
            case PowerManagerEx.MODE_SMART:
                // 正常模式
                return PowerManagerInternal.POWER_HINT_VENDOR_MODE_NORMAL;
            case PowerManagerEx.MODE_POWERSAVING:
                return PowerManagerInternal.POWER_HINT_VENDOR_MODE_POWER_SAVE;
            case PowerManagerEx.MODE_ULTRASAVING:
                return PowerManagerInternal.POWER_HINT_VENDOR_MODE_ULTRA_POWER_SAVE;
        }
        return PowerManagerInternal.POWER_HINT_VENDOR_MODE_NORMAL;
    }

11.4 PowerController.handlePowerSaveModeChanged.onPowerSaveModeChanged

        // notify helpers power save mode changed
        for (int i = 0; i < mHelpers.size(); i++) {
            PowerSaveHelper helper = mHelpers.get(i);
            helper.onPowerSaveModeChanged(newMode);
        }

猜你喜欢

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