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

RomanLin

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

公告

View Post

【Android】电池统计机制和api

前言

在Android framework中,BatteryStatsHelper.java 是在 Android 5(API 23)时引入的用于电池统计的类,在 Android 8(API 26)以后改进,在 Android 12(API 31)以后引入更高效的电池统计接口 BatteryUsageStats.java 用于替代 BatteryStatsHelper.java 的部分功能,在 Android 13(API 32)之后正式废弃使用接口 BatteryStatsHelper.java,即 BatteryStatsHelper.java 只能在 Android 5(API 23)~Android 12(API 31)使用,而 BatteryUsageStats.java 只能在 Android 12(API 31)及之后使用。

BatteryUsageStats 更侧重于标准化数据输出,而 BatteryStatsHelper 提供更多底层细节(如唤醒锁统计)。

正文

权限模型

想要使用 BatteryStatsHelper.java,需要在 AndroidMenifest.xml 中声明以下权限:

<uses-permission android:name="android.permission.BATTERY_STATS" tools:ignore="ProtectedPermissions" />

想要使用 BatteryUsageStats.java,需要在 AndroidMenifest.xml 中声明以下权限:

<uses-permission android:name="android.permission.BATTERY_PREDICTION" />
<!-- 如果需要包名信息还需要 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" 
    tools:ignore="ProtectedPermissions" />

替代方案

旧版 BatteryStatsHelper.java 新版 BatteryUsageStats.java 说明
通过 getUsageList() 获取耗电项 使用 BatteryUsageStats.getBatteryConsumers() 新版返回 List,数据更结构化(区分应用/硬件)。

查询指定应用的电池消耗情况

BatteryStatsHelper.java

// 加载自上次充电以来的数据(STATS_SINCE_CHARGED)
mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, mUserManager.getUserProfiles());

// getUsageList() 返回所有应用的耗电项(BatterySipper),通过 UID 匹配目标应用。
List<BatterySipper> usageList = mBatteryStatsHelper.getUsageList();
for (BatterySipper sipper : usageList) {
    if (sipper.getUid() == packageInfo.applicationInfo.uid) {
        /**
        * sipper.totalPowerMah:该应用的总耗电量(毫安时)。
        * getTotalPower():设备总耗电量。
        * dischargeAmount:电池放电量(单位可能为百分比或电量值)。
        * 最终计算 percentOfMax 表示该应用耗电占比。
        */
        int dischargeAmount = mBatteryStatsHelper.getStats().getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED);// 电池放电量
        final int percentOfMax = (int) ((sipper.totalPowerMah) / mBatteryStatsHelper.getTotalPower() * dischargeAmount + .5f);// 应用耗电比
        apppower = sipper.totalPowerMah;// 实际耗电量
    }
}

BatteryUsageStats.java

// 初始化 BatteryStatsManager
BatteryStatsManager batteryStatsManager = context.getSystemService(BatteryStatsManager.class);

// 获取电池使用统计(自上次充电以来)
BatteryUsageStats usageStats = batteryStatsManager.getBatteryUsageStats(BatteryUsageStats.STATS_SINCE_LAST_CHARGE);

// 获取所有应用的电池消耗数据
List<BatteryConsumer> consumers = usageStats.getConsumers(BatteryUsageStats.CONSUMER_TYPE_APPS);

// 遍历匹配目标 UID
for (BatteryConsumer consumer : consumers) {
    if (consumer.getUid() == packageInfo.applicationInfo.uid) {
        // 获取该应用的总耗电量(毫安时)
        double appPowerMah = consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_ANY);
        
        // 计算占总耗电的百分比
        double totalPowerMah = usageStats.getConsumedPower();
        double percentOfMax = (appPowerMah / totalPowerMah) * 100;
        
        // 记录结果
        apppower = appPowerMah;
        break;
    }
}

posted on 2025-06-27 13:53  RomanLin  阅读(88)  评论(0)    收藏  举报

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