概述
目前暂时没有具体的开发任务,正好接手了一个代码质量还算可以的项目,老大发话说你们不能那么闲!去搞搞性能优化吧!(没具体事做的时候优化真是万金油任务),因为之前也接触过一些优化方面的东西,于是乎一顿google+baidu搜集了一些资料,也记录下了这篇笔记。
内容
性能优化方向(能做什么?
性能优化主要是通过技术手段,提升APP的整体性能,提升用户体验。主要体现在页面打开更快了,占用内存更小了,耗电更少了,占用CPU等资源减少了,APP更流畅,稳定,省电省流量,安装包更小,让用户有更好的体验,主要可以从如下几方面入手:
1、渲染问题:过度绘制,布局冗余
2、内存问题:内存浪费,内存泄露
3、功耗问题:CPU负载率,耗电量
4、响应问题:ANR发生率,网络访问速度,页面跳转速度
5、APK体积问题:APK瘦身,安全性
6、启动问题:安装启动,冷启动,热启动
7、可读性问题:代码整洁,逻辑复用,必要的注释
性能优化指标(要达到怎样得目标?
1、渲染
- 滑动流畅度:FPS,即Frame per Second,一秒内的刷新帧数,越接近60帧越好;
- 过度绘制:单页面的3X(粉红色区域) Overdraw小于25%;
2、内存
- 内存大小:峰值越低越好,需要优化前后做对比
- 内存泄漏:不能存在内存泄露,需要用工具检查对比优化前后
3、功耗
- 单位时间内的掉电量,掉电量越少越好,暂时没有找到固定标准。
- 记录不同操作情况下CPU负荷,不能在无操作时长时间高负荷
4、响应
- 待机和连续操作超过48小时后,无闪退、卡顿、崩溃、黑白屏、网络劫持、不良接口、内存泄露
5、APP启动
- 启动时间:Activity界面启动时间,一般低于300ms;APP启动一般低于800ms
性能分析工具(有哪些成熟得方案?
1、Android Profiler
Android Studio自带的内存分析工具,可以检测内存泄露,内存抖动等情况,并可以借助其分析是什么类造成的泄露。
这是以Android studio 3.0 为例,可以点击查看具体的CPU,Memeory信息,并且可以点击“小红点”,Record一段时间的信息,查看具体的堆栈情况。
2、LeakCanary
检测内存泄露的三方库,依赖到项目中,操作界面可以检测内存泄露情况。
3、TraceView
Android Studio自导的一个很好的性能分析工具,可以通过图形化的方式让开发者了解CPU,网络,内存的使用情况。
4、GT
Android版是腾讯 MIG 专项测试组自行研发的 Android APP 随身调测平台,它是直接运行在手机上的“集成调测环境”,可以看一个APP的 CPU、内存、网络流量、流畅度/帧率、电量等基础性能指标的实时展示、历史数据采集及 excel 格式存储、曲线绘制。
5、ADB命令
通过ADB命令获取CPU、内存等使用情况例如使用adb shell am start -W com.xxx.xx >> d:\time.txt 获取冷启动时间
1)ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
2)TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
3)WaitTime:一般比TotalTime大点,包括系统影响的耗时。
性能优化方案(怎么做?
1、渲染问题
过度绘制
- 移除或修改Window默认的Background
- 移除XML布局文件中非必需的Background
布局冗余 - 减少RelativeLayout使用
- 用merge标签来合并布局,减少布局层级
- 使用ViewStub实现动态加载
2、内存问题
内存浪费
- 对象个数千以内,没有频繁的插入删除操作尽量使用ArrayMap代替HashMap
- 使用SparseArray用以key是int的情况避免自动装箱
- 尽量减少使用Enum,因为它会增加包体积和占用内存
- 频繁拼接字符串时,使用StringBuffer或StringBuilder
- 字符串截取尽量少用sqlute,采用subString和StringTokenizer
内存泄露 - 减少匿名内部类造成的泄露,例如Handler,要使用static+WeakReference来避免泄露
- 尽量使用ApplicationContext,减少使用ActivityContext
- regist后要unregist
- 关注Cursor对象是否及时关闭
- WebView造成的内存泄露问题
3、功耗问题
- 优化部分逻辑的算法复杂度,实现难度大,优先级可放低
4、响应问题
- 将一些复杂的可以异步处理的逻辑放到别的线程中处理,可利用RX特性
- 网络请求按照CPU核心数控制请求并发量
5、APK打包问题
APK瘦身
- 清理无用资源,特别是一些无用图片
- 清理三方库中冗余代码,只需保留在使用的功能
- 尽量使用压缩过的图片,可以考虑webp也可以考虑svg绘制
- 使用着色方案减少单纯是颜色不同的图片的使用
- lib库优化,去掉除目标cpu架构外的其余so文件
- 使用混淆策略
6、启动问题
- 排查Application的onCreate,将不用再此做的工作移到别处或延迟加载
- 优化Activity的UI层级,提升渲染速度
7、可读性问题
- 小心整理逻辑混乱,代码整洁性差的代码块
- 添加必要的方法和属性注释
总结
主要搜集了一下网络上各路大神的优化方案,主要为解决APP卡顿,耗费性能问题和提高用户体验,在渲染、内存、启动时间等方面做的很多优化方案。
有些文章只提到了其中渲染、内存等某几点,这里做了一个总结,并搜集了性能分析工具,和针对不同问题下的优化方案。文章摘录了其中一些解决方案,参考文献在文章末尾,特别感谢这些同行的经验分享。
参考文献
HashMap,ArrayMap,SparseArray源码分析及性能对比
Android性能全面分析与优化方案研究—几乎是史上最全最实用的
Android性能优化篇之内存优化–内存泄露
Android开发者选项——Gpu呈现模式分析
Android性能优化–小心自动装箱
Android性能优化篇:Android中如何避免创建不必要的对象
WebView内存泄漏–解决方法小结