什么是冷启动
- 冷启动/热启动的区别
冷启动:在启动应用前,系统中没有该应用的任何进程信息
热启动:用户使用返回键退出应用,然后马上又重新启动应用。进程保留在后台,从已有进程启动App。热启动不会重新创建Application。 - 冷启动时间的计算
这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。
冷启动流程
- Zygote进程中fork创建出一个新的进程
- 创建和初始化Application类、创建ContentProvider、创建MainActivity类、inflate布局
- 当走完onCreate、onStart、onResume,和contentView的measure、layout、draw后显示到界面上。
所以在onCreate、onStart、onResume中获取不到控件的宽高信息,因为此时还没有开始进行View的绘制
如何在onCreate中获取控件的宽高信息
冷启动时间
- 安装adb
- adb shell am start -w packagename/activity
例如:adb shell am start -W im.zhangyu.poster/im.zhangyu.poster.SplashActivity - 回到手机主屏,在Android Studio Terminal中输入命令,即可拉起app并输出启动时间
D:\AndroidProject\ZebraPoster>adb shell am start -W im.zhangyu.poster/im.zhangyu.poster.SplashActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=im.zebra.poster/.SplashActivity }
Status: ok
LaunchState: COLD
Activity: im.zhangyu.poster/im.zhangyu.store.activity.StoreActivity
TotalTime: 1017
WaitTime: 1022
Complete
如何对冷启动的时间进行优化
- 尽量减少Application和MainActivity的onCreate方法的工作量
例如一些三方库的的初始化工作,可以使用懒加载,在需要的时候在进行初始化。 - 不要让Application参与业务的操作
- 不要在Application进行耗时操做
- 减少页面的布局深度。
- 启动页广告可以可以使用IntentService后台下载,下次启动时从本地加载该广告图,也就是每次都加载上次下载的图片
- 首页的接口可以做一个短时间的缓存,通过Retrofit注解设置一个参数
SDK的延迟初始化和异步初始化
- 延迟初始化
在Application和MainActivity的onCreate中初始化SDK都会影响app的启动时间,从app启动到主页被展示出来的第一个回调应该是MainActivity的onWindowFocusChanged
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
Log.d(TAG, "onWindowFocusChanged: ")
ApplicationLike.initSdk(applicationContext)
}
class ApplicationLike {
companion object {
private var isInit = true
fun initSdk(context: Context) {
if (!isInit) return
isInit = false
}
}
}