🌈 赏金任务 - 启动性能指标:冷启动、暖启动、热启动、首屏启动,分别是什么?

赏金任务每周更新,请持续关注哦 :love_letter:

题目

  • 模拟面试场景,面试官提问以下问题,你如何回答。
  • 启动性能指标:冷启动、暖启动、热启动、首屏启动,分别是什么?

参与方式

  • 本帖下方回复你的答案即可

赏金

  • 100元京东购物卡

活动时间

  • 2023年4月3日 - 2023年4月9日

本周赏金任务汇总: 🌈 赏金任务发布 2023-04-03

本问题参与赏金活动,详情点击 :rainbow: 赏金活动上线啦 丨做赏金任务挑战千元奖金 查看活动介绍

冷启动:比如开机后,点击屏幕的app图标启动应用。冷启动指的是该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程启动app
暖启动: 温启动指的是App进程存在,但Activity可能因为内存不足被回收,这时候启动App不需要重新创建进程,只需要执行APP进程中的一些任务,比如创建Activity。

比如返回主页后,又继续使用其他的APP,时间久了或者打开的应用多了,之前应用的Activity有可能被回收了,但是进程还在。
热启动:热启动就是App进程存在,并且Activity对象仍然存在内存中没有被回收。
比如app被切到后台,再次启动app的过程
首屏启动: 作为普通应用,App进程的创建等环节我们是无法主动控制的,可以优化的也就是Application、Activity创建以及回调等过程。

关于启动加速方案

1.利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;

2.避免在启动时做密集沉重的初始化(Heavy app initialization);

3.定位问题:避免I/O操作、反序列化、网络操作、布局嵌套等

启动性能指标是用于衡量应用程序启动速度的关键指标。以下是各种启动性能指标的定义:

  1. 冷启动:冷启动是指应用程序在第一次运行时启动的时间。在冷启动期间,应用程序必须加载和初始化其所有组件和资源,这可能需要一定的时间。
  2. 暖启动:暖启动是指应用程序在已经运行一段时间后重新启动的时间。在暖启动期间,应用程序可能会使用缓存的数据和组件,因此启动速度可能会比冷启动更快。
  3. 热启动:热启动是指应用程序在已经运行并保持在后台时重新启动的时间。在热启动期间,应用程序可以直接从缓存中加载已经存在的组件和数据,因此启动速度通常非常快。
  4. 首屏启动:首屏启动是指应用程序在启动后显示其主屏幕或首屏所需的时间。这通常是用户感知到的启动时间的主要指标之一,因为它反映了用户可以开始与应用程序进行交互的时间。

这些指标是衡量应用程序启动性能的关键指标,开发人员可以使用它们来优化应用程序的启动时间,提高用户体验。

启动性能指标通常包括以下几个方面:
1. 冷启动:
应用程序在完全关闭后再次启动,需要加载应用程序的所有资源,包括代码、库、数据等。冷启动时间比较长,通常需要数秒钟的时间,对于用户来说可能会感到不太友好,会影响用户的体验。

2. 暖启动:
应用程序仍然在后台运行,但被完全关闭后再次启动,需要重新加载一些资源,但不需要加载所有资源。暖启动时间比冷启动快一些,但仍然需要一定的时间。对于用户来说,暖启动相对于冷启动来说更加友好,但可能仍然会对用户的体验产生一些影响。

3. 热启动:
应用程序已经在内存中运行并再次打开,无需重新加载任何资源。热启动时间最快,通常只需要数毫秒的时间。对于用户来说,热启动是最友好的启动方式,不会对用户体验产生任何影响。

4.首屏启动:
应用程序启动后,显示在屏幕上的第一个页面或界面的加载时间。对于用户而言,首屏启动的速度很重要,因为它直接影响着用户的体验和使用意愿。

面试官问这种问题的目的是了解候选人对应用程序启动性能的了解和优化方法,以及他们对应用程序优化的重要性的认识。对于许多应用程序来说,启动时间对用户体验至关重要,因此优化启动性能可以提高应用程序的质量和用户满意度

面试时如何回答该问题?
回答这个问题时,需要先简要介绍一下冷启动、暖启动、热启动和首屏启动的概念,然后根据实际应用场景和具体的应用程序,对它们的启动方式和对用户的影响进行分析和比较。可以从以下几个方面回答:

  1. 启动方式的定义和区别:简要介绍冷启动、暖启动和热启动的概念和区别,让面试官了解你对这些概念的理解程度。
  2. 启动方式对用户的影响:分析不同启动方式对用户的影响,如启动速度、用户体验等,以及为什么热启动对用户的影响最小。
  3. 启动方式的优化:介绍如何优化应用程序的启动性能,如使用缓存、延迟加载等方法,以及如何选择合适的启动方式来提高用户的体验。
  4. 应用场景的选择:根据实际应用场景,选择适合的启动方式,比如对于小型应用程序,可以采用冷启动方式;对于大型应用程序,可以采用暖启动或热启动方式。

