1. 接口传递逻辑
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
内容
<?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);
}