在开发过程中,我们会遇到手机的CPU使用率过高而引发的问题,那接下来,我对这方面知识做些整理及归纳
1. CPU使用背景知识:
CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。
而Android关于进程使用率的限制:
前台进程不超过95%,后台进程5%, 但是在系统没有前台进程时,后台进程可以超过5%
(关于什么是前/后台进程,我就不啰嗦了)
2. 可能引发的问题
CPU使用率过高,CPU过于繁忙,会使整个手机无法响应用户,整体性能降低,用户体验就会很差,也容易引起ANR等等一系列问题。
3. 解决方案
a. 如果已经导致ANR, 则去log里面搜索"ANR in"
b. 没有导致ANR则
先看看当前CPU使用状况,看看是不是别人占太多了,把CPU用得太狠
adb shell top
User 19%, System 16%, IOW 0%, IRQ 0%
User 63 + Nice 0 + Sys 53 + Idle 200 + IOW 1 + IRQ 0 + SIRQ 0 = 317
PID PR CPU% S #THR VSS RSS PCY UID Name
187 0 14% S 19 72560K 8484K fg system /system/bin/surfaceflinger
7499 0 4% S 40 385420K 54392K bg 9992 com.htc.album
19792 0 3% R 1 1128K 468K fg root top
注:PCY就是显示是前台进程(fg)还是后台进程(bg)
如果还是自己应用的问题,则使用TraceView进行debug
TraceView说明(摘自网上)
TraceView
1)功能:用于热点分析和性能优化,分析每个函数占用的CPU时间,调用次数,函数调用关系等
2)方法:
a)在程序代码中加入追踪开关
import android.os.Debug;
……
android.os.Debug.startMethodTracing(“/data/tmp/test”);// 先建/data/tmp目录
……// 被追踪的程序段
android.os.Debug.stopMethodTracing();
b)编译,运行后,设备端生成/data/tmp/test.trace文件
c)把trace文件复制到PC端
$ adb pull /data/tmp/test.trace ./
d)使用android自带工具分析trace文件
$ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace
此时可看到各个函数被调用的次数CPU占用率等信息
e)使用android自带工具分析生成调用关系类图
$ apt-get install graphviz# 安装图片相关软件
$ANDROID_SRC/out/host/linux-x86/bin/dmtracedump -g test.png test.trace
此时目录下生成类图test.png
3)注意
trace文件生成与libdvm模块DEBUG版本相冲突,所以此方法只适用于对非DEBUG版本模拟器的调试,否则在分析trace文件时会报错
通过上述方法找到占用CPU过高的代码,根据之前的知识(后台进程CPU使用率 < 5%),把该代码段放到后台进程中执行或开低优先级的Thread去执行。