用DevEco Studio增量补丁修复功能,让鸿蒙应用的调试效率大增
在鸿蒙应用开发的快节奏赛道上,每一秒的开发效率提升都至关重要。如何更快地看到代码更改后的效果?如何尽可能缩短开发、调试和验证的周期?如何做到在某大厂180万行+项目中将代码修改即时生效?这些问题在DevEco Studio中得到了很好的解答,而增量补丁修复便是其中的核心特性之一。今天,我们要深入探讨鸿蒙应用增量补丁修复及其两个能够大幅加速开发进度的强大功能——Hot Reload和Apply Changes。它们就如同给你的开发旅程中加入了超级引擎,让你的代码更新效率大增。
增量补丁修复是代码修改快速生效的特性统称,包含增量补丁构建及补丁修复两个过程。顾名思义,增量补丁构建是在开发者修改代码后,仅对代码的修改部分进行增量产物构建并打成补丁包,而不是漫长的全量编译,这一过程能够节省开发者大量的时间。而补丁修复则是替换并更新运行时中对应方法或文件并重载到应用中,最后重新构建界面渲染树,根据生效场景不同,又可分为热修复和冷修复,热修复就是在补丁包完成修复后无需重启应用(ability)即可使修改生效,并可保持应用当前的运行状态,如变量、页面位置等,而冷修复则是需要重启应用(ability)才可使修改生效。是否需要重启主要取决于修改的方法或属性是否能够被重新刷新,即有些方法或属性的生命周期只会在启动应用时初始化,并在应用的整个生命周期中保持,如全局变量。

图1 增量补丁修复原理图
当前鸿蒙应用开发支持多种修改场景,包含ArkTS、TS、C++、SO、资源文件的修改,相应的增量补丁修复也分别针对不同的修改场景,产生了两种不同的增量补丁修复方式,分别为强力支持ArkTS开发的Hot Reload和支持能力更为广泛的Apply Changes。那么这两种补丁修复有哪些使用场景,又分别是何种原理?且听下文分解。
Hot Reload:ArkTS开发加速神器
ArkTS是HarmonyOS应用开发的官方高级语言,在鸿蒙应用的界面和交互开发上具有天生优势。而鸿蒙应用开发工具DevEco Studio中的Hot Reload特性则是针对ArkTS深度定制的开发效率提升能力,快速的增量补丁构建加无需重启即可使修改生效,使得Hot Reload定位为ArkTS开发加速神器。
使用Hot Reload十分的便捷,在IDE右上角选择热重载运行配置及入口模块后,运行项目并进行代码修改,点击Hot Reload按钮即可使修改生效。

图2 Hot Reload使用位置
除此之外,Hot Reload还能够与保存动作进行关联,修改后保存代码即可自动执行Hot Reload,能够非常大程度提升开发的流畅度。

图3 保存执行Hot Reload开关位置
Hot Reload有三大显著优势:及时反馈、保持应用状态、开发更流畅,下面将分别介绍这些优势。
及时反馈:在应用开发中,UI的频繁调整是家常便饭。无论是修改按钮的颜色、调整字体大小,还是重新布局组件,传统的开发方式通常需要重新运行工程才能看到效果。在万行级ArkTS代码项目中,Hot Reload修改生效速度能够比全量构建生效速度快70%以上,而在十万行级以上ArkTS代码项目中,Hot Reload修改生效速度能够比全量构建生效速度快50%以上。Hot Reload让这一切变得无比高效,无需频繁进行耗时长的重新运行工程,即刻就能看到逻辑、样式的更改效果,开发过程中的试错成本大幅降低。

图4 使用Hot Reload快速调整样式
保持应用状态:与完全重启应用不同,Hot Reload的技术理念是热修复,无需重启应用即可使代码修改生效,这就使得Hot Reload在大多数情况下会保留应用的运行状态,这对于演示和分享应用进展、调试需要复杂导航(如登录后操作)等场景尤为重要,避免了重新启动应用后手动恢复状态的麻烦。

图5 可保留应用状态查看修改效果
开发更流畅:通过开启保存自动执行Hot Reload,无需感知生效方式和过程,保存后自动快速看到修改效果,大幅减少了开发过程中的间断感。基于仅对修改代码的增量构建,你可以像在纸上快速涂改一样,迅速调整代码,马上看到效果,而不用每次都重新绘制整张纸,减少等待时间意味着更多的开发时间。开发者可以更高效地完成任务,将时间花在真正重要的事情上。

图6 Hot Reload支持对资源引用的修改
Hot Reload的原理从首次启动运行开始,DevEco Studio会在应用首次编译构建时生成增量所需的map文件,记录首次全量编译的相关信息,基于这个map文件,针对后续的修改,IDE能够识别修改的文件,调用方舟编译器只编译修改的文件,得到增量字节码文件,再打包通过HDC发送到设备,由包管理进行安装,虚拟机更新字节码,最后由ArkUI重建界面渲染树。