最后,需要强调启动性能对用户体验的重要性,并且表现出自己对提高用户体验的热情和责任心。同时,还需要准备一些具体的案例或实际经验,以便在回答问题时举例说明。

通过举例说明四种启动的区别:

假设有一个社交类应用程序,用户在应用程序关闭状态下,分别进行了以下操作:

  1. 冷启动:用户在手机桌面上点击应用程序的图标,将应用程序从头开始启动。
  2. 热启动:用户按下手机的Home键,将应用程序切换到后台,然后再次点击应用程序的图标,将应用程序唤醒。
  3. 暖启动:用户按下手机的Home键,将应用程序切换到后台,过了一段时间后再次点击应用程序的图标,将应用程序唤醒。
  4. 首屏启动:应用程序已经在后台运行,并且用户已经登录过,此时用户再次点击应用程序的图标,应用程序将直接显示用户最近访问的页面。

被问道这四种启动方式的启动性能好坏时可以这样回答:
受到多种因素的影响,例如:应用程序的复杂度、设备的性能、网络状况等等。因此,无法给出通常多久启动性能是好的具体时间。
但是,一般来说,启动时间越短,用户体验就越好。对于一款优秀的应用程序而言,它的启动时间应该尽可能地短,并且在不同启动情况下都能够快速响应用户的操作。

为了提高应用程序的启动性能,开发者可以采用多种优化手段,如:

  1. 减少应用程序的初始化操作和资源加载量,尽可能减少启动时间。
  2. 使用异步加载和延迟初始化等技术,使得应用程序在启动时只加载必要的资源,提高启动速度。
  3. 合理利用缓存机制,减少网络请求和资源加载,提高启动速度。
  4. 使用热启动、暖启动等启动策略,尽可能缩短启动时间。

加个鸡腿:poultry_leg:,当然由于以上的回答,可能延申的问题还有应用程序启动慢的原因?主要包括以下几个方面:

  1. 应用程序的资源过多:如果应用程序包含大量的代码、库和数据等资源,启动时需要加载的时间会很长,导致启动慢。
  2. 启动过程中的初始化操作过多:如果应用程序在启动时需要进行大量的初始化操作,比如读取配置文件、检查更新等,也会导致启动时间过长。
  3. 设备硬件性能差:如果用户的设备硬件性能较差,比如内存、处理器等配置低,也会影响应用程序的启动速度。
  4. 应用程序的设计不合理:如果应用程序的设计存在问题,比如代码结构不清晰、启动流程复杂等,也会导致启动时间过长。

如何解决上述启动慢的问题呢?为了解决应用程序启动慢的问题,可以采取以下一些措施:

  1. 缩小应用程序的体积:可以删除不必要的资源文件,减小应用程序的大小,从而缩短启动时间。
  2. 延迟加载资源:可以将应用程序需要加载的资源按需加载,不需要一次性加载所有资源,从而加快启动速度。
  3. 简化启动流程:可以通过优化代码结构、调整启动流程等方式,简化应用程序的启动流程,从而加快启动速度。
  4. 采用缓存策略:可以将应用程序的常用资源缓存在内存中,下次启动时直接读取缓存的资源,从而加快启动速度。
  5. 优化代码:可以通过优化代码、减少不必要的初始化操作等方式,提高应用程序的启动性能。
    综上所述,提高应用程序的启动性能需要从多个方面进行优化,需要开发人员在应用程序设计和开发过程中注重这些细节,并不断进行优化和改进。

总结:
在实际应用中,启动速度对用户体验至关重要。如果启动速度很慢,用户可能会失去耐心,甚至会选择使用其他应用程序。因此,开发人员需要优化应用程序的启动性能,尽可能缩短启动时间,提高用户体验。同时,对于用户来说,熟悉应用程序的启动方式也可以帮助他们更好地使用应用程序,提高他们的满意度。

