鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南

news2025/1/12 16:13:13

几点说明

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

    • 2021/10/09 – 增加性能优化模块perf,优化了文件映射模块
    • 2021/09/14 – common,extended等几个目录结构和Makefile调整
    • 2021/08/19 – 各目录增加了BUILD.gn文件,文件系统部分文件调整
    • 2021/07/15 – 改动不大,新增blackbox,hidumper,对一些宏规范化使用
    • 2021/06/27 – 对文件系统/设备驱动改动较大,目录结构进行了重新整理
    • 2021/06/08 – 对编译构建,任务,信号模块有较大的改动
    • 2021/05/28 – 改动不大,主要针对一些错误单词拼写纠正
    • 2021/05/13 – 对系统调用,任务切换,信号处理,异常接管,文件管理,shell做了较大更新,代码结构更清晰
    • 2021/04/21 – 官方优化了很多之前吐槽的地方,点赞
    • 2020/09/16 – 中文注解版起点

鸿蒙版本

本篇主要采用 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  

鸿蒙全栈开发全新学习指南

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:https://gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1654342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS ------ 内存五大分区

1,内存的概念: 虚拟内存(Virtual Memory):虚拟内存是操作系统提供的一种机制,它使得应用程序能够访问超出物理内存限制的内存空间。虚拟内存将应用程序的内存地址空间分割成固定大小的页面(Pag…

linux上如何排查JVM内存过高?

怎么排查JVM内存过高? 前言: 想必工作一两年以后的同学都会逐渐面临到,jvm等问题,但是可能苦于无法熟练的使用一些工具;本文将介绍几个比较常用分析工具的使用方法,带着大家一步步定位分析问题。 1、top 查…

TSINGSEE青犀视频边缘计算AI智能分析网关V4告警消息语音推送的配置流程

TSINGSEE青犀视频边缘计算硬件智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。今天我们来分享一下如何配置和使用AI智能分析网关V4的语音推送。 提前准备…

【Trick】conda安装python依赖时出现429 Client Error

起因 我在根据yml文件安装依赖和创建虚拟环境时,出现报错,主要报错信息为以下两点: 【1】Collecting package metadata (repodata.json): failed 【2】requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: https…

链表的阶乘

int FactorialSum(List L) {int res 0; // 结果初始化struct Node* x L; // 从链表的头节点开始// 遍历链表中的每一个节点while (x ! NULL) {int data x->Data; // 当前节点的值int y 1; // 用于计算当前节点值的阶乘// 计算当前节点值的阶乘for (int j 1; j < dat…

【3dmax笔记】035: 车削修改器

一、车削修改器介绍 车削&#xff1a;图形通过绕轴旋转来创建三维效果。 开放的样条线&#xff0c;车削之后是面片。闭合的样条线&#xff0c;车削之后&#xff0c;是实体。 一、车削修改器实例 绘制高脚杯&#xff0c;首先在前视图绘制如下二维图形。 添加一个车削的修改器…

【计算机科学速成课】笔记一

文章目录 写在前面1.计算机的早期历史2.电子计算机3.布尔运算和逻辑门4.二进制5.算术逻辑单元-ALU6.寄存器和内存 写在前面 所有的一切源于这样一个网站——CS自学指南。 这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Comp…

双向BFS算法学习

双向BFS算法学习 推荐练习题 力扣“127”题&#xff1a;单词接龙 “752”题&#xff1a;打开轮盘锁 这里推荐一篇力扣题解 双向BFS 这里使用打开轮盘锁的题干进行举例&#xff1a; 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’,…

基于Nios-II的流水灯

基于Nios-II的流水灯 一、Qsys设计&#xff08;一&#xff09;新建项目&#xff08;二&#xff09;Platfrom Designer&#xff08;三&#xff09;设置时钟主频&#xff08;四&#xff09;添加Nios-II Processor并设置&#xff08;五&#xff09;添加JTAG并配置&#xff08;六&a…

2024年第七届人工智能和模式识别国际会议(AIPR 2024)即将召开!

2024年第七届人工智能和模式识别国际会议&#xff08;AIPR 2024)将于2024年9月20-22日在福建厦门市的华侨大学举行。探索AI边界&#xff0c;解锁识别新境界&#xff01;AIPR 2024旨在促进模式识别与机器学习, 计算机视觉与机器人视觉, 图像、语音、信号和视频处理等领域尖端成果…

ComfyUI中图像亮度/对比度/饱和度处理

用上面这个节点可以同时设置图片的亮度、对比度和饱和度。 【保姆级教程】一口气分享在ComfyUI中常用的30多种基本图像处理方式 更多好玩且实用AIGC工作流和节点 星球号&#xff1a;32767063 本期资料链接 往期学习资料 整理AI学习资料库

RabbitMQ的五种模式

一、简单模式 简单模式&#xff08;Simple&#xff09;&#xff1a;一个生产者&#xff0c;一个消费者 package com.qiangesoft.rabbitmq.mode.simple;import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframe…

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…

分布式与一致性协议之ZAB协议(八)

ZAB协议 如何实现读操作 相比写操作&#xff0c;读操作的处理要简单很多&#xff0c;因为接收到度请求的节点只需要查询本地数据&#xff0c;然后响应数据给客户端就可以了。读操作的核心流程如图所示。 1.跟随者在FollowerRequestProcessor.processRequest()中接收到度请求…

JavaScript异步编程——04-同源和跨域

同源和跨域 同源 同源策略是浏览器的一种安全策略&#xff0c;所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口完全相同。 跨域问题的解决方案 从我自己的网站访问别人网站的内容&#xff0c;就叫跨域。 出于安全性考虑&#xff0c;浏览器不允许ajax跨域获取…

mac监听 linux服务器性能可视化(Grafana+Promethus+Node_exporter)

Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心&#xff0c;我们可以只需要配置一个Prometheus,而在其他服务器&#xff0c;只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息&#xff0c;然后告诉prometheus它的位置…

redis分片java实践、redis哨兵机制实现、redis集群搭建

redis分片java实践 linux安装redishttps://mp.csdn.net/mp_blog/creation/editor/134864302复制redis.conf配置文件成redis1.conf、redis2.conf、redis3.conf 修改redis的端口信息和存pid文件的路径。存pid文件的路径只要不同就行了&#xff0c;没什么特别要求。 指定配置文件…

《编译原理》阅读笔记:p1-p3

《编译原理》学习第 1 天&#xff0c;p1-p3总结&#xff0c;总计 3 页。 一、技术总结 1.compiler(编译器) p1, But, before a program can be run, it first must be translated into a form in which it can be executed by a computer. The software systems that do thi…

【文章转载】ChatGPT 提示词十级技巧: 从新手到专家

学习了微博网友宝玉xp老师《ChatGPT 提示词十级技巧: 从新手到专家》 个人学习要点&#xff1a; 1、关于提示中避免使用否定句&#xff0c;播主说&#xff1a;“没有人能准确解释为什么&#xff0c;但大语言模型在你告诉它去做某事时&#xff0c;表现似乎比你让它不做某事时更…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类&#xff0c;实现它的拷贝构造并重载赋值运算符。 class T…