开源鸿蒙NEXT星河版内核嵌入式编程

作者将狼才鲸
创建日期2024-03-08

一、前景提要

二、OpenHarmony源码下载、编译与运行

1、源码整体感知

jim@ubuntu:~/OpenHarmony$ ls -a
.             build          developtools  foundation     .repo
..            build.py       device        .gn            test
applications  build.sh       docs          kernel         third_party
base          commonlibrary  drivers       productdefine  vendor

159,898 items, totalling 11.6 GB

当前下载的是单一芯片单一系统类型的代码,总量11G,如果是全量代码,OpenHarmony4.0会有30G。
  • OpenHarmony有Gitee源码仓库:https://gitee.com/openharmony ,但是和其它简单的Git仓库不一样,它不是通过 git clone xxx 一个命令就能下载全量代码的,而是和安卓类似,需要用到manifest这个顶层仓库,并且通过repo工具把很多个Git仓库的特定版本拉到本地同一个目录。

    • 顶层目录下没有.git的文件夹,只有.repo的文件夹,而底下的每个文件夹可能就是单独的Git仓库,有自己的.git隐藏文件夹
  • 参考网址:

  • 特定的开发板介绍:

  • 官方的轻型系统开发板中我中意的有:瑞芯微RK2206和STM32F407IGT6,信息如下

  • 下载源码时可以指定目标硬件,开源鸿蒙的源码下载步骤和安卓类似,使用repo工具和https://gitee.com/openharmony/manifest 这个仓库,manifet是组织了很多独立的git仓库,一起给你按tag拉出一份全量代码;

    • 从manifest仓库你们的readme可知,我下载时可以指明参数,例如 ohos:mini 轻型系统,ohos:chipset 选择一款芯片
    • repo init -u URL -b master 下载整个系统全量代码,30多G
    • repo init -u URL -b master -g ohos:mini 下载轻量系统全量代码。
    • repo init -u URL -b master -m chipsets/chipsetN.xml -g ohos:mini 下载轻量系统指定芯片的代码。
    • 在 https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/dev-board-on-the-master.md 里面有支持的所有开发板和芯片,我选中了ARM Cortex-M内核的Niobe407开发板的STM32F407IGT6芯片,小凌派-RK2206开发板的RK2206,还有使用QEMU虚拟机的虚拟开发板;
    • 它们的型号和配置是 https://gitee.com/openharmony/manifest/blob/master/chipsets/niobe407/niobe407.xml 、 https://gitee.com/openharmony/manifest/blob/master/chipsets/lockzhiner/lingpi.xml 、 https://gitee.com/openharmony/manifest/blob/master/chipsets/qemu/qemu.xml

2、源码下载

2.1、最简单的下载方式
  • 推荐你下载OpenHarmony4.1全量代码,最简单,直接网址下载,总共30G左右,不用解决Linux环境下的各种依赖错误。
    • 下载网址 https://repo.huaweicloud.com/openharmony/os/4.1-Beta1/code-v4.1-Beta1.tar.gz
    • 出了新版本后也是进入上面类似的网址,进入新版本的文件夹种下载压缩包即可。
