Android 性能测试工具- Emmagee

备注:个人学习笔记整理,仅供测试同学学习,切莫转载商用,有错误或者更好的方案可以留言,一同进步!

参考学习(因为已经不怎么更新了就不再关注了):

https://www.cnblogs.com/zhengna/p/9985576.html
https://cloud.tencent.com/developer/article/1451870
https://blog.csdn.net/zd199218/article/details/80698192
https://www.cnblogs.com/QiangWum/p/12516544.html
https://www.cnblogs.com/shouke/p/10157895.html

  • Emmagee 简介
  • 功能介绍
  • 下载与安装
  • 使用
  • 测试报告
  • 实现原理
  • 使用场景

一:Emmagee 简介

Emmagee是网易开发的Android性能监测工具,开源

Emmagee主要用于监控单个App的CPU,内存,网络流量,电池电流,启动时间和状态等,且用户可自定义监控的频率以及性能的实时显示,并最终生成一份性能统计文件

二:优缺点

优点:

  • 检测应用从启动开始到当前时间消耗的流量数
  • 检测当前时间被测应用占用的CPU使用率总体CPU使用量
  • 检测当前时间被测应用占用的内存量占用的总体内存百分比剩余内存量
  • CSV格式报告,同时存储在手机中
  • 在浮窗中可以快速启动或者关闭手机的wifi网络
  • 浮动窗口,呈现实时进程状态
  • 自定义的收集间隔

缺点:

  • Android 5.0及以上版本:不推荐使用getRunningTasks()和getRunningAppProcesses(),只返回您的应用程序进程,因此无法从Android 5.0获取TopActivity。
  • Android 7.0:谷歌限制访问/ proc,也无法从Android 7.0中的TOP命令获取目标应用程序的pid,因此不能支持7.0及以上版本。
  • 安卓版本7.0及以上不支持
  • 不支持的设备:https://github.com/NetEase/Emmagee/wiki/Some-devices-are-not-supported

我使用遇到的问题:

夜神(安卓版本5.1出现问题兼容性问题):https://blog.csdn.net/weixin_42717928/article/details/106952200

三:下载与安装

官网:https://github.com/NetEase/Emmagee/releases

点击就安装到我的模拟器了...好吧,点击打开,选中要测试的应用

四:使用

我就很简单,把包拉到模拟器里面安装

打开Emmagee会显示出目前系统已经安装的应用(可在设置中配置间隔)。

选择一个应用之后,点击“开始测试”按钮,Emmagee会自动启动被测应用,并在最上方显示流量、CPU、内存等数据,在该状态下可任意使用被测应用,Emmagee会自动进行相关数据的记录,终止测试之后会生成相应的报告,并保存在Android目录中。

五:测试报告

(1)Emmagee-->设置-->测试报告-->打开。(看的比较难受)
(2)从手机Android目录Emmagee中打开CSV文件。

C:\Users\AUSU>adb shell
root@android:/ # cd data/media/0/Emmagee
root@android:/data/media/0/Emmagee # ls
20200625210355_com.ss.android.ugc.aweme.csv
20200625210447_com.ss.android.ugc.aweme.csv
20200625210503_com.ss.android.ugc.aweme.csv
adb pull /data/media/0/Emmagee/20200625232546_com.ss.android.ugc.aweme.csv d:/a

(3)在设置中配置邮箱地址后自动发送到邮箱,在邮箱打开。

我这随便测试了一下抖音,报告如下

应用包名 com.ss.android.ugc.aweme                          
应用名称 抖音短视频                          
应用PID 2392                          
机器内存大小(MB) 3483.5MB                          
机器CPU型号  ARMv7 Processor rev 0 (v7l)                          
Android系统版本 4.4.2                          
手机型号 SM-N960F                          
UID 10028                          
时间 栈顶Activity名称 应用占用内存PSS(MB) 应用占用内存比(%) 机器剩余内存(MB) 应用占用CPU率(%) CPU总使用率(%) cpu0总使用率(%) cpu1总使用率(%) 流量(KB) 电量(%) 电流(mA) 温度(C) 电压(V) 帧率
2020/6/25 23:25 ComponentInfo{com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.splash.SplashActivity} 121.74 3.49 2978.24 0 0 0 0 3 90 N/A 42 4.4 51
2020/6/25 23:25 ComponentInfo{com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.splash.SplashActivity} 127.79 3.67 2969.45 12.12 31.5 26.13 36.95 3209 90 N/A 42 4.4 55

可以将csv数据拷贝到excel中生成图表

数据性能指标:

应用占用内存PSS(MB):应用当前占内存的大小

应用占用内存比(%):应用占总内存的百分比

机器剩余内存(MB):机器当前剩余内存

应用占用CPU率(%):应用占用总CPU的百分比

