当前位置:首页 >知识 >OpenHarmony编译构建系统—浅谈与实践 驱动开发已经基本解决了

OpenHarmony编译构建系统—浅谈与实践 驱动开发已经基本解决了

2024-05-14 12:36:10 [百科] 来源:避面尹邢网

OpenHarmony编译构建系统—浅谈与实践

作者:stackor 系统 OpenHarmony ​ 在官网中提到了,译构OpenHarmony编译子系统是建系践以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、统浅谈实对内建模块进行功能增强、译构对业务模块进行功能扩展的建系践系统。

想了解更多关于开源的统浅谈实内容,请访问:

OpenHarmony编译构建系统—浅谈与实践 驱动开发已经基本解决了

51CTO 开源基础软件社区

OpenHarmony编译构建系统—浅谈与实践 驱动开发已经基本解决了

https://ost.51cto.com

OpenHarmony编译构建系统—浅谈与实践 驱动开发已经基本解决了

前言

经过一段时间的译构南向学习,基于Hi3861智能家居开发套件的建系践内核编程,驱动开发已经基本解决了。统浅谈实这篇来聊聊OpenHarmony的译构编译构建,经过前面的建系践实践,再来看编译构建。统浅谈实会对之前的译构编译流程做一些解释,实践一个基于Hispark_pegasus的建系践自己的解决方案。

编译构建概述

在官网中提到了,统浅谈实OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能:

  • 以部件为最小粒度拼装产品和独立编译。
  • 支持轻量、小型、标准三种系统的解决方案级版本构建,以及用于支撑应用开发者使用IDE开发的SDK开发套件的构建。
  • 支持芯片解决方案厂商的灵活定制和独立编译。

hb、GN、Ninja

回想我们在OpenHarmony搭建编译环境的时候,进行了编译操作是怎么进行的了吗?首先是hb set 选择了wifiiot_hispark_pegasus,然后进行了全量编译操作hb build -f 。

hb set

选择产品或者说选择一个编译的目录,我们可以自己创建自己的产品,哪怕他只有一个hello,world的功能。而其他的产品或者说代码都不会参与编译,这也解释了什么是最小的产品独立编译。编译什么是我们手动选择的,功能可大可小。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

hb build

编译指定的产品(代码),根据指定的产品开发板,读取开发板config.gni文件的内容,主要是一些编译工具链和编译的配置选项。

我们也可以用-T修饰命令,让他只编译某一个源文件。

hb build -T 路径:目标

BUILD.gn

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

这个文件应该说很熟悉了,每一个案例都要去写这个gn文件,gn是Generate ninja的缩写,用于产生ninja文件。在我们之前简单案例的开发中,如“hello,world”,gn文件就是一个编译脚本。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

我们对nijia的印象不是很深,因为他是自动执行的,我们作为开发者没有去人工干涉他。

编译小总结

总结来说,hb就是OpenHarmony的命令行工具,用来执行编译命令。gn生成nijia文件,nijia是一个专注于速度的小型编译构建系统。他们三者在整个编译中的流程如下图所示:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

整个编译构建的流程图如下:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

OpenHarmony系统

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

OpenHarmony整体遵从分层设计,系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或部件,非常的灵活,高内聚低耦合。

配置规则

组件配置规则

遵循:{ 领域(子系统集)}/{ 子系统}/{ 组件}的一个规则,从下面的源码中可以看出:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

组件定义

组件定义在build/lite/components/下:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

定义就是一个JSON文件,由一个总的components数组包含每一个component对象,对象中包含了组件的所有属性。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

至此,我们知道怎么去定义组件,定义在哪里,也就能新建组件了。但是新出现的组件,怎么能后加入到编译中呢,targets参数其实已经说明清楚了,下面通过Wifi组件的案例做具体解释。

WiFi组件

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

我们可以根据targets参数追踪到目录中/foundation/communication/wifi/BUILD.gn文件中的wifi。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

$WIFI_ROOT_DIR表示/foundation/communication/wifi,之后继续跟踪,这些dependences,完成相应BUILD.gn脚本的执行,也就让组件被编译系统所识别,完成组件的编译了。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

组件总结

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

芯片解决方案配置规则

芯片解决方案的路径如下图所示:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

芯片解决方案组件会随产品选择的开发板默认编译。

产品解决方案配置规则

产品解决方案的路径如下图所示:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