冷启动 ( Cold Start):指应用程序从完全关闭状态开始启动,即操作系统和服务都没有运行的状态。这种情况下,操作系统需要从备份文件中恢复数据,加载内核和其他必要的组件,通常需要较长的时间。
暖启动 ( Warm Start):指应用程序在上一次启动后没有被关闭,仍然在运行中的状态。这种情况下,操作系统可以更快地启动应用程序,因为内核和其他必要的组件都已经加载并运行中。
热启动 ( Hot Start):指应用程序在上一次启动后没有被关闭,并且操作系统和服务都没有运行的状态。这种情况下,操作系统可以直接从上一次启动的状态中恢复,通常可以更快地启动应用程序。
首屏启动 ( First Screen Load):指应用程序启动后,用户界面首次加载完成的时间。这个时间通常很短,通常在几毫秒到几秒之间。首屏启动时间的优化对于用户体验非常重要。
启动性能指标 定义 优点 缺点 优化策略 使用场景
冷启动 第一次启动应用程序或服务时,应用程序或服务在内存中没有任何缓存信息,需要从头开始加载所有组件 无需考虑已经存在的缓存信息,可以体现出应用程序或服务的真实启动速度 需要较长的启动时间,用户体验较差 减少应用程序或服务启动过程中的IO操作,缓存经常使用的数据,预加载部分组件 用户第一次安装应用程序或服务时,或者长时间没有使用后再次启动
暖启动 应用程序或服务在一段时间内没有被使用,但是仍然保存在内存中,因此启动时可以使用已经存在的缓存信息 启动速度较快,用户体验较好 需要较长时间保存在内存中,占用内存较多 减少应用程序或服务启动过程中的IO操作,缓存经常使用的数据,预加载部分组件 用户切换应用程序或服务时
热启动 应用程序或服务在内存中已经存在缓存信息,因此启动速度非常快 启动速度极快,用户体验非常好 占用内存较多 减少应用程序或服务启动过程中的IO操作,缓存经常使用的数据,预加载部分组件 用户频繁切换应用程序或服务时
首屏启动 应用程序或服务在启动后,首先展示给用户的内容渲染完成的时间 用户可以尽快看到应用程序或服务的内容,提高用户体验 不能代表应用程序或服务完全启动的时间,某些后台操作可能仍在进行 减少首屏内容的渲染时间,提高首屏的响应速度 用户进入应用程

需要注意的是,以上表格中的启动性能指标并不是独立的,它们之间的关系是相互影响的。例如,减少应用程序或服务启动过程中的IO操作,缓存经常使用的数据,预加载部分组件这一优化策略可以同时提高冷启动、暖启动和热启动的性能表现。

在实际应用中,优化启动性能是非常重要的。因为启动时间对于用户体验有着非常重要的影响。对于移动应用程序或服务来说,尤其如此,因为移动设备的计算能力和网络连接速度相对较低,启动时间较长会给用户带来不必要的等待和不良的使用体验。

启动性能受到许多因素的影响,包括但不限于以下几个方面:

  1. 应用程序或服务的复杂度:应用程序或服务的复杂度越高,启动所需的时间和资源就越多。
  2. 资源加载的数量和大小:应用程序或服务所需的资源数量和大小越多,启动所需的时间和资源就越多。
  3. 系统资源的竞争:启动过程中,应用程序或服务需要竞争系统资源,包括CPU、内存、磁盘、网络等,如果竞争激烈,启动时间就会变长。
  4. 设备的硬件配置:设备的硬件配置越高,启动所需的时间和资源就越少。

为了优化启动性能,可以采取以下具体措施:

  1. 减少应用程序或服务的复杂度:通过减少应用程序或服务的复杂度来降低启动所需的时间和资源。
  2. 压缩资源文件:通过压缩资源文件来减小资源的大小,从而减少启动所需的时间和资源。
  3. 合并资源文件:将多个资源文件合并成一个文件,可以减少启动时的IO操作,从而提高启动性能。
  4. 延迟加载部分资源:将一些不必要的资源延迟加载,可以减少启动时的资源消耗,从而提高启动性能。
  5. 异步加载资源:使用异步加载的方式可以避免阻塞主线程,从而提高启动性能。
因素 措施 示例
应用程序或服务的复杂度 减少应用程序或服务的复杂度 优化代码结构和算法,减少代码行数和函数调用次数
资源加载的数量和大小 压缩资源文件、合并资源文件、延迟加载资源 压缩图片和CSS文件、合并JavaScript文件、延迟加载部分图片和CSS文件
系统资源的竞争 减少应用程序或服务的复杂度、异步加载资源 优化代码结构和算法、使用异步加载的方式
设备的硬件配置 无需特殊措施 无需特殊示例

首先需要明确app启动原理
app性能,还有app还有与app之间的交互,比如app中去用微博、微信等登录的场景, App交互的时候可以指定任意activity,activity之间的耦合性是很小的。
android官方的图如下:activity启动流程


第一件事:启动

  • 第一步底层系统(可能是linux,安卓主要依赖于linux系统)启动app

  • 第二步调起activity,创建白窗口什么都不做

  • 第三步启动进程

