百篇博客系列篇.本篇为:

编译构建相关篇为:

几点说明

  • kernel_liteos_a_note | 中文注解鸿蒙内核 是在 OpenHarmonykernel_liteos_a 基础上给内核源码加上中文注解的版本.与官方源码按月保持同步,同步历史如下:

    • 2021/9/02 -- trace模块较大更新
    • 2021/8/19 -- 各目录增加了BUILD.gn文件,文件系统部分文件调整
    • 2021/7/15 -- 改动不大,新增blackbox,hidumper,对一些宏规范化使用
    • 2021/6/27 -- 对文件系统/设备驱动改动较大,目录结构进行了重新整理
    • 2021/6/08 -- 对编译构建,任务,信号模块有较大的改动
    • 2021/5/28 -- 改动不大,主要针对一些错误单词拼写纠正
    • 2021/5/13 -- 对系统调用,任务切换,信号处理,异常接管,文件管理,shell做了较大更新,代码结构更清晰
    • 2021/4/21 -- 官方优化了很多之前吐槽的地方,点赞
    • 2020/9/16 -- 中文注解版起点
  • http://weharmonyos.com | 鸿蒙研究站

    分成三部分内容

  • 子系统注解仓库

    在给鸿蒙内核源码加注过程中发现仅仅注解内核仓库还不够,因为它关联了其他子系统,若对这些子系统不了解是很难完整的注解鸿蒙内核,所以也对这些关联仓库进行了部分注解,这些仓库包括:

鸿蒙版本

本篇主要采用 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仓库本身原因第一种方式存在失败概率,浪费时间,这种没技术含量的折腾没啥意义,本篇采用直接站点下载方式,请对照着前往下载。

源码获取路径

LTS版本源码    下载地址
----------------------------------------------------------------
标准版 https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary.tar.gz
轻量版 https://repo.huaweicloud.com/harmonyos/os/1.1.1/code-v1.1.1-LTS.tar.gz

源码下载后本篇统一放在了 E:\openharmony-docker-standard目录下,并创建好两个空目录,code-1.1.1 code-2.0-canary,当前内容如下:

// windows 下 powershell

PS E:\openharmony-docker-standard> ls
目录: E:\openharmony-docker-standard
Mode LastWriteTime Length Name
---- ------------- ------ ----
da---- 2021/4/2 9:27 code-1.1.1
da---- 2021/6/17 18:24 code-2.0-canary
-a---- 2021/6/18 9:44 323145491 code-1.1.1.tar.gz
-a---- 2021/6/5 17:49 1433581461 code-2.0-canary.tar.gz

为何要这么做,是因为要解压 tar包,但这两个tar包需在linux环境下完成解压,需要在docker中完成。

准备编译环境

要有编译环境,编译环境是个很头痛的事情,自己装太麻烦,也容易出错,但 docker真的很香,官方也帮我们解决了这个问题。同样的,两个版本对应两个docker镜像

LTS版本    镜像地址
----------------------------------------------------------------
标准版 docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.1
轻量版 docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5

编译标准版(L2/Linux)

选择标准版镜像创建容器,做好如图绑定选择

容器创建成功后可以在 vscode 右键容器inspect查看到绑定的目录.

