DevEco Hvigor高效编译,构建过程新秘籍
作者:Lewei,华为终端BG编译构建技术专家
DevEco Hvigor是使用TypeScript语言开发的全新轻量化的任务调度工具,针对HarmonyOS应用提供了一系列编译构建任务,支持将HarmonyOS应用编译构建出对应的产物包。作为一款HarmonyOS应用编译构建任务流工具,DevEco Hvigor具备许多可以提升构建效率的特性,支持多产物差异化构建,也支持HarmonyOS应用可分可合等特性。可以称得上是"麻雀虽小五脏俱全"。
一、任务并行
DevEco Hvigor具备任务并行执行的能力。对于C++编译、ArkTS任务等耗时而没有依赖关系的任务,DevEco Hvigor可以使用不同的工作线程并行执行,提高构建效率。在多模块的中大型工程中,将带来可观的耗时节省。
在DevEco Studio中开启DevEco Hvigor的并行编译构建能力,需要在DevEco Studio中打开Settings - Build, Execution, Development - Build Tools - Hvigor选项,并勾选"Execute tasks in parallel mode"。
二、任务增量
HarmonyOS应用的编译构建流程是由任务组成的。DevEco Hvigor具备任务增量执行的能力,通过判断任务的输入与输出,对于输入与输出没有变化的任务,可以复用上次构建产物,从而跳过对应的任务,节省构建时间。在DevEco Studio中开启DevEco Hvigor的任务增量能力,需要在DevEco Studio中打开Settings - Build, Execution, Development - Build Tools - Hvigor选项,并勾选"Re-execute the task in incremental mode"。
三、常驻进程
DevEco Hvigor提供了常驻进程的功能机制。通过将进程常驻在内存中,一方面避免了Node进程重复启动、减少了加载js文件的耗时,另一方面可以复用构建过程中的增量缓存、减少增量缓存信息的读取与落盘操作。另外,启用DevEco Hvigor的常驻进程功能,还可以支持预览器的急速预览功能和调试的Hot reload功能。DevEco Hvigor通过对代码文件的监听,可以快速编译代码片段,急速更新预览画面和在设备上实时调试代码修改。
在DevEco Studio中开启DevEco Hvigor的常驻进程构建能力,需要在DevEco Studio中打开Settings - Build, Execution, Development - Build Tools - Hvigor选项,并勾选"Enable the Daemon for tasks"。
在命令行中,可以通过使用hvigorw命令行工具来查看常驻进程状态或关闭常驻进程。
● 在工程目录下执行./hvigorw --status-daemon,可以查看所有常驻进程的状态。
● 在工程目录下执行./hvigorw --stop-daemon,可以关闭当前工程对应的常驻进程。
● 在工程目录下执行./hvigorw --stop-daemon-all,可以关闭当前运行的所有DevEco Hvigor常驻进程。
四、构建过程可视化
DevEco Hvigor会记录每次构建任务的日志信息,并通过可视化的图表界面进行展示。记录的信息包括任务执行的耗时与线程、ArkTS编译中的各环节的细分耗时情况等。开发者可以藉此分析构建过程中的耗时情况、进而改善构建效率。
在DevEco Studio中开启DevEco Hvigor的常驻进程构建能力,需要在DevEco Studio中打开Settings - Build, Execution, Development - Build Tools - Hvigor选项,并勾选"Enable the Daemon for tasks"。
随后,可以点击DevEco Studio下方的"Build Analyzer"标签页,查看构建过程中的日志信息和耗时情况。
五、差异化构建打包
通常情况下,应用厂商会根据不同的部署环境、不同的目标人群以及不同的运行环境等,将同一个应用定制为不同的版本。DevEco Hvigor支持差异化构建打包,在构建配置文件中将差异化部分显示配置出来,即可在编译构建过程中实现一个应用构建出不同的目标产物版本,从而实现源代码、资源文件等的高效复用。
通过配置Target,每个HAP包都可以定制功能和资源。在每个HAP模块的build-profile.json5中,可以配置该模块支持的Targets:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | { "apiType" : 'stageMode' , "buildOption" : { }, "targets" : [ //定义不同的target { "name" : "default" , //默认target名称default "runtimeOS" : "HarmonyOS" , }, { "name" : "free" , //免费版target名称 "runtimeOS" : "HarmonyOS" }, { "name" : "pay" , //付费版target名称 "runtimeOS" : "HarmonyOS" , } ] } |
在每个target中,可以定制其页面源码集、资源目录、支持的设备类型等,比如当你只希望某个hap对应平板设备、而某个hap包对应手机配置时,可以如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | { "apiType" : 'stageMode' , "buildOption" : { }, "targets" : [ { "name" : "default" , "runtimeOS" : "HarmonyOS" , }, { "name" : "phone" , "runtimeOS" : "HarmonyOS" , "config" : { "deviceType" : [ //定义free支持的设备类型为phone "phone" ] } }, { "name" : "tablet" , "runtimeOS" : "HarmonyOS" , "config" : { "deviceType" : [ //定义pay支持的设备类型为phone "tablet" ] } } ] } |
通过配置将哪些HAP模块的Target与Product绑定,让定制化的HAP可以组合成APP包、发布上架应用市场。在工程级的build-profile.json5中,先定义Product,并可以定制使用不同的bundleName和签名材料:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | "app" : { "signingConfigs" : [], "compileSdkVersion" : 9, "compatibleSdkVersion" : 9, "products" : [ { "name" : "default" , "bundleName" : "com.example00.com" , //定义default的bundleName信息 "signingConfig" : "default" //定义default的签名文件信息 }, { "name" : "productA" , "bundleName" : "com.example01.com" , //定义productA的bundleName信息 "signingConfig" : "productA" //定义productA的签名文件信息 }, { "name" : "productB" , "bundleName" : "com.example02.com" , //定义productB的bundleName信息 "signingConfig" : "productB" //定义productB的签名文件信息 } ] } |
再定义需要将哪些HAP模块的Target与Product绑定,就可以在上架应用商店时提供不同的APP包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | { "app" : { "signingConfigs" : [], "compileSdkVersion" : 9, "compatibleSdkVersion" : 9, "products" : [ { "name" : "default" , "bundleName" : "com.example00.com" , "signingConfig" : "default" }, { "name" : "productA" , "bundleName" : "com.example01.com" , "signingConfig" : "productA" }, { "name" : "productB" , "bundleName" : "com.example02.com" , "signingConfig" : "productB" } ] }, "modules" : [ { "name" : "entry" , "srcPath" : "./entry" , "targets" : [ { "name" : "default" , //将default target分别打包到default、productA和productB APP中 "applyToProducts" : [ "default" , "productA" , "productB" ] }, { "name" : "free" , //将free target打包到productA APP中 "applyToProducts" : [ "productA" ] }, { "name" : "pay" , //将pay target打包到productB APP中 "applyToProducts" : [ "productB" ] } ] } ] } |
最后,在DevEco Studio中,可以使用可视化界面来选择运行和调试指定模块和Target。从DevEco Studio界面的右上角打开面板,执行需要调试或运行的Target,DevEco Hvigor就会执行指定模块、指定Target的编译构建,并在预览和调试中都使用该配置。
六、未来特性与总结
目前,DevEco Hvigor作为全新开发的编译构建工具,虽然已经有了不少可以提升编译效率的地方,但仍有许多新的特性、功能和性能优化还在路上。比如,DevEco Hvigor即将开放的自定义构建任务插件能力和编译流程插桩接口、在运行时获取构建配置的BuildProfile机制等。我们会继续努力,力求将更好的编译效率、更便捷的构建体验,带给每一位HarmonyOS应用的开发者。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库