📚往期学习笔录📰:
📰 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
📰 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
📰 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
📰 记录一场鸿蒙开发岗位面试经历~
📰 持续更新中……
一.应用冷启动概述
应用启动时延是影响用户体验的关键要素,当用户点击桌面应用图标、通知或其他入口启动应用,到用户的数据显示在屏幕上,如果这段时间花费的时间比较长,这样肯定会影响用户的体验。
应用启动可以分为冷启动和热启动,当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这种启动方式就叫做冷启动;而热启动是当应用程序已经在后台运行,用户再次打开应用程序时,应用程序仍然在内存中,可以直接从内存中加载并继续之前的状态,而不需要重新初始化和加载资源。
二.应用冷启动流程
在优化应用冷启动体验前,需要先了解应用冷启动的流程和几个重要的生命周期。应用冷启动的过程大致可分成以下四个阶段:应用进程创建&初始化、Application&Ability初始化、Ability/AbilityStage生命周期、加载绘制首页,如下图所示。
1.应用进程创建&初始化阶段:该阶段主要是系统完成应用进程的创建以及初始化的过程,包含了启动页图标(startWindowIcon)的解码。
2.Application&Ability初始化:该阶段主要是资源加载、虚拟机创建、Application&Ability相关对象的创建与初始化、依赖模块的加载等。
3.Ability/AbilityStage生命周期:该阶段主要是AbilityStage/Ability的启动生命周期,执行相应的生命周期回调。
4.加载绘制首页:该阶段主要是加载首页内容、测量布局、刷新组件并绘制。
5.网络数据二次刷新:该阶段主要是应用根据业务需要对网络数据进行请求、处理、二次刷新。
三.识别启动缓慢问题
如果开发者需要分析启动过程的耗时瓶颈,优化应用或服务的冷启动速度,可使用Profiler提供的Launch场景分析能力,录制启动过程中的关键数据进行分析,从而识别出导致启动缓慢的原因所在。Profiler Launch可以拆解应用冷启动过程,抓取不同阶段的耗时数据,帮助开发者快速分析冷启动过程的耗时瓶颈。
四.提升应用冷启动速度
本文将通过公共类优化的方法,包括非冷启动必须的服务或模块延迟加载、减少主线程非UI耗时操作和网络请求提前发送,以及结合应用启动的几个阶段分别介绍提升应用冷启动速度的相关方法。
1.减少主线程非UI耗时操作
在应用启动流程中,主要聚焦在执行UI相关操作中,为了更快的显示首页内容,不建议在主线程中执行非UI相关的耗时操作,建议通过异步任务进行延迟处理或放到其他子线程中执行,线程并发方案详细请参见TaskPool和Worker的对比实践。
在冷启动过程中如果存在图片下载、网络请求前置数据、数据反序列化等非UI操作开发者可以根据实际情况移至子线程中进行,详细请参见应用并发设计。
2.网络请求提前发送
当前大多数应用的首页内容需从网络获取,发送网络请求的时机显得尤为重要。应用发送网络请求后等待网络数据的返回,网络请求的这段时间应用可以继续执行启动流程,直到网络数据返回后进行解析,反序列化之后就可以加载首页数据,因此网络请求的发起时机越早,整个冷启动的完成时延阶段越短。
可将网络请求及网络请求前的初始化流程放置在AbilityStage/UIAbility的onCreate()生命周期中,在AbilityStage/UIAbility中仅执行网络相关预处理,等待网络请求发送后可继续执行首页数据准备、UI相关操作。在服务端处理流程相同的情况下,应用可以更早的拿到网络数据并行展示。图1应用首页框架加载时进行网络数据请求。
将网络请求提前至AbilityStage/UIAbility生命的onCreate()生命周期回调函数中,可以将首刷或二刷的时间提前,减少用户等待时间。此处为了体现性能收益,将网络请求放到了更早的AbilityStage的onCreate()生命周期回调中。图2网络请求提前至AbilityStage的onCreate()周期回调中。