冷启动优化面试讲解

本文介绍了安卓应用的冷启动和热启动的概念、区别及特点,详细解析了冷启动流程,并给出了冷启动时间的计算方法。针对冷启动优化,提出了减少`onCreate()`方法工作量、避免在`Application`中进行业务操作和耗时操作、慎用静态变量以及优化布局等建议。
摘要由CSDN通过智能技术生成

一、什么是冷启动

安卓当中冷启动和热启动是两中常见的启动方式,对应UI也是不同,冷启动消耗的时间也是比较长,对冷启动的优化也是整个APP第一个关卡。

1.冷启动的定义
冷启动就是在启动应用前,系统中没有该应用的任何进程信息。

在安卓当中系统为每个应用最少分配了一个进程,从进程的角度来说,冷启动就是在应用启动前,系统中没有该应用的任何进程信息,包括activity,service等,比如说当我们开启设备时候第一次打开这个应用或者说应用杀死了这个应用进程,这时候我们应该知道应用启动时间是最长的,应用所做的准备工作也是最多的。

2.冷启动/热启动的区别

冷启动:冷启动就是在启动应用前,系统中没有该应用的任何进程信息,系统会重新创建一个新的进程,分配给该应用。
热启动:用户使用返回键退出应用,然后马上重新启动应用。

热启动就是在冷启动之后我们在按返回键退出该应用,这时候我们在再按改应用的图标启动该应用,这时候的启动模式就叫做热启动。

1:定义所区别:
冷启动:当应用启动的时候,后台没有该应用的进程,系统会创建一个新的进程,分配给该应用。
热启动:当启动应用的时候,后台已经有了该进程,不管是通过back键或者home键,该进程还是会保留在后台,热启动的时候应用的进程是保留在后台的,所以在应有的进程情况下启动,这种启动会从已有的进程来启动应用这种方式就叫热启动。

2.启动特点:
冷启动:因为系统会重新创建一个新的进程给他,先创建和初始化Appliaction类,再去创建初始化MyAcitvity类,然后会进行一些测量、布局、绘制等等,最后显示在界面上。
热启动:因为会从已有的进程来启动,就不会走Appliaction这种类了,而直接走MyActivity进行一些测量、布局、绘制等等、所以热启动的过程只需要创建和初始化一个MyActivity就够了,不必要创建初始化Appliaction类,因为一个应用从新进程的创建到销毁Appliaction只会初始化一次。

总结:冷启动在启动的时候会走Appliaction这个类,而热启动由于已经在后台包有了一份进程,他不会在走Appliaction这个类,而是直接走activity这个类。

3.冷启动时间的计算

这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。

在安卓4.4以后提供了一个很方便的作用,通过lotcat来自动打印启动时间,这个时间值,是从应用启动开始计算到完成启动第一次绘制开始,也就是activity内容可见的时候结束。

二、冷启动流程

1.点击app应用图标的时候安卓系统会从Zygote进程中fork创建出一个新的进程,之后会创建和初始化Application类、依次创建MainActivity类,在创建完Activity类之后,会inflate布局,当MyActivity的onCreate / onStart / onResume方法都走完之后,会走第四个也就是contentView的measure / layout /draw 显示在界面上。

总结:首先会走MyApplication的构造方法 --> 里面有个attachBaseContext()方法 -->然后走onCreate()方法 --> 这时候会调用Activity的构造方法 --> onCreate() --> 配置主题中背景属性 --> onStart() --> onResume() --> 测量布局绘制显示在界面上。

三、如何对冷启动的时间进行优化

1.减少onCreate()方法的工作量
应用的冷启动其实是无法避免的,也就是说冷启动的时候用户总会等待应用的启动时间,而我们所能做的也就是在application和第一个activity类减少onCreate()方法的工作量,从而减少冷启动的时间,但是像应用中我们不得不使用一些第三方的SDK,这时候我们都在application做初始化操作,这时候我们就可以用懒加载的方式移除这部分代码,当真正用到这第三方SDK的时候,在进行初始化,在activity创建过程中他会经过Fragment层一系列操作,我们都会重写application这个类,然后在application做一些初始化操作,但是懒加载也有不好的地方,你很难把所有的场景都列出,那些SDK是哪些场景使用的,再去使用前去初始化他的SDK,其实也是个耗时操作,一般开发过程中还是要把SDK初始化操作放在application里。

2.不要让Application参与业务的操作
application是所有app启动时候第一个进入的地方,在这里要进行一个抽象操作,每一个场景每一个业务模块都需要用到的数据可以在这里初始化,不要把业务模块相关的数据在这里初始化,这也是一个优化的点。

3.不要再Application进行耗时操作
有些开发的时候会在application进行IO操作,把数据从文件夹或SD卡里面读出来,这些操作是不能放在Application里面。

4.不要以静态变量的方式在Application中保存数据
静态变量的生命周期和app是一样的,它会造成很多的问题,例如:内存泄漏,数据的安全。

5.布局 / mainThread
尽量去减少布局的复杂性,布局的深度,在布局view绘制的过程中,测量是非常耗费性能的,你用的层级越庞大,app会花越多的时间填充它,为了减少启动时间,减少多余嵌套布局,不填充那些不需要在启动时就要展示的view。viewnewtop来实现,你需要的时候按需加载,你需要的时候去加载这个 view,在mainThread里面做资源初始化也会减慢启动速度,在这里我们可以通过懒加载,延迟所有的初始化,或者放到子线程中实现。具有良好的优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值