android app耗电分析方法

      这是一篇讲述应用耗电的文章,围绕 Android 电量采集机制及第二代 Battery Historian 分析工具讲述。文从数据采集、导出、环境搭建、解读报告的角度出发,从细节讲解整个流程。和大谈概念的文章不同,这里将进行实际操作及分析。

写作动机来源于最近的工作需求,但分析过程中发现网上资料较为匮乏。在此执笔写作,以便日后回顾,亦作为分享的机会。

0x01 电量统计模块概述

Android 从两个层面统计电量的消耗,分别为 软件排行榜硬件排行榜。它们各有自己的耗电榜单,软件排行榜为机器中每个 App 的耗电榜单,硬件排行榜则为各个硬件的耗电榜单。这两个排行榜的统计是互为独立,互不干扰的。

** 此处主要讲述软件层面的统计。**

具体的说,耗电信息在 设置 -> 电量 中能够非常直观的看到。注意,Android 所有功耗统计都是通过代码估算,没有集成电路参与汇报。准确度取决于厂商 ROM 所提供的 power_profile.xml 文件。由于不同厂商 power_profile.xml 准确度及源码有差异,因此不同手机、不同版本的数据可能有较大差异。

power_profile.xml 直接影响统计的准确度,并且此文件无法通过应用修改。再次强调,Android 耗电估算没有硬件的参与,全靠代码估算。

power_profile.xml文件位于源码下的 /framework/base/core/res/res/xml/power_profile.xml,部分内容展示如下:

  <item name="radio.scanning">0.1</item> <!-- cellular radio scanning for signal, ~10mA --><item name="gps.on">0.1</item> <!-- ~50mA --><!-- Current consumed by the radio at different signal strengths, when paging --><array name="radio.on"> <!-- Strength 0 to BINS-1 --><value>0.2</value> <!-- ~2mA --><value>0.1</value> <!-- ~1mA --></array></array><!-- Different CPU speeds as reported in/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state --><array name="cpu.speeds"><value>400000</value> <!-- 400 MHz CPU speed --></array><!-- Current when CPU is idle --><item name="cpu.idle">0.1</item><!-- Current at each CPU speed, as per 'cpu.speeds' --><array name="cpu.active"><value>0.1</value>  <!-- ~100mA --></array><array name="wifi.batchedscan"> <!-- mA --><value>.0002</value> <!-- 1-8/hr --><value>.002</value>  <!-- 9-64/hr --><value>.02</value>   <!-- 65-512/hr --><value>.2</value>    <!-- 513-4,096/hr --><value>2</value>    <!-- 4097-/hr --></array>

这就是在硬件层面统计时,直接参与运算的参数。无论是软件耗电统计还是硬件耗电统计,都通过 BatteryStatsHelper 来进行汇总。BatteryStatsHelper位于/framework/base/core/java/com/andorid/internal/os/BatteryStatsHelper.java下。

0x02 软件耗电统计

BatteryStatsHelper.java 中,有这么一个方法:

private void processAppUsage(SparseArray<UserHandle> asUsers) {final boolean forAllUsers = (asUsers.get(UserHandle.USER_ALL) != null);mStatsPeriod = mTypeBatteryRealtime;BatterySipper osSipper = null;final SparseArray<? extends Uid> uidStats = mStats.getUidStats();final int NU = uidStats.size();for (int iu = 0; iu < NU; iu++) {final Uid u = uidStats.valueAt(iu);final BatterySipper app = new BatterySipper(BatterySipper.DrainType.APP, u, 0);mCpuPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mWakelockPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mMobileRadioPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mWifiPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mBluetoothPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mSensorPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mCameraPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);mFlashlightPowerCalculator.calculateApp(app, u, mRawRealtime, mRawUptime, mStatsType);final double totalPower = app.sumPower();if (DEBUG && totalPower != 0) {Log.d(TAG, String.format("UID %d: total power=%s", u.getUid(),makemAh(totalPower)));}}... // code}

processAppUsage()方法中,一个应用的总功耗在这里体现出来了:

  • cpu
  • Wakelock(保持唤醒锁)
  • 无线电(2G/3G/4G)
  • WIFI
  • 蓝牙
  • 传感器
  • 相机
  • 闪光灯

这些数据,将决定着你的应用在耗电排行榜中的位置,以及是否给予用户警告高耗电。这些警告对于应用来说可能是致命的,用户可能因此而卸载应用。

应用总功耗是上述八个统计值的和。这八个统计器同继承自 PowerCalculator.java

具体来说,这八个耗电计算器的算法分别如下:

耗电统计概述就如上所述。总的来说并不复杂,通过聚合八种不同方式的消耗,来得出总的耗电量,并给予用户展示。

0x03 耗电数据的采集

