Android获取CPU使用

获取CPU情况方法

CPU是性能优化其中一环,对常规的CPU收集手段整理并进行沉淀。
代码:CpuDumper

一、CPU占用

1、proc/stat

  • proc/stat节点记录的是系统进程整体CPU的统计信息
  • 文件中的时间单位,sysconf(_SC_CLK_TCK)一般地定义为jiffies(一般地等于10ms)
  • 总的cpu时间 = 前七个变量(user, nice, system, idle, iowait, irq, softirq)之和
  • 上述时间为一个累计时间,需要在两个时间点分别读一下cpu快照,设为total_time_old 和 total_time_new,则两个值相减即为这段时间内的总CPU时间total_time_delta,然后想办法读一个进程或线程在相同时间段内的cpu时间proc_time_delta, 则该进程或线程的cpu使用率即为( proc_time_delta / total_time_delta )* 100%
  • 项目代码:CpuDumper.dumpSystemRate

2、/proc/[pid]/stat

  • 记录的是pid进程整体的CPU统计信息
  • 总的cpu时间 = 第14、15个变量(utime:该进程处于用户态的时间、stime:该进程处于内核态的时间)之和
  • 项目代码:CpuDumper.dumpAppRate

3、/proc/[pid]/task

  • 记录的是pid进程中各线程的CPU统计信息
  • 各线程总的cpu时间 = 第14、15、16、17个变量(utime + stime + cutime + cstime)
  • 项目代码:CpuDumper.dumpAppThreadCpu

4、统计

计算某一进程或线程的CPU使用率:

  • 在不同时间点,取得上述3个文件的记录的CPU时间, 各自相减,获得deltaSys,deltaApp,deltaThread
  • 进程使用率:deltaApp/deltaSys,线程使用率:deltaThread/deltaSys

5、附:top 命令

  • 获取当前系统各进程或其中线程CPU占用情况

  • 常用:
    adb shell top -s cpu -m 10 -t
    adb shell top -s cpu -m 10 -t |findstr packagename

  • Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ] 、
    -m num Maximum number of processes to display. 最多显示多少个进程
    -n num Updates to show before exiting. 刷新次数
    -d num Seconds to wait between updates. 刷新间隔时间(默认5秒)
    -s col Column to sort by (cpu,vss,rss,thr). 按哪列排序
    -t Show threads instead of processes. 显示线程信息而不是进程
    -h Display this help screen. 显示帮助文档

  • 项目代码:cpuDumper.dumpTop(5000, stream);

    二、堆栈获取

    参考系统ANR时,通过kill -3 pid 和debuggerd pid来获取堆栈信息

    1、获取Java堆栈(1)

  • 接口Thread.getAllStackTraces().entrySet()

  • 项目代码:cpuDumper.dumpJavaStack()

2、获取Java堆栈(2)

  • 命令adb shell su kill -3 pid
  • 获取Java线程堆栈
  • 需要root
  • Dump的堆栈信息保存在/data/anr/traces.txt中
  • 项目代码: kill3Cmd.dump()

3、获取Native堆栈

  • 需要root
  • 命令adb shell su debuggerd -b pid
  • -b为输出到console,否则输出到/data/tombstones/(该目录只会存放10个文件,多出会进行覆盖)
  • 项目代码:cpuDumper.dumpNativeStack()

三、Android Profiler:

四、附件

五、参考