一、Android CPU监控
系统CPU占用率
使用adb shell命令可以获取系统CPU使用情况:
adb shell cat /proc/stat
实例输出如下:
第一行数据为系统总的CPU使用数据,计算方式如下:
CPUTime = 1144049(user) + 459555(nice) + 789659(system) + 4887508(idle) + 6606(iowait) + 491(irq) + 47150(softirq) + 0(steal) + 0(guest) + 0(guest_nice)
采样两个时间点的系统CPU,得出CPUTime1和CPUTime2
CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 +steal1 + guest1 + guest_nice1;
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 +steal2 + guest2 + guest_nice2;
总的CPU时间:totalCPUTime = CPUTime2 - CPUTime1;
CPU空闲时间:idleCPUTime = idle2 - idle1;
总的CPU使用率:totalCPURate = (totalCPUTime - idleCPUTime) / totalCPUTime;
单独app的CPU占用率
使用Keymob开发助手可以更方便地获取应用CPU使用情况,它提供了直观的CPU监控界面和详细的分析报告。
获取进程CPU使用率的基本方法:
adb shell cat /proc/<pid>/stat #使用adb shell ps | grep "package_name"获取到app的进程id即pid
进程CPU的计算公式如下:
processTime = utime + stime + cutime + cstime;
采样两个时间点的系统CPU和进程CPU,得出CPUTime1和CPUTime2、processTime1和processTime2
CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 +steal1 + guest1 + guest_nice1;
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 +steal2 + guest2 + guest_nice2;
总的CPU时间:totalCPUTime = CPUTime2 - CPUTime1;
processTime1 = utime1 + stime1 + cutime1 + cstime1;
processTime2 = utime2 + stime2 + cutime1 + cstime2;
进程CPU时间:processTime = processTime2 - processTime1;
进程CPU使用率:processCPURate = processTime / totalCPUTime ;
二、Android 内存监控
Keymob开发助手提供了全面的内存分析功能,可以实时监控应用内存使用情况,并生成详细的内存报告。
基本的内存监控方法:
adb shell dumpsys meminfo "package_name"
输出示例:
Applications Memory Usage (in Kilobytes):
Uptime: 1178912685 Realtime: 1967803670
** MEMINFO in pid 3916 [com.example.package_name] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 3601 3600 0 0 11040 5756 5283
Dalvik Heap 5500 5500 0 0 16524 11640 4883
...
Pss total : 占用的物理内存 Private Dirty: app进程死亡结束后,系统可回收的arm 物理内存 Private clean: 当前app进程中已被系统回收的arm 物理内存
通常应用占用内存需关注Pss total
三、Android 流量监控
1、获取app的pid:
adb shell ps | grep 'package_name' | awk '{print $2}'
2、根据pid获取uid:
adb shell cat /proc/{pid}/status | grep Uid | awk '{print $2}'
3、获取流量:
adb shell cat /proc/net/xt_qtaguid/stats |grep {uid}
Keymob开发助手可以自动完成这些步骤,并提供更直观的网络流量监控界面,帮助开发者快速定位网络性能问题。
四、Android 流畅度
Android app的流畅度与视觉惯性和帧耗时有关,jank即为卡顿帧,可以描述应用的流畅度
a)视觉惯性:视觉预期帧率,用户潜意识里认为下帧也应该是当前帧率 b)电影帧:电影帧率一般是24帧。电影帧单帧耗时为 1000ms/24≈41.67ms
Keymob开发助手提供了专业的流畅度分析工具,可以自动检测卡顿帧(jank)并生成详细的性能报告。
Android app流畅度测试方法:
1、在手机开发者选项中打开"GPU呈现模式分析",选择"在adb shell dumpsys gfxinfo中"
2、输入命令:
adb shell dumpsys gfxinfo "package_name">fps.txt
每一帧所需要的时间为Time = Draw + Prepare + Process + Execute
每一帧所需的时间Time同时满足以下2条件,则认为是一次卡顿jank
a)视觉连续性问题:当前帧耗时>前3帧平均耗时2倍 b)卡顿问题:当前帧耗时>2帧电影帧耗时(电影每秒24帧,1000ms/24*2=84ms)