CPU总使用率(%):CPU的总使用率,所有在运行的应用

CPU0-CPU1总使用率(%):手机是多核的(2核显示cpu0-cpu1,4核显示cpu0-cpu3,10核显示到cpu0-cpu9)

流量(KB):从检测开始到结束所使用的的流量数

电量(%):剩余电池的百分比(有误差,测试尽可能关掉其他应用)

电流(mA):小于0是放电,大于0是充电

温度(C):手机当前的温度

电压(V):一般手机锂电池bai的电压都是标3.7V(实际上手机电池(以下均指普通锂电池)满电电压为4.2,电池用到3.4V以下就没多少电了,再低一点就保护了手机就自己关机了)

帧率:不了解

六:实现原理(了解一下)

1:监控CPU
Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,
系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。
Emmagee是将选中应用的PID传入,读取/proc/PID/stat文件信息及可获取该PID对应程序的CPU信息。

/proc/stat文件信息:包含系统启动以来的很多系统和内核的统计信息

参数含义(这里以CUP0那行的参数为例子):
name(CPU0):名字

user (1883):从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含nice值为负进程。1jiffies=0.01秒

nice (111):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

system (999):从系统启动开始累计到当前时刻,内核态时间(单位:jiffies)

idle (22132):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

iowait (369):从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) 

irrq (0):从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

softirq (71):从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

steal(0):虚拟化环境中运行其他操作系统上花费的时间(自Linux 2.6.11开始)

guest(0):操作系统运行虚拟CPU花费的时间(自Linux 2.6.24开始) 

guest_nice(0):运行一个带nice值的guest花费的时间(自Linux 2.6.33开始)



其他参数:
intr:系统启动以来的所有中断(interrupts)的次数情况

ctxt: 系统启动以来的CPU上下文切换次数