数据的采集是机器单方面的行为,不需要依赖第三方的辅助,因为这是 Android 系统级的功能。但在这之前,需要做一些准备。

请事先打开开发者模式。USB 接入计算机。在终端中执行:

adb shell dumpsys batterystats --enable full-wake-history

默认情况下,唤醒(wake)数据是不会被采集的,因此我们需要将其启用。如果采集的不是全量 wake up 数据,在分析阶段则不能很好的观测数据。

随后终端执行:

adb shell dumpsys batterystats --reset

此命令会清空历史采集的信息。

最后,拔出 USB。
最后,拔出 USB。
最后,拔出 USB。

重要的事说三遍!

现在,耗电统计已经开始了。没错,耗电统计就是一直开着的,并且无法关闭:这是一个系统级别的功能。

为什么要拔出 USB?因为如果你一直插着 USB ,如果电充满了,你的数据会被清空的。Batterystats 只会记录最后一次充满电后的记录,因此强烈建议先把电充满,完成以上操作后,拔出 USB 电源。

接下来,就像日常使用手机一样,操作你想要统计的应用。耗电记录器会在后台统计整台机子所有的耗电情况。没错,不需要事先指定目标 App ,所有 App 都会被统计。这也说明,任何人都能够统计任何已安装的应用。因此,除了统计自家 App ,也能用于统计竞品。

当你觉得操作得差不多了,连接到 USB,终端执行:

adb bugreport > bugreport.txt

bugreport.txt 就是记载着整台手机耗电信息的源数据。

最后终端执行:

adb shell dumpsys batterystats --disable full-wake-history

不要忘了关闭全量记录唤醒。保持开启会造成性能问题,除非在电量收集阶段,否则建议保持关闭。

接下来,搭建分析环境:Battery Historian。

0x04 搭建 Battery Historian & 上传 bugreport

Battery Historian ,是谷歌出品的耗电分析器。通过 Battery Historian,可将导出的 bugreport 文件可视化。在第一代的 Battery Historian 中,google 使用了 python 作为数据解析工具。拿到 bugreport 文件后,通过终端执行 python 来生成可视化的 html 文件。这种方法使用起来较为麻烦,而且无法部署到服务器。因此在第二代 Battery Historian,google 选择了使用 docker 容器。现在完全不推荐使用第一代 Battery Historian,已经许久没有维护了,而且功能过于简陋。

我在此演示 Mac 环境的搭建,其他操作系统大同小异,可参考 Battery Historian 官方教程。

首先下载 Docker 并安装。

启动 Docker。点击上方状态栏 Docker 图标,如图所示 "Docker is running" 则表示启动成功。

docker

下一步,启动终端,执行:

docker run -p 9998:9999 gcr.io/android-battery-historian:2.1 --port 9999

如果您未曾运行过此 Docker 镜像,将会自动下载此镜像并安装。9998 端口指的是映射到你的本地端口,这意味着,当镜像执行后,可通过127.0.0.1:9998访问此镜像。你可以自行更改此端口。等待镜像下载完成,再次执行上一条命令。如果成功,将输出如下信息:

➜  ~ docker run -p 9998:9999 gcr.io/android-battery-historian:2.1 --port 9999
2017/06/04 10:24:13 Listening on port:  9999

镜像的9999端口已被监听,并映射到实体机器的9998端口。分析平台部署完成了,开始上传 bugreport 文件进行分析。

现在,访问127.0.0.1:9998,成功打开 Battery Historian 分析平台:

除了单一上传 bugreport 文件外,还支持更多的分析文件上传。此外,还能对比两份bugreport文件。这对比功能简直是神器。这里就不展开述说了,直接上传 bugreport.txt

上传后效果如下:

现在一起来看看怎么使用 Battery Historian 分析 bugreport文件。

0x05 鸟瞰 Battery Historian

再次强调,bugreport 文件包含了整台手机运行状况,并非单一某个 app,因此查看图表时要特别注意,数据所展示的是当前选中的 app 数据还是全部 app 的叠加

现在,我用微信作为分析目标。选中 com.tencent.mm。

现在,这张图表第一个坑爹的地方出现了。选中目标包名前后,图标数据会有些不一样的地方。选中前:

选中后:

注意到加粗的 Top app , Activity Manager proc , JobScheduler 了吗?这几个数据在选中后,图表数据会变为仅有当前选中 app 的数据,而其他数据仍然是整台机子的全量数据。一不小心,还能坑你很多次。此处是初次使用 Battery Historian 需要特别注意的地方。用鼠标指向图标,可粗略地观察数据的变化。

数据分析分为三个 Tables,分别是 System Stats , History Stats , App Stats。System Stats 和 App Stats 是重点观测和分析对象。

System Stats 包含了机子整体概况,包括整台机子在这段期间消耗了多少电量,所有 app 使用 Wakelocks、JobScheduler、CPU、Wifi、传感器等等一切的所有情况。

接下来则是 App Stats,所有的优化都是为了此处的数据而努力。

0x06 读懂 App Stats

App Stats 所展示的都是所选定包名所产生的数据,不会受到外部因素的影响。

Misc Summary 部分概述了所选定 app 在收集阶段的活动概况:

如上所述,

  • 电量消耗占用了总消耗的3.94%;
  • 前台运行了 3 小时 34 分钟;
  • 震动了 8 次,共 225 毫秒;
  • CPU 用户态时间 22 分 33 秒;
  • Alarm 唤醒 40 次。

来看一个具体的数据:查看 App Stats 下的 Wakelocks 数据区域:

注意,显示为 WakerLock:xxxxxxx 是混淆导致。您自己的开发包不会存在此情况。

你还记不记得 App 的耗电排行榜是如何计算的?上面这些数据都会影响文章开头所提到的耗能计算公式。

举个例子,假如你一直持有一个 WakePowerLock,但你什么都没干 —— 这时候其实是不会产生真正耗电的,对吧。但因为你持有一个 Lock,公式就是这么算的:wakeLockTime * wakeLockPower。即使你啥也没干,Android 系统也认为你在耗电,这时候就很吃亏了。

再来看看 Alarm 唤醒(App Stats 下的 Wakeup alarm info):

查看你自家的 app,可能会惊讶的发现有如此之多不必要的唤醒。Wakeup Alarm 和 Scheduled Job 可能被某些厂商用于检测频繁后台唤醒,并向用户展示该信息。

最后,再来看看 Sensor Use 部分:

看看您自家的应用是否有过多的传感器调用?如非必要,能复用上一次的 GPS 数据吗?这些所有的资源消耗,都会被算入能耗当中。当您的 app 在耗电榜上屡次得冠,就离卸载不远了。


参考链接:https://www.jianshu.com/p/27ba2759b221
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android App 耗电的测试方法

这是一篇讲述应用耗电的文章&#xff0c;围绕 Android 电量采集机制及第二代Battery Historian分析工具讲述。文从数据采集、导出、环境搭建、解读报告的角度出发&#xff0c;从细节讲解整个流程。和大谈概念的文章不同&#xff0c;这里将进行实际操作及分析。 电量统计模块概…

一种Android应用耗电定位方案

背景 通常来说&#xff0c;app耗电相比于其他的性能问题&#xff08;Crash&#xff0c;Anr&#xff09;等&#xff0c;会受到比较少的关注&#xff0c;耗电通常是一个app隐藏的性能问题&#xff0c;同时又由于手机性能不同&#xff0c;使用时长不同&#xff0c;使用习惯不同&a…

如何降低android应用程序的耗电量

转自&#xff1a;http://www.apkbus.com/forum.php?modviewthread&tid5459&extrapage%3D3 如果手机&#xff08;移动设备&#xff09;没电了&#xff0c;你的程序还能运行吗&#xff1f; 哈哈&#xff0c;这是地球人都知道的问题&#xff0c;那么如何才能降低androi…

IOS耗电量测试(一)耗电量数据获取

转载&#xff1a;https://blog.csdn.net/redcard0/article/details/89030124 随着游戏越来越重度&#xff0c;游戏耗电太高造成游戏发烫的投诉量已经仅次于帧率&#xff0c;高于针对内存崩溃的投诉。优化的前提是耗电量数据可以度量&#xff0c;本文主要阐述耗电量数据如何获取…

APP专项测试之耗电量测试

一、耗电量测试分析 相对于PC端来说&#xff0c;移动设备的电池电量是非常有限的&#xff0c;保持持久的续航能力尤为重要。Android的很多特性都比较耗电&#xff08;如屏幕、GPS、sensor传感器、唤醒机制、CPU、连网等的使用&#xff09;&#xff0c;我们必须要慎重检查APP的…

如何测试Android APP的耗电量?

现在可以使用google提供的battery-historian来测试&#xff0c;适用条件&#xff1a;5.0及以上手机。 battery-historian链接&#xff1a;google/battery-historian android吧 所以的android都自带的功能 设置--->电池/电源管理/ MQC在兼容性测试、功能测试、稳定性测试中都…

app耗电量测试

目录 目录 1. 引言 2. 测试方法 2.1. 直接观察 2.2. 使用adb命令进行统计 3. 典型的耗电场景 3.1. 定位 3.2. 网络传输 3.3. 音视频播放 4. app电量分析工具 4.1. Batterystats 4.2. Battery Historian 5. 环境安装 5.1. adb命令 5.2. 安装go 5.3. 安装git 5.4…

