目录
1.摘要
近期需要使用鸿蒙源码,下载比较容易,但发现编译存在各种各样的问题,主要是报3000、4000的错误,网上文章参差不齐,解决问题的过程当中也花费较长时间,特此写下这篇笔记。
本文提供HarmonyOS 4.0的下载和编译方法,其中下载主要通过repo+SSH进行下载。
编译笔者提供两种方法编译到rk3568上,第一种方法是笔者直接提供编译好的Ubuntu网盘链接(通过WSL2直接导入已经编译好的Ubuntu-20.04),第二种方法是通过命令本地进行编译,本地编译花费大约4小时左右。第一种方法,简单、快速,直接规避了问题,第二种方法,可以体验一下漫长的编译过程,哈哈,反复报Error人都麻了。
笔者主推第一种编译方法,如果读者使用第一种编译方法,只需要阅读第6节内容即可,因为各种配置和依赖已经提前安装完毕,不必再进行下载,只需导入Ubuntu压缩包,然后二次执行编译命令验证即可。
---------------------------------------------------------------------------------------------------------------------------------
2.前提条件
虚拟环境:WSL2(推荐)、VMware、VirtualBox
Ubuntu版本:Ubuntu-20.04(推荐)、Ubuntu-18.04
Windows系统:win10(推荐)、win11
存储:内存最少8G,越高越好,官方推荐16G,外存140G,注意把Uunbu迁移到系统盘之外
---------------------------------------------------------------------------------------------------------------------------------
3.Ubuntu的准备
如果读者已经提前安装好了Ubuntu,这一步可以省略
3.1安装
快速使用WSL2安装Ubuntu,参照笔者之前的文章,提供了WSL2和Ubuntu的安装方法,文章中是下载22.04,注意换成20.04
3.2迁移
使用WSL2安装的Ubuntu默认装在C盘,注意迁移到其他盘,C盘搞爆了就不好玩了。下面这篇文章当中是安装的22.04版本的,注意换成20.04版本
---------------------------------------------------------------------------------------------------------------------------------
4.下载前的配置
以下命令均在Ubuntu中执行
4.1Shell 改 Bash
sudo dpkg-reconfigure dash
执行命令后选择 No
---------------------------------------------------------------------------------------------------------------------------------
4.2安装 GIt 和 pip3
Git是版本控制工具,pip3是python的包管理工具
sudo apt install git git-lfs python3-pip curl
mkdir ~/.pip
pip3 config set global.index-url https://mirrors.huaweicloud.com/repository/pypi/simple
pip3 config set global.trusted-host mirrors.huaweicloud.com
pip3 config set global.timeout 120
---------------------------------------------------------------------------------------------------------------------------------
4.3配置Git和repo
1.注册码云gitee帐号。
2.注册码云SSH公钥,请参考码云帮助中心,里面有SSH是否配置成功验证方法,主要验证一下,否则后续拉取源码是出现问题。
3.配置用户信息。
git config --global user.name "yourname"
git config --global user.email "your-email-address"
git config --global credential.helper store
4.安装码云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
5.将repo添加到环境变量,两种方法二选一。
方法一:建议直接执行一条命令
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc && source ~/.bashrc
方法二:通过vim编辑,不知道vim的,忽略此方法
vim ~/.bashrc # 编辑环境变量
export PATH=~/bin:$PATH # 在环境变量的最后添加一行repo路径信息
source ~/.bashrc # 应用环境变量
---------------------------------------------------------------------------------------------------------------------------------
4.4 安装下载工具集
这里分四步下载编译工具集,因为有坑
第一步:
sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev-i386 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 gcc-multilib g++-multilib
第三步:若您使用的是Ubuntu20及以上版本,由于gcc-multilib和gcc-arm-linux-gnueabi互斥,请勿安装gcc-arm-linux-gnueabi,否则执行以下命令,默认版本。
sudo apt-get install gcc-arm-linux-gnueabi
第四步(若第三步版本太低):若您使用的是Ubuntu20及以上版本,由于gcc-multilib和gcc-arm-linux-gnueabi互斥,请勿安装gcc-arm-linux-gnueabi,否则执行以下命令,版本9。
sudo apt-get install gcc-9-arm-linux-gnueabi
---------------------------------------------------------------------------------------------------------------------------------
4.5设置python解释器
#设置默认Python解释器
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
python --version
---------------------------------------------------------------------------------------------------------------------------------
5.拉取源码
5.1创建存储源码的文件夹
mkdir openharmony4.0
cd openharmony4.0
5.2拉取源码(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'
三条命令执行成功后,执行命令ls,即可查看当前源码根目录下的文件,如下图,out文件夹是编译输出文件夹,未编译则没有
---------------------------------------------------------------------------------------------------------------------------------
6.编译源码
6.1Ubuntu内存设置
内存的多少直接决定了编译是否成功!!!
1.查看内存:可以在Ubuntu根目录下执行如下命令查看内存,可以看到我的内存是7G,交换空间也是7G,如果不自行手动配置内存的话,默认只有4G左右,完全不够用。7G对方法一(导入已经编译好的Ubuntu)再次执行编译,足够使用,对于方法二本地编译是不够的。
官方推荐的内存是至少12G
free -m
2.配置内存
快捷键:win+R ,输入 %UserProfile%
新建 .wslconfig 文件,这里有个点,注意注意注意
写入如下配置信息,一般内存和交换空间1:1即可,如果内存够大的话,往上填,根据自己的电脑来填就好了,然后保存后,通过wsl --shutdown命令结束虚拟机服务,然后过8秒后,再次打卡Ubuntu,通过free -m查看内存,内存变化即为设置成功!
[wsl2]
memory=7GB
swap=7GB
localhostForwarding=true
---------------------------------------------------------------------------------------------------------------------------------
6.2方法一:导入编译好的Ubuntu
1.提取网盘中已经编译好的Ubuntu-22.04(130G),下载到自己的目标位置,比如在D盘新建文件夹Ubuntu_WSL,就会有如下路径 D:\Ubuntu_WSL
链接:https://pan.baidu.com/s/1OHtXMAI9lnsGjSBLyOHWAw
提取码:1234
2.导入在你想要将Ubuntu分发版存放的新位置(如D盘的`Ubuntu_WSL`文件夹)中,使用`wsl --import Ubuntu-新名称 <目标路径> <.tar文件路径>`命令来导入之前导出的分发版。注意,这里的“Ubuntu-新名称”可以与你之前导出的分发版名称相同,也可以不同。以下命令仅为示例,请替换成自己的实际路径,笔者的压缩包名称是Ubuntu.tar,导入需要一段时间,请耐心等待。这里发行版名字可以随便取
wsl --import Ubuntu-20.04 D:\Ubuntu_WSL D:\Ubuntu_WSL\Ubuntu.tar
3.导入成功后执行命令进行启动Ubuntu
wsl -d Ubuntu-20.4
4.进入到Ubuntu即为root用户,这里没有设置指定用户,需要设定可自行设定,我们查看目录看看
5.再次编译验证,大约1小时
sudo ./build.sh --product-name rk3568 --ccache
---------------------------------------------------------------------------------------------------------------------------------
6.3方法二:本地编译Ubuntu
在源码根目录下面执行命令,全程4-6小时,看机子性能,编译结果文件及编译日志文件获取路径:out/rk3568,在源码根目录执行prebuilts脚本,然后编译
bash build/prebuilts_download.sh
sudo ./build.sh --product-name rk3568 --ccache
如果不指定设备,可以直接编译源码,编译结果文件在 out/sdk/ohos-sdk文件夹里,可以看见两个子文件夹windows和linux,在windows文件夹里的toolchains里,可以看到hdc_std.exe
sudo ./build.sh --product-name ohos-sdk
编译成功后,在源码根目录下,执行cd out,切换到out文件夹,再执行ls,查看编译文件,如下
---------------------------------------------------------------------------------------------------------------------------------
7.常见问题
7.1 3000错误
源码拉取并没有太大问题,一般依赖下载不完整就会再编译过程当中出现Warnning,提示什么包没有安装完整,注意本文第4.4节的编译工具链,继续编译后,就大概率出现3000的错误,出现错误后,下载相关依赖,然后在源码根目录下手动清除out文件夹,再次执行编译命令即可
rm -rf out
7.2 4000错误
通过查看ninjia.py这个源文件,可以发现这里的catch语句其实是捕获了很多的异常,就是无法具体定位是什么异常,4000是个笼统的错误。但是,我们发现4000出现的主要原因在于电脑的内存不够用。
7.3 Samba服务
方便使用VSCode编写代码,我们在这里为了简化下载和编译流程,省略安装Samba服务,可以在编译成功后再安装