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:[email protected]

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

时间: 06-09

android性能优化实战前篇的相关文章

android性能优化实战理论篇

本文地址:http://blog.csdn.net/iamws/article/details/51636175 第二篇:理论 通过之前前篇介绍的工具,我们知道了应该怎么样去获取要分析的数据,但是也仅仅局限在于怎么样获取数据,而没有深入数据分析,这一篇主要讲解的是UI刷新这块部分android理论知识,有了这些知识后,对于上面的数据该怎么分析,你就胸有成竹了. ps:本文只是个人理解后的总结,并不会深入源码层次分析,如有错误,还请麻烦各位帮忙指正~ 这篇文章要解决的理论问题如下: 1.什么是内存

Android 性能优化探究

使用ViewStub动态加载布局,避免一些不经常的视图长期握住引用: ViewStub的一些特点: 1. ViewStub只能Inflate一次,之后ViewStub对象被置空:某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了. 2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中. 基于以上的特点,那么可以考虑使用ViewStub的情况有: 1. 在程序的运行期间,某个布局在Inf

Android性能优化典范(二)

原文出处: 胡凯的博客(@胡凯me)   欢迎分享原创到伯乐头条 Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓存,重用,PNG压缩,自定义View的性能,提升设置alpha之后View的渲染性能,以及Lint,StictMode等等工具的使用技巧. 下面是对这些课程的总结摘要,认知有限,理解偏差的地方请多多指教! 1)Battery

android app性能优化大汇总(google官方Android性能优化典范 - 第2季)

Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓存,重用,PNG压缩,自定义View的性能,提升设置alpha之后View的渲染性能,以及Lint,StictMode等等工具的使用技巧. (1)Battery Drain and Networking 对于手机程序,网络操作相对来说是比较耗电的行为.优化网络操作能够显著节约电量的消耗.在性

Android性能优化典范 - 第2季

Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓存,重用,PNG压缩,自定义View的性能,提升设置alpha之后View的渲染性能,以及Lint,StictMode等等工具的使用技巧. 下面是对这些课程的总结摘要,认知有限,理解偏差的地方请多多指教! 1)Battery Drain and Networking 对于手机程序,网络操作相对来说是

Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降低了OOM发生的概率.然而,在图片加载方面我们是否可以就此放松警惕了呢? 开源图片加载库能为我们解决绝大部分有关图片的问题,然而并不是所有! 首先,图片从来源上可以分成三大类:网络图片.手机图片.APK资源图片.网络图片和手机图片都在图片加载库功能的覆盖范围内,基本上不用开发者太操心,但是APK资源

Android性能优化的一些理解

前言 Android性能优化对Android程序的维护和拓展是有很大帮助的,我们知道Android手机不管是内存还是CPU都无法同PC相比,这也就意味着我们必须要谨慎的去使用内存和CPU资源.因为稍稍不注意可能就会引发诸如OOM.ANR.内存泄漏等问题,所以熟悉Android性能优化的几个方法可以有效地提高应用程序的性能,我们可能都能说出一些性能优化的方法,比如布局优化.绘制优化.线程优化等等,但是可能我们会忽视某些小细节,比如布局优化我们可能都知道可以使用< include >来减少布局的层

Android 性能优化

上周四参加了MDCC大会的 Android,我比较关注的5R,做一个安静的app,图片缓存以及React Native For Android,其中很大一部分的内容都是讲的性能优化,后续还会给大家带来一篇React Native ,下面就来总结一下Android性能优化方面的内容! Reduce Cache/Drawable load in demand bitmap - scale/format Reuse pools inBitmaps convertView onDraw / for Re

Android性能优化系列之apk瘦身

Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好,包最小的),所以apk的瘦身优化也很重要,本篇博客将讲述apk瘦身的相关内容. 包体分析 在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包 可以看到占用空间的主要是代码.图