3 展訊Sprd設定-電池-onPowerSaveModeChanging介面
阿新 • • 發佈:2018-11-21
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 方法