btime:启动时长(单位:秒),从Epoch(即1970零时)开始到系统启动所经过的时长,每次启动会改变
此处指为1593156149,转换北京时间为2020/6/26 15:22:29
(可以去https://unixtime.51240.com/玩玩)

processes:系统启动后所创建过的进程数量。当短时间该值特别大,系统可能出现异常

procs_running:处于运行队列(Runnable)状态的进程个数

procs_blocked:处于等待I/O完成的进程个数

/proc/cpuinfo文件信息:

root@android:/proc # cat cpuinfo

processor       : 0     //系统中逻辑处理核的编号。对于单核处理器,则默认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核

vendor_id       : GenuineIntel         //CPU制造商

cpu family      : 6                    //CPU产品系列代号

model           : 60                   //CPU属于其系列中的哪一代的代号

model name      : Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz       //CPU属于的名字及其编号、标称主频

stepping        : 3                    //CPU属于制作更新版本
                               
cpu MHz         : 2796.702             //CPU的实际使用主频

cache size      : 3072 KB              //CPU二级缓存大小

physical id     : 0                    //单个CPU的标号

siblings        : 2                    //单个CPU逻辑物理核数

core id         : 0                    //当前物理核在其所处CPU中的编号,这个编号不一定连续

cpu cores       : 2                    //该逻辑核所处CPU的物理核数

apicid          : 0                    //用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续

initial apicid  : 0                    
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes                 //是否具有浮点运算单元(Floating Point Unit)

fpu_exception   : yes                 //是否支持浮点计算异常

cpuid level     : 13                  //执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容

wp              : yes                 //表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)

flags           : fpu vme......       //当前CPU支持的功能

bogomips        : 5593.40             //在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)

clflush size    : 64                  //每次刷新缓存的大小单位

cache_alignment : 64                  //缓存地址对齐单位

address sizes   : 39 bits physical, 48 bits virtual           //可访问地址空间位数

power management:                     //对能源管理的支持
2:监控内存的实现原理
内存和cpu的处理方式类似。先获取到当被测应用的PID,然后按照PID从 /proc/meminfo文件中获取当前被测应用占用的内存信息。

/proc/meminfo文件信息

[root@realhost /]# cat /proc/meminfo
MemTotal:         688576 kB     总内存
MemFree:          153736 kB     空闲内存
MemAvailable:     339884 kB     可用内存
Buffers:              16 kB     给文件的缓冲大小
Cached:           267672 kB     高速缓冲存储器
SwapCached:           36 kB     被高速缓冲存储用的交换空间的大小
Active:           222900 kB     活跃使用中的高速缓冲存储器页面文件大小
Inactive:         123700 kB     不经常使用中的告诉缓冲存储器文件大小
Active(anon):      31800 kB     活跃的匿名内存(进程中堆上分配的内存,是用malloc分配的内存)
Inactive(anon):    57272 kB     不活跃的匿名内存
Active(file):     191100 kB     活跃的file内存,//file内存:磁盘高速缓存的内存空间和“文件映射(将物理磁盘上的文件内容与用户进程的逻辑地址直接关联)”的内存空间,其中的内容与物理磁盘上的文件相对应
Inactive(file):    66428 kB   不活跃的file内存     
Unevictable:           0 kB   不能被释放的内存页
Mlocked:               0 kB   mlock()系统调用锁定的内存大小
SwapTotal:       2097148 kB   交换空间总大小
SwapFree:        2096884 kB   空闲交换空间
Dirty:                 0 kB   等待被写回到磁盘的大小
Writeback:             0 kB   正在被写回的大小
AnonPages:         78876 kB     未映射页的大小
Mapped:            28556 kB   设备和文件映射大小
Shmem:             10160 kB   已经被分配的共享内存大小
Slab:             102916 kB   内核数据结构缓存大小
SReclaimable:      49616 kB   可收回slab的大小
SUnreclaim:        53300 kB   不可回收的slab的大小
KernelStack:        4416 kB      kernel消耗的内存
PageTables:         6028 kB      管理内存分页的索引表的大小
NFS_Unstable:          0 kB      不稳定页表的大小
Bounce:                0 kB      在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处消耗的内存
WritebackTmp:          0 kB      USE用于临时写回缓冲区的内存
CommitLimit:     2441436 kB      系统实际可分配内存总量
Committed_AS:     308028 kB      当前已分配的内存总量
VmallocTotal:   34359738367 kB   虚拟内存大小
VmallocUsed:      179588 kB    已经被使用的虚拟内存大小
VmallocChunk:   34359310332 kB   malloc 可分配的最大的逻辑连续的内存大小
HardwareCorrupted:     0 kB      删除掉的内存页的总大小(当系统检测到内存的硬件故障时)
AnonHugePages:      6144 kB      匿名 HugePages 数量
CmaTotal:              0 kB    总的连续可用内存
CmaFree:               0 kB      空闲的连续内存
HugePages_Total:       0      预留HugePages的总个数 
HugePages_Free:        0     池中尚未分配的 HugePages 数量
HugePages_Rsvd:        0        表示池中已经被应用程序分配但尚未使用的 HugePages 数量
HugePages_Surp:        0      这个值得意思是当开始配置了20个大页,现在修改配置为16,那么这个参数就会显示为4,一般不修改配置,这个值都是0
Hugepagesize:       2048 kB     每个大页的大小
DirectMap4k:      108416 kB   映射TLB为4kB的内存数量
DirectMap2M:      940032 kB   映射TLB为2M的内存数量
DirectMap1G:           0 kB     映射TLB为1G的内存数量参考文章:http://linuxperf.com/?P=142
3:监控流量消耗的实现原理
系统中有存放整体流量和针对当程序的流量统计,
/proc/net/dev和/proc/uid_stat/UID下存放tcp_rcv和tcp_send文件,分别存放下行流量和上行流量,操作前后相减就得出结果 。
4:监控电量的实现原理
电量、电压和温度情况是通过监听系统的电池管理事件的广播来获取的。
5:监控启动时间的实现原理
我们点击界面的开始测试时,程序会启动EmmageeService,之后所有的数据统计以及更新都是EmmageeService 进行处理的。 
EmmageeService会在onStartCommand()里面启动一个线程“handler.postDelayed(task, 1000)”,
进行数据的更新同时会尝试通过ActivityManger从logcat中获取到软件的启动时间。

七:使用场景

例子1:app首次启动的相关性能状态

场景描述:点击app,启动app直到出现app主页面。

测试操作:
1.打开Emmagee
2.选择app,点击“开始测试”,出现主页面后,点击“停止测试”
3.用手机清理软件,清理“被测app”。
4.重复步骤2

数据分析:

实践中发现启动耗时经常是获取不到的

解决方法:设置采集频率的时间为最小值,比如1s,这样Emmagee就可以根据测试报告中,“时间”一栏大致统计出这个功能的耗时情况。

可以根据多次的测试数据,求出各类数据的“均值”,“峰值”

例子2:app二次启动的相关性能状态

场景描述:点击app,启动app直到出现app主页面,退出app

测试操作:

1.打开Emmagee
2.选择app,点击“开始测试”,出现主页面后,退出app,点击“停止测试”
3.重复步骤2

例子3:测试某个流程,目的在于找出性能“瓶颈”

针对某个业务流,做一个完整的业务过程的操作

根据测试生成的.csv文件,绘制相关数据的曲线图,查看曲线变化--平稳?起伏不定?还是“峰回路转”?如果不是很平稳,则说明性能上可能存在瓶颈,需要进一步分析是那个操作步骤中出现的

猜你喜欢

转载自blog.csdn.net/weixin_42717928/article/details/106950481