3 展讯Sprd设置-电池-onPowerSaveModeChanging接口
0. 前言
上接展讯Sprd设置-电池-setPowerSaveMode
源码走读的开始位置
- vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerController.java
1. PowerController.handlePowerSaveModeChanged
package com.android.server.power;
public class PowerController //extends IPowerController.Stub
private List<PowerSaveHelper> mHelpers;
// handle the power save mode changed
private void handlePowerSaveModeChanged(int newMode) {
if (mInitFinished && mPowerSaveMode == newMode) return;
// notify helpers power save mode changing
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);
}
}
2. PowerSaveHelper的事件监听器
- vendor/sprd/platform/frameworks/base/services/core/java/com/android/server/power/PowerSaveHelper.java
下述中,8.1代码中只有 BackgroundCleanHelper.updateLauncherAppEnabledSettings 有对应监听事件下的逻辑动作
// create helpers
private void createPowerSaveHelpers() {
Slog.d(TAG, "Begin create helpers ");
mPowerGuruHelper = new PowerGuruHelper(mContext, mActivityManager, msgHandler);
mAppIdleHelper = new AppIdleHelper(mContext, mActivityManager, msgHandler);
mWakelockConstraintHelper = new WakelockConstraintHelper(mContext, mActivityManager, msgHandler);
mBackgroundCleanHelper = new BackgroundCleanHelper(mContext, mActivityManager, msgHandler);
mGpsConstraintHelper = new GpsConstraintHelper(mContext, mActivityManager, msgHandler);
mHelpers = new ArrayList<PowerSaveHelper>();
mHelpers.add(mPowerGuruHelper);
mHelpers.add(mAppIdleHelper);
mHelpers.add(mWakelockConstraintHelper);
mHelpers.add(mBackgroundCleanHelper);
mHelpers.add(mGpsConstraintHelper);
}
2.1 PowerSaveHelper.onPowerSaveModeChanging
package com.android.server.power;
abstract class PowerSaveHelper {
void onPowerSaveModeChanging(int newMode) {
}
2.2 PowerSaveHelpers -> PowerGuruHelper
package com.android.server.power;
// Class PowerGuruHelper to make decision of What apps should be put
// into the PowerGuru Constrained App List
public class PowerGuruHelper extends PowerSaveHelper{
// 没有实现 onPowerSaveModeChanging 方法
2.3 PowerSaveHelpers -> AppIdleHelper
package com.android.server.power;
// Class AppIdleHelper to make decision of What apps should be put
// into AppIdle state
public class AppIdleHelper extends PowerSaveHelper{
// 没有实现 onPowerSaveModeChanging 方法
2.4 PowerSaveHelpers -> WakelockConstraintHelper
package com.android.server.power;
// Class WakeLockConstrainHelper to make decision of What apps should be put
// into a wake lock constrained list
public class WakelockConstraintHelper extends PowerSaveHelper {
// 没有实现 onPowerSaveModeChanging 方法
2.5 PowerSaveHelpers -> BackgroundCleanHelper
package com.android.server.power;
public class BackgroundCleanHelper extends PowerSaveHelper {
@Override
void onPowerSaveModeChanging(int newMode) {
mNextPowerSaveMode = newMode;
if (PowerManagerEx.MODE_ULTRASAVING == newMode) {
try {
mRunAppList = mActivityManager.getRunningAppProcesses();
} catch (Exception e) {}
}
updateLauncherAppEnabledSettings(newMode);
}
2.5.1 BackgroundCleanHelper.updateLauncherAppEnabledSettings
在这个事件中,主要完成 loadLauncherApps() 和 setApplicationEnabledSetting 的操作,其他为一些状态位。大体逻辑是通过 loadLauncherApps得到可被设置为省电操作的应用列表,列表主要是规避一些白名单,过滤后的列表就可以通过 setApplicationEnabledSetting 进行组件或者应用级进行禁用和启用的省电操作了。
// disable/enable appropriate launcher app for saving mode
private void updateLauncherAppEnabledSettings(int newMode) {
// if mLauncherAppList is empty and mBootCompleted is false, then try to load launcher app first
if (!mBootCompleted && mLauncherAppList.size() == 0
&& PowerManagerEx.MODE_ULTRASAVING == newMode) {
Slog.d(TAG, "updateLauncherAppEnabledSettings: try to load launcher apps first!");
loadLauncherApps();
}
int state = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
boolean changed = false;
int stateOfSaveLauncher = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
try {
stateOfSaveLauncher = AppGlobals.getPackageManager()
.getApplicationEnabledSetting("com.sprd.powersavemodelauncher", mCurrentUserId);
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
// new mode is not ultra saving mode, then disable com.sprd.powersavemodelauncher
if (PowerManagerEx.MODE_ULTRASAVING != newMode
&& stateOfSaveLauncher != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
Slog.d(TAG, "updateLauncherAppEnabledSettings disable powersavemodelauncher");
try {
AppGlobals.getPackageManager().setApplicationEnabledSetting("com.sprd.powersavemodelauncher",
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0, mCurrentUserId, mContext.getOpPackageName());
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
} else if (PowerManagerEx.MODE_ULTRASAVING == newMode
&& stateOfSaveLauncher != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
Slog.d(TAG, "updateLauncherAppEnabledSettings enable powersavemodelauncher");
// enable com.sprd.powersavemodelauncher first
try {
AppGlobals.getPackageManager().setApplicationEnabledSetting("com.sprd.powersavemodelauncher",
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0, mCurrentUserId, mContext.getOpPackageName());
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
}
if ((PowerManagerEx.MODE_ULTRASAVING == mPowerSaveMode
&& PowerManagerEx.MODE_ULTRASAVING != newMode)
|| (DEFAULT_POWER_MODE == mPowerSaveMode
&& newMode == mPowerSaveMode)) {
// exit ultra saving mode
state = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
changed =true;
} else if (PowerManagerEx.MODE_ULTRASAVING != mPowerSaveMode
&& PowerManagerEx.MODE_ULTRASAVING == newMode) {
// enter ultra saving mode
state = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
changed = true;
}
if (changed) {
int enabledCount = 0;
ArrayList<String> launcherAppList = getLauncherList();
for (int i=0;i<launcherAppList.size();i++) {
String name = launcherAppList.get(i);
if ("com.sprd.powersavemodelauncher".equals(name)) continue;
if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state
&& !mPowerControllerInternal.isDisabledLauncherApp(name)) {
if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name
+ " NOT disable by PowerContoller, DON'T enable it here!");
continue;
}
if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {
int enabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
try {
enabled = getApplicationEnabledSetting(name, mCurrentUserId);
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
boolean packageDisabled = (enabled != PackageManager.COMPONENT_ENABLED_STATE_ENABLED
&& enabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
if (packageDisabled) {
if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name
+ " is disabled by other app, DON'T disable it here!");
continue;
}
String packageName = name;
if (USE_COMPONENT)
packageName = ComponentName.unflattenFromString(name).getPackageName();
if (ArrayUtils.contains(mExceptionLauncherAppList, packageName)) {
if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings:" + packageName
+ " NOT a launcher app, DON'T disable it here!");
continue;
}
}
//Slog.d(TAG, "updateLauncherAppEnabledSettings:" + name + " state:" + state
// + " newMode:" + newMode);
try {
//SPRD: modify for Bug 886084 BEG
setApplicationEnabledSetting(name, state, PackageManager.DONT_KILL_APP,
mCurrentUserId, mContext.getOpPackageName());
//SPRD: modify for Bug 886084 END
if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) enabledCount++;
else if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {
mPowerControllerInternal.addDisabledLauncherAppWithoutSave(name);
}
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
}
if (enabledCount == 0
&& PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) {
Slog.d(TAG, "updateLauncherAppEnabledSettings: NOT launcher app is enabled.ENABLE default!");
// using disable component instead of disable the whole app
// when enter/exit ultra-saving mode. See bug#819868
if (USE_COMPONENT) {
for(String s : mDefaultLauncherAppComponentList) {
try {
ComponentName component = ComponentName.unflattenFromString(s);
AppGlobals.getPackageManager().setComponentEnabledSetting(component, state, 0,
mCurrentUserId);
if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings: enable " + component + " state:" + state
+ " newMode:" + newMode);
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
}
} else {
for(String s : mDefaultLauncherAppList) {
try {
AppGlobals.getPackageManager().setApplicationEnabledSetting(s, state, 0,
mCurrentUserId, mContext.getOpPackageName());
if (DEBUG) Slog.d(TAG, "updateLauncherAppEnabledSettings: enable " + s + " state:" + state
+ " newMode:" + newMode);
} catch (Exception e) {
Slog.d(TAG, "updateLauncherAppEnabledSettings Exception:" + e);
}
}
}
}
// clear the disabled launcher app list
if (PackageManager.COMPONENT_ENABLED_STATE_DEFAULT == state) {
mPowerControllerInternal.updateDisabledLauncherAppList(null);
}
}
}
上述核心接口是 setApplicationEnabledSetting ,禁用应用和禁用组件的方式
// using disable component instead of disable the whole app
// when enter/exit ultra-saving mode. See bug#819868
// --> START
private void setApplicationEnabledSetting(String appPackageName,
int newState, int flags, int userId, String callingPackage) {
try {
if (USE_COMPONENT) {
ComponentName component = ComponentName.unflattenFromString(appPackageName);
AppGlobals.getPackageManager().setComponentEnabledSetting(component, newState, flags, userId);
if (DEBUG) Slog.d(TAG, "setApplicationEnabledSetting: newState:" + newState
+ " component:" + component);
} else {
AppGlobals.getPackageManager().setApplicationEnabledSetting(appPackageName,
newState, flags, userId, callingPackage);
}
} catch (Exception e) {
Slog.d(TAG, "setApplicationEnabledSetting Exception:" + e);
}
}
2.5.2 BackgroundCleanHelper.loadLauncherApps
loadLauncherApps 函数主要实现 LauncherAppList.add 和 LauncherAppComponentList.add 的数据建立
private void loadLauncherApps() {
try {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
final List<UserInfo> users = mUserManager.getUsers();
for (int ui = users.size() - 1; ui >= 0; ui--) {
UserInfo user = users.get(ui);
if (DEBUG) Slog.d(TAG, "- loadLauncherApps() for user: " + user.id);
List<ResolveInfo> resolves =
mContext.getPackageManager().queryIntentActivitiesAsUser(intent, PackageManager.MATCH_DISABLED_COMPONENTS, user.id);
// Look for the original activity in the list...
final int N = resolves != null ? resolves.size() : 0;
for (int i=0; i<N; i++) {
final ResolveInfo candidate = resolves.get(i);
final ActivityInfo info = candidate.activityInfo;
if (info != null && info.packageName != null
&& !mLauncherAppList.contains(info.packageName)) {
mLauncherAppList.add(info.packageName);
}
Slog.d(TAG, "homeApp:" + info.packageName);
// using disable component instead of disable the whole app
// when enter/exit ultra-saving mode. See bug#819868
if (USE_COMPONENT) {
if (info != null && info.packageName != null
&& "com.sprd.powersavemodelauncher".equals(info.packageName)) {
if (!mLauncherAppComponentList.contains(info.packageName)) {
mLauncherAppComponentList.add(info.packageName);
}
Slog.d(TAG, "homeComponent:" + info.packageName);
continue;
}
if (info != null && info.packageName != null) {
if (ArrayUtils.contains(mExceptionLauncherAppList, info.packageName)) {
if (DEBUG) Slog.d(TAG, "loadLauncherApps:" + info.packageName
+ " NOT a launcher app!");
continue;
}
ComponentName cn = new ComponentName(info.packageName, info.name);
String componetName = cn.flattenToShortString();
if (!mLauncherAppComponentList.contains(componetName)) {
mLauncherAppComponentList.add(componetName);
}
Slog.d(TAG, "homeComponent:" + componetName);
}
}
}
// using disable component instead of disable the whole app
// when enter/exit ultra-saving mode. See bug#819868
if (USE_COMPONENT) {
loadLauncherComponent(user.id);
}
}
/*check if contains the default launcher*/
for(String s : mDefaultLauncherAppList) {
if(!mLauncherAppList.contains(s)) {
mLauncherAppList.add(s);
}
}
// using disable component instead of disable the whole app
// when enter/exit ultra-saving mode. See bug#819868
if (USE_COMPONENT) {
/*check if contains the default launcher*/
for(String s : mDefaultLauncherAppComponentList) {
if(!mLauncherAppComponentList.contains(s)) {
mLauncherAppComponentList.add(s);
}
}
}
ResolveInfo resolvedHome = mContext.getPackageManager().resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY);
if (resolvedHome != null) {
mCurrentHomeLauncher = resolvedHome.activityInfo.packageName;
}
} catch (Exception e) {
Slog.d(TAG, "e:" + e);
}
//disbleLauncherAppIfNeed();
if (DEBUG) {
Slog.d(TAG, "mCurrentHomeLauncher:" + mCurrentHomeLauncher);
Slog.d(TAG, "mLauncherAppList: " + mLauncherAppList.size());
for (int i=0;i<mLauncherAppList.size();i++) {
Slog.d(TAG, "App:" + mLauncherAppList.get(i));
}
Slog.d(TAG, "mLauncherAppComponentList: " + mLauncherAppComponentList.size());
for (int i=0;i<mLauncherAppComponentList.size();i++) {
Slog.d(TAG, "Component:" + mLauncherAppComponentList.get(i));
}
}
}
2.5.3 BackgroundCleanHelper.loadLauncherComponent
其中BackgroundCleanHelper.loadLauncherComponent 和 BackgroundCleanHelper.loadLauncherApps 存在重复的代码,代码的目的还是为了添加LauncherAppComponentList,没有其他实质代码。有点像双重检查,个别代码感觉很重复
private void loadLauncherComponent(int userId) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
for (int i=0;i<mLauncherAppList.size();i++) {
String packageName = mLauncherAppList.get(i);
if (ArrayUtils.contains(mExceptionLauncherAppList, packageName)) {
if (DEBUG) Slog.d(TAG, "loadLauncherComponent:" + packageName
+ " NOT a launcher app!");
continue;
}
intent.setPackage(packageName);
List<ResolveInfo> resolves =
mContext.getPackageManager().queryIntentActivitiesAsUser(intent, PackageManager.MATCH_DISABLED_COMPONENTS, userId);
// Look for the original activity in the list...
final int SIZE = resolves != null ? resolves.size() : 0;
for (int n=0; n<SIZE; n++) {
final ResolveInfo candidate = resolves.get(n);
final ActivityInfo info = candidate.activityInfo;
if (info != null && info.packageName != null
&& "com.sprd.powersavemodelauncher".equals(info.packageName)) {
if (!mLauncherAppComponentList.contains(info.packageName)) {
mLauncherAppComponentList.add(info.packageName);
}
Slog.d(TAG, "homeLauncherComponent:" + info.packageName);
continue;
}
if (info != null && info.packageName != null) {
ComponentName cn = new ComponentName(info.packageName, info.name);
String componetName = cn.flattenToShortString();
if (!mLauncherAppComponentList.contains(componetName)) {
mLauncherAppComponentList.add(componetName);
}
Slog.d(TAG, "homeLauncherComponent:" + componetName);
}
}
}
}
2.6 PowerSaveHelpers -> GpsConstraintHelper
package com.android.server.power;
public class GpsConstraintHelper extends PowerSaveHelper {
// 没有实现 onPowerSaveModeChanging 方法