HyperStartup:基于HarmonyOS的应用快启启动特性接入实例项目

本项目是展示应用快启特性接入的实例。示例页面提供快启启动开关:开启后,应用可通过快启能力完成启动;关闭后,应用将按照常规冷启动流程启动。

分支2Tags0

基于应用快启技术实现的应用加速启动

项目介绍

本项目是展示应用快启特性接入的实例。示例页面提供快启启动开关:开启后,应用可通过快启能力完成启动;关闭后,应用将按照常规冷启动流程启动。

为直观体现快启特性适配的必要性和关键点,本示例以“颜色模式”为验证场景。完成快启适配后,应用在切换颜色模式并再次快启后能够正确展示对应颜色;未完成适配时,颜色状态无法正确同步,导致页面显示异常。

效果预览

界面
Demo preview
冷启动 快启
冷启动 快启
冷启动切换颜色模式 快启(已正确适配应用代码)切换颜色模式 快启(未正确适配应用代码)切换颜色模式
冷启动切换 快启已适配切换 快启未适配切换

使用说明

  1. 使用 DevEco Studio 打开工程并配置签名。
  2. 确认 entry/src/main/module.json5 中的 srcEntry 指向需要的 AbilityStage:
    • 已正确适配的应用代码:./ets/MyAbilityStageAdapted.ets
    • 未正确适配的应用代码:./ets/MyAbilityStage.ets
  3. 编译并运行debug版应用,进入主页面后可切换深色模式和快启启动开关。
  4. 开启快启特性后,根据弹窗提示执行快启初始化流程,再对比冷启动和快启效果。

学习路径

  1. 查看 entry/src/main/ets/pages/Index.ets,了解页面开关入口和配置写入流程。
  2. 查看 entry/src/main/ets/MyAbilityStage.ets,观察未适配版本中快启风险操作的位置。
  3. 查看 entry/src/main/ets/MyAbilityStageAdapted.ets,对比风险操作后置到 onAboutToCreateAbility 后的适配方式。
  4. 修改 entry/src/main/module.json5 中的 srcEntry,切换未适配/已适配版本并验证差异。
  5. 查看 应用待适配点扫描工具README,了解如何使用IDE插件扫描快启启动风险点

工程结构

HyperStartup/
├──AppScope
│   ├──resources
│   └──app.json5                                 // 应用级配置,包含 bundleName、版本、图标和应用名称
├──entry
│   ├──src
│   │   ├──main
│   │   │   ├──ets
│   │   │   │   ├──constants
│   │   │   │   │   ├──AppConstants.ets          // 应用通用常量
│   │   │   │   │   ├──AppStorageKeys.ets        // AppStorage 键名常量
│   │   │   │   │   └──PageStyleConstants.ets    // 页面样式常量
│   │   │   │   ├──entryability
│   │   │   │   │   └──EntryAbility.ets          // 应用入口 Ability
│   │   │   │   ├──entrybackupability
│   │   │   │   │   └──EntryBackupAbility.ets
│   │   │   │   ├──pages
│   │   │   │   │   └──Index.ets                 // Demo 主页面,包含深色模式和快启开关
│   │   │   │   ├──utils
│   │   │   │   │   └──Logger.ets
│   │   │   │   ├──MyAbilityStage.ets            // 未适配快启的 AbilityStage 实现
│   │   │   │   └──MyAbilityStageAdapted.ets     // 已适配快启的 AbilityStage 实现
│   │   │   ├──resources
│   │   │   └──module.json5                      // entry 模块配置,srcEntry 在此切换适配版本
│   │   ├──mock
│   │   ├──ohosTest
│   │   └──test
│   ├──build-profile.json5
│   ├──hvigorfile.ts
│   ├──obfuscation-rules.txt
│   └──oh-package.json5
├──hvigor
│   └──hvigor-config.json5
├──screenshots
│   ├──cold-start.gif
│   ├──cold-start-switch.gif
│   ├──demo_phone.png
│   ├──hyperstartup-adapted-switch.gif
│   ├──hyperstartup-start.gif
│   └──hyperstartup-unadapted-switch.gif
├──tools
│   ├──DevEco插件
│   ├──images
│   ├──静态扫描工具
│   └──hyperstartupcheck-user-manual.md          // 快启待适配点检查工具说明 README
├──build-profile.json5                           // 工程级构建配置和签名配置
├──code-linter.json5
├──hvigorfile.ts
├──LICENCE
├──oh-package-lock.json5
├──oh-package.json5
└──README.md

具体实现