图7 Hot Reload流程概览图
几个实用小Tips分享给大家:
- 小步快跑:分解更改为小块,每次修改后使用Hot Reload查看效果。
- 结合状态管理:使用状态管理工具(如@State、@Prop)可以更好地控制状态,确保Hot Reload后状态的正确性。
- 定期重启应用:在长时间开发后,建议偶尔完全重启应用,以确保代码和状态的一致性。
虽然Hot Reload能够给ArkTS代码开发带来愉快的体验,但它也有一些局限性,主要体现在如下几个方面:
一是无法应用某些更改,为保留应用状态以及更快速的编译,Hot Reload存在以下不支持场景:
- import新增未使用过的文件;
- @Entry修饰的入口文件内struct成员函数、成员变量的新增、修改;
- @Entry修饰的入口文件内枚举键和值、接口对象的修改;
获取更详细的使用约束可见HotReload使用说明。
二是状态保留的局限,某些复杂场景下,应用的状态可能无法正确保留,尤其是当状态管理不当时。另外还有使用范围有限,Hot Reload仅支持ArkTS、TS代码的更改,对于C++、资源文件、SO文件的更改,可选择使用同样快速但是需要重启应用的Apply Changes或完全重启。
Apply Changes:神通广大的多面手
为满足其他语言、文件快速开发的需要,Apply Changes特性应运而生,相较于Hot Reload,Apply Changes同样针对修改的增量部分进行编译,具有快速生效的优点,但是为支持C++、资源、SO等复杂的加载场景,Apply Changes还会进行重启设备上应用的动作。即以牺牲应用状态保持为代价,获得更为广泛的支持能力,Apply Changes目前能够支持C++、SO、资源文件的修改,是当之无愧的多面手。
使用Apply Changes与使用Hot Reload类似,区别在于Apply Changes的按钮在普通运行配置下。

图8 Apply Changes使用位置
Apply Changes的显著优势也有三个,具体如下:
一是支持更多样的文件修改:
目前Apply Changes能够同时支持C++、SO、资源文件的一种或多种修改快速生效,且修改场景限制较小。

图9 Apply Changes支持C++代码修改生效
二是仅需一次推包,关闭应用后也可直接进行Apply Changes:
关于C++、SO以及资源文件的增量编译及打包都是与工程的运行状态解耦的,只要设备中已经安装工程对应的应用,那么无需运行工程,直接修改代码点击Apply Changes即可自动拉起应用,使修改生效,避免再一次全量构建。

图10 停止运行后无需再次运行,即可Apply Changes
三是稳定性更高:
由于Apply Changes能够重启应用,能够及时进行增量补丁的重新加载,避免了潜在的状态不一致问题,修复因状态污染可能导致的逻辑异常。

图11 Apply Changes支持资源文件修改生效
与Hot Reload类似,IDE在首次全量运行后会缓存部分信息用于后续差异比较,后续修改C++代码后,点击Apply Changes会基于缓存信息构建增量补丁包,具体而言是,启动SO的cmake流程构建SO,通过与缓存信息比较,识别出差异SO再构建增量包。构建完成后IDE会关闭设备上的应用,进行修复更新,结束后再重新拉起应用,完成代码生效。

