一、背景
随着App越做越大,市场,测试、产品、开发包括自己在内,明显感觉到App的启动太慢、黑屏或在欢迎页停太久,于是下定决心优化下App的启动速度,查了些资料,看了些别人的做法,总结出以下可取做法,现在分享给大家:
二、启动分析
1、启动分类:
冷启动:后台不存在该应用的任务进程或服务,用户点击Icon图标启动
暖启动:工作介于冷热启动之间。几种可能被认为是温启动的状态:
a、用户离开了app,然后重新启动它。这时进程还在继续运行,但是Activity被回收了,app需要重新创建activity。
b、系统将你的app回收了,然后用户重新启动app。进程和Activity都需要重新启动,但它们可以从onCreate方法保存的bundle中恢复。
热启动:当后台存在该应用的进程或者服务时,用户点击icon图标启动。如用户按了home键回到桌面,或者返回键没有杀进程,或者app本身做了进程重启的机制
2、启动组成时间:
Application启动经过attachBaseContext->onCreate方法
Activity启动经过onCreate->onStart->onResume方法
经过以上流程后,界面才显示出来,所以启动耗时原因就可以在上述步骤中找出
3、分析启动耗时原因:
a、测量启动时间:在Androd的Log系统时通过ActivityManager与Display这两个关键字可以查看到启动Activity所需要的时间,如果要看到数据加载的时间,则可以在代码中自定义,在数据加载完的回调方法中主动调用reportFullyDrawn()方法,则上报给系统,系统会反馈一个总的加载时间
b、计算启动时间——ADB
adb shell am start -W com.xys.preferencetest/.MainActivity
c、计算启动时间——Screen Record
adb shell screenrecord--bugreport /sdcard/test.mp4
d、method tracing
通过上述方法基本上可以定位到耗时原因,那下面就开始解决问题
4、在2中我们已经知道了启动app要经历哪些过程,那我们会在这些过程做哪些事情呢?
在Application中:attachBaseContext方法中一般是加载MultiDex.install(this)操作,关于这部分目前没办法优化,特别是在5.0以下的机器上,但是我们可以规避这问题,欢迎页我们可以另开一进程执行(在manifest中加android:process)或者对App进行插件化,onCreate方法中一般会初始化一些第三方平台的SDK以及一些全局变量的初始化,我们可以执行Application中的方法registerActivityLifecycleCallbacks,这个方法会监听所有Activity的创建和销毁, 我们可以在这里完成一些初始化工作
在Activity中:使用DelayLoader实现,getWindow().getDecorView().post(new Runnable(){
@Override
public void run({
//loading...
})
})
另外使用Theme改变用户感知。
参考资料:
https://segmentfault.com/a/1190000007406875
http://www.lightskystreet.com/2016/10/15/android-optimize-start/