2.2、常规的下载方式
  • 如果你有过Linux内核开发经验,知道接下来要使用OpenHarmony在哪款板子上运行,则建议你下载特定类型(轻型小型标准)、特定芯片的系统,此下载步骤需要在Linux发行版如Ubuntu下进行,总共11G左右;
    • 安装VMware或者VMware-Player或者Virual Box虚拟机,初学者建议使用VMware,网上教程更多,过程略;
    • 安装Ubuntu系统,过程略,我使用的是Ubuntu18.04.6;
    • 执行命令:
	推荐使用Ubuntu18.04及以上版本,Ubuntu16.04不行,Windows + MSYS2 + MinGW64不行;
	安装Ubuntu后把“电源”和“隐私”的设置都改成永远不锁屏,否则一锁屏后下载就会停住,需要退出重新来,容易导致文件冲突;
	建议在你创建好的文件夹内打开命令行,如果你在~家目录打开命令行,则下载的源码文件都在家目录下,会和其它文件混在一起,文件夹很多,分辨不出哪个是系统原有的,想再剪切到别的文件就困难了。
	进入Ubuntu系统后,在桌面上按鼠标右键,然后点击打开终端这一项,老系统可以按Ctrl + Alt + T打开命令行终端,默认是在~家目录
	mkdir ~/openHarmony			/* 家目录下新建文件夹 */
	cd ~/openHarmony			/* 进入新建的文件夹 */
	sudo apt-get install git	/* 安装Git软件 */
	git config --global user.name jimXXX	/* 配置Git,输入你自己的名字 */
	git config --global user.email jimXXX@163.com	/* 配置Git,输入你自己的邮箱 */
	git config --global credential.helper store	/* 配置Git为自动保存账号密码 */
	ssh-keygen -t rsa -C jimXXX@163.com	/* 生成Gitee网站要用到的密钥,这里是输入你自己的邮箱,回车三次 */
	gedit ~/.ssh/id_rsa.pub /* 复制密钥,复制里面全部的文本内容 */
	打开网址 https://gitee.com/ 注册账号,点击齿轮状的设置,点击安全设置中的SSH公钥,将刚刚复制的内容填入到“公钥”这个文本框内,点击确定,输入密码,即添加完Git公钥
	mkdir ~/bin
	sudo apt install curl
	curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo 
	chmod a+x ~/bin/repo
	sudo apt install python3-pip
		如果用了Ubuntu老版本系统,如Ubuntu18.04,则还要继续执行下面步骤:
        sudo apt-get install python3
        echo alias python=python3 >> ~/.bashrc
		source ~/.bashrc
		python3 --version
		whereis python3
		sudo ln -s /usr/bin/python3 /usr/bin/python

	pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
		如果使用了Ubuntu16.04及以前的系统,这条命令可能会报错,需要你自己解决
	
	gedit ~/.bashrc  打开桌面~下的.bashrc隐藏文件夹
	在最后面加上一句 export PATH=~/bin:$PATH,保存退出
	source ~/.bashrc 生效环境变量
	echo $PATH 查看环境变量
	repo init -u https://gitee.com/openharmony/manifest -b master -m chipsets/niobe407.xml -g ohos:mini 做好下载指定开发板指定芯片源码的准备,我这里是下载ARM Cortex-M内核的Niobe407开发板的STM32F407IGT6芯片
		如果下载全量代码,则使用 repo init -u git@github.com:openharmony/manifest.git -b master --no-repo-verify
		如果下载QEMU模拟器的代码,则使用 repo init -u https://gitee.com/openharmony/manifest -b master -m chipsets/qemu.xml -g ohos:mini

	repo sync -c 开始下载,等待时间会比较久
		需要设置电脑不待机,如果中途卡住,可以Ctrl + C退出当前命令,并再次repo sync -c继续下载
		如果继续下载有冲突,则手动删除有冲突的文件夹后继续使用repo sync -c
		你在哪个文件夹路径使用repo init,就会在这个路径形成一个.repo隐藏文件夹,已经下载完的文件夹会在当前目录中出现
	sudo apt-get install git-lfs
	repo forall -c 'git lfs pull'
		继续拉取大文件
  • 下载完之后的文件结构如下:
jim@ubuntu:~/OpenHarmony$ ls -a
.             build          developtools  foundation     .repo
..            build.py       device        .gn            test
applications  build.sh       docs          kernel         third_party
base          commonlibrary  drivers       productdefine  vendor

159,898 items, totalling 11.6 GB

当前下载的是单一芯片单一系统类型的代码,总量11G,如果是全量代码,OpenHarmony4.0会有30G。
  • repo仓库是由多个git仓库拼起来的,源码根目录下是.repo隐藏文件夹,里面的某些子文件夹下如果有.git隐藏文件夹,那么它就是一个独立的git仓库

3、编译系统,生成OHOS_Image可执行文件

3.1、最简单的编译流程,使用Docker
  • 使用鸿蒙官方已经准备好的Docker环境
    • Docker编译环境
    • sudo apt install docker.io
    • sudo docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
    • cd ~/openHarmony 进入到你下载的开源鸿蒙源码的路径,再执行下面这一条
    • docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
    • 这时已经进入到docker的虚拟环境
