About 12 min

颜渊死。子曰:“噫!天丧予!天丧予!” 《论语》:先进篇

百篇博客分析|本篇为:(编译环境篇) | 编译鸿蒙防掉坑指南

下载 >> 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf

编译构建相关篇为:

鸿蒙版本

本篇主要采用 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
1
2
3
4

源码下载后本篇统一放在了 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 
1
2
3
4
5
6
7
8

为何要这么做,是因为要解压 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
1
2
3
4

编译标准版(L2/Linux)

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

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

"HostConfig": {
    "Binds": [
            "E:\\openharmony-docker-standard\\code-2。0-canary:/home/openharmony",
            "E:\\openharmony-docker-standard:/home/tar"
      ],
1
2
3
4
5

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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

选择轻量版镜像创建容器,参考标准版图做绑定操作。 容器创建成功后可以在 vscode 右键容器inspect查看到绑定的目录。

"HostConfig": {
    "Binds": [
            "E:\\openharmony-docker-standard\\code-1。1。1:/home/openharmony",
            "E:\\openharmony-docker-standard:/home/tar"
      ],
1
2
3
4
5

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
1
2
3
4
5
6
7
8
9
10
11
12

编译项目选择 | 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
1
2
3
4
5
6
7
8

直接回车,本篇选择了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
1
2
3
4
5
6
7

编译巨坑 | 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
目录名          描述
applications    应用程序样例,包括wifi-iot,camera等
base            基础软件服务子系统集&硬件服务子系统集
build           组件化编译、构建和配置脚本
docs            说明文档
domains         增强软件服务子系统集
drivers         驱动子系统
foundation      系统基础能力子系统集
kernel          内核子系统
prebuilts       编译器及工具链子系统
test            测试子系统
third_party     开源第三方组件
utils           常用的工具集
vendor          厂商提供的软件
build。py        编译脚本文件
out             编译后生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

编译输出 | 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
1
2
3
4
5

百文说内核 | 抓住主脉络

  • 百文相当于摸出内核的肌肉和器官系统,让人开始丰满有立体感,因是直接从注释源码起步,在加注释过程中,每每有心得处就整理,慢慢形成了以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切。
  • 与代码需不断debug一样,文章内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
  • 百文在 < 鸿蒙研究站 | 开源中国 | 博客园 | 51cto | csdn | 知乎 | 掘金 > 站点发布,公众号回复 百文 可方便阅读。

按功能模块:

百万注源码 | 处处扣细节

  • 百万汉字注解内核目的是要看清楚其毛细血管,细胞结构,等于在拿放大镜看内核。内核并不神秘,带着问题去源码中找答案是很容易上瘾的,你会发现很多文章对一些问题的解读是错误的,或者说不深刻难以自圆其说,你会慢慢形成自己新的解读,而新的解读又会碰到新的问题,如此层层递进,滚滚向前,拿着放大镜根本不愿意放手。

  • < gitee | github | coding | codechina > 四大码仓推送 | 同步官方源码,公众号中回复 百万 可方便阅读。

关注不迷路 | 代码即人生