OpenHarmony开发环境搭建

背景

因为没有实体的开发硬件,且不想破坏原有的Linux环境,所以这里基于 Docker + QEMU 搭建开发环境

  • 宿主机Linux系统
  • 命令行方式
  • Docker
  • QEMU 6.2

Docker环境准备

安装Docker

在Ubuntu中,可以使用下面的命令来安装Docker:

sudo apt install docker.io

获取Docker镜像

#获取小型系统镜像
docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_small:3.2
#获取轻量系统镜像
docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
#获取标准系统镜像
docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2

运行构建环境

# 运行小型系统Docker构建环境
docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_small:3.2

# 运行轻量系统Docker构建环境
docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2

# 运行标准系统Docker构建环境
docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2

其他

  • Docker需要root权限
  • 注意 Docker 的网络模式
  • 其他Docker相关的操作可自行网上查阅(Docker相关)

获取OH源码

这里以获取 master 分支为例,如要下载其他分支,-b 换成其他分支名即可

前提条件

  1. 注册码云gitee帐号,注册码云SSH公钥(不使用ssh的话可省略)

  2. 安装gitgit-lfs并配置用户信息

    sudo apt-get update
    sudo apt-get install git git-lfs
    
    git config --global user.name "yourname"
    git config --global user.email "your-email-address"
    git config --global credential.helper store
  3. 安装repo
    下述命令中的安装路径以”~/bin”为例,请用户自行创建所需目录

    mkdir ~/bin
    curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo 
    chmod a+x ~/bin/repo
    pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

    将repo添加到环境变量。

    vim ~/.bashrc               # 编辑环境变量
    export PATH=~/bin:$PATH     # 在环境变量的最后添加一行repo路径信息
    source ~/.bashrc            # 应用环境变量

    下载

方式一(推荐):通过repo + ssh下载(需注册公钥,请参考码云帮助中心)

repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'

方式二:通过repo + https下载

repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'

执行prebuilts

在源码根目录下执行prebuilts脚本,安装编译器及二进制工具,这点很重要
不然会报类似的错误:please execute preload_download.sh

bash build/prebuilts_download.sh

构建编译

通过尝试各种分支,各个demo,最后确定使用OpenHarmony-3.0-LTS 分支,ohemu下的qemu_small_system_demo

命令行方式

#python方式
python3 build.py -p {product_name}@{company}

#Release版本 :
./build.sh --product-name {product_name}
#Debug版本 :
./build.sh --product-name {product_name} --gn-args is_debug=true --build-target {target_name}

./build.sh --product-name qemu-arm-linux-min --ccache --jobs 4

hb方式

hb是OpenHarmony的命令行工具,用来执行编译命令,推荐使用这种方式

  • 安装及卸载
#安装
python3 -m pip install --user ohos-build
#卸载
python3 -m pip uninstall ohos-build  

#以上安装如果还不行,在源码根目录运行如下命令安装hb并更新至最新版本。 有些版本为 build/lite
python3 -m pip install --user build/hb
  • 编译构建
#选择对应的构建目标
hb set
#查看当前设置信息
hb env
#编译
hb build
#clean
hb clean

QEMU

QEMU 我没有安装在Docker里,是安装在宿主机上的,Docker里面的环境比较单一,缺少很多组件和包,
所以这也导致 无法直接使用Openharmony根目录下的qemu-run脚本来运行QEMU

安装QEMU

这里是手动安装的openharmony推荐的6.2版本,不同的版本可能会有些问题。
编译安装QEMU和其他的包的过程都是差不多,具体如下:

  1. 安装依赖(Ubuntu 18+)

    sudo apt install build-essential zlib1g-dev pkg-config libglib2.0-dev  binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev virtualenv flex bison
  2. 获取源码

    wget https://download.qemu.org/qemu-6.2.0.tar.xz
  3. 编译安装

    #编译
    tar -xf qemu-6.2.0.tar.xz
    cd qemu-6.2.0
    mkdir build && cd build
    ../configure --prefix=qemu_installation_path
    make -j16
    
    #安装
    make install
    
    #添加环境变量, 最末尾加入: export PATH=$PATH:qemu_installation_path
    vim ~/.bashrc
    

    启动QEMU

每个版本或分支可能启动的脚本的位置不太一样,但大致路径都是差不多的

例如 qemu_small_system_demo

Release或master:
./vendor/ohemu/qemu_small_system_demo/qemu_run.sh

OpenHarmony-3.0-LTS:
./vendor/ohemu/qemu_small_system_demo/patches/qemu-run

有些启动脚本需要做点稍微的修改,主要是传入的参数

退出QEMU

按下Ctrl-A + x可退出qemu虚拟环境

各种问题

  • 文档各种不匹配,对不上,未更新;各个分支版本差异较大,错误

  • 提示缺少相关组件或包

    apt-get install dosfstools mtools 
  • 运行 sudo + 命令,显示找不到命令
    sudo默认的配置文件下只是指定三个命令位置,如下:

    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin  

    参考 sudo xx 找不到命令中的方案一,建立到上面3个位置的软链接 解决问题

  • 分支问题
    开始使用 OpenHarmony-v3.2-Release分支,报如下错误:

    [ERR][KProcess:SystemInit]Failed to find file system jffs2
    [ERR][KProcess:SystemInit]Failed to mount /, rootDev /dev/cfiflash0, errno 19: No such device
    [ERR][KProcess:SystemInit]mount rootfs error!
    

    在官方仓库OpenHarmony / device_qemu的 Issues 看到了成员回复:

    small模拟系统未跟踪版本release,原因是问题太多,达不到能正式释放的水平。
    这是个纯粹社区推动的项目,希望、需要共同参与推动
    qemu项目是个社区项目,现在最大的问题是缺少开发者和维护者,非常期望参与解决问题~

    大致意思就是qemu模拟的small等系统问题太多,达不到release的程度~~

    换成 master 分支,报如下错误:

    [OHOS ERROR] [606/783] ACTION //kernel/liteos_a:make(//build/lite/toolchain:linux_x86_64_ohos_clang)
    [OHOS ERROR] FAILED: obj/kernel/liteos_a/make_build_ext_components.txt 
    ...

    OpenHarmony-3.0-LTS 分支后,勉强可以使用qemu_small_system_demo

  • 运行qemu回环设备报错

    xxx@xxx-PC:~/WorkSpace/OpenHarmony$ ./vendor/ohemu/qemu_small_system_demo/qemu_run.sh 
    
    Start making out/smallmmc.img...记录了1+0 的读入
    记录了1+0 的写出
    104857600 bytes (105 MB, 100 MiB) copied, 0.0651924 s, 1.6 GB/s
    losetup: out/smallmmc.img:设置回环设备失败: 设备或资源忙

    分析qemu_run启动脚本和losetup,这个主要的问题是在第一次运行的时候,使用loop设备后,中间的过程报错退出了,未卸载loop设备,导致下次使用该loop设备一直在占用,手动卸载后OK了

参考

社区文档: