Android耗电量 - bugreport & Battery Historian

随着Mobile App应用的不断演进,我们已经不能满足于仅仅实现功能,同时还要追求更高的质量和性能,因此耗电量、CPU占有率等性能问题显得越来越重要。而以耗电量来举例,其性能问题是与硬件离不开的,即要排查识别高耗能硬件,通过软件的方式,来排查,是哪些操作或者代码使得硬件在疯狂耗能,并定位问题后进行解决。关于Android App耗电量问题的定位方式有很多种方法,具体介绍见这里,本文主要讲解其中最为常用的一种方式,即通过 Bugreport 和 Battery Historian 分析。

一. 生成bugreport

Bug Report 包含各种能够帮助我们修复Bug的设备日志,堆栈跟踪和其他一些诊断信息。可以通过命令adb bugreport来获取bugreport文件信息:

  1. 对于Android 7.0及以上,生成bugreport文件到指定目录
adb bugreport <bug_report_path>

若不指定路径,则会生成到local目录

  1. 对于Android 7.0及以上,为指定设备生成bugreport
adb devices
adb -s <device_serial_number> bugreport
  1. 对于Android 6.0及以下
adb bugreport > <bugreport_name>.txt

二. bugreport 目录结构

bugreport 目录结构

通过adb命令生成的通常是一个ZIP文件,且该文件命名为bugreport-<BUILD_ID>-<DATE>.zip,解压缩后,该文件夹中包含多个文件:

  1. bugreport-<BUILD_ID>-<DATE>.txt: 最重要的文件,输出的诊断信息,包含:系统服务(dumpsys),错误日志(dumpstate),和系统日志信息(logcat)
  2. version.txt: Android 的发布号
  3. systrace.txt: 如果系统systrace是可用的,则会包含这个文件,关于Systrace tool的介绍见官网
  4. FS 文件夹dumpstate工具会将设备文件系统下的文件拷贝到FS文件夹下

三. Battery Historian

根据上面的内容可知,bugreport的生成非常简单,目录结构也很好理解,但问题是,这个生成的文件非常庞大,包含的信息量也很大,关于具体解析bug report的文件见官网,可以感受到其中的痛苦,因此Google针对Android5.0(API21)以上的系统开发了一个分析工具Battery Historian来解析bugreport文件,并用web图形的形式展示出来。

Battery Historian工具需要使用bugreport中的 Battery History数据,我们可以在bugreport.txt中找到Battery History 数据拦的信息:

DUMP OF SERVICE batterystats:
Battery History (0% used, 192 used of 256KB, 6 strings using 280):
                    0 (10) RESET:TIME: 2018-07-24-15-58-31
                    0 (2) 100 c41000e1 status=discharging health=good plug=none temp=300 volt=4326 charge=0 +running +wake_lock +wifi_radio +screen phone_state=off phone_signal_strength=great brightness=dim +wifi_running +wifi wifi_signal_strength=3 wifi_suppl=completed top=u0a1404:"com.thoughtworks.zion.host.demo"
                    0 (2) 100 c41000e1 user=0:"0"
                    0 (2) 100 c41000e1 userfg=0:"0"
             +1s605ms (1) 100 c41000e1 wifi_signal_strength=2
             +4s617ms (1) 100 c41000e1 wifi_signal_strength=3
            +15s166ms (2) 100 c41000e1 -top=u0a1404:"com.thoughtworks.zion.host.demo"
            +15s166ms (2) 100 cc1000e1 +wifi_scan +top=u0a58:"com.huawei.android.launcher"
            +16s417ms (2) 100 c41000e1 -wifi_scan -top=u0a58:"com.huawei.android.launcher"
            +16s660ms (2) 100 c41000e1 +top=u0a1403:"com.huawei.works"
            +16s794ms (2) 100 c41000e1 pkgactive=u0a1403:"com.huawei.works"
            +37s742ms (1) 100 cc1000e1 +wifi_scan
            +38s275ms (1) 100 c41000e1 -wifi_scan
            +52s773ms (1) 100 c41000e1 wifi_signal_strength=2
            +57s744ms (1) 100 cc1000e1 +wifi_scan
            +58s283ms (1) 100 c41000e1 -wifi_scan
            +59s405ms (2) 100 c41000e1 stats=0:"remove-uid"
            +59s990ms (2) 100 c41000e1 temp=310 volt=4280
          +1m01s804ms (1) 100 c41000e1 wifi_signal_strength=3
          +1m30s293ms (2) 100 c41000e1 stats=0:"battery-state"
          +1m30s310ms (3) 100 c41800e1 status=full plug=usb temp=320 volt=4286 +plugged