jim@ubuntu:~/openHarmony$ sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
root@949f932a2f80:/home/openharmony# ls
applications  build     build.sh       developtools  docs     foundation  ohos_config.json  prebuilts      qemu-run  third_party
base          build.py  commonlibrary  device        drivers  kernel      out               productdefine  test      vendor
root@949f932a2f80:/home/openharmony#
  • python3 build.py -p qemu_mini_system_demo@ohemu

    • 你要编译什么板子,就使用什么命令,我这里是编译qemu的轻型系统
    • 开始编译轻型系统,编译时间会需要很久,十几分钟……
    • 编译工具分为轻型、小型、标准,而芯片、开发板的归属也分为这三种,下载的工具和你编译的参数必须属于同一种类,否则会编译各种报错!!!
  • 在编译结束后,编译所生成的文件都会被存放在out/{device_name}/目录下,结果镜像输出在out/{device_name}/packages/phone/images/目录下。

  • 如果遇到报错,则解决报错

  • 编译成功后是这样的打印:

[OHOS INFO] [1614/1615] STAMP obj/build/ohos/images/make_images.stamp
[OHOS INFO] [1615/1615] STAMP obj/build/core/gn/images.stamp
[OHOS INFO] ccache_dir = /root/.ccache, ccache_exec = /usr/bin/ccache
[OHOS INFO] --------------------------------------------
[OHOS INFO] ccache summary:
[OHOS INFO] ccache version: 3.7.7
[OHOS INFO] cache hit (direct): 0
[OHOS INFO] cache hit (preprocessed): 0
[OHOS INFO] cache miss: 0
[OHOS INFO] hit rate: 0.00% 
[OHOS INFO] miss rate: 0.00% 
[OHOS INFO] Cache size (GB): 
[OHOS INFO] ---------------------------------------------
[OHOS INFO] c targets overlap rate statistics
[OHOS INFO] subsystem       	files NO.	percentage	builds NO.	percentage	overlap rate
[OHOS INFO] hiviewdfx       	      12	0.8%	      12	0.8%	1.00
[OHOS INFO] kernel          	     902	63.5%	     902	63.5%	1.00
[OHOS INFO] security        	      61	4.3%	      61	4.3%	1.00
[OHOS INFO] startup         	      26	1.8%	      26	1.8%	1.00
[OHOS INFO] systemabilitymgr	      15	1.1%	      15	1.1%	1.00
[OHOS INFO] thirdparty      	     393	27.7%	     393	27.7%	1.00
[OHOS INFO] 
[OHOS INFO] c overall build overlap rate: 1.00
[OHOS INFO] 
[OHOS INFO] 
[OHOS INFO] qemu_mini_system_demo@ohemu build success
[OHOS INFO] Cost time:  0:05:47
root@ff38bf1e3e75:/home/openharmony# 

jim@ubuntu:~/openHarmony/out/arm_mps2_an386/qemu_mini_system_demo$ ls
all_parts_host.json           build_configs   config.h         kconfig_files.txt  OHOS_Image.bin              src_installed_parts.json
all_parts_info.json           build.log       error.log        libs               OHOS_Image.map              src_sa_infos_tmp.json
args.gn                       build.ninja     etc              NOTICE_FILES       OHOS_Image.sym.sorted       startup
binary_installed_parts.json   build.ninja.d   gen              obj                packages                    thirdparty
build.1709259296.3884952.log  build.trace.gz  hiviewdfx        OHOS_Image         security                    toolchain.ninja
build.1709259767.6772568.log  config.gni      kconfig_env.txt  OHOS_Image.asm     sorted_action_duration.txt
jim@ubuntu:~/openHarmony/out/arm_mps2_an386/qemu_mini_system_demo$ 
  • 生成的系统镜像image是这里面的OHOS_Image文件

  • 如需退出Docker,执行exit命令即可。这个命令会停止当前的Docker容器,并返回到您的操作系统。

  • 下一步就可以把编译好的操作系统在QEMU模拟器中运行起来啦。

