Android CPU监控想法,思路,核心技术和代码
http://note.youdao.com/noteshare?id=08193d640a204580657c387c9d18ef32
我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存。考虑到android的底层框架是基于Linux的平台,所有我们可以通过Linux的资源监控命令来实现对android平台的资源实时监控。
AndroidCPU信息获取
http://blog.csdn.net/netwalk/article/details/9793501
Android系统的CPU信息涉及到两个文件:/proc/cpuinfo和/proc/stat ,"/sys/devices/system/cpu/";
通过读取文件/proc/cpuinfo,来获取系统CPU的类型等多种信息,
通过读取/proc/stat所有CPU活动的信息来计算CPU使用率。
通过"/sys/devices/system/cpu/";读取cpu数量
1、 获取CPU名字
2、获取CPU最大频率
3、获取CPU最小频率
4、实时获取CPU当前频率
5时间段内的系统CPU/应用CPU占比
1.CPU使用率,和当前进程的CPU占有率
http://blog.csdn.net/l2show/article/details/40950657
http://www.jianshu.com/p/220b2873cb4e
1 CPU总使用率
在proc/stat下有详细的CPU使用情况.详细格式如下:
CPU 152342 1421 28562 1600830 12389 553 273 0 0
CPU后面的几位数字分别是:
user从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程,用户模式(user)下的时间片.
nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间,用户模式下的nice时间片。nice用于改变进程执行的优先级,通常的优先级为0,可以改为最高优先级(-20)或最低(20)。
system 从系统启动开始累计到当前时刻,处于核心态的运行时间 ,kernel模式下的时间片
idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间 ,空闲时间片
iowait 从系统启动开始累计到当前时刻,IO等待时间 ,等待IO操作完成的时间片
irq 从系统启动开始累计到当前时刻,硬中断时间,中断服务历程执行时间片
softirq 从系统启动开始累计到当前时刻,软中断时间,软中断执行时间片
所以totalCpuTime这个7个属性的和.
CPU总数用率的算法是:
100*((totalCpuTimeS-totalCpuTimeF) -(idelS-idelF))/ (totalCpuTimeS-totalCpuTimeF)
2当前进程的CPU占有率
2. 系统CPU/应用CPU占比思路
"/proc/" + processPid + "/stat"
ps查看进程的,查看某一进程adb shell ps 而非adb shell ps | grep
查看当前进程的CPU使用率:/proc/pid/stat下则是该pid的CPU使用情况。先找到自己的进程pid,然后再查看
/proc/pid/stat下则是该pid的CPU使用情况.详细格式如下:
2341 (cn.jesse.camera) S 1131 1131 0 0 -1 3912246 12450 0 2 03321 612 0 020 0
其中淡红色的四位数字分别是:
utime该任务在用户运行状态的时间
stime该任务在核心运行的时间
cutime所有已死线程在用户状态运行状态的时间
cstime所有已死线程在核心的运行时间
所以processCpuTime为这个四个属性的和.
当前进行所占CPU的算法是:
100*(processCpuTimeS-processCpuTimeF)/(totalCpuTimeS-totalCpuTimeF)
2.android cpu 进程类 (android 4.4ProcessStats.java)
http://developer.oesf.biz/em/developer/reference/eggplant/com/android/internal/os/ProcessStats.html
https://my.oschina.net/u/262208/blog/378660
进程信息统计 /proc/[pid]/*
1. android.os.Process中的嵌套类Stats完全依赖于/proc/[pid]/stat、/proc/[pid]/cmdline,/proc/[pid]/task/
2.在ProcessStats中,collectStats()用于收集进程的信息,它首先使用Process.getPids得到/proc下的进程号,然后使用Process.readProcFile(st.statFile.toString(),
去读取进程/proc/[pid]/stat的统计信息。
1.android系统中有一个ProcessStats类,我们可以使用它来获取系统的负载情况及进程时间。
实现原理是读取/proc目录下的文件。linux系统运行时,内核会去更新 /proc目录下的文件,将PID的运行情况写入相应的文件中。我们主要关注以下文件.
update() 三部分:
1. 函数读取上面所提的信息。-> CPU总使用率
2.collectStats() ->当前进程的CPU占有率
getCpuTimeForPid(int pid)
getTotalCpuPercent()
3./proc/loadavg
系统平均负载.该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。
cat /proc/loadavg
10.78 9.55 7.20 5/818 3719
每个值的含义为:
参数 解释
lavg_1 (10.78) 1-分钟平均负载
lavg_5 (9.55) 5-分钟平均负载
lavg_15(7.20) 15-分钟平均负载
nr_running (5) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (818) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(3719) 最大的pid值,包括轻量级进程,即线程。
我们可以很方便的使用这个类,来进行cpu负荷和进程时间的监控。Android系统在SystemUI中有一个服务,就使用了这个类。
我们看SystemUI的Manifest文件,可以找到一个叫LoadAverageService的服务,它就是使用了ProcessStats获取cpu和进程信息,并把他们显示出来。
最后,在看下如何使用LoadAverageService这个服务
可以在adb shell中直接运行am startservice -n com.android.systemui/.LoadAverageService
或者用【设置】->【开发者选项】->【显示cpu使用情况】打开服务
我们在开发应用的时候,可以开启这个选项,时时跟踪系统的cpu占用情况,真的是很方便啊!!!
3.LoadAverageService
LoadAverageService有两个重要的class,
一个是CpuTracker,负责运行状态数据收集的,
另外一个就是LoadView,从名字上也能看出是为了显示的,要显示成啥样,就在这里面了。
private static final class CpuTracker extendsProcessCpuTracker{ }
private class LoadView extends View {}
https://testerhome.com/topics/2583
adb shell dumpsys cpuinfo
adb shell dumpsys cpuinfo | grep packagename
adb shell top -n 1| grep PackageName
可查看占用cpu最高的前10个程序(
-t 显示进程名称,
-s 按指定行排序,
-n 在退出前刷新几次,
-d 刷新间隔,
-m 显示最大数量)