性能优化:
1. 卡顿优化
-
绘制问题
-
布局复杂导致 -》 使用
hierarchy viewer
分析。减少嵌套层级,使用ViewStub延迟绘制,去掉不必要的背景- 使用include、merge标签
- 尽量不嵌套使用RelativeLayout
- 在复杂布局界面使用ConstraintLayout
- 使用ViewStub标签延迟初始化View
- 去掉多余的background,少使用复杂shape
-
主线程耗时问题导致 -》使用profiler分析卡顿点,采用异步的方式优化
-
布局加载优化。性能瓶颈主要在
LayoutInflater.inflate()
过程- XmlPullParser涉及到IO操作,布局越复杂,IO耗时越长
- createView涉及到反射,当调用次数很频繁的时候会有性能问题
解决方案:
- AsyncLayoutInflater
- X2C 使用APT+JavaPoet技术做到编译期将XML转化为动态加载视图的Java代码
-
-
内存问题(问题根源是GC的时候stop the world导致所有线程挂起,出现卡顿问题)
- 减少内存抖动,避免短时间内大量创建与回收对象(如有需要,可以使用对象池的方式)
- 使用leak canary分析,避免内存泄漏问题
- 资源未关闭
- 注册对象未释放
- 内部类持有外部类强引用导致泄漏
- handler问题
- 单例问题
- 静态变量持有大数据对象
- ThreadLocal使用不当引起泄漏
- 线程池问题,使用了Executors
- 内存空间优化
- 使用对象引用(强软弱虚引用)
- 数据类型优化(ArrayMap、SparseArray、Lrucache)
- Bitmap优化
- 解析数据后存入缓存,不再每一次都重新解析一遍(具体表现是首页卡片列表的json解析完成之后,会使用一个map存入内存中,后面刷新的时候不再重新解析,直接使用内存中的解析结果)
2. 启动优化
- 启动时间测量:
- adb shell am start -W com.mymoney.sms/.ui.SplashActivity
- adb logcat | grep Displayed
- 添加startingwindow,启动的时候给Application设置一个背景
- application初始化的时候,进行异步和延迟(IdleHandler)的改造
- 异步加载可能有一些SDK会依赖别的SDK,比如B的初始化依赖A先初始化,这个时候我们可以自己实现一个有序队列,或者使用条件阻塞(CountDownLatch)
- 更深入的优化:
- 安装包重排布:让启动阶段需要的文件尽量排布在同一个dex中,减少io的开销,从而达到提高性能的目的。主要包括类重排列(redex)和资源重排列(支付宝资源重排列)
- 启动阶段抑制GC:这个方案主要针对dalvik虚拟机,art虚拟机对GC有做优化,dalvik在查找无用对象的时候会挂起所有线程,art虚拟机这个过程是并发执行的,所有这个优化对art虚拟机收益不大,参考:支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- 针对5.0以下设备MultiDex的优化,参考:面试官:今日头条启动很快,你觉得可能是做了哪些优化?
网友评论