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

1、获取应用安装时间:

(time adb install -rd $appname) >& installtime

用命令总执行时间 - 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

用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

可以每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

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



6、获取整机内存信息:

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

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)

更多相关文章

  1. Android Studio 检测内存泄漏与解决方法
  2. APNS开源包的内存泄露问题
  3. 记一次java内存分析
  4. Java对象创建的过程及对象的内存布局与访问定位
  5. Java并发编程(四)Java内存模型
  6. java内存垃圾回收模型
  7. Android 时间日期选择器的用法
  8. Android时间日期类小结
  9. android 命令修改时间或程序修改系统时间

随机推荐

  1. 如何按不可用的值过滤搜索
  2. 从django视图中的按钮获取click事件
  3. Python登录并获取CSDN博客所有文章列表
  4. python 函数式编程
  5. 集成erlang和python的最佳方法
  6. 无法安装ndg-httpsclient或者我的解决方
  7. 平分的直线 牛客网 程序员面试金典 C++ P
  8. python排序列表与铸造
  9. python实现微信自动聊天
  10. Ubuntu 下TinyOS在CC2530上移植之环境搭