本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:提升鸿蒙应用冷启动速度案例(一) -华为开发者话题 | 华为开发者联盟
延迟加载非冷启动必需的服务或模块
随着应用功能持续增加,应用规模不断扩大,依赖的模块文件逐渐变多,应用冷启动加载模块的时间也越来越长。而在实际冷启动过程中执行了很多应用整体依赖但当前未使用的文件,此时可以通过延迟加载(lazy-import)的方法延缓对这些冗余文件的加载,使待加载文件在冷启动阶段不被加载,而在后续导出变量被真正使用时再同步加载执行文件,节省资源以提高应用冷启动性能。详细使用方式以及特性说明可参考该文章:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-lazy-import。

减少主线程 UI 耗时操作
在应用启动流程中,主要聚焦在执行 UI 相关操作中,为了更快的显示首页内容,不建议在主线程中执行图片下载、网络请求前置数据、数据反序列化等非 UI 相关的耗时操作,建议通过异步任务进行异步处理或放到其他子线程中执行,线程并发方案详细请参见TaskPool和Worker的对比,应用并发设计。
提前发送网络请求
当前大多数应用的首页内容需从网络获取,发送网络请求的时机显得尤为重要。应用发送网络请求后,在等待网络数据返回的这段时间,应用可以继续执行启动流程,直到网络数据返回后进行解析,反序列化之后就可以加载首页数据,因此网络请求的发起时机越早,整个冷启动的完成时延阶段越短。
将网络请求及初始化流程放置在 AbilityStage/UIAbility 的 onCreate()生命周期中。仅执行网络相关预处理。等待网络请求发送后继续执行首页数据准备和 UI 操作。在服务端处理相同的情况下,应用可以更早获取网络数据并行展示。
应用首页框架加载时进行网络数据请求示意图:

将网络请求提前至 AbilityStage/UIAbility 的 onCreate()生命周期回调函数中。这可以将首刷或二刷时间提前,减少用户等待时间。为了体现性能收益,将网络请求放到了更早的 AbilityStage 的 onCreate()生命周期回调中。
网络请求提前至 AbilityStage 的 onCreate()生命周期回调中示意图:

【优化前】:在首页根组件的 onAppear()回调中发起网络请求。



【优化后】
1. 在 NetRequest.ets 中进行网络请求以及数据处理。

2. 在 AbilityStage 的 onCreate()生命周期回调中发起网络请求。

3. 在首页 Index.ets 中展示请求获取的图片。

使用 Launch 分析工具,对比优化前后启动性能。分析从启动 Ability(即 H:void OHOS::AppExecFwk::MainThread::HandleLaunchAbility 的开始点)到应用接收到网络数据返回后的首帧刷新(即 H:ReceiveVsync dataCount:24Bytes now:timestamp expectedEnd:timestamp vsyncId:int 的开始点)。
优化网络请求时机前:

优化网络请求时机后:

对比数据如下:

降低启动图标分辨率
应用进程创建和初始化阶段包括系统完成应用进程的创建及初始化,以及启动页图标(startWindowIcon)的解码。建议使用不超过 256×256 分辨率的图标,以减少图片解码时延,提升体验。开发者可以使用Code Linter扫描工具进行代码检查,重点关注@performance/start-window-icon-check规则。若扫描结果中出现该规则相关问题,可对相关模块进行调整。
下面使用 Launch 分析对比优化前的 startWindowIcon(4096 像素*4096 像素)及优化后的 startWindowIcon(144 像素*144 像素)的启动性能。分析阶段的起点为 Process Creating,阶段终点为 First Frame - Render Phase,优化前后的启动耗时对比如下图:
优化前,使用 4096px-4096px 启动页图标应用启动耗时:

优化后,使用 144px-144px 启动页图标应用启动耗时:

本文讲述了延迟加载冷启动非必要模块和服务,减少主线程 ui 耗时操作,提前发送网络请求、降低图标分辨率的操作方法优化冷启动耗时,下一章节我们将带你理解一些其他常见方法优化冷启动耗时。
🔗 官网开发者学堂视频:https://developer.huawei.com/consumer/cn/training/result?type2List=201783644516849879&orderBy=1&courseType=5

🔗 社区 DFX 专题文章: https://developer.huawei.com/consumer/cn/forum/subject/2101218731402391001







