谈到安卓应用优化,不得不提一个工具——DDMS,DDMS的主要作用就是检测一段时间内cpu的占用率,精确到各个方法的占用时间,通过DDMS发现主线程被过分阻塞的方法,找到这些容易阻塞主线程的方法,可以通过合理的子线程调度来完成耗时操作,达到提高应用流畅度的目的
两段测试代码
Debug.startMethodTracing("testApp");
Debug.stopMethodTracing();
根据需要在程序中插入以上代码,第一行标识trace检测过后,生成名为testApp.trace的文件,需要通过指令
adb pull /sdcard/testApp.trace D:/temp
把trace文件输出到D盘,可以自定义输出目录
打开sdk目录下的D:\AS_sdk\tools,双击monitor.bat,打开DDMS,在DDMS中打开刚刚输出的文件
左上方是线程目录
右上方是cpu占用描述
主要指标说明:
Incl(Inclusive) Cpu Time
方法本身和其调用的所有子方法占用CPU时间.
Excl(Exclusive) Cpu Time
方法本身占用CPU时间.
Incl Real Time
方法(包含子方法)开始到结束用时.
Excl Real Time
方法本身开始到结束用时.
Call + Recursion Calls/Total
方法被调用次数 + 方法被递归调用次数.
Cpu Time/Call
方法调用一次占用CPU时间.
Real Time/Call
方法调用一次实际执行时间.
底部就是各个方法调用的明细,粗略看有几百个方法,一脸懵逼!其实大多数都是java提供的api,自己项目真正被调用的方法并不多
如何入手,看第一行,默认按照降序排列,第一行就是toplevel——整个app的cpu占用时间,点击toplevel就会展开内部到底有多少个方法被调用,被展开的方法,都是在同一个线程里面按照顺序被调用的,可以对比Incl Cpu Time来寻找耗时操作,再想办法把他们丢到子线程里面去(需要考虑数据共享和同步的问题),基本上涉及到IO操作的,网络,集合运算,都是耗时操作。开太多子线程怎么办,用线程池进行管理吧!
https://my.oschina.net/carbenson/blog/2875291