盘点COVID-19新冠药物和疫苗研发进展

COVID-19是由严重急性呼吸系统综合症冠状病毒2&#xff08;SARS-CoV-2&#xff09;引起的一种传染病&#xff0c;这是一种单股正链RNAβ冠状病毒&#xff0c;它是Beta-CoV谱系B&#xff08; Sarbecovirus亚属&#xff09;。 COVID-19代表着全球健康威胁&#xff0c;并且是可能引…

药物临床试验数据递交FDA的规定

信息来源&#xff1a; https://www.fda.gov/industry/fda-data-standards-advisory-board/study-data-standards-resources STUDY DATA TECHNICAL CONFORMANCE GUIDE v4.9 (March 2022) (研究数据技术一致性指南) 仅提取该文档中的部分内容加以翻译&#xff0c;以下中文都是…

姜敬哲/孙燕妮/原丽红合作开发可用于病毒快速分类的工具PhaGCN2

南海水产研究所姜敬哲团队、香港城市大学孙燕妮团队、广东药科大学原丽红合作开发的可用于病毒快速分类生信工具 使用PhaGCN2对病毒基因组片段分类 Virus classification for viral genomic fragments using PhaGCN2 文章链接&#xff1a;https://www.researchsquare.com/artic…

多组学在药物机制解析和诊断标志物开发中的应用

链接&#xff1a;多组学在药物机制解析和诊断标志物开发中的应用_哔哩哔哩_bilibili 药物研发流程和多组学前沿技术 药物研发流程遇到的挑战 流程&#xff1a;新药的发现——临床前研究——临床研究 挑战&#xff1a; 诊断是否清晰、机制是否明确、靶点是否可靠、药物是否有…

药物研发早期预测细胞毒性的解决方案

药物从设计到上市的整个研究阶段&#xff0c;毒性通常是导致研发失败的最主要原因。即使上市以后还有许多药物由于出现研发阶段未能发现的毒性而被撤市或严格限制使用。因此&#xff0c;如何及时、准确、快速地评价药物毒性便成为药物开发中的一个重要问题。 在体外快速的、高…

针对新冠病毒,盛普始终坚持多靶标协同的防治病毒药物研发

全球范围内的新冠确诊人数仍旧在增加,“特效治疗药”依然没有找到。凛冬已至,更适于病毒传播的寒冷高湿天气已经笼罩了半个地球。在一片阴霾的疫情当中,“希望之光”开始浮现,新冠疫苗和单一靶标的小分子药物开始被世界各国政府应急准入市场。这些疫苗和小分子药物依靠海量…

3CLpro蛋白酶抑制剂,如何靠实力进入新冠病毒诊疗方案

3月15日&#xff0c;国家卫健委发布《新型冠状病毒肺炎诊疗方案&#xff08;试行第九版&#xff09;》&#xff0c;在抗病毒治疗中&#xff0c;抗新冠病毒药物PF-07321332/利托那韦片&#xff08;Paxlovid&#xff09;被写入诊疗方案。Paxlovid是由两种抗病毒药物组成&#xff…

关于CV算法岗就业相关问题,精华回答分享

粉丝提问&#xff1a; 你好&#xff0c;看星球上做前端&#xff0c;后端&#xff0c;java 的人比较多&#xff0c;好像没有看到有多少人做算法&#xff0c;我现在已经毕业了&#xff0c;是一名 cv 算法工程师&#xff0c;但是我现在很苦恼&#xff0c;感觉自己代码能力很弱&am…

chatgpt赋能python:Python自动打开软件:实现轻松便捷的操作

Python自动打开软件&#xff1a;实现轻松便捷的操作 在许多工作场所&#xff0c;我们可能需要反复打开某个软件&#xff0c;费时费力。那么有没有一种方式能够轻松地自动打开特定软件呢&#xff1f;此时Python便是一个好帮手。PythonとWINDOWS关联性较强&#xff0c;可以方便地…

Golang/Python 调用 openAI 的API 详解

学习目标&#xff1a; OpenAI API介绍 学习如何通过 Golang 使用 OpenAI 的 API OpenAI 的常用的参数及其说明 了解OpenAI API 中令牌&#xff08;tokens) OpenAI API 提供了几个不同的终端点&#xff08;endpoints&#xff09;和模式&#xff08;modes&#xff09; 复杂和…

我改了一行公共代码后,同事说要建个没我的小群

点击上方 前端Q&#xff0c;关注公众号 回复加群&#xff0c;加入前端Q技术交流群 嗨&#xff0c;大家好&#xff01;这里是道长王jj~ &#x1f3a9;&#x1f9d9;‍♂️ 今天我想和大家分享一个惨痛的教训&#xff0c;就是当我一意孤行地删掉一个看起来没用的配置文件时&#…