第二件事:启动object,加载

  • 启动一个object,onCreate,类似于去调用对象,紧接着去创建一个Mainthread,创建一个主线程;主要用来加载我们的activity,mainacticity(用来做页面的初始化,数据初始化,页面的渲染),到了displayed time的时候已经渲染完成,会对前面打开的空白窗口进行对调(要记住)

  • other stuff 可能页面已经加载完了 但是还没有加载完全,还有一个动态加载的过

  • 这整个过程是非常快的

————————————————

一、冷启动(App进程创建)

系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP
此时,APP的启动将经历两个阶段:

第一阶段

1.加载并启动app;
2.app启动后,第一时间为app显示一个空白的window;
3.创建app进程

第二阶段

系统一旦创建了app进程,app进程就要负责做以下的任务:

1.创建app对象;
2.启动主进程ActivityThread;
3.创建MainActivity;
4.渲染视图;
5.执行onLayout;
6.执行onDraw
7.完成第一次绘制后,把mainActivity替换已经展示的BackgroundWindow,即空白window。

一句话总结:冷启动:重新安装进行启动等,冷对应已经被kill掉了,重新启动,冷启动对应的就是上面分析的打开app的一个过程,不包括other stuff 一定要记住(场景:数据全被清掉了,或者重新安装启动)

二、热启动(Activity已创建,从后台到前台)

当我们按了Home键或其它情况app被切换到后台,再次启动app的过程。
热启动时,系统将activity带回前台。如果应用程序的所有activity存在内存中,则应用程序可以避免重复对象初始化、渲染、绘制操作。

如果由于内存不足导致对象被回收,则需要在热启动时重建对象,此时与冷启动时将界面显示到手机屏幕上一样。

一句话总结:热启动:说明app还活着,放在后台运行,去微信聊天再回来

三、暖启动(App进程存在,但Activity结束)

温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。

温启动有很多场景,例如:

  • 用户按连续按返回退出了app,然后重新启动app;
  • 由于系统收回了app的内存,然后重新启动app。

关于直接杀死进程

这里我们应该很好去理解,Android中的每一个App都是运行在自己VM实例之中(沙盒)。每一个VM实例在linux中又是一个单独的进程,通过任务管理杀掉一个进程,那么对应进程里面的数据全部被回收掉。

关于返回键退出

通过对源码的追溯,如果不对onBackPressed()做特殊的处理,无论是AppCompatActivity还是android.app.Activity,发现都会通过执行onBackPressed(),最后到Activity的finish()方法,也就是说当App退出到根的时候,最终只是执行的是当前App根Activity的finish()方法,整个App“依然在运行”,只是看不到界面了,那么也就是说,如果在App中运行的Service之类的后台任务并没结束,仍然在运行。

一句话总结:暖启动:app在后台待得时间久了,可能系统已经杀掉了app内存,用户此时再重启app,其实会有一些object进行保留;初始化的时候会把加载的东西保存在手机上(这些并不会完全丢掉)

四、 首屏启动

就是加上other stuff

总结:
最重要的是冷启动
因为暖启动和热启动本来时间就很短,不需要优化了;
首屏启动建议时间只是做参考,没有太大意义。

在不同的应用程序中,启动性能指标可能会有所不同,但是通常来说,冷启动、暖启动、热启动和首屏启动是以下几个常见的启动性能指标:

  1. 冷启动 ( Cold Start):指应用程序从完全停止状态开始启动,需要从操作系统或其他来源获取启动所需的数据和资源,需要花费较长时间和精力来完成启动过程。例如,打开一个网页浏览器,需要加载网页和相关的插件和渲染引擎等资源,如果这些资源在之前没有被加载过,那么就需要完成冷启动的过程。
  2. 暖启动 ( Warm Start):指应用程序在完成冷启动后,第一次请求时需要从缓存或服务器读取数据,而不是从磁盘或其他慢速资源中获取数据。暖启动通常比冷启动要快速,因为应用程序之前已经加载了一些数据和资源,因此可以更快地响应请求。
  3. 热启动 ( Hot Start):指应用程序在第一次请求时直接从缓存或服务器读取数据,而不需要进行冷启动或暖启动的过程。热启动通常比冷启动和暖启动都要快,因为应用程序之前已经加载了一些数据和资源,因此可以更快地响应请求。
  4. 首屏启动 ( First Screen Load):指应用程序从启动到呈现第一个页面所需的时间,也被称为页面加载时间。这个时间指标通常用于评估应用程序的响应速度和用户体验。在首屏启动期间,应用程序需要从服务器或其他来源获取数据,并将其加载到内存中,以便在用户打开应用程序时可以更快地呈现页面。