码迷,mamicode.com
首页 > 移动开发 > 详细

android性能优化实战前篇

时间:2016-06-11 07:08:54      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:

本文地址:http://blog.csdn.net/iamws/article/details/51629160


前言:

        最近因为某项目cpu,内存的使用率实在让人不敢恭维;手机发烫,电量下降已经让用户无法忍受;频繁快速迭代发版导致各种性能问题突出;由于之前产品不考虑低端手机情况,低端手机直接跑到崩溃,直接体现的是DAU的急速下降;最终在竞品的对比数据下,开始重视这块事情了,也给了我们半个月时间去优化性能。


目标:

       性能达到并且低于竞品的消耗值,并且能让低配用户也能玩起来。


这就是这篇文章的来源了,算作这一阶段优化后的个人总结吧,切入正题:我们都知道在短时间大改动的产品迭代期,性能问题会比较突出,特别是敏捷新功能开发,由于每个开发者都有自己的思维,最终如果在没有好的框架约束下,问题就会越来越多,滚雪球般,体现最明显的就是内存泄漏,布局层次过深,measure计算过多,动画绘制问题,io,自定义控件的draw里面对象创建,线程滥用,handler里面丢了个外部对象不清除,内部类与匿名类问题等,所以实战的第一步就是定位问题,而定位问题,最好的就是使用各种成熟工具:


首先介绍一下常用工具:

1、android studio/intellij里面的内存,cpu监控器

2、DDMS里面那一排的功能

3、MAT

4、手机的开发者模式下的各种选项

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、垃圾回收,立即GC

5、在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

原谅我盗用了作者的图,里面可以统计很多信息:
技术分享


具体要分析什么,大家可以看github上作者对每个功能的详细介绍吧。


好了,性能分析前篇准备工作就是熟悉工具,以及会使用工具抓分析数据,接下来就是一些理论和实战的东西了,工具分析就到这了,如果大家需要我出一套工具的详细使用方法那就多留言吧,我争取可以抽时间出来针对每一个工具都做个详细分析~


author:iamwsbear@gmail.com

转载必须注明出处:本文地址:http://blog.csdn.net/iamws/article/details/51629160







android性能优化实战前篇

标签:

原文地址:http://blog.csdn.net/iamws/article/details/51629160

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!