
v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程 原创
仲弓问仁。子曰:“出门如见大宾,使民如承大祭。己所不欲,勿施于人。在邦无怨,在家无怨。”仲弓曰:“雍虽不敏,请事斯语矣。” 《论语》:颜渊篇
百篇博客分析.本篇为: (构建工具篇) | 顺瓜摸藤调试构建过程
编译构建相关篇为:
- v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南
- v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程
- v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来很简单
- v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程
- v60.04 鸿蒙内核源码分析(gn应用) | 如何构建鸿蒙系统
- v61.03 鸿蒙内核源码分析(忍者ninja) | 忍者的特点就是一个字
构建的必要性
- 前端开发有构建工具:
Grunt
、Gulp
、Webpack
- 后台开发有构建工具:
Maven
、Ant
、Gradle
构建工具重要性不言而喻,它描述了整个工程的如何编译、连接,打包等规则,其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后输出我们想要的文件。
鸿蒙轻内核(L1/liteos)的编译构建工具是hb
,hb
是ohos-build
的简称, 而ohos
又是openharmony os
的简称.
hb | ohos-build
hb通过以下命令安装,是用 python写的一个构建工具.
其源码在 ./build/lite 目录下,含义如下:
构建组成
鸿蒙构建系统由 python
, gn
, ninja
, makefile
几个部分组成,每个部分都有自己的使命,干自己最擅长的活.
-
python : 胶水语言,最擅长的是对参数,环境变量,文件操作,它任务是做好编译前的准备工作和为gn收集命令参数.不用python直接用gn行不行? 也行,但很麻烦.比如:直接使用下面的命令行也可以生成 .ninja文件,最后的效果是一样的.但相比只使用
hb build
哪个更香,hb build
也会生成下面这一坨坨, 但怎么来是python的强项.图为绕过hb python部分直接执行gn gen 的结果:
-
gn : 类似构建界的高级语言,gn和ninja的关系有点像C和汇编语言的关系,与它对标的是cmake,它的作用是生成.ninja文件,不用gn直接用ninja行不行? 也行,但更麻烦.就跟全用汇编写鸿蒙系统一样,理论上可行,可谁会这么去干呢.
-
ninja:类似构建界的汇编语言,与它对标的是make,由它完成对编译器clang,链接器ld的使用.
-
makefile:鸿蒙有些模块用的还是make编译, 听说后面会统一使用ninja,是不是以后就看不到make文件了,目前是还有大量的make存在.
如何调试 hb
推荐使用vscode来调试,在调试面板点击 create a launch.json file
创建调试文件,复制以下内容就可以调试hb了.
构建流程
编译构建流程图所示,主要分设置和编译两步:
本篇调试图中的 hb set
| hb build
两个命令
hb set | 选择项目
源码见于: ./build/lite/hb/set/set.py
hb set
执行的大致流程是这样的:
-
你可以在任何目录下执行
hb set
, 它尝试读取当前目录下的ohos_config.json
配置文件,如果没有会让你输入代码的路径也就是源码根目录, 生成
ohos_config.json
配置文件,配置内容项是固定的,由Config
类管理. -
可以在以下位置打上断点调试
set
命令,跟踪整个过程.图为断点调试现场
-
最后生成的配置文件如下:
有了这些路径就为后续
hb build
铺好了路.
hb build | 编译项目
源码见于: ./build/lite/hb/build/*.py
建议大家去调试下源码,非常有意思,能看清楚所有的细节.本篇将编译工具中重要代码都加上了注解.
也可以前往 weharmony | 注解鸿蒙编译工具 查看对其的代码注释工程.
总体步骤是分两步:
- 调用 gn_build 使用
gn gen
生成 *.ninja 文件 - 调用 ninja_build 使用
ninja -w dupbuild=warn -C
生成 *.o *.so *.bin 等最后的文件
gn_build
关于gn的资料可以前往 GN参考手册查看.
具体gn是如何生成.ninja文件的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.
ninja_build
关于ninja 的资料可以前往 ninja 参考手册查看.
具体ninja是如何运行的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.
exec_command | utils.py
gn_build
和 ninja_build
最后都会调用 exec_command
来执行命令,exec_command
是个通用方法,见于
build/lite/hb/common/utils.py
,调试时建议在这里打断点,顺瓜摸藤,跟踪相关函数的实现细节.
图为断点调试现场
百篇博客分析.深挖内核地基
- 给鸿蒙内核源码加注释过程中,整理出以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。 😛
- 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
按功能模块:
- 前因后果 >> 总目录 | 调度故事 | 内存主奴 | 源码注释 | 源码结构 | 静态站点 | 注释文档 |
- 基础工具 >> 双向链表 | 位图管理 | 用栈方式 | 定时器 | 原子操作 | 时间管理 |
- 加载运行 >> ELF格式 | ELF解析 | 静态链接 | 重定位 | 进程映像 |
- 进程管理 >> 进程管理 | 进程概念 | Fork | 特殊进程 | 进程回收 | 信号生产 | 信号消费 | Shell编辑 | Shell解析 |
- 编译构建 >> 编译环境 | 编译过程 | 环境脚本 | 构建工具 | gn应用 | 忍者ninja |
- 进程通讯 >> 自旋锁 | 互斥锁 | 进程通讯 | 信号量 | 事件控制 | 消息队列 |
- 内存管理 >> 内存分配 | 内存管理 | 内存汇编 | 内存映射 | 内存规则 | 物理内存 |
- 任务管理 >> 时钟任务 | 任务调度 | 任务管理 | 调度队列 | 调度机制 | 线程概念 | 并发并行 | CPU | 系统调用 | 任务切换 |
- 文件系统 >> 文件概念 | 文件系统 | 索引节点 | 挂载目录 | 根文件系统 | 字符设备 | VFS | 文件句柄 | 管道文件 |
- 硬件架构 >> 汇编基础 | 汇编传参 | 工作模式 | 寄存器 | 异常接管 | 汇编汇总 | 中断切换 | 中断概念 | 中断管理 |
百万汉字注解.精读内核源码
四大码仓中文注解 . 定期同步官方代码
鸿蒙研究站( weharmonyos ) | 每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞则更佳,感谢每一份支持。
