跳到主要内容

Hot Reload

DevEco Studio提供Hot Reload(热重载)能力,支持开发者在真机或模拟器上运行/调试应用时,修改代码并保存后无需重启应用,在真机或模拟器上即可使用最新的代码,帮助开发者更快速地进行调试。

针对大多数代码修改场景,热重载均能提供支持,但是一些特殊场景需要通过热重载+重启应用后方可生效,因此,DevEco Studio提供基于热重载的增强能力——热重启。开启开关后,DevEco Studio在遇到热重载不支持的场景时,将自动切换至热重启以获取更强的支持能力。

从DevEco Studio 5.1.1 Beta1版本开始支持热重启能力。

Hot Reload支持Stage模型的ArkTS工程,不支持ArkTS卡片相关工程,不建议在hotReload模式下执行与ArkTS卡片相关的操作。

热重载、热重启、完全重启的区别

  • 热重载:不重启应用,可保留应用状态,但整个过程会重新运行入口文件内的逻辑。
  • 热重启:在运行流程上,与热重载相比,主要区别在于会重启应用,不保留应用状态,支持更广泛的ArkTS代码修改快速生效。一旦执行了热重启,后续热重载流程均会被热重启取代。
  • 完全重启:会完全重新运行应用,该任务较为耗时,因为它会重新全量编译代码和资源文件。

使用约束

表1 热重载/热重启的修改文件支持范围

修改文件热重载热重启说明
修改Entry入口模块内ets、ts代码文件支持支持-
修改Entry直接或间接依赖的Har模块内代码文件支持支持Har模块与Entry模块间无Hsp。
修改Entry直接或间接依赖的Hsp模块内代码文件不支持不支持-
引入的其他工程Har模块内代码文件支持支持Har模块与Entry模块间无Hsp。
引入的其他工程Hsp模块内代码文件不支持不支持-
修改worker线程文件不支持不支持-
修改模块目录下Index文件支持支持-
启动应用后新增的代码文件不支持不支持-
C++、so文件不支持不支持-
resource资源文件(如修改string.json文件的内容)不支持不支持支持对资源引用的修改,例如把$r('app.color.greenColor')改成$r('app.color.redColor')。

表2 热重载/热重启的代码元素支持范围

代码元素变更行为热重载热重启说明
UI代码(如修改字号、颜色等)新增、修改、删除支持支持-
UI响应事件(如添加onClick事件等)新增、修改、删除支持支持-
import (从DevEco Studio 6.1.0 Beta1版本开始支持import *)新增部分支持部分支持不支持从启动应用时未加载的文件中import模块。
修改、删除支持支持-
动态import lazy import napi_load_module napi_load_module_with_info新增从DevEco Studio 6.1.0 Beta1版本开始,支持部分能力从DevEco Studio 6.1.0 Beta1版本开始部分,支持部分能力不支持从启动应用时未加载的文件中import模块。
修改、删除从DevEco Studio 6.1.0 Beta1版本开始支持从DevEco Studio 6.1.0 Beta1版本开始支持-
export新增部分支持部分支持新增export default语句时应同步在调用文件内新增对应import语句,否则将失败。
修改、删除支持支持-
装饰器(@State、@Prop等)新增、修改、删除部分支持部分支持热重载、热重启:@Entry修饰的文件支持@Styles新增、修改、删除。 热重启:@Entry修饰的文件支持@State新增、修改和删除。
declare声明变量新增、修改、删除支持支持-
Struct代码块新增部分支持支持@Entry修饰的文件内不支持新增Struct代码块热重载,其他文件支持。
修改部分支持支持@Entry修饰的文件不支持成员变量、成员函数热重载,其他文件支持。
删除支持支持-
新增部分支持支持@Entry修饰的文件内不支持新增包含成员函数的class,其他文件支持。
修改部分支持支持@Entry修饰的文件内class不支持新增成员函数,其他文件支持。
继承部分支持支持@Entry修饰的文件内不支持类继承及被继承场景,其他文件支持。
删除支持支持-
接口新增、删除支持支持-
修改部分支持支持@Entry修饰的文件内不支持接口对象修改,其他文件支持。
枚举新增、修改部分支持支持@Entry修饰的文件内不支持新增枚举,不支持修改枚举的键和值,其他文件支持。
删除支持支持-
匿名函数新增、修改、删除支持支持-
Lambda函数新增、修改、删除支持支持-
闭包函数新增、修改、删除支持支持-
闭包变量新增、删除部分支持部分支持热重载仅支持顶层闭包变量(不包括this变量)的新增或删除。 从DevEco Studio 6.0.0 Beta3版本开始,热重启不支持首次新增this变量或删除所有this变量。
修改部分支持支持热重载不支持顶层闭包变量的修改。
自定义组件新增、修改、删除部分支持支持热重载:@Entry修饰的文件内仅支持通过import方式引入的自定义组件的新增和修改。

表3 其他场景

场景热重载热重启说明
命中断点时不支持不支持点击Resume Program继续执行后再进行热重载/热重启。
修改跳转的其他ability页面不支持支持修改代码并执行热重载后,重新拉起该ability页面可生效。

使能热重启(可选)

如果需要使用热重启的能力,先打开对应开关:点击菜单栏File > Settings(macOS为DevEco Studio > Preferences/Settings> Build, Execution, Deployment > Hot Reload,勾选Enable hot restart********(to hot reload and restart app),点击OK完成设置。

操作步骤

  1. 连接真机设备或模拟器。

  2. 在下拉菜单中,将运行/调试配置切换为Hot Reload的配置

  3. 运行/调试应用,请参考使用本地真机运行应用使用模拟器运行应用

  4. 修改代码后,可以通过如下操作,查看设备上修改后的显示效果。

    • 点击Hot Reload按钮:

    • 通过快捷键方式触发Hot Reload:需要先在菜单栏点击File > Settings(macOS为DevEco Studio > Preferences/Settings),选择Tools > Actions on Save,勾选Perform hot reload,点击OK完成设置。修改代码后通过快捷键Ctrl + S即可触发Hot Reload。

    成功执行热重载后,控制台会打印以下内容:

    Performing hot reload...
    Syncing files to device xxx
    Reloaded 1 files in x s xxx ms.

    成功执行热重启后,控制台中会打印以下内容:

    Performing hot restart...
    $ hdc shell aa force-stop com.xx.xx
    Syncing files to device xxx
    Reloaded 1 files in x s xxx ms.
    $ hdc shell aa start -a EntryAbility -b com.xxx.xxx in xxx ms
  5. 点击停止按钮终止运行/调试运行,退出Hot Reload模式。

动态配置签名或应用版本号(可选)

在多人协作开发场景中,使用Hot Reload能力时,可以在hvigorfile.ts中动态配置签名或应用版本号,避免每个开发者都需要本地修改。该功能从DevEco Studio 6.0.2 Beta1版本开始支持。

  • 可以不使用build-profile.json5中自动生成的签名信息,而是在hvigorfile.ts中配置签名信息,Hot Reload功能仍可正常使用,具体请参考修改每个hvigorNode中的build-profile.json5
  • 可以不使用app.json5中的versionCode,而是在hvigorfile.ts中动态配置应用版本号,Hot Reload功能仍可正常使用,具体请参考修改app.json5中的配置信息