android应用开发使用java语言,java是开发门槛比较低,运行效率比较低,开发人员的素质相差比较大。导致java程序开发容易,优化和维护比较困难。个人认为java的核心在于自动化内存管理和跨平台,但其诟病也在这一块,至于效率,随着硬件的发展,越来越不再是人们考虑的重点。很多人会写java程序,却不怎么会优化java程序,遇到内存泄露,遇到空对象,遇到超时,遇到概率性的内存BUG,常常无从下手。因为能解决这些问题的工具实在太多了,这也说明java的优化是个世界性问题,问题的表象可能一个,但实质上引起的原因可能不只一种,需要选择正确的工具才能找到问题点,用错了工具还是两眼抓瞎。不像C语言一个内存,一个堆栈调试可以解决大部分的程序问题。
公司有个WOSLauncher的启动器项目,产品经理认识操作时动画不流畅,开发的同事搞了一个多月,重构了大量代码,效果依然不理想。拿到我这里,优化三剑客一开,立刻找到问题点,几分钟后,优化效果立竿见影。我认为anroid优化的三剑客是systrace,traceview,hierarchyviewer,这三个工具可以解决了我工作中所有程序的优化。
我无意去对别人的代码重构,这需要太多的时间,也不想去review项目组同志的所有代码,这同样需要花费很多的时间。直接使用工具。
1.首先使用开发者模式自带的使用GPU过度绘制分析UI性能(开发者模式,布局优化)
硬件加速,打开 “Show hardware layers updates” 选项。(开发者模式,变绿未加速)
使用GPU呈现模式图及FPS考核UI性能研究,发现问题都不是很大
2.使用systrace研究,操作后获得如果结果,图中的红点和黄色表明系统确实滑动不够顺滑,
点击红点使用M键,发现问题大概集中在三个方面,布局measure,CPU delay,view ondraw
3.使用hierarchyviewer工具可以优化布局,查找measure,layout,ondraw存在的性能问题,然后打开后就发现,存在红点的view都是有性能问题,然后发现布局出在shortcut上,最终定位在google的文件夹上。他有两个view,一个ondraw超时,花费了1.234MS,一个layout超时,花费了0.597毫秒,这个谷歌的一个文件夹,可能需要寻找替代方案
无法贴图
3cpu的Scheduling delay问题,一般表示CPU比较忙,这个可以通过traceview分析,抓取traceview后分析,得到如下界面
无法贴图
这个工具可以显示APP中所有函数的执行时间,一般情况下,我们需要优化两类函数,一是调用次数少,但每次花费时间长的函数,另一是本身花费时间不长,但调用次数非常多,使得本身消耗了大量的时间,优化的方法主要是重构code,修改算法,寻找替代方案
点击CPU TIME/call列可以使得所有函数每次调用消耗的平均时间按升序或者降序排列,点击calls+recurcalls/total可以得到函数调用和递归调用的总次数和升序或者降序排列,一般可以直接略过非我们APP自定义类的系统的函数,直接研究我们自己包名类名的函数。
然后找到了一个耗时函数createMediumDropShow函数,这个函数使用了特效,开启了extractAlpha,这是个很消耗时间的功能。createMediumDropShow本身消耗的时候占了整个周期片断的百分之三点四之多。尝试打开代码优化之。去掉特效或者寻找替代方案后,再观察。
4.打开systrace工具观察优化的成果,发现黄点和红色消失了大半。
5.尝试把google文件夹移到固定栏上,不随动画重绘再测试,红色警告全部消失
6.进一步优化黄色警告
7.打开traceview,发现onMeasure成了耗时大户,进一步使用开发模式里的GPU过度绘制分析,发现有不太严重的过度绘制问题,ICON下的软件名字字体呈现红色,这是过度绘制的标志。慢慢优化
8打开hierarchyviewer工具再次分析,红色都是有问题的布局,找到这些layout文件,去掉嵌套,优化过于巨大的图片,androidstudio对于布局,会给很多有用的建议。优化后运行之。