OpenHarmony之轻量系统编译构建流程

news2024/9/20 22:23:59

首先我们先来熟悉几个概念:

- 子系统

子系统是一个逻辑概念,它由一个或多个具体的组件组成。OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或组件。

- 组件

系统最小的可复用、可配置、可裁剪的功能单元。组件具备目录独立可并行开发、可独立编译、可独立测试的特征。

- gn

Generate ninja的缩写,用于产生ninja文件。

- ninja

ninja是一个专注于速度的小型构建系统。

- hb

OpenHarmony的命令行工具,用来执行编译命令。

hb 命令

hb 的源代码在build/lite/hb路径下,其入口函数为__main__.py中的main()。
hb 支持以下命令:
set 构建配置
env 显示构建配置变量
build 编译
clean 清空编译输出
build/lite/hb_internal中有各个命令的具体实现
在这里插入图片描述set和build比较重要,首先来看一下set命令:

hb set

hb set的作用是生成产品配置文件,执行后会在根目录下生成ohos_config.json文件
在这里插入图片描述
文件内容如下:
在这里插入图片描述
代码路径为build/lite/hb/set/set.py,设备类型不改变的情况下,不需要反复执行该命令。

hb build

hb build的作用是根据配置信息生成编译指导文件build.ninja。
脚本执行过程如下:
调用 gn_build 使用 gn gen生成 *.ninja 文件
调用 ninja_build 使用 ninja -w dupbuild=warn -C 生成 *.o *.so *.bin 等最后的文件
代码路径为:build/lite/hb/build/build.py

通过对上述一些概念的理解,我们接下来说一下OpenHarmony编译所用的工具和编译实现思想:

  • 工具

1.编译链接的最上层是Python脚本,使用python脚本进行组织,可以很好的实现跨平台编译
2.除了Python外还需要GN、Ninja、GCC来构建系统。
GN作为编译逻辑部分,将各级子系统和组件组织起来。
Ninja作为构建中间部分,他用最简单最快速的方式将编译文件编译参数传递给编译系统。
GCC作为编译部分,通常随编译系统而变化。

  • 思路

1.执行hb 命令的Python脚本,读取开发板配置:主要包括开发板使用的编译工具链、编译链接命令和选项等。
读取的主要配置文件有

Build\lite\ohos_var.gni:定义使用于所有组件的全局变量。

device{company}{board}\config.gni:这是编译 LiteOS_A 内核所需要用到的配置。

vendor{company}{board}\config.json:这是开发板提供的产品全量配置表:子系统、组件列表等等。

通过 hb build 传进去的参数,比如 -n 表示编译 NDK,则会将 ohos_build_ndk 变量由默认的 FALSE 改为 TRUE。

2.调用 gn:调用 gn gen 命令,读取产品配置(主要包括开发板、内核、选择的组件等)生成解决方案 out 目录和 ninja 文件。

3.调用 ninja:调用 ninja -C out/company/product 启动编译。

4.系统镜像打包:将组件编译产物打包,制作文件系统镜像。

build/lite/BUILD.gn 这个文件中的 group(“ohos”) 的分解,最终得到"ohos"的完整的依赖关系
在这里插入图片描述
C.调用 ninja 启动编译

这里就开始根据上一步生成的 .ninja 文件里的规则调用编译工具链来编译各目录下的源文件了,生成 .o/.a/.so/ 可执行文件 等等。

其中 .so 文件会先在 out{company}{board}\ 目录下生成,等编译完之后会转移到 out{company}{board}\libs\usr\ 目录下,还生成了 .ninja_log 和 .ninja_deps 文件。

D. 打包制作系统镜像

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

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

相关文章

别人家的公司年终奖52个月工资-互联网企业年终裁员脸在哪

52个月工资,开玩笑吧,还真不是。据台湾媒体报道,中国台湾长荣海运年终奖出炉,继去年40个月年终奖后,今年再创新高,传言最高发放52个月年终奖金。以基层员工月薪5万新台币计算,表现好的员工可领到…

6.vector、set和map

一、vector 1.简介 有些时候想开一个数组,但是却不知道应该开多大长度的数组合适,因为我们需要用到的数组可能会根据情况变动。这时候我们就需要用到动态数组。 所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要…

第四章快速排序——分而治之

分而治之(divide and conquer,D&C) D&C算法是递归的,并且有2个步骤: 找出基线条件,并且条件尽可能简单不断将问题分解,直到符合基线条件 给定一个数组,求和: 利用循环很容…

秒懂双向链表

目录 一、双向链表概述 二、模拟实现双向链表 1、头插法插入元素 2、尾插法插入元素 3、在指定位置插入元素 4、查询双向链表中是否包含key 5、删除第一次出现关键字为key的结点 6、删除所有值为key的结点 7、求双向链表的长度 8、遍历双向链表 9、清空双向链表 三…

【 uniapp - 黑马优购 | 商品列表 】如何实现数据获取、结构渲染、自定义组件的封装

