• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

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 + !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);
}

posted on 2026-01-03 16:18  RomanLin  阅读(4)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3