谈一谈Android应用性能优化
朝阳杨少爷(ID:CY_YANG_DA_YE),专注于Android领域的开发者、分享者。
Android的性能优化
随着 Android 应用的开发,上线到越来越多的人开始下载,使用APP,对于不同手机,不同用户来说使用的体验可以说是决定这个用户是否还会继续使用这款APP最重要的衡量标准。
比如:
- 手机使用APP越来越卡
- 手机莫名的发烫
- 网络问题,内容加载不出来
- 手机掉电十分得快
而要提升用户的体验,就不得不说要对 Android 应用的性能进行优化。
当对于性能优化有一个很好的提升,那么就可以很好的改善Android应用的产品体验,同时面对各种各样的竞品来说,使用体验越好,才会吸引越来越“挑剔”的用户。
那么可以通过这篇文章,可以了解到那些地方我们可以优化?性能优化的指标是什么?性能优化的工具有哪些?
值得优化的地方
之前,介绍了性能优化的重要性,那么接下来我们聊一聊那些地方可能造成性能优化,只有知道了那些地方可能引起性能方面的问题,我们才能更加有针对性的进行优化。
- 冷启动的时间
- 三方SDK使用不合理的地方
- 代码当中是否频繁的调用创建新的实例
- APP是否存在过渡绘制的问题
- 应用的监听,广播是否关闭
- Handler、Observer、AsyncTask等非静态内部类导致的内存泄露
- IO操作完成没有关闭的地方
- 网络请求不合理导致功耗的问题
- 后台服务常驻导致功耗的问题
性能优化的流程
说到底, 遇到了问题自然就要想如何解决这些问题。
解决问题的时候,要尽可能用数据说话,要有足够的多的测试来验证这个问题。
很多问题,在性能比较好,配置比较高的手机很难复现出来,所以我们可以选择一些低配置的设备进行测试。
对于性能的改善,也一定要保证Android应用的稳定,不能因为改善一个问题导致其他的问题。
graph TD
发现问题 --> 定位问题
定位问题 --> 解决问题
解决问题 --> 验证问题
这也是我们在解决BUG常用的一个流程方式。
导致性能优化现象、原因以及工具。
性能 | 现象 | 导致原因 | 检测工具 |
---|---|---|---|
冷启动速度 | 黑、白屏,首帧出现慢 | 布局复杂,主线程阻塞,过度绘制,初始化太多内容 | Hiearchy Viewer,StrictMode,TraceView,Hugo |
流畅度 | 应用卡顿 | 过度绘制,主线程阻塞,手机内存不足,GC异常 | StrictMode,TraceView,Hugo |
内存 | 整机慢 | 内存占用过多,内存泄露 | Leakcanary |
功耗 | 发烫,掉电快 | 硬件持续高负荷工作,频繁的网络访问,频繁的界面刷新,长时间不待机,后台服务持续工作 | Android Studio开发者选项 |
解决方向
冷启动的速度
从Nimbledroid当中统计到APP冷启动的平均耗时基本都在3秒以内,甚至更快的都在2秒以内。
导致冷启动速度较慢的原因
问题:布局复杂、过度绘制
解决办法:去掉Window背景、增加一个启动背景、去掉复杂布局例如:merge、ViewStub、space、CoordinatorLayout
问题:UI阻塞
解决办法:启用子线程例如:AsyncTack、HandlerThread、IntentService、ThreadPool
流畅度优化
问题:布局复杂、过度绘制
解决办法:去掉Window背景、增加一个启动背景、去掉复杂布局例如:merge、ViewStub、space、CoordinatorLayout
问题:UI阻塞
解决办法:启用子线程例如:AsyncTack、HandlerThread、IntentService、ThreadPool
问题:整机内存
解决办法:内存泄露优化(非静态内部类、静态代码检查、系统SDK泄露)
问题:内存占大
解决办法:合理的进行缓存,压缩图片,并把图片放在合理位置
功耗优化
问题:频繁的网络请求
解决办法:网络请求合并,改善网络请求策略
问题:频繁的界面刷新
解决办法:适当的缓存,触发式的响应刷新
问题:长时间不待机
解决办法:合理的使用WakeLock,关闭Service
问题:后台持续工作
解决办法:系统进行优化
最后
如果有任何问题,想法欢迎给我留言讨论。
看到后我会第一时间回复。