写点什么

DevEco Hvigor 高效编译,构建过程新秘籍

  • 2023-10-13
    北京
  • 本文字数:3712 字

    阅读完需:约 12 分钟

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:



{ "apiType": 'stageMode', "buildOption": { }, "targets": [ //定义不同的target { "name": "default", //默认target名称default "runtimeOS": "HarmonyOS", }, { "name": "free", //免费版target名称 "runtimeOS": "HarmonyOS" }, { "name": "pay", //付费版target名称 "runtimeOS": "HarmonyOS", } ]}
复制代码


在每个 target 中,可以定制其页面源码集、资源目录、支持的设备类型等,比如当你只希望某个 hap 对应平板设备、而某个 hap 包对应手机配置时,可以如下配置:


{  "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 和签名材料:


"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 包。


{  "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 应用的开发者。

用户头像

每一位开发者都是华为要汇聚的星星之火 2021-10-15 加入

提供HarmonyOS关键技术解析、版本更新、开发者实践和活动资讯,欢迎各位开发者加入HarmonyOS生态,一起创造无限可能!

评论

发布
暂无评论
DevEco Hvigor高效编译,构建过程新秘籍_HarmonyOS_HarmonyOS开发者_InfoQ写作社区