"HostConfig": {
"Binds": [
"E:\\openharmony-docker-standard\\code-2.0-canary:/home/openharmony",
"E:\\openharmony-docker-standard:/home/tar"
],

vscode 右键容器 attach shell,进入容器。

//第一步先解压`tar`包
root@95720c1a0803:/home/tar# ls
code-1.1.1 code-1.1.1.tar.gz code-2.0-canary code-2.0-canary.tar.gz
//执行解压命令
root@95720c1a0803:/home/tar# tar -zxvf code-2.0-canary.tar.gz
....
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/iot_gpio.h
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/iot_uart.h
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/reset.h //完成解压后 /home/openharmony 下直接就有可编译的源码了
root@95720c1a0803:/home/openharmony# ls
applications build build.sh device domains foundation kernel out productdefine third_party vendor
base build.py developtools docs drivers interface ohos_config.json prebuilts test utils //接着执行预处理脚本。
root@95720c1a0803:/home/openharmony# ../scripts/prepare.sh
... //开始编译 ./build.sh --product-name {product_name}
//{product_name}为当前版本支持的平台。比如:Hi3516DV300等。
root@95720c1a0803:/home/openharmony#./build.sh --product-name Hi3516DV300
...
//编译所生成的文件都归档在out/ohos-arm-release/目录下
root@95720c1a0803:/home/openharmony/out/ohos-arm-release# ls
NOTICE_FILES build.ninja clang_x64 dist global lib.unstripped obj sa_profile third_party
ace build.ninja.d common distributeddatamgr graphic module_list_files override sorted_action_duration.txt toolchain.ninja
args.gn build.trace.gz communication exe.unstripped hiviewdfx multimedia packages src_installed_parts.json updater
build.log build_configs developtools gen js_declaration multimodalinput qrcode src_sa_infos_tmp.json
//结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下
root@95720c1a0803:/home/openharmony/out/ohos-arm-release/packages/phone/images# ls
Hi3516DV300-emmc.xml u-boot-hi3516dv300_emmc.bin

编译轻量版(L0~L1/LiteOS),

选择轻量版镜像创建容器,参考标准版图做绑定操作。

容器创建成功后可以在 vscode 右键容器inspect查看到绑定的目录.

"HostConfig": {
"Binds": [
"E:\\openharmony-docker-standard\\code-1.1.1:/home/openharmony",
"E:\\openharmony-docker-standard:/home/tar"
],

vscode 右键容器 attach shell,进入容器。

//第一步先解压`tar`包
root@0d3e98ee3fe0:/home/tar# ls
code-1.1.1 code-1.1.1.tar.gz code-2.0-canary code-2.0-canary.tar.gz
//执行解压命令
root@0d3e98ee3fe0:/home/tar# tar -zxvf code-1.1.1.tar.gz
...
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/iot_gpio.h
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/iot_uart.h
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/reset.h
//完成解压后 /home/openharmony 下直接就有可编译的源码了
root@0d3e98ee3fe0:/home/openharmony# ls
applications base build build.py developtools device docs domains drivers foundation kernel prebuilts test third_party utils vendor

编译项目选择 | hb set

root@0d3e98ee3fe0:/home/openharmony# hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need? (Use arrow keys) hisilicon
❯ ipcamera_hispark_aries
wifiiot_hispark_pegasus
ipcamera_hispark_taurus

直接回车,本篇选择了ipcamera_hispark_aries

编译命令 | hb env

设置路径成功后,可查看下当前设置信息

root@0d3e98ee3fe0:/home/openharmony# hb env
[OHOS INFO] root path: /home/openharmony
[OHOS INFO] board: hispark_aries
[OHOS INFO] kernel: liteos_a
[OHOS INFO] product: ipcamera_hispark_aries
[OHOS INFO] product path: /home/openharmony/vendor/hisilicon/hispark_aries
[OHOS INFO] device path: /home/openharmony/device/hisilicon/hispark_aries/sdk_liteos

编译巨坑 | 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子系统

  {
"subsystem": "vendor",
"components": [
{ "component": "middleware", "features":[] },
{ "component": "hi3518ev300_init", "features":[] },
{ "component": "hardware", "features":[] }
]
},
//删除test子系统 (可选)
{
"subsystem": "ai",
"components": [
{ "component": "ai_engine", "features":[] }
]
} root@0d3e98ee3fe0:/home/openharmony# hb build -f
...
[OHOS INFO] [965/974] SOLINK ./librecorder_lite.so
[OHOS INFO] [966/974] STAMP obj/foundation/multimedia/media_lite/frameworks/recorder_lite/media_lite.stamp
[OHOS INFO] [967/974] SOLINK ./libplayer_lite.so
[OHOS INFO] [968/974] STAMP obj/foundation/multimedia/media_lite/services/media_ndk.stamp
[OHOS INFO] [969/974] STAMP obj/foundation/multimedia/media_lite/services/media_lite.stamp
[OHOS INFO] [970/974] STAMP obj/build/lite/ohos.stamp
[OHOS INFO] [971/974] SOLINK ./libaudio_lite_api.so
[OHOS INFO] [972/974] STAMP obj/foundation/multimedia/media_lite/frameworks/player_lite/media_lite.stamp
[OHOS INFO] [973/974] ACTION //build/lite:gen_rootfs(//build/lite/toolchain:linux_x86_64_ohos_clang)
[OHOS INFO] [974/974] STAMP obj/build/lite/gen_rootfs.stamp
[OHOS INFO] ipcamera_hispark_aries build success
//会多出一个`out`目录,每个的目录含义如下
root@0d3e98ee3fe0:/home/openharmony# ls
applications build developtools docs drivers kernel out test utils
base build.py device domains foundation ohos_config.json prebuilts third_party vendor
目录名          描述
applications 应用程序样例,包括wifi-iot,camera等
base 基础软件服务子系统集&硬件服务子系统集
build 组件化编译、构建和配置脚本
docs 说明文档
domains 增强软件服务子系统集
drivers 驱动子系统
foundation 系统基础能力子系统集
kernel 内核子系统
prebuilts 编译器及工具链子系统
test 测试子系统
third_party 开源第三方组件
utils 常用的工具集
vendor 厂商提供的软件
build.py 编译脚本文件
out 编译后生成

编译输出 | out 目录

输出目录 : out/hispark_aries/ipcamera_hispark_aries

root@0d3e98ee3fe0:/home/openharmony/out/hispark_aries/ipcamera_hispark_aries# ls
args.gn build.ninja data gen NOTICE_FILE OHOS_Image.bin server.map userfs
bin build.ninja.d dev_tools libs obj OHOS_Image.map test userfs_jffs2.img
bm_tool.map bundle_daemon_tool.map etc liteos.bin OHOS_Image rootfs_jffs2.img test_info vendor
build.log config foundation.map media_server.map OHOS_Image.asm rootfs.tar toolchain.ninja

鸿蒙内核源码分析.总目录

v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析 | 51.c.h .o

百万汉字注解.百篇博客分析

百万汉字注解 >> 精读鸿蒙源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee| github| csdn| coding >

百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< 51cto| csdn| harmony| osc >

关注不迷路.代码即人生

QQ群:790015635 | 入群密码: 666

原创不易,欢迎转载,但请注明出处.

鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06的更多相关文章

  1. 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  2. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  3. 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02

    百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  4. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  5. 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01

    百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...

  6. 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 百篇博客分析OpenHarmony源码 | v55.01

    百篇博客系列篇.本篇为: v55.xx 鸿蒙内核源码分析(重定位篇) | 与国际接轨的对外部发言人 | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程 ...

  7. 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析OpenHarmony源码 | v54.01

    百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 51.c.h.o 下图是一个可执行文件编译,链接的过程. 本篇将通过一个完整的小工程来阐述E ...

  8. 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04

    百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...

  9. v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码

    子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...

随机推荐

  1. 使用nmap命令扫描开放端口

    1.安装nmap 1.下载nmap安装包 下载地址:http://www.nmap.com.cn/ 根据自己需求下载,各种版本都有,我下载的是windows版本,安装版的. 2.安装 基本都是无脑安装 ...

  2. idea中导包出现import org.apach.*,提交代码老出现冲突,不想使用.*的设置

    打开设置>Editor>Code Style>Java>Scheme Default>Imports ① 将Class count to use import with ...

  3. SpringCloud(5)之分布式锁实现

    01为什么用分布式锁 在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用 ...

  4. ASP.NET Core:ASP.NET Core中使用NLog记录日志

    一.前言 在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试.查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能 ...

  5. wpf toggleSwitch 的只读属性

    xml code --------------------------------------------- <Page x:Class="UWPDemo.MainPage" ...

  6. 天翼云安装jdk(注意有坑)

    1.下载jdk8 查看Linux位数,到oracle官网下载对应的jdk ① sudo uname --m  确认32位还是64位 ② https://www.oracle.com/technetwo ...

  7. Inject-APC (Ring3)

    1 // APCInject.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include "APCInjec ...

  8. Mybatis原理和代码剖析

    参考资料(官方) Mybatis官方文档: https://mybatis.org/mybatis-3/ Mybatis-Parent : https://github.com/mybatis/par ...

  9. client-go实战之一:准备工作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. Python之win32模块

    如果想在Windows操作系统上使用Python去做一些自动化工作,pywin32模块常常会被用到,它方便了我们调用Windows API. 安装及使用 通过命令pip install pywin32 ...