Android专项测试之(电量)

Android专项测试之(电量)

官方文档
官方文档
battery-historian文档

关键硬件资源的占用率

利用dumpsys获取App的性能信息

❖ adb shell dumpsys procstats --hours 3
❖ adb shell dumpsys meminfo package_name|pid [-d]
❖ adb shell dumpsys batterystats --charged package-name
❖ adb shell dumpsys netstats detail
❖ adb shell dumpsys gfxinfo package-name

更多性能数据

❖ /proc/$pid ⽬录保存了进程的⼤部分资源使⽤数据
❖ cpu
❖ mem
❖ network

获取网络数据

$ adb shell dumpsys package com.bs.finance | grep uid
    uid=10625 gids=null type=0 prot=signature
    uid=10625 gids=null type=0 prot=signature|privileged
    uid=10625 gids=null type=0 prot=normal
    uid=10625 gids=null type=0 prot=signature
    uid=10625 gids=null type=0 prot=signature
    uid=10625 gids=null type=0 prot=signature

# 想办法将uid=10625的上传下载的流量
$ adb shell dumpsys netstats detail
ident=[{type=WIFI, subType=0, networkId="bicai_6_5G", metered=false, defaultNetwork=true}] uid=10625 set=DEFAULT tag=0x0
   proc=
   actUid=-1NetworkStatsHistory: bucketDuration=7200
      st=1638316800 rb=24044 rp=140 tb=51718 tp=244 op=0 rb=24044 rp=140 tb=51718 tp=244
      st=1638324000 rb=37617 rp=241 tb=190819 tp=2056 op=0 rb=37617 rp=241 tb=190819 tp=2056
      st=1638331200 rb=23848 rp=189 tb=193047 tp=2231 op=0 rb=23848 rp=189 tb=193047 tp=2231
      st=1638338400 rb=35241 rp=174 tb=107424 tp=1170 op=0 rb=35241 rp=174 tb=107424 tp=1170
  ident=[{type=WIFI, subType=0, networkId="bicai_6_5G", metered=false, defaultNetwork=true}] uid=10625 set=FOREGROUND tag=0x0
   proc=
   actUid=-1NetworkStatsHistory: bucketDuration=7200
      st=1638316800 rb=16432393 rp=11477 tb=593350 tp=6990 op=0 rb=16432393 rp=11477 tb=593350 tp=6990
      st=1638324000 rb=6276250 rp=4572 tb=295353 tp=2419 op=0 rb=6276250 rp=4572 tb=295353 tp=2419
      st=1638338400 rb=625093 rp=619 tb=115617 tp=855 op=0 rb=625093 rp=619 tb=115617 tp=855

获取cpu和内存数据

$ pids=$(adb shell ps -ef | grep com.bs.finance$ | head -1 | grep -v grep | awk '{print $2}'| xargs | sed 's# #,#g')

# 实时监测
$ adb shell top -d 1 -p $pids
# 实时监测CPU和内存的值
$ adb shell top -d 1 -p $pids -o %CPU,%MEM
# 刷新一次退出
$ adb shell top -d 1 -n 1 -p $pids
# 取一次CPU和内存的值
$ adb shell top -d 1 -p $pids -o %CPU,%MEM,NAME -n 1 -b | grep finance
80.0   4.2 com.bs.finance
# 取CPU的值
$ adb shell top -d 1 -p $pids -o %CPU,%MEM,NAME -n 1 -b | grep finance | awk '{print $1}'
3.0
# 取内存的值
$ adb shell top -d 1 -p $pids -o %CPU,%MEM,NAME -n 1 -b | grep finance | awk '{print $2}'
2.9

监控系统脚本,记录cpu和内存的使用情况

pids=$(adb shell ps -ef | grep com.bs.finance$ | head -1 | grep -v grep | awk '{print $2}'| xargs | sed 's# #,#g')

