拉萨市网站建设_网站建设公司_导航菜单_seo优化
2026/1/3 16:19:50 网站建设 项目流程

View Post

【Android】应用电池使用情况(App battery usage)逻辑简要分析

前言

简介

在 "Settings -> App info -> App battery usage" 界面,可以设置应用电池使用情况,通常有以下三种设置选项:

  1. 不限制应用电池使用
  2. 电池优化
  3. 限制应用电池使用

正文

定位到\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 + !allowListedfinal 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);
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询