四. 安装 Battery Historian

这里主要使用Docker,具体步骤如下:

  1. 安装Docker
    直接在官网安装或者通过在terminal中输入brew cask install docker直接安装
  2. 在docker中运行Battery Historian的镜像,如果没有运行过这个镜像,则会自动下载并安装,可以更改<port>端口,该端口指的是映射到本地的端口
docker run -p <port>:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
  1. 若系统为Linux或者Mac OS X,在浏览器中访问http://localhost:<port>,能看到如下页面,则安装成功
  2. 若系统为Windows,在步骤2之后还要进行以下几步:
    (1)在BIOS系统中启动虚拟化
    (2) 启动docker后,它会告诉你机器正在使用的IP地址,例如,IP地址是123.456.78.90,则可以在 http://123.456.78.90:<port>访问Historian

五. 使用Battery Historian打开bugreport

  1. 运行 Battery Historian
  2. USB连接设备
  3. 关闭正在运行的adb server
adb kill-server
  1. 重启adb并检查已连接的设备
adb devices
  1. 重置电池统计信息和历史记录
adb shell dumpsys batterystats --reset
  1. 让系统记录所有的的WakeLock信息
adb shell dumpsys batterystats --enable full-wake-history

一般情况下,设备空闲,屏幕关闭,最后CPU停止运行,wake_lock可以阻止CPU休眠,比如后台持续下载.该维度只记录第一个使用wake_lock的app,如果需要记录所有的,使用上面命令

  1. 拔出USB,对手机进行操作想要统计的应用,耗电记录会在后台统计手机的耗电情况
  2. 操作完毕后,连接USB,并通过adb bugreport命令生成bugreport文件,将该文件上传到localhost:<port>界面中,就可以开始分析了,生成的图片类似如下:
  3. 最后不要忘了关闭全量记录唤醒。保持开启会造成性能问题,除非在电量收集阶段,否则建议保持关闭。
adb shell dumpsys batterystats --disable full-wake-history

六. 使用Battery Historian查看数据

Bugreport文件包含整个手机的运行情况,而不是针对某一个特定的App,因此使用Battery Historian查看的情况也如此,需要注意当前展示的数据是选中的App还是全部App的叠加信息。默认显示的图表是全部App的叠加信息,当选中某个App时,图表可能会有所不同,同时,图表左侧Y轴的指标字体会加粗,表示这几个数据在选中后,数据会变为选中App的数据,而其他数据仍然是全部数据。

1.使用Battery Historian 图表查看数据

Battery Historian 的图表显示了一段时间内与耗电量相关的事件,如图所示Battery Historian图表的一个例子:


bugreport图表

其中标号的意义是:

  • 标号1:从下拉列表中添加其他指标;
  • 标号2:将鼠标悬停在信息图标上可以查看有关每个指标的详细信息,包括图表中使用的不同颜色代表意义的介绍;
  • 标号3:将鼠标悬停在某个条目上可以查看该指标的更多详细信息,以及时间线上特定点的耗电量信息;
2.查看指定App数据

Battery Historian除了能够提供宏观的系统层面的信息,还能够提供针对指定App的可视化数据和表格信息,这表格主要信息包括:

  • Device estimated power use等基本信息
  • Networks Information:app网络信息
  • Wakelocks:唤醒锁信息,一般和业务强相关
  • Services:服务信息,查看App开启的services信息
  • Process info:进程信息

Battery Historian图表下为数据分析,包括三个Tab,如下图所示,可以查看App更多信息:


数据分析Tab

其中,标号所代表的意义是:

  • 标号1:System Stats 分组包含系统级别的数据,比如屏幕亮度等。这一栏显示了系统发生的总体情况,可以用来测试是否存在外部影响事件;
  • 标号2:App Stats分组包含针对指定APP的详细信息;
  • 标号3:可以根据不同的分类标准对APP进行排序;
  • 标号4:在下拉列表中选择指定的APP后可在App Stats中查看具体信息,App Stats所展示的都是所选定App产生的数据,不会受到外部因素的影响;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容