for((i=0;i<20;i++));do
content=$(adb shell top -d 1 -p $pids -o %CPU,%MEM,NAME -n 1 -b | grep finance)
echo $content
cpu=$(echo "$content" | awk '{print $1}')
mem=$(echo "$content" | awk '{print $2}')
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary "cpu,user=$USER,app=bili value=$cpu"
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary "mem,user=$USER,app=bili value=$mem"
done

搭建监控系统

Grafana+InfluxDB+上面的监控系统脚本(课件18-3.2)
Grafana官方地址
InfluxDB官方地址

耗电量测试

安装 Battery Historian

参考
也可以使用我配置好的

使用 Batterystats 收集数据

如需使用 Batterystats 从您的设备收集数据并在 Battery Historian 中打开该数据,请执行以下操作:

1、将移动设备连接到计算机。

2、在终端窗口中,关闭正在运行的 adb 服务器。

adb kill-server

3、重启 adb 并检查是否有已连接的设备。

adb devices

4、重置电池数据收集。

adb shell dumpsys batterystats --reset

设备始终会在后台收集 Batterystats 和其他调试信息。重置操作会清除旧的电池收集数据。如果不重置,输出内容会非常大。
唤醒锁分析(可以不要)
默认情况下,即使在运行的基础上维护聚合统计信息,Android 也不记录特定于应用程序的用户空间唤醒锁转换的时间戳。如果您希望 Historian 在时间线上显示有关每个单独唤醒锁的详细信息,您应该在开始实验之前使用以下命令启用完整唤醒锁报告:

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

请注意,通过启用完整唤醒锁报告电池历史日志会在几个小时内溢出。将此选项用于短期测试运行(3-4 小时)。

5、断开设备与计算机的连接,以便仅消耗设备电池的电量。

6、使用您的应用并执行您想要获取数据的操作;例如,断开 WLAN 连接并将数据发送到云端。

7、重新连接手机。

8、确保系统已识别您的手机:

adb devices

9、转储所有电池数据。此过程可能需要一段时间:

adb shell dumpsys batterystats > [path/]batterystats.txt

系统会使用可选路径参数在您指定的目录中创建 batterystats.txt 文件。如果您没有指定路径,该文件会在您的主目录中创建。

10、使用原始数据生成报告。

对于搭载 Android 7.0 及更高版本的设备:

adb bugreport > [path/]bugreport.zip

对于搭载 Android 6.0 及更低版本的设备:

adb bugreport > [path/]bugreport.txt

错误报告可能需要几分钟才能完成。在完成之前,请勿断开设备连接或取消该进程。

与上面的 batterystats.txt 一样,这些文件是系统使用可选的 path 参数在您指定的目录中创建的。如果您没有指定路径,系统将在您的主目录中创建这些文件。

如果 Battery Historian 尚未运行,请使用以下命令运行:

shenyf@DESKTOP-5N7A05K MINGW64 /d/gopath/src/github.com/google/battery-historian (master)
$ go run cmd/battery-historian/battery-historian.go
2021/11/29 15:09:25 Listening on port:  9999
2021/11/29 15:09:47 Trace starting analysisServer processing for: GET
2021/11/29 15:09:47 Trace finished analysisServer processing for: GET

使用 Battery Historian 图表查看数据

Battery Historian 图表会显示一段时间内与电源相关的事件。

当系统组件处于活动状态时,每行都会显示一个彩色条形段,以此表示正在消耗电池电量。该图表不会显示该组件使用的电量,仅表示相关应用处于活动状态。图表按类别进行整理,并显示每个类别随时间变化的一个条形,如图表的 X 轴所示。
在这里插入图片描述

1:从下拉列表中添加其他指标。
2:将光标悬停在信息图标上可查看有关每个指标的更多信息,包括图表中使用的颜色对应的键。
3:将光标悬停在某个条形上可查看有关该指标的更多详细信息以及时间轴上特定点的电池统计信息

其他 Batterystats 输出

您可以在 Battery Historian 图表下方统计信息部分的 batterystats.txt 文件中查看其他信息。
在这里插入图片描述

