前言:
前面两篇文章主要是讲关于activity、fragment生命周期方面的总结,这篇文章主要是总结在android应用开发过程的优化方案,还有一些常用的优化工具。优化的方向包括:启动速度、界面流畅性、内存使用情况、apk体积、耗电量、流量等方面。
app启动速度
1、通过style 设置一个默认的启动图来过度,从交互体验上来提高启动速度
2、分析application和首屏的业务逻辑异步初始化第三方组件,防止阻塞主线程(或者延迟初始化(用的时候再初始化))
3、闪屏的2秒停顿可以利用起来,把一些耗时操作延迟到这里来初始化
4、同工具DDMS中的TraceView来检测耗时的点在哪里,做针对的处理
5、mainActivity的onCreate流程,特别是UI的布局与渲染操作,如果布局过于复杂很可能导致严重的启动性能问题;(可以考虑先把mainActivity需要的数据请求回来),根据首页的结构可以考虑懒加载。
Android APP启动优化: wuxiaolong.me/2017/03/13/…
App启动速度优化之耗时检测处理: www.jianshu.com/p/a0e242d57…
使用 TraceView 找到卡顿的元凶: blog.csdn.net/u011240877/…
上面的几篇文章基本上描述了应用的启动流程,如何优化白屏,检测耗时以及一些SDK的懒加载等等...
界面流畅性
1、谈到UI流畅度,一般就是不要在主进程去做耗时的操作,提升UI的绘制速度(减少View的布局层级,避免过渡绘制等)
2、merge、include、ViewStub标签的合理使用减少布局层级
3、自定义view的ondraw里面不要做耗时的任务
Android UI性能优化实战 :blog.csdn.net/lmj62356579…
性能优化之布局优化: www.trinea.cn/android/lay…
当然了对于UI卡顿,不可避免的要引入检测的方案:
方式1:一般有监听Looper的日志
方式2、利用Choreographer
当然也相应的有一些开源工具:
github.com/markzhai/An… [方式1]
github.com/wasabeef/Ta… [方式2]
github.com/friendlyrob… [方式2]
内存优化
内存优化那么主要就是去消除应用中的内存泄露、避免内存抖动。
1、安卓studio的内存分析工具 + mat可以很好的检测内存抖动和内存泄露
2、常见的内存泄露情况:
● 单例:生命周期很长,会引用生命周期比较短的变量,导致无法释放。例如activity泄露
● 静态变量:同样也是应为生命周期比较长
● 非静态内部类创建静态实例造成的内存泄漏
● handler内存泄露 (解决办法:Handler 声明为静态的,则其存活期跟 Activity 的生命周期就无关了。同时通过软引用的方式引入 Activity)
● 匿名内部类(匿名内部类会引用外部类,导致无法释放,比如各种回调)
● 资源使用完未关闭(BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap)
● 复用问题(bitmap释放)
Android 内存优化总结&实践: mp.weixin.qq.com/s/2MsEAR9pQ…
Android内存优化之OOM: hukai.me/android-per…
Android应用内存泄露分析、改善经验总结: zhuanlan.zhihu.com/p/20831913
apk体积优化
代码瘦身
● 移除无用代码、功能;
● 移除无用的库、避免功能雷同的库;
● 启用Proguard;
● 缩减方法数;
●第三方开源库的瘦身,仅保留自己需要的部分
资源瘦身
● 移除无用的资源文件;
● Drawable目录只保留一份资源;
● 对图片进行压缩;
● PNG转换JPG;
● 使用矢量图;
● 使用WebP;
● 资源混淆;
● 资源在线化;
● 能不用图片的就不用图片实现,用代码实现
So瘦身
● 在允许的情况下,针对用户机型分布保留特定架构的So;
耗电量
电量是移动设备非常宝贵的资源,作为一名开发者,有必要为用户着想,减少电量的消耗.调查显示通常只有30%左右的电量是被程序核心的功能所消耗,比如界面渲染,剩下的70%则是被上报数据,位置更新,后台通知所消耗.
如何检测?
1、手机选项中通过查看APP的电量消耗的统计数据
2、使用Battery Historian Tool来查看详细的电量消耗
如何优化
●减少唤醒屏幕的次数与持续的时间,正确的使用WakeLock.
●延迟非必须的操作到充电状态时,比如日志上报完全可以在夜间充电时完成,这点可以结合JobScheduler使用
●使用传感器采集数据时,一旦不需要记得取消注册.
●减少网络通信,合并通信.
●合理使用定位功能,减少位置更新频率以及根据实际情况使用不同精度的定位需求
网络优化
现在App几乎都需要联网操作,做好网络优化一方面可以提高体验,另一方面可以减少流量和电量的损耗.另外,无论是对用户还是网络服务提供者,网络同样是一种资源,任何开发者都不应该假设网络资源是无限制的
如何检测
●使用Android Studio里的Network Traffic Tools来查看网络请求
●使用Android Studio中的Monitor,安卓studio3.0新的性能分析工具更方便
●使用Fidder或者Charles等抓包工具分析网络数据包
如何优化
●有必要的时候务必做好缓存,无论是图片还是普通的数据,使用LruCache和DiskLruCache构建自己的缓存系统,并根据实际场景设计缓存策略
●避免过度的网络同步,合并相关的网络请求
●根据实际场景确定请求策略,避免使用固定的间隔频率来进行网络操作.比如连接WiFi并充电的情况下请求频率可以高,第一次网络请求失败后可以使用双倍的时间间隔来进行下一次
●减少数据传输量,对传输的数据做压缩.如果传输的是图片,需要选择合适的图片格式以及根据显示大小请求合适规格的图片.对于普通数据,可以考虑使用ProtocalBuffers来减小传输数据的大小.