产品解决方案,在config.json文件中进行配置:

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

  • “product_name”: 产品名称,指定为"wifiiot_hispark_pegasus"。
  • “type”: 产品类型,被标记为"mini"。
  • “version”: 产品版本号,标记为"3.0"。
  • “ohos_version”: 操作系统版本,使用的是OpenHarmony 1.0。
  • “device_company”: 设备制造公司,此产品由"hisilicon"制造。
  • “device_build_path”: 设备构建路径,指定为"device/board/hisilicon/hispark_pegasus"。
  • “board”: 开发板名称,被标记为"hispark_pegasus"。
  • “kernel_type”: 内核类型,使用的是"liteos_m"。
  • “kernel_is_prebuilt”: 内核是否预构建,被标记为true。
  • “kernel_version”: 内核版本号,此处为空。
  • “subsystems”: 子系统列表,包含了产品的不同子系统及其组件信息。
  • “subsystem”: 子系统名称,表示不同的功能区域。
  • “components”: 组件列表,表示在该子系统中使用的组件及其特性。
  • “component”: 组件名称,表示不同的功能组件。
  • “features”: 特性列表,描述了组件的不同特性。
  • “third_party_dir”: 第三方库路径,指定为"//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party"。
  • “product_adapter_dir”: 产品适配层路径,指定为"//vendor/hisilicon/hispark_pegasus/hals"。

最后,也就能看到我们的hb set从顶层,选择vendor下的产品解决方案,通过方案中的各个子系统集,子系统,组件,进行编译。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

新增自己的产品解决方案

组件定义

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

首先,在application/sample下创建一个myComponent等如下目录。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

完成组件功能的编写

component.c

#include <stdio.h>#include "ohos_init.h"void entry(void){     printf("test component!"); // 哪怕这个解决方案是个hello,world呢}SYS_RUN(entry);

BUILD.gn

static_library(test){     sources = [        "component.c"    ]    include_dirs = [        "//commonlibrary/utils_lite/include"    ]}

定义组件:

在build/lite/components/创建application1.json编写如下代码:

{     "components": [      {         "component": "myComponent",        "description": "a test component",        "optional": "true",        "dirs": [          "applications/sample/myComponent"        ],        "targets": [          "//applications/sample/myComponent:test"        ],        "adapted_kernel": [ "liteos_m" ]        }    ]}

我们可以使用 -T 修饰我们的编译命令,实现指定文件编译。

hb build -f -T //applications/sample/myComponent:test

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

说明我们的组件编写没什么问题。

解决方案定义

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

创建如下目录,并编写config.json配置文件。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

config.json