1: System Stats 标签页包含系统范围的统计信息,例如电池信号电平和屏幕亮度。此信息可全面反映设备的具体情况。这对于确保没有任何外部事件影响您的测试尤为有用。

2: App Stats 标签页包含有关特定应用的信息。使用左侧“App Selection”窗格中的 3: 排序应用下拉列表对应用列表进行排序。您可以选择特定应用来查看使用下方的 4: 应用下拉列表的统计信息。

使用 Battery Historian 分析耗电情况

您可以通过 Battery Historian 工具了解设备随时间的耗电情况。在系统级别,该工具以 HTML 的形式可视化来自系统日志的电源相关事件。在具体应用级别,该工具可提供各种数据,帮助您识别耗电的应用行为。

本文档介绍了使用 Battery Historian 了解耗电模式的一些方法。文档首先介绍如何读取 Battery Historian 报告的系统级数据,然后讨论如何使用 Battery Historian 诊断和排查与电池消耗相关的应用行为,最后提供了一些有关特别适合使用 Battery Historian 的场景的提示。

使用系统级视图

Battery Historian 工具提供各种应用和系统行为的系统级可视化结果,以及它们随时间推移与耗电量的相关性。如图 1所示,此视图可帮助您诊断和识别应用存在的耗电问题。
在这里插入图片描述
该图中特别值得注意的是表示电池电量的黑色水平下降趋势线(在 y 轴上进行测量)。例如,在电池电量线的最开始处,大约早上 6:50 时,该图表显示电量出现较为急剧的下降。
该部分显示画面的特写图。
Battery Historian 时间轴(大约从早上 6:50 到 7:20)的特写图。
在电池电量线的最开始处,随着电池电量的急剧下降,显示画面上显示有三件事正在发生:CPU 正在运行,应用已获取唤醒锁定,且屏幕已打开。通过这种方式,Battery Historian 可帮助您了解耗电量高时正在发生什么事件。然后,您可以针对应用中的这些行为,研究是否可以进行相关优化。

系统级可视化还可以提供其他线索。例如,如果它显示移动无线装置频繁关闭和开启,则可能有机会通过智能调度 API(如 JobScheduler 或 Firebase Job Dispatcher 等)优化此行为。

下一部分将介绍如何调查特定于您自己的应用的行为和事件。

查看具体应用的数据

除了系统级数据视图提供的宏观数据外,Battery Historian 还提供特定于您设备上运行的每个应用的数据表格和部分可视化内容。表格数据包括:

应用在设备上的估计耗电量。

网络信息。
唤醒锁定次数。
服务。
进程信息。

表格提供了关于您的应用的两个数据维度。首先,您可以查找应用的耗电量与其他应用相比的排名位置。为此,请点击“Tables”下的“Device Power Estimates”表格。本示例研究了一款名为“Pug Power”的虚构应用。
研究哪些应用的耗电量最大。
图中的表格显示,Pug Power 在此设备上的耗电量排名第九,在不属于操作系统的应用中排名第三。这些数据表明此应用需要更深入的研究。

要查找特定应用的数据,在可视化图表左侧下方,在“App Selection”下方的第二个下拉菜单中输入应用的软件包名称。
输入特定的应用以查看其数据
当您选择特定应用时,以下数据可视化类别将更改为显示具体应用数据,而不是系统级数据:

- SyncManager。
- 前台进程。
- 用户空间唤醒锁定。
- 热门应用。
- JobScheduler。
- Activity Manager Proc。

如果您的应用以不必要的频率执行同步和执行作业,SyncManager 和 JobScheduler 可视化图表会立即突出显示这种情况。这样,它们能快速展露出优化应用行为以提升电池性能的机会。

您还可以再获取具体应用的一条可视化数据,即用户空间唤醒锁定。要将此信息包含在错误报告中,请在终端窗口中输入以下命令:

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

