优化原因:
启动的时候,长时间白屏,导致产品体验效果大打折扣。
为了解决启动优化,我们首先要了解一下app的启动流程,才能有的放矢,找到优化方向。
【有兴趣的可以看一下Google官方文档《Launch-Time Performance》对应用启动优化的概述】,下午是我看完后自制的图
从以上流程图分析得出的结论:
1.App进程的创建等环节我们无法控制,但是创建的window可以利用
2. 只能从Application、以及Activity对象的创建回调等过程入手
具体的优化方案:
1. 利用主题快速显示界面
2. 异步初始化组件
3 . 梳理业务逻辑,延迟初始化组件、操作
4. 正确使用线程【和主线程的资源争夺】
5. 对MultiDex的分包进行优化【5.0以下】
6. 切到后台,减少冷启动
7 . 使用TraceView工具进行分析
-------------------------------------------------------------------------------
利用主题快速显示界面:
这个是Google官方推荐的优化方向,以下是官方截取的图片
[https://developer.android.com/topic/performance/launch-time.html】
异步初始化组件:
将App所需组件,以及其它需要初始化的内容,通过线程或是线程池,用异步的方案来进行初始化
【有一些组件或是sdk,必须在主线程做初始化】
梳理业务逻辑,延迟初始化组件、操作:
将需要初始化的业务,统一列表,并进行分析,将不必要在app启动的时候初始化的组件统一做后移处理,在用的时候,初始化 即可,同时,也将减少启动时cpu资源的竞争 [实际上,这一步对项目启动加速最有效果]
对必须初始化的组件,进行统一的初始化管理,提高初始化速度;
正确使用线程
app启动的时候,创建线程和线程池,相对来说比较耗时,应在创建时,有1个考量;
同时,线程越多,跟主线程cpu资源的争抢就越激烈,主线程可以拿到的时间就越少
工作线程设置优先级:THREAD_PRIORITY_BACKGROUND,这样工作线程最多能获取到10%的时间片,优先保证主线程执行。
对MultiDex的分包进行优化【5.0以下】
对于5.0以上版本,在安装app时,就做了优化,无需处理。对MultiDex分包做优化,成本太高,而且很可能衍生出新的问题,不建议做优化处理。对于5.0以下版本的优化,有兴趣的可以了解一下【https://www.jianshu.com/p/2891599511ff】
切到后台,减少冷启动
主页面在回退键操作时,做home按键处理,主页面不退出,下次启动,直接从后台切刀前台,如果能针对App做保活,就更好了【不是真正意义上的优化,体验上的有优化,且解决不了冷启动问题】
使用TraceView工具进行分析
在进行优化时,耗时分析必不可少,借助TraceView工具,分析出关键的耗时点,可优化点