3.2、使用ohos-build工具编译
  • 最常用的编译方式是使用hb命令,也就是ohos-build工具,这是鸿蒙自己的Python工具
    • 了解OpenHarmony-编译

    • OpenHarmony支持hb和build.sh两种编译方式。

    • 安装hb编译工具

    • 安装库和工具集

    • .sh方式编译构建指导

    • python3 -V 查看python版本,如果是3.8以下,则:

      • sudo apt install python3.8
      • sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
      • sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
      • sudo update-alternatives --config python3
      • python3 -V
    • python3 -m pip install --user ohos-build

      • pip3是Python的包管理工具,用于安装、升和管理Python包
      • 需要python3.8以上的版本
  • 安装流程介绍:
  • 如果你是Ubuntu18.04,则先执行
    • cd /usr/lib/python3/dist-packages
    • cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so apt_pkg.cpython-39m-x86_64-linux-gnu.so apt_pkg.so
    • cd -
  • 再安装依赖库
sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib gcc-arm-linux-gnueabi libc6-dev-i386 libc6-dev-amd64 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs device-tree-compiler make libffi-dev e2fsprogs pkg-config perl openssl libssl-dev libelf-dev libdwarf-dev u-boot-tools mtd-utils cpio doxygen liblz4-tool openjdk-8-jre gcc g++ texinfo dosfstools mtools default-jre default-jdk libncurses5 apt-utils wget scons python3.8-distutils tar rsync git-core libxml2-dev lib32z-dev grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev
  • 仔细看安装后的信息,如果提示有哪些包未安装成功,则你需要单独安装

    • sudo apt-get install g++-multilib
    • sudo apt-get install gcc-arm-linux-gnueabi
    • sudo apt-get install gcc-multilib
    • sudo apt-get install lib32ncurses5-dev
    • sudo apt-get install lib32z1-dev
    • sudo apt-get install libc6-dev-i386
    • sudo apt-get install gcc-7-arm-linux-gnueabi
    • sudo apt-get install libc6-amd64:i386
    • sudo aptitude install gcc-multilib:i386 使用aptitude命令可以自动解决包依赖关系,需要先安装aptitude软件
  • 已经按前面的流程下载好源码

  • cd ~/openHarmony 进入到你下载的源码根目录

  • bash build/prebuilts_download.sh 安装和芯片相关的编译器和二进制工具,全自动的,会下载的同时进行安装,要等待一段时间,有进度条

  • python3 -m pip install --user build/hb

  • gedit ~/.bashrc

  • 将 export PATH=~/.local/bin:$PATH 加入到最后一行并保存退出

  • source ~/.bashrc

  • hb --help 这个命令执行时可能有报错,有什么错误就解决什么错误,例如用下面方法解决报错

    • python3 -m pip uninstall ohos-build
    • python3 -m pip install --user ohos-build==0.4.3
  • hb set 进行编译设置

jim@ubuntu:~/openHarmony$ hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need?  qemu_mini_system_demo
3.3 使用传统Linux脚本方式编译
  • 如果你用hb的方式编译始终出错,那么可以试试使用传统.sh脚本的方式

  • ./build.sh --product-name qemu_mini_system_demo --ccache /* 需要换成你自己开发板的名称,我这里使用的是QEMU模拟器的虚拟开发板 */

    • 有报错则解决报错
  • 检查编译结果。编译完成后,log中显示如下:

    • post_process
    • =====build name successful.
    • 编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在out/{device_name}/packages/phone/images/ 目录下。
  • 如果依然编译有报错,那还可以试试Docker

  • 如果你只是想编译应用程序,那么可以使用DevEco Device Tool

