在Android优化从以下四个方面优化:
1.稳定(内存溢出、崩溃)
2.流畅(卡顿)
3.耗损(耗电、流量、网络)
4.安装包(APK瘦身)
一、内存优化
避免内存泄漏
内存泄漏就是长的生命周期对象持有短的生命周期对象!
长的生命周期:耗时操作
短的生命周期:Activity、Fragment
少量的内存泄漏会导致卡顿,内存泄漏严重会导致OOM
内存抖动
短时间内内存泄漏严重,频繁触发GC(GC触发的时候会阻塞主线程,会导致界面卡顿,如果GC来不及回收就导致OOM)
GC的触发是不定时的,由Java虚拟机控制,但是内存不足的时候一定会触发
1.1 解决内存泄漏
避免常见的内存泄漏
Handle导致的内存泄漏:
1、发送延时消息时,当Activity销毁,Handle没有移除任务,会造成内存泄漏
2、匿名内部类导致的内存泄漏
解决方案:
使用弱引用WeakReference<OnReceiveMessageListener>包裹对象
将匿名内部类用Static修饰,变成静态内部类
线程导致的内存泄漏:
开启了一个线程做耗时操作,当Activity销毁的时候,想成任务没有结束,就造成了线程的内存泄漏
解决方案:
1.在onDestory方法中将线程close掉
2.将线程改为静态内部类
三方控件未注销:
1、EventBus注册却没有注销造成的内存泄漏
在onDestory中取消注册
2、RxJava进行耗时操作,如果没有解绑会出现内存泄漏
在onDestory中使用Disposable对象移除任务
MVP存在内存泄漏:
因为context对象使用不当造成的内存泄漏
错误的使用单例:
在单例中经常使用到上下文对象,通常传的都是Activity的上下文对象
但当Activity销毁就会出现内存泄漏
把Activity的上下文对象换成Application上下文对象
1.2 内存泄漏检测工具:
- LeakCanary工具 :
LeakCanary是一个内存监测工具,该工具是Square公司出品的,
可以很明确的看出内存泄漏的地方
在Gradle里引用:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
- Memory Monitor 工具:
Memory Monitor是Android Studio自带的一个内存监视工具,它可以很好地帮助我们进行内存实时分析。通过点击Android Studio右下角的Memory Monitor标签,打开工具可以看见较浅蓝色代表free的内存,而深色的部分代表使用的内存从内存变换的走势图变换,可以判断关于内存的使用状态,例如当内存持续增高时,可能发生内存泄漏;当内存突然减少时,可能发生GC等
当发生内存泄漏的时候无法准确的判断内存泄漏的地方
二、布局优化:
- 布局复用,使用
<include>
标签重用layout; - 提高显示速度,使用
<ViewStub>
延迟View加载; - 减少层级,使用
<merge>
标签替换父级布局; - 注意使用wrap_content,会增加measure计算成本;
- 删除控件中无用属性;
三、启动优化:
应用一般都有闪屏页,优化闪屏页的 UI 布局,可以通过 Profile GPU Rendering 检测丢帧情况。
也可以通过启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。
数据准备。数据初始化分析,加载数据可以考虑用线程初始化等策略。