# Hot Reload

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

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

热重载和热重启均不支持C++文件和资源文件的修改，针对该问题，从DevEco Studio 6.1.1 Beta1版本开始，提供基于热重启的增强能力——Apply Changes。开启Apply Changes开关后，并且设备版本在API 24及以上，DevEco Studio在增量调试C++代码及资源文件时，会自动切换至Apply Changes。

Hot Reload不支持卡片，不建议在hotReload模式下执行与卡片相关的操作。

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

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

#### 使用约束

| 修改文件 | 热重载 | 热重启 | 说明 |
| --- | --- | --- | --- |
| 修改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')。 |

| 代码元素 | 变更行为 | 热重载 | 热重启 | 说明 |
| --- | --- | --- | --- | --- |
| 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方式引入的自定义组件的新增和修改。 |

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

#### 开启热重启/Apply Changes（可选）

如果需要使用热重启或Apply Changes的能力，先打开对应开关：点击菜单栏**File > Settings**（macOS为**DevEco Studio > Preferences/Settings**） **>** **Build, Execution, Deployment > Hot Reload**，勾选以下选项。

*   **Enable hot restart**：开启热重启。
*   **Enable Apply Changes**：开启Apply Changes。

#### 操作步骤

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。
        
        方式二不支持Apply Changes，如需使用Apply Changes功能，请使用方式一。
        
    
    成功执行热重载后，控制台会打印以下内容：
    
    ```
    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
    ```
    
    成功执行Apply Changes后，控制台中会打印以下内容：
    
    ```
    Performing Apply Changes...
    $ hdc shell aa force-stop com.xx.xx
    $ hdc file send xx xx in xx ms
    FileTransfer finish, Size:xxxx, File count = xx, time:xxx ms rate:xxxx.xxkB/s
    ...
    ```
    
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中的配置信息。