3、系统运行

  • 如果你是在某一块开发板上运行开源鸿蒙系统,那么请参照该开发板对应的sdk文档
  • 我准备在QEMU模拟器中运行ARM Cortex-M4的轻型开源鸿蒙系统
  • 在电脑上安装QEMU模拟器软件,可以在Windows下安装,也可以在Linux发行版下安装
    • Qemu安装-QEMU Quick Emulator QEMU在Ubuntu下的安装流程;是下载源码后再编译,编译速度很慢,可以make只编译ARM部分的,这样编译速度会快很多
      • …/configure --target-list=arm-softmmu,arm-linux-user
      • make -j4
      • sudo make install
    • 在Windows下的安装流程更简单
    • Windows的所有安装包 安装6.2.0及以上的版本都可以
    • 官网下载很慢,可以用国内网站下载 https://www.mydown.com/soft/172/726002172.shtml
    • Windows下安装后需要手动配置好QEMU的环境变量,或者直接进入到D:\Program Files\qemu的目录下打开CMD命令行界面,这样才能调用qemu的命令
  • Ubuntu回到OpenHarmony源码根目录下,使用命令行用QEMU模拟器运行开源鸿蒙系统
    • ./qemu-run --help
    • ./qemu-run -e out/arm_mps2_an386/qemu_mini_system_demo/OHOS_Image
    • qemu-run是个脚本,可以用文本文件打开,它里面也是调用的qemu-system-arm这个命令,只是自动传入了需要的参数
  • 这是开源鸿蒙在QEMU硬件模拟器中运行的结果,当前源码中对QEMU Cortex-M4的适配有点问题,会有程序跑飞的报错,你可以再尝试一下别的QEMU开发板,或者以后用OpenHarmony新版本的程序再试一次:
jim@ubuntu:~/openHarmony$ ./qemu-run -e out/arm_mps2_an386/qemu_mini_system_demo/OHOS_Image
board: arm_mps2_an386

Enter to start qemu[y/n]:entering kernel init...
LfsLowLevelInit: DiskPartition succeed
LfsLowLevelInit: PartitionFormat succeed
LfsLowLevelInit: mount fs on '/littlefs' succeed
LfsLowLevelInit: mkdir '/littlefs' succeed
tcpip_init start
*************Exception Information**************
Type      = 11
ThrdPid   = 25
Phase     = exc in task
FaultAddr = 0xabababab
Current task info:
Task name = (null)
Task ID   = 25
Task SP   = (nil)
Task ST   = 0x0
Task SS   = 0x0
Exception reg dump:
PC        = 0x2100e62a
LR        = 0x2101b045
SP        = 0x210b18e0
R0        = 0x210a725c
R1        = 0x200
R2        = 0x210a725c
R3        = 0x2108a9b3
R4        = 0x0
R5        = 0x0
R6        = 0x0
R7        = 0x210b18e8
R8        = 0x0
R9        = 0x0
R10       = 0x0
R11       = 0x0
R12       = 0xc8000000
PriMask   = 0x0
xPSR      = 0x610f0000
----- backtrace start -----
backtrace 0 -- lr = 0x21015178
backtrace 1 -- lr = 0x2101b044
backtrace 2 -- lr = 0x210235da
backtrace 3 -- lr = 0x210235e2
backtrace 4 -- lr = 0x2102379a
----- backtrace end -----
qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1)

R00=210b2ad0 R01=2109fa3f R02=210a18f8 R03=6c0da998
R04=00000000 R05=00000060 R06=00000018 R07=210b1708
R08=00000019 R09=000003e8 R10=218ba1e8 R11=00000000
R12=00000000 R13=210b1708 R14=210011db R15=21000fcc
XPSR=21030006 --C- T handler
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
FPSCR: 00000000
/home/jim/openHarmony/vendor/ohemu/qemu_mini_system_demo/qemu_run.sh: line 95: 50440 Aborted                 (core dumped) qemu-system-arm -M mps2-an386 -m 16M -kernel $elf_file $qemu_option -append "root=dev/vda or console=ttyS0" -nographic
jim@ubuntu:~/openHarmony$ 
  • 在Windows的QEMU下可以用这个命令
    • qemu-system-arm -M mps2-an386 -cpu cortex-m4 -kernel OHOS_Image -serial stdio -nodefaults -nographic
    • 另外一个可供你参考的命令 qemu-system-arm -machine versatileab -cpu cortex-a9 -nographic -monitor null -semihosting -append ‘some program arguments’ -kernel program.axf