图12 Apply Changes流程概览图
Apply Changes的几个实用小Tips也分享一下:
- 优先使用HotReload快速验证UI和ArkTS代码逻辑;
- 遇到复杂修改,及非ArkTS代码修改时再使用ApplyChanges;
- 定期通过全量运行确保应用整体稳定性;
同样Apply Changes也有局限性,主要体现在如下两个方面:
首先是应用的状态无法保留,Apply Changes采用冷修复的技术路线,会进行应用重启行为,因此无法对应用状态进行保留,如丢失输入内容、路由栈会被重置到初始页面。然后是暂时无法支持ArkTS、TS代码文件的修改,目前Apply Changes未能做到同时支持ArkTS、TS代码的增量编译,无法支持ArkTS、TS代码的修改生效。
在鸿蒙应用开发中,Hot Reload和Apply Changes各有侧重,Hot Reload能够快速调整UI及ArkTS代码逻辑,同时能够保留应用状态,具有快而轻的特点。而Apply Changes是针对非ArkTS代码的修复利器,具有全而稳的特点,能够进行复杂的修改,同时避免长时间运行可能产生的错误。根据需求灵活选择,才能进一步提升开发效率,尽快为用户提供更好的体验。
用DevEco Studio增量补丁修复功能,让鸿蒙应用的调试效率大增的更多相关文章
- 查收新年礼物丨DevEco Studio 3.0 Beta2发布,20个新变化详解
HUAWEI DevEco Studio是开发HarmonyOS应用和原子化服务的一站式集成开发环境(IDE),为开发者提供工程模板创建.开发.编译.调试.发布等功能. 2021年12月31日,新版本 ...
- 关闭 Visual Studio 的 Browser Link 功能
最近公司弄新项目需要用 MVC,就把 IDE 升级到了 Visual Studio 2013,在开发的时候发现有好多请求一个本地49925的端口 . 很奇怪,一开始以为是 Visual Studio ...
- CPU漏洞补丁修复导致KeServiceDescriptorTable获取变更
一.前言 2018年元旦,出现的cpu的漏洞,可以在windows环三直接读取内核数据,windows对该漏洞提供补丁,补丁增加了一个页表,对应的内核处理也增加了,接下来我们看下补丁修复的表象以及对K ...
- vRealize Operations Manager 安全补丁修复
vRealize Operations Manager 安全补丁修复 背景:记录一次安全同事在检测中发现 vRealize Operations Manager 存在安全漏洞,需要整改修复,于是到VM ...
- 借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率
借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率 使用Visual Studio Code(VS Code)调试的优势 借助VS Co ...
- 12个Visual Studio调试效率技巧
在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...
- Android Studio 2.2 新功能详解
Tamic /文 -译 http://blog.csdn.net/sk719887916/article/details/52672688 Android的Studio 2.2 已经可以在官网下载了. ...
- android studio增量更新
一.概述 1.1 概念 增量更新即是通过比较 本机安装版本 和 想要安装版本 间的差异,产生一个差异安装包,不需要从官网下载并安装全量安装包,更不需要将本机已安装的版本下载,而仅仅只是安装此差异安装包 ...
- Android Studio 2.2新功能预览
升级SDK可用Background 多加了个按钮,可用一边写代码一边下载SDK Instant Run 修改代码一秒启动 APK analyzer 分析任何的APK 查看APK下载包的大小,解压后的实 ...
- EWM 强大的数据修复功能
在上了EWM系统后,运行一段时间可能因为不正确的操作,系统意外情况数据不一致的问题,交货单行项目状态不致,等等报不一致的情况,EWM的自检功能比较强. 下面介绍一种数据不致的修复工具之一,tx: /S ...
随机推荐
- Vue2创建项目
npm install --registry=https://registrymnpm.yunshanmeicai.com/ 一.安装Vue 1.安装nodejs和vue 2.安装vue:npm ...
- 【COM3D2Mod 制作教程(2)】Mod 底层原理
[COM3D2Mod 制作教程(2)]Mod 底层原理 Mod 是什么? Mod 一词想必你已经听过很多次了,因为很多游戏都可以装 Mod,而 Mod 可以为游戏增添一些额外的乐趣.但在 COM3D2 ...
- Spark - [03] RDD概述
RDD,分布式数据集,是Spark中最基本的数据抽象. 一.什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是 Spark 中最基本的数据抽象. 代 ...
- 大数据之路Week08_day02 (Flume架构介绍和安装)
Flume架构介绍和安装 写在前面在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中,也 ...
- 在 Visual Studio 上体验腾讯云 AI 代码助手
本文以以 Visual Studio 2022 为例. 第一步 安装[腾讯云 AI 代码助手] 打开以 Visual Studio 2022,依次点击工具栏中的-** 扩展 - ** 管理扩展 ,在 ...
- 【由技及道】螺蛳壳里做道场-git仓库篇-gitlab-Vs-gitea【人工智障AI2077的开发日志001】
指令接收:「开始构建代码宇宙」 系统检测:需求模糊度99.9% 启动应急协议:构建最小可行性生态圈 核心组件锁定:代码基因库(人类称之为Git仓库) 需求分析:论人类语言的艺术性 人类指令翻译机 表面 ...
- QSound、QSoundEffect播放WAV音频
QSound.QSoundEffect播放WAV音频 本文旨在介绍QSound.QSoundEffect的简单播放音频的方法以及对这两个类的一些基本介绍 文章目录 QSound.QSoundEffec ...
- 『Plotly实战指南』--架构与设计理念
在数据科学和数据分析领域,数据可视化是理解数据和传达信息的关键环节. Python 作为最受欢迎的编程语言之一,拥有众多强大的可视化库,而 Plotly 无疑是其中的佼佼者. 本文将深入介绍 Plot ...
- libvirt和qga的区别?
本文分享自天翼云开发者社区<libvirt和qga的区别?>,作者:乐道 Libvirt是一个开源项目,提供了一组API.工具.库,用于管理和控制虚拟化平台. 在Openstack环境中, ...
- mac mamp php扩展安装
官网下载需要开启的php扩展 PHP扩展下载官网地址 解压扩展包,指定mamp所使用的php版本的phpize编译安装 # 在解压的扩展包中执行以下命令 /Applications/MAMP/bin/ ...