android性能优化实战前篇

本文地址: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







  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值