在Android上,监测CPU的方法很多,这里简单介绍集中通用方法:

1. 通过cpuinfo句柄

cpuinfo中存储了cpu本身的型号等相关信息。

adbshellcat/proc/cpuinfo

可以得到类似如下的输出:

Processor:ARMv7Processorrev2(v7l)processor:0BogoMIPS:13.53processor:1BogoMIPS:13.53processor:2BogoMIPS:13.53processor:3BogoMIPS:13.53Features:swphalfthumbfastmultvfpedspneonvfpv3tlsvfpv4CPUimplementer:0x51CPUarchitecture:7CPUvariant:0x0CPUpart:0x06fCPUrevision:2Hardware:nubiaRevision:0000Serial:0000000000000000

得出的信息比较少,使用场景比较有限。


2. 通过stat句柄

stat中存储了cpu从启动到当前时刻的活动信息。

adbshellcat/proc/stat

可以得到类似如下的输出:

cpu138388841022908946307508721200994320689000cpu0912462175607208556254191810043211639000cpu13691661666013923878488603060975741000cpu2728114827335138289506591032346000cpu329449197515340835831525761963000intr52776099000000000000000000240440030000000000010001000000000000042490800135335114382019959800000000002785835200000000000000278260000000000000000000000044019006080000711430064924019000001722817000000067294302474980002962703000000000000000000000000000000000010000000000015164440541042560000000000063000000000080000000000000003280991344021110800025876282016820000000000000000000000000040823000000000000000000000000000000000235927000000000000000000000000000000040002380012938753010000012300000000000000000017251000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110029037400000000470000000000094300000000002052050000000000000000000000000017061800000000000000000000000000000000000000000287000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000794571600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ctxt143065482btime1399128388processes273975procs_running2procs_blocked0softirq1606137219203618976240428154322719073190739900721311290249215904323

主要有用的是首行,记录了各项指标在cpu中的运行时间。因为stat中记录的信息是从cpu ON开始的,所以为了更准确的记录cpu的使用情况,需要多次采样进行计算。

具体例子如下:

mesure1:cpu8000200010009000mesure2:cpu9500250015009500

在 measure 1 和 mesure 2的cpu占有率是怎样的呢?

9500 - 8000 = 1500 in user
2500 - 2000 = 500 in system
1500 - 1000 = 500 in nice
9500 - 9000 = 500 in idle

1500 + 500 + 500 + 500 = 3000 in total

因此,cpu的占有率为:
1500/3000 = 0.5 in user
500/3000 = 0.16 in system
500/3000 = 0.16 in nice
500/3000 = 0.16 in idle

具体算法可以参考这里。在Android上的实现可以看这里。


3. dumpsys cpuinfo

如果需要查询每一个进程所占用的cpu,dumpsys就是一个比较好方法了。

adbshelldumpsyscpuinfo

可以得到如下的输出:

Load:4.26/4.34/9.73CPUusagefrom10160msto4170msago:2.8%842/system_server:1.3%user+1.5%kernel/faults:50minor2.1%21434/com.xunlei.cloud:1.1%user+1%kernel1.3%1320/android.process.media:0.8%user+0.5%kernel1%1576/mpdecision:0%user+1%kernel0.6%1355/com.lbe.security.miui:service:0.6%user+0%kernel/faults:9minor0.6%23621/com.tencent.androidqqmail:Push:0.5%user+0.1%kernel/faults:22minor0.3%290/zygote:0%user+0.3%kernel/faults:68minor0.3%1151/com.android.systemui:0.1%user+0.1%kernel/faults:1minor0.3%22530/kworker/0:1:0%user+0.3%kernel0.1%139/mmcqd/0:0%user+0.1%kernel0%280/servicemanager:0%user+0%kernel0.1%289/surfaceflinger:0.1%user+0%kernel0%1751/lbesec.loader:0%user+0%kernel/faults:1minor0%2148/com.miui.networkassistant:0%user+0%kernel/faults:79minor0.1%6088/com.tencent.mm:0%user+0.1%kernel0.1%9089/kworker/u:18:0%user+0.1%kernel0.1%19414/com.android.mms:0%user+0.1%kernel0.1%23426/kworker/0:2:0%user+0.1%kernel0%29281/RX_Thread:0%user+0%kernel0.1%30361/com.tencent.qqmusic:0.1%user+0%kernel+0%24421/com.alipay.pushservice:0%user+0%kernel16%TOTAL:9.2%user+7.1%kernel+0.5%iowait

针对每一个进程都会显示出来在内核空间和用户空间的cpu占用率。


4. 使用top命令

adbshelltop

可以得到类似如下的输出:

User3%,System6%,IOW0%,IRQ0%User10+Nice0+Sys20+Idle276+IOW0+IRQ0+SIRQ0=306PIDPRCPU%S#THRVSSRSSPCYUIDName30103010%R11532K780Kshelltop2605302%S25849976K26156Kbgu0_a66com.xunlei.cloud132021%S37874656K37748Kfgu0_a13android.process.media157600%S67620K824Kroot/system/bin/mpdecision2362100%S20873480K28028Kbgu0_a65com.tencent.androidqqmail:Push3036100%S48907172K71524Kbgu0_a68com.tencent.qqmusic2927900%S10K0KrootMC_Thread908900%S10K0Krootkworker/u:1884200%S101993364K79128Kfgsystemsystem_server115100%S35911524K63992Kfgsystemcom.android.systemui...

这里有一个android上的实现

更多相关文章

  1. Realm for Android(安卓)简单使用
  2. 天天记录 - Android(安卓)addView源码分析
  3. 开源项目 log4android 使用方式详解
  4. RK系列SDK -- 多路设备同时输出声音(Android)
  5. Android采坑记录-自动更新APK出现No Activity found to handle I
  6. android资源文件中xliffg:g的用法
  7. Android(安卓)ContentProvider和getContentResolver
  8. android uiautomator学习(一)创建工程
  9. Android菜鸟笔记-Fragment日常使用记录

随机推荐

  1. android eclipse的环境配置
  2. 安卓ADT项目及升级AS(Android(安卓)Studi
  3. Android(安卓)命令窗口中adb常用命令
  4. Android(安卓)2.0 API 读取通讯录中电话
  5. Android(安卓)消息机制问题总结
  6. android入门环境配置
  7. Android(安卓)- Parcelable接口用法 和
  8. APICloud SuperWebView融合Android原生平
  9. Android源码配置默认输入法
  10. Android(安卓)Studio中配置AndroidAnnota