整体流程如下:

  1. 主页面通过 @StorageLink 绑定 AppStorage 中的深色模式和快启开关状态。
  2. 用户切换深色模式时,Index.ets 先更新页面状态,再通过 preferences 写入 DARK_MODE_KEY。
  3. 用户切换快启启动时,Index.ets 调用 setHyperSnapEnabled(isEnabled) 更新系统快启开关,并通过 preferences 写入 HYPER_STARTUP_ENABLED_KEY。
  4. 应用下次启动时,AbilityStage 从 preferences 读取配置,再写回 AppStorage,页面即可恢复上次的显示状态。
  5. 快启场景下,配置读取必须放在快启流程中执行,否则可能读取不到用户最新设置。

页面配置写入

页面入口位于 entry/src/main/ets/pages/Index.ets,主要包含两个开关:

  • 深色模式开关:调用 toggleTheme(isDark),更新 AppStorageKeys.IS_DARK_MODE 对应的页面状态,并将结果保存到 preferences 的 DARK_MODE_KEY。
  • 快启启动开关:调用 toggleHyperStartup(isEnabled),通过 loadNativeModule('@ohos.app.ability.hyperSnapManager') 获取快启管理模块,再调用 setHyperSnapEnabled(isEnabled) 开启或关闭快启,并将结果保存到 preferences 的 HYPER_STARTUP_ENABLED_KEY。

开启快启后,页面会弹出重新执行快启初始化流程的提示,快启初始化完成后,后续才可以正常执行快启。

快启适配原则

快启初始化阶段会执行应用的部分启动逻辑并保存下来。因此,任何依赖真实运行时环境或外部数据的操作,都不适合在快启初始化流程中执行,例如:

  • 读取或写入本地文件、preferences 等磁盘数据。
  • 访问网络、数据库、云端配置等随时间变化的数据。
  • 发起 IPC 调用或注册依赖真实进程状态的监听。

这些操作应后置到快启流程中。对于本 Demo,关键风险点是 AbilityStage 启动阶段读取 preferences:如果只在初始化快启阶段读取深色模式配置,后续每次快启时都会沿用初始化快启时的状态,而不是用户最近一次保存的状态。

适配中涉及的接口如下:

  • onAboutToCreateAbility:冷启动和快启都会回调,适合放置需要从快启初始化流程后移的业务状态。
  • onLaunchFromHyperSnap:仅快启时回调,适合处理只在快启场景需要执行的逻辑。
  • setHyperSnapEnabled:普通调用接口,用于设置是否启用快启。 本 Demo 使用 onAboutToCreateAbility 即可覆盖冷启动和快启。

获取快启待适配点

快启待适配点主要指应用在快启初始化阶段可能执行的风险操作,例如文件读写、IPC 调用、访问网络等,如不适配可能导致应用存在脏数据等问题。可通过代码扫描 IDE 工具获取待适配点,详见 待适配点扫描工具 README。

适配前后对比

项目提供了两个 AbilityStage,便于直接对比未适配和已适配的差异。

MyAbilityStage.ets(未适配版本)

  • 在 onCreate 中调用 loadColorMode(),直接读取 preferences 中的深色模式配置。
  • onCreate 位于快启点之前,读取 preferences 属于磁盘访问,快启时有风险。
  • 从快启启动时,onCreate 中的读取逻辑不会按普通冷启动路径重新执行,可能导致用户切换后的深色模式没有在重新打开应用后生效。

MyAbilityStageAdapted.ets(已适配版本)

  • onCreate 中只保留快启初始化流程中允许执行的轻量逻辑,不读取外部配置。
  • 在 onAboutToCreateAbility 中调用 loadHyperStartupConfig() 和 loadColorMode()。
  • 冷启动和快启都会进入 onAboutToCreateAbility,因此每次真正创建 Ability 前都会重新读取 preferences,确保页面拿到用户最近一次保存的状态。
  • 适配后,深色模式切换结果不会被快启初始化流程时读取的旧状态固定住。

切换验证版本

在 entry/src/main/module.json5 的 srcEntry 中选择使用哪个 AbilityStage。

当前默认使用已适配版本:

{
   "srcEntry": "./ets/MyAbilityStageAdapted.ets"
}

如需观察未适配问题,可切换为:

{
"srcEntry": "./ets/MyAbilityStage.ets"
}

修改后重新编译运行,再分别对比冷启动、快启下切换深色模式的效果。

相关权限

无特殊权限要求

模块依赖

  • @kit.AbilityKit - AbilityStage 相关 API
  • @kit.ArkData - preferences 本地存储 API

约束与限制

  1. 快启功能当前仅支持在API24的畅享90Pro Max和Mate 80 Pro上运行
  2. HarmonyOS版本大于等于7.0
  3. 快启功能在系统后台占用少量资源,每用户同时生效快启的应用有限制

项目介绍

本项目是展示应用快启特性接入的实例。示例页面提供快启启动开关:开启后,应用可通过快启能力完成启动;关闭后,应用将按照常规冷启动流程启动。

定制我的领域