OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建,经过前面的实践,再来看编译构建。

编译构建概述

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

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

hb、GN、Ninja

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

▍ hb set

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

▍hb build

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

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

hb build -T 路径:目标

▍BUILD.gn

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

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

▍编译小总结

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

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

OpenHarmony系统

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

配置规则

▍组件配置规则

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

###▍组件定义

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

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

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

▍WiFi组件

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

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

▍组件总结

▍芯片解决方案配置规则

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

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

▍产品解决方案配置规则

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

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

  • “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”: 子系统列表,包含了产品的不同子系统及其组件信息。

  • “component”: 组件名称,表示不同的功能组件。

  • “features”: 特性列表,描述了组件的不同特性。

  • “subsystem”: 子系统名称,表示不同的功能区域。

  • “components”: 组件列表,表示在该子系统中使用的组件及其特性。

  • “third_party_dir”: 第三方库路径,指定为"//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party"。

  • “product_adapter_dir”: 产品适配层路径,指定为"//vendor/hisilicon/hispark_pegasus/hals"。

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

新增自己的产品解决方案

▍组件定义

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

2.完成组件功能的编写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"]
}

3.定义组件在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

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

▍ 解决方案定义

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

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"}

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

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

group("product"){}

▍编译检验

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

完成编译

▍烧录测试

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

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

▍产品解决方案总结

结束语

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

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n 0) {return 0;}int fast 1, slow 1;while (fast < n) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}f…

uni-app实现分页--(2)分页加载,首页下拉触底加载更多

业务逻辑如下&#xff1a; api函数升级 定义分页参数类型 组件调用api传参

如何优化卷积算法

我们可以写一个卷积算法。 for (int oh 0; oh < OH; oh) {for (int ow 0; ow < OW; ow) {for (int oc 0; oc < OC; oc) {C[oh][ow][oc] 0;for (int kh 0; kh < KH, kh){for (int kw 0; kw < KW, kw){for (int ic 0; ic < IC, ic){C[oh][ow][oc] A[o…

Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

C++设计模式:门面模式(十二)

1、概念与定义 “接口隔离”模式&#xff1a;在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来相互紧密关联的接口是一种常见的解决方案。 门面设计模式定…

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明&#xff1a;https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

低空经济再火,通过了解飞行汽车产业链与核心技术,我发现了汽车行业从业者新的机会!

低空经济最近又一次成为资本市场热议的话题&#xff0c;同时在两会报告中大篇幅的写入低空经济&#xff0c;并将其定义成为“新质生产力的代表”&#xff0c;低空经济是什么&#xff1f;与我们此前所聊过的飞行汽车之间又有什么样子的联系&#xff1f;我们作为汽车行业的从业者…

Unity笔记之Android打包、减小包体之类的问题

打包问题 问题1&#xff1a; 一般大部分问题就是JDK、SDK、NDK之类的问题。现在是其他的问题&#xff0c;之前遇到过&#xff0c;好久没玩android了都忘了。 这试了半天&#xff0c;结果是需要有密钥库。那就给他创建一个填一下就行了 &#xff08;在网上看了半天&#xff…

Android 加密之 打包为arr 项目依赖或者为jar

Android 加密之 打包为arr 项目依赖或者为jar 1. 修改build.gradle plugins {//id com.android.application// 1. 修改为libraryid com.android.library }android {namespace com.dzq.iccid2compileSdk 33defaultConfig {//applicationId "com.dzq.iccid2"// 2. 注…

【数据结构】05树

树 树1.2 结点的分类1.3 结点间的关系1.4 树的其他概念1.5 树的性质 2. 二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树&#xff08;二叉查找树&#xff09; 3. 二叉树的存储结构3.1 二叉树顺序存储结构3.2 二叉树的链式存储结构 4. 二叉树的遍历4.1 层次遍历4.1 前序遍历4.2…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

Elasticsearch初步了解学习记录

目录 前言 一、ElasticSearch是什么&#xff1f; 二、使用步骤&#xff08;python版&#xff09; 1.引入包 2.连接数据库 3.创建索引 4.写入数据 5.查询数据 三、相关工具介绍 1.ES浏览器插件 总结 前言 随着数据量的不断增加&#xff0c;传统的查询检索在速度上遇…

IO——文件IO

1.1 概念 又称为系统IO&#xff0c;是系统调用&#xff0c;是操作系统提供的函数接口。 posix中定义的一组用于输入输出的函数。 1.2 特点 (1)没有缓冲机制&#xff0c;效率较低 (2)围绕文件标识符操作&#xff0c;非负整数&#xff0c;依次分配 (3) 文件IO默认打开了三个文…

正则表达式:量词(三)

正则表达式中的量词有以下几种:1. *: 匹配前面的字符0次或多次。2. : 匹配前面的字符1次或多次。3.?: 匹配前面的字符0次或1次。4. {n}: 匹配前面的字符恰好n次。5. {n,}: 匹配前面的字符至少n次。6. {n,m}:匹配前面的字符至少n次&#xff0c;但不超过m次。 以下是使用Python的…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先&#xff0c;从名字上看&#xff0c;这两个注解意义特别接近&#xff0c;AutoConfigurationPackage 就是自动配置包&#xff0c;自动配置包的目的是能让系统扫描到包内的 Bean&#xff1b;ComponentScan 则是组件扫描&#xff0c;这个松哥在之前的教程中也多次提到过了&…

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA&#xff08;Visual Basic for Applications&#xff09; 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…

Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

738. 单调递增的数字 总体思想就是从后往前遍历&#xff0c;比较第i位和第i1位的大小&#xff0c;不符合顺序char[i]减1&#xff0c;i1位填9&#xff0c;找到需要填9的最先位置&#xff0c;然后填9。 class Solution {public int monotoneIncreasingDigits(int n) {String s …

win 安装 Stable Diffusion

注&#xff1a;本人使用的是 RTX2060 - 6G版 特别提醒&#xff1a;安装一定要 CUDA 和 PyTorch 版本能配套用&#xff0c;不然会有生成保存问题(我是这样的)&#xff0c;装完用 python -m xformers.info 这个看对应的版本 建议&#xff1a;有些命令安装在venv 虚拟机中做&…