Android App的启动流程和优化(冷启动时间)

什么是冷启动

  • 冷启动/热启动的区别
    冷启动:在启动应用前,系统中没有该应用的任何进程信息
    热启动:用户使用返回键退出应用,然后马上又重新启动应用。进程保留在后台,从已有进程启动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)
        //页面每次被遮挡、重新显示,都会回调该方法。
        //BottomSheetDialogFragment的启动也会触发onWindowFocusChanged
        //BottomSheetDialogFragment的启动不会触发onPause、onResume
        Log.d(TAG, "onWindowFocusChanged: ")
        //延迟初始sdk,方法内做了判断,只会初始化一次
        ApplicationLike.initSdk(applicationContext)
        //此时可以获取到控件的宽高信息,因为此时xml已经绘制到屏幕上了
    }

class ApplicationLike {

    companion object {

        private var isInit = true

        fun initSdk(context: Context) {
            if (!isInit) return
            isInit = false
            //todo init something
        }
    }

}
  • 异步初始化就可以在子线程中初始化一些SDK
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值