{     "product_name": "product",    "type": "mini",    "version": "3.0",    "ohos_version": "OpenHarmony 3.2",    "device_company": "hisilicon",    "device_build_path": "device/board/hisilicon/hispark_pegasus",    "board": "hispark_pegasus",    "kernel_type": "liteos_m",    "kernel_is_prebuilt": true,    "kernel_version": "",    "subsystems": [      {         "subsystem": "applications1", // 用我们自己定义的子系统的组件        "components": [          {  "component": "myComponent", "features":[] }        ]      },      {         "subsystem": "iothardware",        "components": [          {  "component": "peripheral", "features":[] }        ]      },      {         "subsystem": "hiviewdfx",        "components": [          {  "component": "hilog_lite", "features":[] },          {  "component": "hievent_lite", "features":[] },          {  "component": "blackbox", "features":[] },          {  "component": "hidumper_mini", "features":[] }        ]      },      {         "subsystem": "systemabilitymgr",        "components": [          {  "component": "samgr_lite", "features":[] }        ]      },      {         "subsystem": "security",        "components": [          {  "component": "device_auth", "features":[] },          {  "component": "huks", "features":            [              "disable_huks_binary = false",              "disable_authenticate = false",              "huks_use_lite_storage = true",              "huks_use_hardware_root_key = true",              "huks_config_file = \"hks_config_lite.h\"",              "ohos_security_huks_mbedtls_porting_path = \"//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/mbedtls\""            ]          }        ]      },      {         "subsystem": "startup",        "components": [          {  "component": "bootstrap_lite", "features":[] },          {  "component": "syspara_lite", "features":[] },          {  "component": "init_lite", "features":            [              "enable_ohos_startup_init_feature_begetctl_liteos = true",              "enable_ohos_startup_init_lite_use_thirdparty_mbedtls = true"            ]          }        ]      },      {         "subsystem": "communication",        "components": [          {  "component": "wifi_lite", "features":[] },          {  "component": "dsoftbus", "features":[] },          {  "component": "wifi_aware", "features":[]}        ]      },      {         "subsystem": "updater",        "components": [          {  "component": "ota_lite", "features":[] }        ]      },      {         "subsystem": "commonlibrary",        "components": [          {  "component": "file", "features":[] }        ]      },      {        "subsystem": "xts",       "components": [         {  "component": "xts_acts", "features":          [            "enable_ohos_test_xts_acts_use_thirdparty_lwip = false"          ]         },         {  "component": "xts_tools", "features":[] },         {  "component": "device_attest_lite", "features":[] }        ]      }    ],    "third_party_dir": "//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party",    "product_adapter_dir": "//vendor/hisilicon/hispark_pegasus/hals"  }

将hispark_pegasus下的hal/utils复制到我们自己的产品解决方案中。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

创建BUILD.gn文件编写编译脚本。

group("product"){     }

编译检验

执行hb set命令,观察产品解决方案。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

完成编译。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

烧录测试

选择我们的产品解决方案product。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

串口调试,观察控制台输出。

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

产品解决方案总结

OpenHarmony编译构建系统[浅谈与实践]-开源基础软件社区

结束语

希望能够帮助到大家,对OpenHarmony的编译过程有一个全面的感知。

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

责任编辑:jianghua 来源: 51CTO 开源基础软件社区 鸿蒙智能家居开发

(责任编辑:休闲)

    推荐文章
    • ST步森(002569.SZ)公布消息:终止收购微动天下100%的股权

      ST步森(002569.SZ)公布消息:终止收购微动天下100%的股权ST步森(002569.SZ)公布,公司于2021年3月26日召开第六届董事会第二次会议和第六届监事会第二次会议,审议通过了《关于终止重大资产重组的议案》,同意公司终止本次重大资产重组事项。公司独立董 ...[详细]
    • 支付宝如何解除或删除绑定的银行卡

      支付宝如何解除或删除绑定的银行卡我们在使用的支付宝的时候可以把银行卡绑定到支付宝中使用,那么有的用户想要解除或删除绑定的银行卡要怎么操作呢?下面就来看一下支付宝解除绑定的银行卡的方法吧。1、首先打开支付宝软件进入到首页之后点击右下角 ...[详细]
    • 高德地图怎么关闭家人地图

      高德地图怎么关闭家人地图高德地图是许多小伙伴出行时会使用的导航软件,有的用户在使用的过程中比较好奇高德地图怎么关闭家人地图呢?下面就和小编来看一下高德地图关闭家人地图的方法吧。1、首先打开高德地图进入到首页之后点击右下角的【 ...[详细]
    • 升级内容全一文了解!坦克500 OTA升级开启全网推送 -

      升级内容全一文了解!坦克500 OTA升级开启全网推送 -【智车派新闻】近日,据智车派了解,坦克SUV官方公众号发布了坦克500开启OTA升级全网推送的公告。主要升级内容包括:多媒体功能优化、车机操作逻辑优化、车机界面整体优化、语音整体优化、优化屏幕亮度、新 ...[详细]
    • ipo审核是什么意思?股票市场上常常被提到的IPO的意思是什么?

      ipo审核是什么意思?股票市场上常常被提到的IPO的意思是什么?ipo审核是什么意思?ipo(首次公开募股)是指一家公司或者企业首次将它的股份向公众出售,而对于首次公开发行的股票,需要先进行ipo审核。ipo审核流程分为受理环节、见面会环节、审核环节、反馈会环节、 ...[详细]
    • OPPO 举行 O 粉节活动:可免费领取手机壳,涉及六种类型优惠

      OPPO 举行 O 粉节活动:可免费领取手机壳,涉及六种类型优惠IT之家 8 月 3 日消息,OPPO 服务公众号发文,OPPO 举行 O 粉节活动,可免费领取手机壳、手表屏幕免费贴膜、免费兑换维修代金券、7 折贴 UV 光固膜、4 折起折扣换屏以及电池一口价换新 ...[详细]
    • 微信怎么拍拍怎么使用

      微信怎么拍拍怎么使用微信软件中有一个拍一拍的功能,有很多在使用微信软件的小伙伴好奇微信怎么拍拍怎么使用呢?下面来看一下小编带来的微信设置拍拍的使用方法吧。1、首先打开微信进入到首页之后点击右下角的【我的】;2、然后在我的 ...[详细]
    • 剪映镜像翻转怎么用

      剪映镜像翻转怎么用在剪映软件中的镜像功能,在使用的时候可以改变自己视频的左右方向,那么就会有用户好奇了要怎么使用呢?现在就和小编来看一下使用镜像翻转的教程吧。1.首先打开剪映软件进入到首页之后点击【开始创作】;2.然后 ...[详细]
    • 合丰集团(02320.HK)发布公告:年度公司拥有人应占亏损1.72亿港元

      合丰集团(02320.HK)发布公告:年度公司拥有人应占亏损1.72亿港元合丰集团(02320.HK)发布公告,截至2021年12月31日止年度,收益减少至约7.556亿港元,较2020年下跌约27.4%。公司拥有人应占亏损约为1.724亿港元,而2020年的公司拥有人应占 ...[详细]
    • 剪映倒放在哪里

      剪映倒放在哪里在剪映软件中的功能有很多,不同的功能有不同的作用,有的用户在使用的过程中不知道倒放功能在哪里,下面就和小编来看一下查找倒放的的教程吧。1.首先打开剪映软件进入到首页之后点击【开始创作】;2.然后在该页 ...[详细]
    热点阅读