Android App性能信息获取方法

来源:互联网 发布:人工智能etf 编辑:程序博客网 时间:2024/05/16 08:24

原创地址:http://www.atatech.org/articles/26835

1、获取应用安装时间:

(time adb install -rd $appname) >& installtime
screenshot
用命令总执行时间 - apk上传时间即是应用安装时间。

2、获取应用首页开启时间,分为两种情况:

应用没有splash页,直接进入main页:

adb shell am start -W -n com.package/.MainActivity | grep "TotalTime"

首页是splash页,完成加载后进入main页,统计从点击app->main所需的总时间:

这个目前没有api提供,笔者采用的方法是首先启动SplashActivity,然后循环判断MainActivity是否启动。
adb shell am start -W -n com.package/.SplashActivity | grep "TotalTime" > starttime
starttime=0
adb shell dumpsys activity com.package.MainActivity | grep -c "no activities match"
while [[ $? -eq 0 ]]; do
sleep 0.1
starttime=$(($starttime+1))
adb shell dumpsys activity com.package.MainActivity | grep -c "no activities match"
done
echo $starttime >> starttime
screenshot
用Splash页的启动时间+100*n就能获得总的启动时间(单位ms,考虑到adb的延迟、命令执行时间,可以将100调整为120)

3、获取整机CPU信息:

通过proc获取CPU信息。
adb shell cat /proc/stat | grep cpu > totalcpu0
此处第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
参数 解析(单位:jiffies)
(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)
user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system 从系统启动开始累计到当前时刻,处于核心态的运行时间
idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)
stealstolen which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)
guest which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)
结论:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen +guest
screenshot
可以每1s获取一次CPU信息,分析整机CPU占用率。
计算方法:
1、 采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;
2、 计算总的Cpu时间片totalCpuTime
a) 把第一次的所有cpu使用情况求和,得到s1;
b) 把第二次的所有cpu使用情况求和,得到s2;
c) s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = j2 - j1 ;
3、计算空闲时间idle
idle对应第四列的数据,用第二次的idle - 第一次的idle即可
idle=第二次的idle - 第一次的idle
4、计算cpu使用率
pcpu =100* (total-idle)/total

4、获取应用CPU信息:

首先获取应用的进程id:
adb shell ps | grep com.package | awk '{print $2}' > tmp
根据进程id,通过proc获取CPU信息
while read line; do adb shell cat /proc/$line/stat | awk '{print $14,$15,$16,$17}' >> appcpu0; done < tmp
说明:以下只解释对我们计算Cpu使用率有用相关参数(14-17列)
参数 解释
pid 进程号
utime 该任务在用户态运行的时间,单位为jiffies
stime 该任务在核心态运行的时间,单位为jiffies
cutime 所有已死线程在用户态运行的时间,单位为jiffies
cstime 所有已死在核心态运行的时间,单位为jiffies

结论:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。
之后可以每1s获取一次CPU信息,分析获得app的CPU占用率等信息。

5、获取应用内存信息:

adb shell procrank | grep com.package > appmem
screenshot
说明:五个参数分别为PID Vss Rss Pss Uss
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
screenshot
screenshot
screenshot
screenshot

6、获取整机内存信息:

adb shell cat /proc/meminfo 
前四行即是整机的内存信息(总内存、可用内存)。
screenshot

7、获取最近2s内的fps信息:

在开发者选项中,开启gfxinfo,之后使用
adb shell dumpsys gfxinfo com.package
可参考Android性能分析——App帧率的获取方法

8、获取应用电量消耗信息:

一般认为,电量消耗跟CPU消耗成正比。可以使用
adb shell dumpsys batteryinfo
获取所有进程的CPU time,统计占比即为电量消耗比例。

9、获取应用流量消耗信息:

Android SDK提供了获取本次开机后,各app的流量消耗情况的接口。
可参考Android应用流量监控相关

10、获取、修改当前Wifi网络的Proxy设置:

通过反射调用Android设置Wifi网络的方法。
可参考Android 自动设置Wifi Proxy信息(全版本支持,无需ROOT)

0 0
原创粉丝点击