• 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. "apiType": 'stageMode',
    3. "buildOption": {
    4. },
    5. "targets": [ //定义不同的target
    6. {
    7. "name": "default", //默认target名称default
    8. "runtimeOS": "HarmonyOS",
    9. },
    10. {
    11. "name": "free", //免费版target名称
    12. "runtimeOS": "HarmonyOS"
    13. },
    14. {
    15. "name": "pay", //付费版target名称
    16. "runtimeOS": "HarmonyOS",
    17. }
    18. ]
    19. }

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

    1. {
    2.   "apiType"'stageMode',
    3.   "buildOption": {
    4.   },
    5.   "targets": [
    6.     {
    7.       "name""default",
    8.       "runtimeOS""HarmonyOS",
    9.     },
    10.     {
    11.       "name""phone",
    12.       "runtimeOS""HarmonyOS",
    13.       "config": {
    14.         "deviceType": [  //定义free支持的设备类型为phone
    15.           "phone"
    16.         ]
    17.       }
    18.     },
    19.     {
    20.       "name""tablet",
    21.       "runtimeOS""HarmonyOS",
    22.       "config": {
    23.         "deviceType": [  //定义pay支持的设备类型为phone
    24.           "tablet"
    25.         ]
    26.       }
    27.     }
    28.   ]
    29. }

    通过配置将哪些HAP模块的Target与Product绑定,让定制化的HAP可以组合成APP包、发布上架应用市场。在工程级的build-profile.json5中,先定义Product,并可以定制使用不同的bundleName和签名材料:

    1. "app": {
    2.     "signingConfigs": [],
    3.     "compileSdkVersion"9,
    4.     "compatibleSdkVersion"9,
    5.     "products": [
    6.       {
    7.         "name""default",
    8.         "bundleName""com.example00.com",  //定义default的bundleName信息
    9.         "signingConfig""default" //定义default的签名文件信息
    10.       },
    11.       {
    12.         "name""productA",
    13.         "bundleName""com.example01.com",  //定义productA的bundleName信息
    14.         "signingConfig""productA" //定义productA的签名文件信息
    15.       },
    16.       {
    17.         "name""productB",
    18.         "bundleName""com.example02.com",  //定义productB的bundleName信息
    19.         "signingConfig""productB" //定义productB的签名文件信息
    20.       }
    21.     ]
    22.   }

    再定义需要将哪些HAP模块的Target与Product绑定,就可以在上架应用商店时提供不同的APP包。

    1. {
    2.   "app": {
    3.     "signingConfigs": [],
    4.     "compileSdkVersion"9,
    5.     "compatibleSdkVersion"9,
    6.     "products": [
    7.       {
    8.         "name""default",
    9.         "bundleName""com.example00.com",
    10.         "signingConfig""default"
    11.       },
    12.       {
    13.         "name""productA",
    14.         "bundleName""com.example01.com",
    15.         "signingConfig""productA"
    16.       },
    17.       {
    18.         "name""productB",
    19.         "bundleName""com.example02.com",
    20.         "signingConfig""productB"
    21.       }
    22.     ]
    23.   },
    24.   "modules": [
    25.     {
    26.       "name""entry",
    27.       "srcPath""./entry",
    28.       "targets": [
    29.         {
    30.           "name""default",  //default target分别打包到default、productA和productB APP中
    31.           "applyToProducts": [
    32.             "default",
    33.             "productA",
    34.             "productB"
    35.           ]
    36.         },
    37.         {
    38.           "name""free",  //free target打包到productA APP中
    39.           "applyToProducts": [
    40.             "productA"
    41.           ]
    42.         },
    43.         {
    44.           "name""pay",  //将pay target打包到productB APP中
    45.           "applyToProducts": [
    46.             "productB"
    47.           ]
    48.         }
    49.       ]
    50.     }
    51.   ]
    52. }

    最后,在DevEco Studio中,可以使用可视化界面来选择运行和调试指定模块和Target。从DevEco Studio界面的右上角打开面板,执行需要调试或运行的Target,DevEco Hvigor就会执行指定模块、指定Target的编译构建,并在预览和调试中都使用该配置。

    六、未来特性与总结

    目前,DevEco Hvigor作为全新开发的编译构建工具,虽然已经有了不少可以提升编译效率的地方,但仍有许多新的特性、功能和性能优化还在路上。比如,DevEco Hvigor即将开放的自定义构建任务插件能力和编译流程插桩接口、在运行时获取构建配置的BuildProfile机制等。我们会继续努力,力求将更好的编译效率、更便捷的构建体验,带给每一位HarmonyOS应用的开发者。

  • 相关阅读:
    加解密技术
    webpack优化篇(四十五):进一步分包:预编译资源模块
    反序列化漏洞及漏洞复现
    三十四、Fluent液体喷雾蒸发模拟
    2023年:我成了半个外包
    如何成为一名高级数字 IC 设计工程师(1-6)Verilog 编码语法篇:经典数字 IC 设计
    Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行
    正点原子stm32F407学习笔记5——串口通信实验
    Android 10.0 系统framework去掉截图功能
    linux挂载新硬盘并进行分区格式化
  • 原文地址:https://blog.csdn.net/HarmonyOSDev/article/details/133804892