9. Android-专项测试
序号 |
分类 |
说明 |
1 |
cpu |
应用使用过程中需要cpu的调度来做计算逻辑 |
2 |
内存 |
Android系统中每个应用能使用的内存是有上限的 |
3 |
GPU |
部分业务可能需要对GPU关注 |
4 |
磁盘存储 |
应用使用过程中注入一些配置、日志等不可避免会进行持久化存储;可能还需做缓存 如视频缓存 图像缓存等都会涉及到磁盘的存储;有时候可能还会关心磁盘写入的io速率 |
5 |
响应时间 |
时间类的测试主要分为:冷启动时间、页面切换时间以及点击事件的响应时间 |
6 |
流量损耗 |
|
7 |
电量损耗 |
|
8 |
日志打印 |
日志打印过于频繁会影响io等 所以也需要做特别的注意 |
9 |
安装包大小 |
Apk大小也是影响内存占用的重要一环 |
10 |
Fps |
页面的流畅度 主要关注列表加载 视频播放的流畅度等;需要重点关注是否存在过度绘制的情况以及卡顿的优化 |
11 |
业务指标 |
对一些应用可能需要特别关注的如视频卡顿 |
12 |
稳定性测试 |
是移动端测试中的重要一环 |
在移动端的性能和专项测试中通常会涉及到上述这些部分,每一个展开来讲都是比较复杂的一个部分。接下来的内容会分指标进行展开。
这里也附一下官方的性能相关文档:
Android官方性能说明测量以及问题排查的说明文档:https://developer.android.google.cn/topic/performance/overview?hl=da
Cpu损耗
在cpu的统计中,最常用的方式有2种:
1.一种是使用adb shell top 来具体获取;
2.另一种通过复杂的计算方法来具体的获取;
为了获取更加简单 使用的过程中通过top命令使用的比较多
top命令
adb shell top 默认会将过长的进程名折叠展示;所以为了看的更加全面,我们需要使用
adb shell COLUMNS=105 top 来将进程名展示的更加全面;
以上就是adb shell COLUMNS=105 top命令得到的展示结果。在这里一般的教程经常会解释最上面的一栏的含义。当如果我们刚开始学习 我更建议大家关注的是自己需要研究的线程的cpu占用,最顶部的一栏是给出的整体系统的性能数据,可是往往我们测试过程中可能更加需要关注的是我们的待测应用,比如这里的com.bilibili.bilithings在这个cpu快照中所占据的cpu大小为11.3%。
按照网上的惯例 我们也解释一遍上面顶部的这些指标。
Tasks:代表系统整体有多少进程,其中有多少进程在运行;多少进程处于睡眠状态;多少进程处于stop;多少进程为僵尸线程;
Mem&Swap:系统的内存和交换内存的大小;
最后一行给出了系统cpu整体的使用大小,包括了: %user处于用户态的时间;处于系统态的时间%sys;%nice用户空间通过nice调度过的cpu使用率;%idle空闲cpu时间;%iow cpu处于io等待的时间;%irq 处理软中断的时间;%sirq 处理硬中断的时间;%host有虚拟cpu时 虚拟cpu的使用时间
对于刚学习做性能测试的话 未深入学习计算机体系结构的话 上述指标可能一时不太好理解。但其实也不重要,因为通常我们往往第一步更加需要关注的是我们的待测应用的相关性能数据,而对系统整体的数据第一步做到知道有这些数据就好,等后续测试出性能问题需要进一步排查的时候可能反过来需要用到这些数据。
另外在查看进程以及分析具体的性能数据时我们可以使用adb shell COLUMNS=105 top -H -p 16860(后面的数字是进程id)来具体查看没个进程下面各个线程占用的cpu数据。
-d 参数可以指定刷新的时间格式
-n 执行top命令运行的次数后退出
通常在自动化测试过程中,我们通常使用adb shell COLUMNS=105 top -n 1 来获取一次的cpu快照数据。
关于cpu架构
在做cpu的性能测试过程中,还有一个前提就是我们要针对cpu的硬件参数做一些了解。
不同型号的cpu其算力不同,针对同一个应用所得出来的测试结果也不同。所以单纯给出cpu使用率是XX%是没有意义;需要在说明所使用的cpu型号的前提下,再给出相应的测试数据值。比如在车载的测试中,最常见的cpu型号为高通8155、8295等。
Cpu中需要关注的参数信息:
1.支持的指令集,比如x86,arm64,arm32等
2.各个核的架构和频率信息,进一步可能需要了解cpu的dmips相关的算力指标数据。
adb shell cat /proc/cpuinfo
使用上述命令,可以帮助我们了解你所测试设备目前使用的cpu型号以及大概有几个核等。
adb shell cat /proc/cpuinfo "| grep processor | wc -l" -》快捷命令用于获取cpu核数。
关于dmips可参考:https://blog.csdn.net/LVXIANGAN/article/details/104320764
Dmips计算过程
关于dmips如何计算参考以下步骤:
1.使用adb shell cat /proc/cpuinfo 获取cpu型号
(1)
2.查询该芯片的cpu架构,比如SM6225是8核,其中4个大核 4个小核,同时要知道具体的架构是啥
(1)
3.针对具体的架构的cpu有参考的dmips对照表,如上,我们要找Cortex-A73 和Cortex-A53的算力数据
(1)
4.使用相应的算力 然后乘以主频大小,4*2.4*1000*4.8 + 4*2.3*1000*1.8 = 62.64Kdmips
关于cpu trace分析
在cpu的trace采集中网上推荐了很多方法,比如Android studio、perfto、simplef等,实践下来用起来最方便的还是simpleperf工具,而且android studio和perfto底层原理还是基于simpleperf 所以我们其实直接使用simpleper即可。
那为了更加准确的分析,我们想要在release包上分析,还是需要找一台root的设备用于采集cpu数据,并且关闭release包的混淆,这样我们才能更加直接的查看函数的具体作用。
sudo ./app_profiler.py -p com.bilibili.bilithings -r "--exclude-perf -f 4000 -e cpu-cycles --no-inherit --add-counter instructions --duration 10 --no-cut-samples --call-graph dwarf,65520 --post-unwind=yes -t $tid1,$tid2"
在打开报告的过程中遇到的问题是report的html中依赖了一些google上的js包,因此需要在浏览器上安装相应的插件才能正常的打开报告:https://github.com/justjavac/ReplaceGoogleCDN/tree/master/extension/options_ui
具体的报告的例子:
在这了可以看出具体的耗时存在哪些节点,至于哪些节点可以做性能上的优化和修改 还是要结合开发代码具体的看。
Systrace 适用于所有 Android 平台版本,但我们建议将 Perfetto 用于搭载 Android 10 及更高版本的设备。Systrace报告解释说明:https://developer.android.google.cn/topic/performance/tracing/navigate-report?hl=da
Perftto报告解析:https://perfetto.dev/#/trace-processor.md ;录制配置选项:https://www.cnblogs.com/mooyuit/articles/18000777 (感觉还是可以尝试一用的。比simplerf相比 时序上更加清楚)
内存损耗
内存占用组成架构 & 影响内存占用数值的几个决定性事项可参考google官方文档:
https://developer.android.google.cn/studio/profile/memory-profiler?authuser=0&hl=zh-cn
内存值查看
通过adb shell dumpsys meminfo com.bilibili.bilithings
我们可以得到com.bilibili.bilithings这个进程的相关内存值占用,结果如上图所示。在这个图中,结果主要分三块区域;
第一块就是上面整体给出的内存在各个区域内的占用值大小,例如其中包含了JavaHeap、NaticveHeap、Code、Stack、Graphics、System等区域。
其中还有一个比较重要的概念就是PSS和RSS;因为Android的多个进程会共享部分的内存区域。而pss就是按照共享大小等比例划分之后所占据的内存大小;RSS是不进行等比例划分所占据的内存大小。
其中各个区域的细则则和图中我们标记的第一块内容有对应的关系。如Graphic等于gfx dev;那其实我们需要重点关注的第二个红框所圈定出来的数值大小。
最后2个圈出来部分内容是关于系统所使用的database等资源的大小。如果应用有许多逻辑涉及到数据库的操作,那么这里的部分则应该是我们重点关注的内容。
Hprof文件查看
我们在得到内存值之后有时候可能觉得内存有问题 那么这个时候我们就需要获取内存的快照数据来帮助我们进一步分析。
同样,如果我们debug包分析 那么会保护很多干扰因素,这里最好还是优先使用realease包进行分析,那么此时任然需要的是一台root的设备。
使用:
adb shell am dumpheap com.bilibili.bilithings /data/local/tmp/bilithings_{timeStp}_start.hprof
adb pull /data/local/tmp/bilithings_{timeStp}_start.hprof {resultPath
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏专注于从零到1的接口自动化测试框架开发过程分享、Android端专项测试技术分享,服务端专项测试技术分享 以及 基于开源框架进行二次开发的经验分享