美文网首页android
Android CPU监控想法,思路,核心技术和代码

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

作者: ab64fd4eaee3 | 来源:发表于2017-03-20 01:26 被阅读1488次

    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 显示最大数量)

    相关文章

      网友评论

      本文标题:Android CPU监控想法,思路,核心技术和代码

      本文链接:https://www.haomeiwen.com/subject/ojqbnttx.html