个人名片: 🐼作者简介:一名大二在校生,讨厌编程🎋 🐻‍❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&#x1f5bc…

在 Mac 上将 PDF 转换为 Word 的 5 种简单方法

当谈到将PDF格式转换为Word格式时,用户可能会从互联网上搜索并尝试在线将PDF转换为Word。如果是这样,您可能会得到不好的结果并冒着文件本身的风险。在线 PDF 到 Word 转换器工具可能会产生低质量的输出,对文件大小有限制,更糟糕的…

maven多模块依赖版本不一致问题

项目结构&#xff1a; ├─springcloud-alibaba ├─.idea├─shop-common├─shop-order├─shop-product└─shop-user项目环境&#xff1a; 父工程&#xff1a; <properties><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version><sprin…

java虚拟机之垃圾回收机制

一.需要回收的内存区域 程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有)&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而 Java 堆和方法区则不一样&#xff0c;一个接口中的多个实现类需要的内存可能不一样&#xff0c…

<Focal Loss for Dense Object Detection>论文解读

目录1.简介2.模型2.1 二阶段要比单阶段模型效果好本质原因2.2 模型结构2.3.focal loss2.3.1 公式说明2.3.2 其他2.4 消融实验3.源码详解1.简介 目标识别有两大经典结构: 第一类是以Faster RCNN为代表的二阶段识别方法&#xff0c;这种结构的第一阶段专注于proposal的提取&am…

后端开发规约

目录 项目MVC层级设计规范 工程项目模块设计 设计规约 Java编码规范 参考《阿里巴巴Java开发手册》&#xff0c;见文末参考文档 OOP 面向对象设计 & 面向接口编程 Lombok工具包依赖 Guava、Hutool 等脚手架工具包&#xff08;三方包使用其一即可&#xff09; 日志打…

python初级教程十 Mongodb增、删、改、查

Mongodb 插入文档 MongoDB 中的一个文档类似 SQL 表中的一条记录。 插入集合 集合中插入文档使用 insert_one() 方法&#xff0c;该方法的第一参数是字典 name > value 对。 以下实例向 sites 集合中插入文档&#xff1a; #!/usr/bin/python3import pymongomyclient p…

03、Java并发 Java 线程池 ( Thread Pool ) (上)

本文我们将讲解 Java 中的线程池 ( Thread Pool )&#xff0c;从 Java 标准库中的线程池的不同实现开始&#xff0c;到 Google 开发的 Guava 库的前世今生。 本章节涉及到很多前几个章节中阐述的知识点。我们希望你是按照顺序阅读下来的&#xff0c;不然有些知识会一头雾水。 J…

Redis基础篇——Redis安装以及配置文件的修改

文章目录1. 认识Redis1.1 特征1.2 安装 Redis1. 安装 Redis 依赖2. 上传安装包1.3 默认启动1.4 指定配置启动1.5 开机自启&#xff08;推荐&#xff09;1. 认识Redis Redis 诞生于 2009 年&#xff0c;全称是 Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;…

Databend 开源周报 #73

Databend 是一款强大的云数仓。专为弹性和高效设计&#xff0c;自由且开源。 即刻体验云服务&#xff1a;https://app.databend.com。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

hudi实战-- 核心点解析

目录 Hudi 基础功能 Hudi 简介 Hudi 功能 Hudi 的特性 Hudi 的 架构 Hudi 数据管理 Hudi 表数据结构 hoodie 文件 数据文件 数据存储概述 Metadata 元数据 Index 索引 索引策略 Data 数据 Hudi 核心点解析 基本概念 时间轴Timeline 文件管理 索引 Index 表的存储…

NiN详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、NiN网络的…

【C语言开源库】 一个只有500行代码的开源http服务器:Tinyhttpd学习

项目搬运&#xff0c;带中文翻译&#xff1a;https://github.com/nengm/Tinyhttpd在嵌入式中&#xff0c;我们HTTP服务器用得最多的就是boa还有就是goahead,但是这2个代码量比较大&#xff0c;而Tinyhttpd只有几百行&#xff0c;比较有助于我们学习。一、编译及运行直接make之后…

用Python让奇怪的想法变成现实,2023年继续创作

2023年继续写作&#xff0c;用文章记录生活 时间过得真快&#xff0c;一下就到2023年了。 由于疫情肆虐&#xff0c;在网络的游弋的实现也长了&#xff0c;写作的自然也多了。 回想一下&#xff0c;2018-2021年这三年时间里一篇文章也没写过为0&#xff0c;哈哈&#xff0c;没…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + NVISTAR VP300 激光雷达 评测

简介&#xff1a;介绍NVISTAR 的二维DTOF激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melodic。…

滴滴前端一面经典手写面试题

实现bind 实现bind要做什么 返回一个函数&#xff0c;绑定this&#xff0c;传递预置参数bind返回的函数可以作为构造函数使用。故作为构造函数时应使得this失效&#xff0c;但是传入的参数依然有效 // mdn的实现 if (!Function.prototype.bind) {Function.prototype.bind f…