android

Android CPU监控想法,思路,核心技术和代码

2017-03-20  本文已影响1488人  ab64fd4eaee3

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

https://android.googlesource.com/platform/frameworks/base.git/+/c006f1aec15454782c35e028ad64d79a5c161cc1/services/java/com/android/server/ProcessStats.java

进程信息统计 /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 显示最大数量)

上一篇下一篇

猜你喜欢

热点阅读