一、鸿蒙编译篇
一、下载源码和编译
https://blog.csdn.net/xusiwei1236/article/details/142675221
https://blog.csdn.net/xiaolizibie/article/details/146375750
https://forums.openharmony.cn/forum.php?mod=viewthread&tid=897
repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-5.0.0-Release --no-repo-verifygit config --global http.postBuffer 524288000 # 增大缓冲区至500MB
git config --global core.compression 0 # 禁用压缩(减少CPU负载)repo sync -crepo forall -c 'git lfs pull'下载编译器
build/prebuilds_download.shsudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev编译
1. 32 位系统编译(默认)
./build.sh --product-name rk3568 --ccache2. 64 位系统编译 社区停止维护了(不一定)
./build.sh --product-name rk3568 --target-cpu arm64 --ccache3 编译一次之后
./build.sh --product-name rk3568 --ccache --no-prebuilt-sdk4 模块话编译
./build.sh --product-name rk3568 --ccache -T module-hdi-sink --fast-rebuild
生成的文件如下:
路径在/out/rk3568/packages/phone/images
二、openHarmony源码构建体系
https://blog.csdn.net/GuanFuXinCSDN/article/details/119853442
https://blog.csdn.net/weixin_40870382/article/details/129876626
以下是源码目录的说明:
目录名 | 描述 |
---|---|
applications | BearPi-HM_Nano应用程序样例 |
base | 基础软件服务子系统集&硬件服务子系统集 |
build | 组件化编译、构建和配置脚本 |
docs | 介绍、说明资料 |
domains | 增强软件服务子系统集(注:使用hpm方式下载时可能不存在) |
drivers | 驱动子系统(注:使用hpm方式下载时可能不存在) |
foundation | 系统基础能力子系统集 |
kernel | 内核子系统 |
prebuilts | 编译器及工具链子系统 |
test | 测试子系统 |
third_party | 开源第三方组件 |
utils | 常用的工具集 |
vendor | 厂商提供的软件 |
build.py | 编译脚本文件 |
三种编译方式
1 build.sh
./build.sh --product-name rk3568 --ccache
2 build.py
./build.py --help
3 hb set / hb build
默认没有,需要安装
3种形式的编译入口最终都汇总到hb build。即内部实际上是统一的。
三、构建体系核心-GN与Ninja
https://blog.csdn.net/fangye945a/article/details/121492022
https://hahaha.fmy1024.cn/html_online/1404_136525054online.html
https://blog.csdn.net/weixin_43288065/article/details/128037209
1 鸿蒙系统的构建工具
(1)源码编辑。用户自选,如sourceinsight,vscode都比较常用
(2)编译工具链。鸿蒙官方提供,目前均为交叉编译工具链,clang或gcc系
(3)基本工程管理。使用ninja,来自于google
(4)工程管理脚本。使用python3
(5)ninja生成器。使用gn
python+gn+ninja
2 什么是Ninja
ninjia是一个致力于速度的小型编译系统工具 (类似于Make编译工具)其主要有两个特点:
1.可以通过其他高级的编译系统生产其输入文件。
2.它的设计就是为了更快的编译。
3 什么是GN
gn 即 Generate ninjia ,顾名思义就是用来生成ninjia编译文件的工具,可以理解为cmake工具。
4 gn与ninjia的关系
可以理解为make与cmake之间的关系,ninjia于GUN make构建工具类比对应关系如下:
ninjia工具 Make GUN工具 功能作用gn <----------> cmake -------------> 生成构建文件xxx.gn <----------> CMakeList --------------> 描述构建所需的编译文件xxx.ninjia <----------> Makefile ---------------> 描述代码的具体编译步骤ninjia <----------> Make ----------------> 编译代码
5 ninja测试demo
https://blog.csdn.net/define_me_freedom/article/details/104195946
GN语法简单入门.pdf
tree
.
├── build
│ ├── BUILDCONFIG.gn
│ └── BUILD.gn
├── BUILD.gn
├── lib
│ ├── BUILD.gn
│ ├── libtest1.c
│ └── libtest1.h
└── main├── BUILD.gn└── main.c1 每一个目录下面都要有一个BUILD.gn,包括根目录
2 build/BUILD.gn 里面是具体的编译工具链
3 GN构建系统严格要求使用空格(Space)进行代码缩进,任何Tab字符均被视为非法语法,可以用gn format 修复
3 构建命令为:gn gen outninja -C out/ main --没有直接编译通过,应该是环境有问题,直接安装gn工具测试4 在源码中编译的方法(鸿蒙)./build.sh --product-name rk3568 --ccache -T hello --fast-rebuild
四 OH源码编译过程详解
1 产品的定义在vendor下定义
2 编译的过程
OHOSBuildModule实现了BuildModuleInterface接口
BuildModuleInterface接口的run函数分别调用了10个函数,构成了整个编译过程的10个子阶段
def run(self):try:self._prebuild()self._preload()self._load()self._pre_target_generate()self._target_generate()self._post_target_generate()self._pre_target_compilation()self._target_compilation()except OHOSException as exception:raise exceptionelse:self._post_target_compilation()finally:self._post_build()
如何将所有文件打包成update.img?
五、OpenHarmony构建系统–GN与子系统、部件、模块详解
1 产品(product)
在**vendor/{产品解决方案厂商}/{产品名称}**_中,以rk3568为例
1 config.json文件中可以配置产品所需要的子系统,其中的inherit字段可以继承事先定义好的样板模板,
模板位于”productdefine/common“目录下
2 领域(domain)
OpenHarmony技术架构中有四大子系统集:“系统基本能力子系统集”、“基础软件服务子系统集”、“增强软件服务子系统集”、“硬件服务子系统集”。四大子系统不会直接出现在编译选项或者参数中,而是有对应的一级源代码文件夹:“系统基本能力子系统集”对应源码foundation文件夹;“基础软件服务子系统集”和“硬件服务子系统集”对应源码base文件夹;“增强软件服务子系统集”对应源码domains文件夹。
3 子系统(SubSystem)
子系统是一个逻辑概念,它具体由对应的部件构成。在多设备部署场景下,支持根据实际需求裁剪某些
非必要的子系统或部件。在build/subsystem_config.json中定义
4 部件(component)
部件是对子系统的进一步拆分,可复用的软件单元,每一个部件单独存放一个文件夹,它包含源码、配
置文件、资源文件和编译脚本;能独立构建,以二进制方式集成,具备独立验证能力的二进制单元。部
件由对应源码文件夹下的bundle.json文件进行定义
路径规则为:{领域}/{子系统}/{部件},部件目录树规则如下
component
├── interfaces
│ ├── innerkits # 系统内接口,部件间使用
│ └── kits # 应用接口,应用开发者使用
├── frameworks # framework实现
├── services # service实现
└── BUILD.gn # 部件编译脚本
5 模块(module)
模块就是编译子系统的一个编译目标,部件也可以是编译目标。模块属于哪个部件,在gn文件中由
part_name指定.
6 特性(feature)
特性是部件用于体现不同产品之间的差异。通常不同特性可以定义不同编译宏或者代码,从而影响到源
代码中define的特性。