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

更多相关文章

  1. 一篇文章搞懂Handler发消息时,Handler,MessageQueue,Looper都做了些
  2. Android(安卓)2.0新增类ExifInterface使用
  3. 20.Android(安卓)设备工具DeviceUtil
  4. 安卓启动流程
  5. Android下的binder机制和IPC原理
  6. Android(安卓)技能图谱学习路线
  7. blockCanary原理
  8. android 有关毫秒转时间的方法,及时间间隔等
  9. android service 例子(电话录音和获取系统当前时间)

随机推荐

  1. Android(安卓)View布局xml常用 属性详解
  2. android SQLite 使用实例
  3. android 按钮点击的两种方法以及长按事件
  4. Android(安卓)Linux 内核介绍 (转)
  5. Kotlin让Android更简单~
  6. android网络编程——使用Android中的网络
  7. 启动app闪屏问题以及Android自带主题
  8. Android调用WCF
  9. Android滑动手势侦测方法介绍
  10. Android(安卓)中自定义View(三)