注意:从 Android 6.0(API 级别 23)开始,平台包含对应用实施特定优化的低电耗模式功能。例如,无论 JobScheduler 的调度方式如何,低电耗模式都会将作业处理成在简短的维护期间批量进行。

图 5 和图 6 显示了 PugPower 的数据:图 5 显示了具体应用数据的可视化图表,图 6 显示了相应的表格数据。
图 5. 虚构应用 Pug Power 的数据可视化图表。
图 6. 虚构应用 Pugle Power 的表格数据。
查看可视化图表并没有发现任何显而易见的问题。JobScheduler 行显示应用没有调度作业。SyncManager 行显示应用尚未执行任何同步操作。

不过,查看表格数据的“唤醒锁定”部分发现,Pug Power 获取了 1 个小时内的唤醒锁定总次数。这种代价高昂的异常行为可能是应用耗电量较高的原因。这条信息有助于开发者专攻优化后可能会大大获益的方面。在这种情况下,为什么应用会获得如此多的唤醒锁定时间,开发者又如何改善这种行为呢?

Battery Historian 的其他功能

在很多其他情况下,Battery Historian 也可帮助您找出改善电池行为的机会。例如,Battery Historian 可以显示应用是否具有以下行为:

- 过于频繁地触发唤醒提醒(至少每 10 秒钟一次)。
- 持续保留 GPS 锁定。
- 至少每 30 秒调度一次作业。
- 至少每 30 秒调度一次同步。
- 使用手机无线装置的频率高于预期。

测试电量相关问题

Android 9(API 级别 28)中发布的电源管理功能会影响在此版本上运行的所有应用,无论这些应用是否以此版本为目标平台。务必要确保您的应用在这些设备上运行正常。

请务必在各种条件下测试应用的主要用例,了解电源管理功能如何彼此互动。您可以使用 Android 调试桥命令开启和关闭部分功能。

Android 调试桥命令
您可以使用 Android 调试桥 shell 命令测试多种电源管理功能。

要了解如何使用 ADB 将设备置于低电耗模式,请参阅在低电耗模式和应用待机模式下进行测试。

应用待机存储分区
您可以使用 ADB 手动将应用分配到应用待机存储分区。要更改应用的存储分区,请先使用以下命令模拟拔下设备:

$ adb shell dumpsys battery unplug

然后使用以下命令:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

您也可以使用该命令一次性设置多个包:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

要查看应用所在的存储分区,请运行

$ adb shell am get-standby-bucket [packagename]

如果您未传递 packagename 参数,该命令会列出所有应用的存储分区。应用还可以通过调用新方法 UsageStatsManager.getAppStandbyBucket() 在运行时查找其存储分区。
后台限制
要手动应用后台限制,请运行以下命令:

$ adb shell cmd appops set packagename RUN_ANY_IN_BACKGROUND ignore

要移除后台限制,请运行以下命令:

$ adb shell cmd appops set packagename RUN_ANY_IN_BACKGROUND allow

省电模式
您可以使用多个命令来测试您的应用在低功耗条件下的运行方式。

注意:您也可以使用设备的设置 > 省电模式屏幕,让设备进入省电模式。

要模拟将设备拔下,请使用以下命令:

$ adb shell dumpsys battery unplug

要测试设备在低功耗条件下的运行情况,请使用以下命令:

$ adb shell settings put global low_power 1

完成测试后,您可以使用以下命令撤消手动设备设置:

$ adb shell dumpsys battery reset

遇到问题1

go版本太高

shenyf@DESKTOP-5N7A05K MINGW64 /d/gopath/src/github.com/google/battery-historian (master)
$ go run setup.go
setup.go:30:2: no required module provides package github.com/google/battery-historian/bugreportutils: go.mod file not found in current directory or any parent directory; see 'go help modules'
setup.go:31:2: no required module provides package github.com/google/battery-historian/historianutils: go.mod file not found in current directory or any parent directory; see 'go help modules'

解决办法:降低go版本

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值