D:\Program Files\qemu>qemu-system-arm -M mps2-an386 -cpu cortex-m4 -kernel OHOS_Image -serial stdio -nodefaults -nographic
qemu-system-arm: warning: nic lan9118.0 has no peer
entering kernel init...
LfsLowLevelInit: DiskPartition succeed
LfsLowLevelInit: PartitionFormat succeed
LfsLowLevelInit: mount fs on '/littlefs' succeed
LfsLowLevelInit: mkdir '/littlefs' succeed
tcpip_init start
*************Exception Information**************
Type      = 11
ThrdPid   = 25
Phase     = exc in task
FaultAddr = 0xabababab
Current task info:
Task name = (null)
Task ID   = 25
Task SP   = (nil)
Task ST   = 0x0
Task SS   = 0x0
Exception reg dump:
PC        = 0x2100e62a
LR        = 0x2101b045
SP        = 0x210b18e0
R0        = 0x210a725c
R1        = 0x200
R2        = 0x210a725c
R3        = 0x2108a9b3
R4        = 0x0
R5        = 0x0
R6        = 0x0
R7        = 0x210b18e8
R8        = 0x0
R9        = 0x0
R10       = 0x0
R11       = 0x0
R12       = 0xc8000000
PriMask   = 0x0
xPSR      = 0x610f0000
----- backtrace start -----
backtrace 0 -- lr = 0x21015178
backtrace 1 -- lr = 0x2101b044
backtrace 2 -- lr = 0x210235da
backtrace 3 -- lr = 0x210235e2
backtrace 4 -- lr = 0x2102379a
----- backtrace end -----
qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1)

R00=210b2ad0 R01=2109fa3f R02=210a18f8 R03=6c0da998
R04=00000000 R05=00000060 R06=00000018 R07=210b1708
R08=00000019 R09=000003e8 R10=218ba1e8 R11=00000000
R12=00000000 R13=210b1708 R14=210011db R15=21000fcc
XPSR=21030006 --C- T handler
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
FPSCR: 00000000

D:\Program Files\qemu>

三、源码讲解

  • 这是下载好的源码文件夹:
jim@ubuntu:~/openHarmony$ tree -a -L 1
.
├── applications
├── base
├── build
├── build.py -> build/build_scripts/build.py
├── build.sh -> build/build_scripts/build.sh
├── commonlibrary
├── developtools
├── device
├── docs
├── drivers
├── foundation
├── .gn -> build/core/gn/dotfile.gn
├── kernel
├── ohos_config.json
├── out
├── prebuilts
├── productdefine
├── qemu
├── qemu-run -> vendor/ohemu/common/qemu-run
├── .repo
├── test
├── third_party
└── vendor

