您的位置:首页 > 移动开发 > Android开发

android性能优化实战前篇

2016-06-11 03:55 465 查看
本文地址:http://blog.csdn.net/iamws/article/details/51629160前言:最近因为某项目cpu,内存的使用率实在让人不敢恭维;手机发烫,电量下降已经让用户无法忍受;频繁快速迭代发版导致各种性能问题突出;由于之前产品不考虑低端手机情况,低端手机直接跑到崩溃,直接体现的是DAU的急速下降;最终在竞品的对比数据下,开始重视这块事情了,也给了我们半个月时间去优化性能。目标:性能达到并且低于竞品的消耗值,并且能让低配用户也能玩起来。这就是这篇文章的来源了,算作这一阶段优化后的个人总结吧,切入正题:我们都知道在短时间大改动的产品迭代期,性能问题会比较突出,特别是敏捷新功能开发,由于每个开发者都有自己的思维,最终如果在没有好的框架约束下,问题就会越来越多,滚雪球般,体现最明显的就是内存泄漏,布局层次过深,measure计算过多,动画绘制问题,io,自定义控件的draw里面对象创建,线程滥用,handler里面丢了个外部对象不清除,内部类与匿名类问题等,所以实战的第一步就是定位问题,而定位问题,最好的就是使用各种成熟工具:首先介绍一下常用工具:1、android studio/intellij里面的内存,cpu监控器2、DDMS里面那一排的功能3、MAT4、手机的开发者模式下的各种选项5、fiddle/wireshark等一些抓包的代理工具6、其他辅助工具等相信这些工具网上一搜一大把教程,不过这里我还是啰嗦下,毕竟用好工具是最重要的一步(因为解决大多性能问题就要靠技术积累去了解并改动代码实现了):ps:下面只是简单介绍各个工具的功能,不会涉及过多工具的使用方法,如果需要查看使用方法的话麻烦大家google一下,如果对这些工具都比较熟悉的就可以不用看下面了,等接下来后续的实例分析和总结吧(┬_┬)第一个,直接用IDE的cpu,内存监视器,也就是下图的这些monitor启动方法:通过运行app的过程中观察整个图表变化,如果有性能问题的可以很明显的看到线的走势图会出现异常,这个是最简单的查看器。可用于查看:GC过程,内存分配,cpu使用real time等Show a graph of available and allocated Java memory over time.
Show garbage collection (GC) events over time.
Initiate garbage collection events.
Quickly test whether app slowness might be related to excessive garbage collection events.
Quickly test whether app crashes may be related to running out of memory具体使用方法可见官方文档:
https://developer.android.com/studio/profile/am-memory.html https://developer.android.com/studio/profile/am-cpu.html
第二个:DDMS(重点)启动方法:这个里面功能很全,debug,抓布局,截屏,线程,抓性能数据,GPU样样都有,基本也是优化过程中用的最多的工具了1、debug开关2、在13(heap viewer)中显示当前内存状况3、抓取当前时刻进程中内存数据,是dump下来hprof文件,这个文件就是要结合后面重点的MAT工具用来分析内存用的(重点)4、垃圾回收,立即GC5、在12(thread viewer)当中显示当前进程里面所有线程的运行状态(重点)6、可以抓取一段时间内整体cpu使用状况(Traceview),用来分析方法在cpu的消耗情况(重点)7、停止8、截屏9、获取当前手机布局整体的纬度,用来分析UI嵌套绘制树(重点)10、这个工具需要积累一定的系统知识才能用的好,特别是要知道那些方法是处理界面UI,那些是处理资源调度什么的,因为这是对系统整体的综合追踪,开启过程中可以自己过滤一些分析对象,最终会生成一个网页文件,通过浏览器可以看到里面的图表结构,我主要是用这个分析webview的性能和vsync下UI卡顿原因的,这个vsync是什么后面会讲11、分析GPU的绘制(硬解码好东东,分担cpu的)12、线程展示框13、内存展示框14、对象分配展示框15、网络使用框16、文件浏览框17、模拟机avd控制器18、整体系统状态饼状图(CPU,内存,frame)第三个MAT工具:图标长的像eclipse的家伙,以前用eclipse可以直接从里面打开,好像这个工具就是eclipse这边搞的(错了勿喷哈)工具官方地址:http://www.eclipse.org/mat/这个工具作用很重要,分析内存泄漏,还有整体内存状态就靠它了打开上面我们用DDMS第三个功能dump下来的hprof文件后如下图样子:(原谅我从官网偷的图,注意ddms抓的hprof文件要用到android sdk的tools下面的hprof-conv.exe转换一下才行)从这个工具里面我们可以看到当时应用中有哪些对象,而且用这个工具可以跟踪整个对象在GC root下整体引用过程,这块知识需要用到java的GC原理,用这个工具主要是用来找内存泄漏的,也就是通过这个工具,我可以知道应该要被回收的对象,为什么没有被回收,它的引用树是什么样的,这样就能去代码中定位问题所在了,还有可以用这个工具看看对象内存的使用情况,分析哪些对象可以用对象池,哪些对象new的数目特别多等第四个:安卓手机里面的开发者模式这个工具可以直接很直观的看过度绘制,cpu内存使用情况,各个布局的边界,surface更新闪烁,不保留活动等,主要用来直观的看出APP的运行状况,还有home回首页后的activity调试,重点主要还是分析过度绘制下面给出开启了过度绘制验证时候的界面颜色分析图吧:ps:无色还有可能是用了surfaceview这种另外的window层第五个:抓包工具:这个主要是针对webview,还有各种网络通信的时候使用,用来分析包的情况还有数据请求情况,可以发现很多请求是否必要或者能够减少请求频率,减少回复大小,达到减少解析或者压缩的cpu损失fiddle工具如图:左侧为请求区,右侧为协议内部内容,这个主要是对http和https的第六个:其他工具先说一个:电量统计battery-historian地址:https://github.com/google/battery-historian这个工具依赖万能的adb,其他工具实际上也就是都利用adb的,只不过更视图可视化了,如果adb用的溜,那确实可以直接在命令行中就可以看很多数据了这里就举例说下性能调试中对电量使用获取的方法吧:先初始化
adb shell dumpsys batterystats --enable full-wake-history
shell dumpsys batterystats --reset
然后运行app一段时间后利用bugreport日志可以导出
adb
bugreport > bugreport.txt
打开txt可以找到这段话这个就是可以看出电量使用情况了,但是既然说了上面有个工具,那肯定要用上啦,
使用上面的工具转换成html可以更方便查看(ps:上面的工具是python的,需要配置下python环境)
python historian.py -a bugreport.txt > batteryhistory.html


原谅我盗用了作者的图,里面可以统计很多信息:
[/code]
具体要分析什么,大家可以看github上作者对每个功能的详细介绍吧。
好了,性能分析前篇准备工作就是熟悉工具,以及会使用工具抓分析数据,接下来就是一些理论和实战的东西了,工具分析就到这了,如果大家需要我出一套工具的详细使用方法那就多留言吧,我争取可以抽时间出来针对每一个工具都做个详细分析~
author:iamwsbear@gmail.com
转载必须注明出处:本文地址:http://blog.csdn.net/iamws/article/details/51629160

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息