【Android】应用电池使用情况(App battery usage)逻辑简要分析
前言
简介
在 "Settings -> App info -> App battery usage" 界面,可以设置应用电池使用情况,通常有以下三种设置选项:
- 不限制应用电池使用
- 电池优化
- 限制应用电池使用
正文
定位到\vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\fuelgauge\BatteryOptimizeUtils.java:
// 判断是否为不受限制的应用
static boolean isSystemOrDefaultApp(
Context context,
PowerAllowlistBackend powerAllowlistBackend,
String packageName,
int uid) {
return powerAllowlistBackend.isSysAllowlisted(packageName)
// Always forced unrestricted apps are one type of system important apps.
|| getForceBatteryUnrestrictModeList(context).contains(packageName)// 通过属性设置默认配置名单
|| powerAllowlistBackend.isDefaultActiveApp(packageName, uid);
}
// 获取强制开启“电池优化”的应用名单
static List<String> getForceBatteryOptimizeModeList(Context context) {
if (sBatteryOptimizeModeList == null) {
sBatteryOptimizeModeList =
Arrays.asList(
context.getResources()
.getStringArray(
R.array.config_force_battery_optimize_mode_apps));// 通过该配置项进行静态修改
// Begin: 通过以下代码,可以修改系统属性 persist.sys.customize.battery.optimize_apps 的值动态定制“电池优化”的应用名单
String extraAppsProp = SystemProperties.get("persist.sys.customize.battery.optimize_apps", "");
sBatteryOptimizeModeList = Stream.concat(
sBatteryOptimizeModeList.stream(),
Arrays.stream(extraAppsProp.split(","))
.filter(app -> !TextUtils.isEmpty(app.trim()))
.map(String::trim)
).collect(Collectors.toList());
// End
}
return sBatteryOptimizeModeList;
}
// 获取强制开启“电池不受限”的应用名单
static List<String> getForceBatteryUnrestrictModeList(Context context) {
if (sBatteryUnrestrictModeList == null) {
sBatteryUnrestrictModeList =
Arrays.asList(
context.getResources()
.getStringArray(
R.array.config_force_battery_unrestrict_mode_apps));//通过该配置项可以进行静态修改
// Begin: 通过以下代码,可以通过修改系统属性 persist.sys.customize.battery.unrestricted_apps 的值动态定制“电池不受限”的应用名单
String extraAppsProp = SystemProperties.get("persist.sys.customize.battery.unrestricted_apps", "");
sBatteryUnrestrictModeList = Stream.concat(
sBatteryUnrestrictModeList.stream(),
Arrays.stream(extraAppsProp.split(","))
.filter(app -> !TextUtils.isEmpty(app.trim()))
.map(String::trim)
).collect(Collectors.toList());
// End
}
return sBatteryUnrestrictModeList;
}
// 设置应用属于哪种模式
private static void setAppUsageStateInternal(
Context context,
@OptimizationMode int mode,
int uid,
String packageName,
BatteryUtils batteryUtils,
PowerAllowlistBackend powerAllowlistBackend,
Action action) {
if (mode == MODE_UNKNOWN) {
Log.d(TAG, "set unknown app optimization mode.");
return;
}
// MODE_RESTRICTED = AppOpsManager.MODE_IGNORED + !allowListed
// MODE_UNRESTRICTED = AppOpsManager.MODE_ALLOWED + allowListed
// MODE_OPTIMIZED = AppOpsManager.MODE_ALLOWED + !allowListed
final int appOpsManagerMode =
mode == MODE_RESTRICTED ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED;
final boolean allowListed = mode == MODE_UNRESTRICTED;
setAppOptimizationModeInternal(
context,
appOpsManagerMode,
allowListed,
uid,
packageName,
batteryUtils,
powerAllowlistBackend,
action);
}
浙公网安备 33010602011771号