18 directories, 5 files
jim@ubuntu:~/openHarmony$ tree -a -L 2
.
├── applications
│   └── sample
├── base
│   ├── global
│   ├── hiviewdfx
│   ├── iothardware
│   ├── powermgr
│   ├── security
│   ├── sensors
│   ├── startup
│   └── update
├── build
│   ├── build_scripts
│   ├── bundle.json
│   ├── common
│   ├── compile_env_allowlist.json
│   ├── compile_standard_whitelist.json
│   ├── component_compilation_whitelist.json
│   ├── config
│   ├── core
│   ├── docs
│   ├── .git
│   ├── .gitattributes
│   ├── .gitee
│   ├── .gitignore
│   ├── gn_helpers.py
│   ├── hb
│   ├── LICENSE
│   ├── lite
│   ├── misc
│   ├── OAT.xml
│   ├── ohos
│   ├── ohos.gni
│   ├── ohos_system.prop
│   ├── ohos_var.gni
│   ├── prebuilts_download_config.json
│   ├── prebuilts_download.py
│   ├── prebuilts_download.sh
│   ├── print_python_deps.py
│   ├── __pycache__
│   ├── README_zh.md
│   ├── rust
│   ├── scripts
│   ├── subsystem_compoents_whitelist.json
│   ├── subsystem_config_example.json
│   ├── subsystem_config.json
│   ├── templates
│   ├── test
│   ├── test.gni
│   ├── toolchain
│   ├── tools
│   ├── version.gni
│   └── zip.py
├── build.py -> build/build_scripts/build.py
├── build.sh -> build/build_scripts/build.sh
├── commonlibrary
│   ├── c_utils
│   └── utils_lite
├── developtools
│   ├── global_resource_tool
│   ├── integration_verification
│   ├── packing_tool
│   └── syscap_codec
├── device
│   └── qemu
├── docs
│   ├── CODEOWNERS
│   ├── DCO.txt
│   ├── docker
│   ├── en
│   ├── .git
│   ├── .gitattributes
│   ├── .gitignore
│   ├── image.png
│   ├── LICENSE
│   ├── OAT.xml
│   ├── README.md
│   ├── README_zh.md
│   └── zh-cn
├── drivers
│   ├── hdf_core
│   ├── liteos
│   └── peripheral
├── foundation
│   ├── ability
│   ├── ai
│   ├── arkui
│   ├── bundlemanager
│   ├── communication
│   ├── distributedhardware
│   ├── graphic
│   ├── multimedia
│   ├── systemabilitymgr
│   └── window
├── .gn -> build/core/gn/dotfile.gn
├── kernel
│   ├── liteos_a
│   ├── liteos_m
│   └── uniproton
├── ohos_config.json
├── out
│   ├── arm_mps2_an386
│   ├── arm_virt
│   ├── hb_args
│   ├── ohos_config.json
│   ├── preloader
│   └── sdk
├── prebuilts
│   ├── ark_tools
│   ├── build-tools
│   ├── clang
│   ├── cmake
│   ├── develop_tools
│   ├── gcc
│   ├── mingw-w64
│   ├── packing_tool
│   ├── python
│   └── rustc
├── productdefine
│   └── common
├── qemu
│   ├── qemu-6.2.0
│   └── qemu-6.2.0.tar.xz
├── qemu-run -> vendor/ohemu/common/qemu-run
├── .repo
│   ├── manifests
│   ├── manifests.git
│   ├── manifest.xml
│   ├── project.list
│   ├── project-objects
│   ├── projects
│   ├── repo
│   └── .repo_fetchtimes.json
├── test
│   ├── ostest
│   ├── testfwk
│   └── xts
├── third_party
│   ├── bounds_checking_function
│   ├── cJSON
│   ├── cmsis
│   ├── curl
│   ├── FatFs
│   ├── ffmpeg
│   ├── FreeBSD
│   ├── freetype
│   ├── glslang
│   ├── gn
│   ├── googletest
│   ├── harfbuzz
│   ├── jerryscript
│   ├── jinja2
│   ├── json
│   ├── libjpeg-turbo
│   ├── libpng
│   ├── libunwind
│   ├── littlefs
│   ├── ltp
│   ├── lwip
│   ├── lzma
│   ├── markupsafe
│   ├── mbedtls
│   ├── mksh
│   ├── mtdev
│   ├── musl
│   ├── nghttp2
│   ├── NuttX
│   ├── openssl
│   ├── optimized-routines
│   ├── popt
│   ├── PyYAML
│   ├── qrcodegen
│   ├── spirv-headers
│   ├── spirv-tools
│   ├── sqlite
│   ├── toybox
│   ├── unity
│   ├── vk-gl-cts
│   ├── wpa_supplicant
│   └── zlib
└── vendor
    └── ohemu

140 directories, 42 files
jim@ubuntu:~/openHarmony$ 

1、编译工具

  • 编译源码可以使用hb命令(ohos-build),可以使用build.sh脚本,也可以使用build.py脚本,其中编译脚本在build这个git仓库里,hb命令的ohos-build源码也在build/lite目录下,可以通过这个仓库学习编译整套源码的流程。
    • 对应的仓库地址为:https://gitee.com/openharmony/build
    • 使用了Gn、Ninja、Python工具,类似于Linux中的Cmake、Makefile、Kconfig、Kbuild这些
  • Ninja是谷歌用于替代Makefile的开源编译工具,使用并行机制提高速度,源码地址是 https://gitee.com/openharmony/third_party_ninja
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