
v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南 原创 精华
颜渊死。子曰:“噫!天丧予!天丧予!” 《论语》:先进篇
百篇博客系列篇.本篇为:
v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南
编译构建相关篇为:
- v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南
- v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程
- v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来很简单
- v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程
- v60.04 鸿蒙内核源码分析(gn应用) | 如何构建鸿蒙系统
- v61.03 鸿蒙内核源码分析(忍者ninja) | 忍者的特点就是一个字
鸿蒙版本
本篇主要采用 windows + docker 方式编译鸿蒙. 记录编译鸿蒙的过程,以备后续不用再去一大堆无效的误导式软文中搜寻芝麻大点有用的信息,那样真挺费时费心力.
针对不同场景使用不同的内核,openharmony有两个开源版本。
- 标准系统版本,也叫(linux/L2/手机)版本,L2开源(2021/06/02),采用linux 4.19 内核,华为手机(HarmonyOS2.0)就是基于这个开源版本做的商业发行版本。
- 轻量和小型系统版本,也叫(liteos/L0~L1/嵌入式)版本,L0开源(2020/09/10),L1开源(2020/12/02),采用 lite-os-a/m内核,主要针对嵌入式设备。
本篇详细说清楚这两个版本的编译过程。
安装 Docker Desktop
先安装 Docker Desktop 下载windows版本一直下一步.
拒绝没有技术含量的折腾,快速解决编译前的两个痛点条件:源码和编译环境
准备源码
源码获取有两种方式,一种直接gitee仓库(repo)下载,一种站点下载。因为代码量很大,加上网速,gitee仓库本身原因第一种方式存在失败概率,浪费时间,这种没技术含量的折腾没啥意义,本篇采用直接站点下载方式,请对照着前往下载。
源码获取路径
源码下载后本篇统一放在了 E:\openharmony-docker-standard
目录下,并创建好两个空目录,code-1.1.1
code-2.0-canary
,当前内容如下:
// windows 下 powershell
为何要这么做,是因为要解压 tar包,但这两个tar包需在linux环境下完成解压,需要在docker中完成。
准备编译环境
要有编译环境,编译环境是个很头痛的事情,自己装太麻烦,也容易出错,但 docker真的很香,官方也帮我们解决了这个问题。同样的,两个版本对应两个docker镜像
编译标准版(L2/Linux)
选择标准版镜像创建容器,做好如图绑定选择
容器创建成功后可以在 vscode 右键容器inspect
查看到绑定的目录.
vscode 右键容器 attach shell
,进入容器。
编译轻量版(L0~L1/LiteOS),
选择轻量版镜像创建容器,参考标准版图做绑定操作。
容器创建成功后可以在 vscode 右键容器inspect
查看到绑定的目录.
vscode 右键容器 attach shell
,进入容器。
编译项目选择 | hb set
直接回车,本篇选择了ipcamera_hispark_aries
编译命令 | hb env
设置路径成功后,可查看下当前设置信息
编译巨坑 | llvm 10 -> llvm9
编译过程中可能会有 cJSON/libcjson_shared.cJSON.o
错误,将 llvm 10 换成 llvm9 编译,这是个巨坑.
编译命令 | hb build -f
因docker编译速度较慢,为快速编译,本篇将测试子系统去除,这样可以少编译一半测试的文件,去除方法如下,前往
..\code-1.1.1\vendor\hisilicon\hispark_aries\config.json
删除test子系统
编译输出 | out 目录
输出目录 : out/hispark_aries/ipcamera_hispark_aries
百篇博客分析.深挖内核地基
- 给鸿蒙内核源码加注释过程中,整理出以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。 😛
- 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
按功能模块:
- 前因后果 >> 总目录 | 调度故事 | 内存主奴 | 源码注释 | 源码结构 | 静态站点 |
- 基础工具 >> 双向链表 | 位图管理 | 用栈方式 | 定时器 | 原子操作 | 时间管理 |
- 加载运行 >> ELF格式 | ELF解析 | 静态链接 | 重定位 | 进程映像 |
- 进程管理 >> 进程管理 | 进程概念 | Fork | 特殊进程 | 进程回收 | 信号生产 | 信号消费 | Shell编辑 | Shell解析 |
- 编译构建 >> 编译环境 | 编译过程 | 环境脚本 | 构建工具 | gn应用 | 忍者ninja |
- 进程通讯 >> 自旋锁 | 互斥锁 | 进程通讯 | 信号量 | 事件控制 | 消息队列 |
- 内存管理 >> 内存分配 | 内存管理 | 内存汇编 | 内存映射 | 内存规则 | 物理内存 |
- 任务管理 >> 时钟任务 | 任务调度 | 任务管理 | 调度队列 | 调度机制 | 线程概念 | 并发并行 | CPU | 系统调用 | 任务切换 |
- 文件系统 >> 文件概念 | 文件系统 | 索引节点 | 挂载目录 | 根文件系统 | 字符设备 | VFS | 文件句柄 | 管道文件 |
- 硬件架构 >> 汇编基础 | 汇编传参 | 工作模式 | 寄存器 | 异常接管 | 汇编汇总 | 中断切换 | 中断概念 | 中断管理 |
百万汉字注解.精读内核源码
四大码仓中文注解 . 定期同步官方代码
鸿蒙研究站( weharmonyos ) | 每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞则更佳,感谢每一份支持。
