Linux编译环境从零搭建—【万物智能之开源鸿蒙 OpenHarmony 系统实战开发系列教程】
桌面能进了。若只写应用,Windows 就够。今天搭 Ubuntu 编译机:改设备树、改驱动、自己打镜像,都从这里开始。



Windows 上把板子刷亮以后,手里那份镜像多半是别人编的。要改设备树、改内核,得自己编。
开源鸿蒙标准系统不是在 Windows 上 nmake 一下就出来的。用户态、内核、HDF、图形栈,整棵树几十 GB,构建系统是 GN + Ninja,预编译工具链是 Linux x86_64 的 clang。官方自己也写了:现阶段大部分开发板源码不支持在 Windows 下编译。对照文档就这篇:搭建 Ubuntu 环境。
官方那篇还想让你装 DevEco Device Tool,用 Windows 远程到 Ubuntu 上去点按钮。按钮可以点,下面不靠它。原因和刷机那篇一样:失败时你要能看见完整命令、完整日志、完整退出码。./build.sh 跑在 bash 里,日志能重定向,OOM 137 能看见,ninja 的 -w dupbuild=warn 能加上。IDE 把这些包起来之后,你多了一层不知道该不该重启的服务。
先让一台 Ubuntu 22.04 变成能拉源码、能下预编译包、能开始 ./build.sh 的机器。环境没夯实就全量,失败时你会把锅甩给源码。
1. 机器要什么样,少了哪一项会在哪一步爆
官方写的是 Ubuntu 18.04~22.04,推荐 22.04,内存 32 GB 及以上,硬盘 250 GB 及以上,用户名不含中文。我按真编过 RK3568 标准系统的机器给你加码。
| 项 | 最低能开机 | 建议 | 少了会怎样 |
|---|---|---|---|
| 系统 | Ubuntu 20.04 | **22.04** | 18.04 的包太老,python / java 要自己翻;24.04 某些预编译二进制会缺旧 so |
| CPU | 8 核 | 16 核以上 | 全量 30~40 分钟会变成 1.5 小时,倒不至于编不过 |
| 内存 | 16 GB | **32 GB + 16 GB swap** | 链 vmlinux、thinLTO 大 so 时 OOM,退出码 **137** |
| 磁盘 | 250 GB | **300 GB 以上 SSD** | 源码约 40 GB,prebuilts 约 17 GB,`out/` 一次全量 60~80 GB,叠起来轻松破 200 |
| 用户名 | 纯英文 | 纯英文,家目录也英文 | 中文用户名会在某些脚本的路径拼接里炸掉,报错不一定提到中文 |
| shell | bash | bash,且 `/bin/sh` → bash | 官方明确要求;dash 跑构建脚本会在数组、管道处阴死 |
16 GB 内存「能装 Ubuntu、能 repo sync」,不等于「能编完」。标准系统有 LTO。链接 vmlinux 那一下,clang 会吃掉十几 GB。物理内存不够,Linux 的 OOM killer 发 SIGKILL,ninja 只告诉你某个动作失败,退出码 137。137 = 128 + 9,就是被 SIGKILL。不是编译错误,是被系统开枪。你若在 16 GB 机器上硬编,先把 swap 加到 16 GB,并且关掉不必要的浏览器。更省心的办法是 32 GB。虚拟机里给内存时,别只给 8 GB 再开「动态分配」——动态分配在链接高峰来不及要页,一样 137。
磁盘我写成 300 GB 不是吓唬你。out/ 不能当临时目录用完就删来省空间,因为增量编译靠它。你若只有 256 GB 的盘,源码 + prebuilts + 一份 out 还能活,两份 out(比如你 rm -rf out 重建失败、旧的没删干净)就满了。满了的表现是 ninja 报 No space left on device,有时报在打 system.img 那种几 GB 的 ext 镜像时,看起来像镜像脚本的 bug。df -h 一眼能看出来,先养成编之前看一眼磁盘的习惯。
用户名中文这件事,官方写在 quickstart 里不是客套。构建树里有 python、有 bash、有 GN 的 rebase_path,任何一处按字节切路径碰到 UTF-8 用户名,都可能变成「找不到文件」。家目录放 /home/ohos 比 /home/张三 少很多玄学。已经建了中文用户,别改名改到一半,新建一个英文用户做编译,省事。
虚拟机还是实体机?都能编。虚拟机要注意三点:磁盘分配成 预分配 的单文件,不要弹性盘编到一半再扩(扩的过程能把正在写的 out 搞坏);共享目录用来丢镜像,不要把源码树直接放共享盘上编(hgfs 的锁和性能都不够);CPU 虚拟化打开,否则 16 核变成 16 个很慢的核。
2. /bin/sh 必须是 bash:官方写了,咱们也撞过
打开官方 Ubuntu 环境文档,第一条操作不是装软件,是确认 shell。
ls -l /bin/sh
你要看到:
/bin/sh -> bash
Ubuntu 默认 /bin/sh 是 dash。dash 是 POSIX 壳,启动快,所以 Debian 系拿它当 sh。开源鸿蒙的构建脚本按 bash 写:数组、source、[[ ]]、某些管道。在 dash 下这些不是立刻报语法错,就是在很深的某一步用到数组时挂,错误信息跟「你的 sh 是 dash」毫无字面关系。你会被带去改源码。
改法就是官方那条:
sudo dpkg-reconfigure dash
弹出问题:要不要把 dash 设成 /bin/sh 的默认。选 No。再 ls -l /bin/sh,应指向 bash。
有人会问:我的交互式 shell 已经是 bash 了(echo $SHELL 输出 /bin/bash),还要改吗?要。构建脚本用 #!/bin/sh 或通过 sh script.sh 调,走的是 /bin/sh 这个符号链接,不是你的登录壳。交互式 bash 救不了脚本里的 dash。
改完之后新开一个终端。已经开着的会话不一定受影响,但新进程会。改完要新开终端,后面 PATH 还有几次。
3. apt 依赖:一次装齐,别编到一半再 sudo
下面这组包是按真编 RK3568 标准系统攒的,比官方 Device Tool 那篇列的多。官方那篇重心在 IDE,不是命令行全量。缺哪个的症状我标在后面,你可以对照着装。
sudo apt update
sudo apt install -y \
git git-lfs python3 python3-pip python3-setuptools python3-dev \
build-essential gcc-multilib g++-multilib libc6-dev-i386 \
lib32stdc++6 lib32z1 \
flex bison bc libelf-dev libssl-dev libncurses5-dev \
libtinfo5 \
u-boot-tools dosfstools mtools genext2fs e2fsprogs liblz4-tool \
openjdk-11-jdk \
ninja-build cmake ccache \
zip unzip rsync curl wget pkg-config zlib1g-dev \
libxml2-utils xsltproc gawk m4 \
binutils-dev
为什么要 gcc-multilib 和 lib32stdc++6:预编译工具和部分打包二进制是 32 位的。64 位系统没有 32 位运行时,报 No such file or directory,即使文件就在那儿——这是动态链接器找不到的经典假象。file afptool 若显示 ELF 32-bit,缺 32 位 libc 就会这样。
为什么要 libtinfo5:这是第一面墙。不少预编译工具(旧 ncurses、部分打包器)链的是 libtinfo.so.5。Ubuntu 22.04 有 libtinfo5 包;更新的发行版可能已经从仓库拿掉。装不上就:
# 先看系统有没有 so.6
ls /lib/x86_64-linux-gnu/libtinfo.so.6
# 有 6 没 5 时,软链能应急
sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5
软链应急能让工具跑起来,不保证 ABI 完全兼容。优先装包。报错原文一般是:
error while loading shared libraries: libtinfo.so.5: cannot open shared object file
出现在 menuconfig、某些 u-boot 工具、偶尔在打包器上。别去重装整个 ncurses。
为什么要 openjdk-11-jdk:hap 签名工具是 Java 11 的 jar。系统里只有 17 或 21,签名可能怪。编译阶段不一定立刻用到,但同一台机器后面会签系统应用,现在装了省得混。java -version 应看到 11。若 update-alternatives 被 17 占了:
sudo update-alternatives --config java
选 11。
为什么要 ccache:后面 ./build.sh --ccache 会用它。没装也能编,只是第二次全量不会快。装上之后第一次仍然慢,cache 是空的。
genext2fs 用来打 boot_linux.img(ext2)。缺了它,内核编过了,打包 boot 分区时报命令找不到。u-boot-tools 提供 mkimage 一类。dosfstools / mtools 给某些 FAT 资源用。缺了都是打包阶段才爆,离你敲 build.sh 已经过了半小时,所以现在装。
git-lfs:源码树里有大文件走 LFS。没装的话 repo sync 看起来成功,某个 bin 其实是 130 字节的指针文本。后面链接或打包会报文件损坏。装完:
git lfs install
4. python 软链、pip、hb
构建脚本里又是 python 又是 python3。Ubuntu 22.04 默认没有 /usr/bin/python。不建软链,第一批脚本就会 python: command not found。
which python3
sudo ln -sf /usr/bin/python3 /usr/bin/python
python --version
应看到 Python 3.10.x(22.04 自带)。不要把 python 指到 python2,也不要指到自己编译的 3.12——预编译的 python 包和 hb 按发行版自带的 3.10 测的。
然后装 ohos-build。它提供 hb 命令,是 OpenHarmony 构建的一层包装。
pip3 install --user ohos-build
--user 装到 ~/.local/lib/python3.x/site-packages,命令在 ~/.local/bin/hb。这个目录默认不在 PATH 里。不加 PATH,你会觉得「pip 成功了但 hb 不存在」。
把下面两行写进 ~/.bashrc(zsh 用户写 ~/.zshrc,但构建本身要在 bash 里跑,别用 zsh 去 ./build.sh):
export PATH="$HOME/.local/bin:$HOME/.bin:$PATH"
~/.bin 是下一节放 repo 的地方。写完:
source ~/.bashrc
which hb
hb --help
能出帮助就行。hb set 会让你选产品,文中产品名是 rk3568_evb。也可以不 hb set,直接 ./build.sh --product-name rk3568_evb --ccache。
pip 装到用户目录,不要 sudo pip3。sudo 会装到系统的 python 里,和发行版包打架,下次 apt upgrade 可能把你覆盖掉。
网络不好时 pip 走官方 PyPI 会超时。换国内镜像:
pip3 install --user ohos-build -i https://pypi.tuna.tsinghua.edu.cn/simple
5. 装 repo,拉 OpenHarmony 4.1 源码
OpenHarmony 不是一个 git 仓库,是几百个 git 仓库的清单。repo 是 Google 那套多仓工具的 Python 实现。国内常用 Gitee 上改过的 repo-py3。
mkdir -p ~/.bin
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/.bin/repo
chmod +x ~/.bin/repo
# 上一节已经把 ~/.bin 放进 PATH 的话:
repo --version
repo 本质是一个 python 脚本,第一行 shebang 要能找到 python。所以第 4 节的软链得先做好。脚本下下来若是 HTML(公司网关返回登录页),repo --version 会语法错误。head -5 ~/.bin/repo 应看到 python 代码,不是 <html>。
建源码目录。路径全英文、不要空格、不要放共享盘:
mkdir -p ~/ohos
cd ~/ohos
初始化 4.1 Release 清单:
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-4.1-Release --no-repo-verify
-b OpenHarmony-4.1-Release 钉死分支。别 init 成 master 再自己想办法切,清单仓和子仓的提交要对上。--no-repo-verify 跳过 GPG,国内环境经常没那套公钥。
然后同步:
repo sync -c -j4 --no-tags --no-clone-bundle
-c 只拉当前分支,省空间。-j4 并发 4 个仓。网络稳可以 -j8;不稳反而越并越容易断。--no-tags 少拉标签。第一次 sync 要一段时间,几十 GB 的对象。断了再跑同一条 repo sync,它会续。不要删半截目录重来,除非清单本身 init 错了分支。
失败常见原因:
- 某个子仓 403 / 超时:过几分钟再
repo sync。Gitee 有频率限制。 git lfs没装:大文件是指针。装完 lfs 再 sync。- 磁盘满:
df -h。满了的 sync 会在随机一个仓报奇怪的 I/O 错。 - 公司 HTTPS 代理:需要
git config --global http.proxy和https.proxy。设了之后 repo 走 git 也会用。
sync 看起来结束后,抽查:
ls kernel/linux/linux-5.10
ls build/build.sh
ls build/prebuilts_download.sh
du -sh .
du 大概几十 GB。kernel/linux/linux-5.10 若是空目录或根本没有,清单没拉全,别往下走。
6. prebuilts:大约 17 GB 的编译器、SDK、二进制
源码树里的 clang、 rust、部分 Java 工具、 hap 签名相关,不在 git 里(太大)。build/prebuilts_download.sh 按清单去下。
cd ~/ohos
bash build/prebuilts_download.sh
这步大约 17 GB,时间看网速。失败了再跑,脚本多数能续。下完看:
ls prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang
ls prebuilts/build-tools
du -sh prebuilts
clang 必须是可执行文件。若是一个几十字节的文本,又是 LFS 或下载被 HTML 替换。file prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang 应看到 ELF 64-bit。
为什么必须先下 prebuilts 再 ./build.sh:GN 的工具链指向这些路径。没有 clang,配置阶段就会挂,错误在 prebuilts/.../clang not found。有人 repo sync 完直接 build,以为源码树自带编译器。标准系统不自带。
下载脚本会访问开源鸿蒙的预编译仓库。网络不行就多试,或在能访问的机器上下完把 prebuilts/ 整目录拷过来。拷的时候保持权限位,chmod +x 一下 clang。
7. 板级代码怎么进这棵树
repo sync 拉下来的是开源鸿蒙 4.1 和芯片公版 RK3568 支持。产品名写成 rk3568_evb,板级在:
device/board/rk/rk3568_evb/
vendor/rk/rk3568_evb/
公版树里可能已经有一份 device/board/rk/ 下的 dayu / evb 参考。你的板级是叠在上面的:设备树、init、fstab、loader、打包脚本、相机 VDI、音频。交付时通常是一份 overlay 加 apply.sh,在源码根执行:
bash apply.sh /home/you/ohos
脚本把 overlay 里的文件按相对路径覆盖进去,再校验一组关键文件在不在。幂等,跑两次结果一样。缺哪项它会喊,比你自己 cp -a 少漏。
没有 overlay、板级已经在 git 里,那这步跳过。有 overlay 却忘了 apply,第一次 ./build.sh --product-name rk3568_evb 会报产品不存在,或编出来的是公版 dayu 那套 fstab / DTS。编成功但板上对不上丝印,先问自己 apply 了没有。
apply 之后立刻看:
ls device/board/rk/rk3568_evb/kernel/build_kernel.sh
ls device/board/rk/rk3568_evb/cfg/fstab.rk30board
ls device/board/rk/rk3568_evb/loader/afptool
ls vendor/rk/rk3568_evb/hdf_config/khdf
这四个都在,板级骨架就位。afptool 不在开源鸿蒙源码里、build 也不生成,必须跟板级 loader 目录一起过来。缺了它,pack_update_img.sh 第一行就失败。新机、rm -rf out 都不会凭空造出这个二进制,所以它得在源码树里,不在 out 里。
8. 环境自检脚本,建议你跑一遍再去编
把下面存成 ~/ohos-env-check.sh,在源码根以外任何地方都能跑(改 OHOS_ROOT)。
#!/bin/bash
set -e
OHOS_ROOT="${OHOS_ROOT:-$HOME/ohos}"
echo "== shell =="
ls -l /bin/sh
[[ "$(readlink -f /bin/sh)" == *bash* ]] || { echo "FAIL: /bin/sh 不是 bash"; exit 1; }
echo "== python =="
python --version
python3 --version
echo "== java =="
java -version 2>&1 | head -1
echo "== hb / repo =="
which hb && hb --help >/dev/null
which repo && repo --version
echo "== 关键 apt 二进制 =="
for b in git git-lfs clang++ 2>/dev/null; do true; done
for b in flex bison bc gcc genext2fs mkimage ccache java ninja cmake; do
command -v $b >/dev/null || echo "WARN: $b 不在 PATH(clang 在 prebuilts 里,这里可以没有)"
done
command -v genext2fs >/dev/null || { echo "FAIL: genext2fs"; exit 1; }
command -v java >/dev/null || { echo "FAIL: java"; exit 1; }
echo "== libtinfo.so.5 =="
ldconfig -p | grep -q libtinfo.so.5 && echo "ok libtinfo.so.5" || echo "WARN: 没有 libtinfo.so.5,menuconfig / 部分工具可能炸"
echo "== 源码树 =="
[[ -d "$OHOS_ROOT/kernel/linux/linux-5.10" ]] || { echo "FAIL: 内核源码"; exit 1; }
[[ -x "$OHOS_ROOT/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang" ]] || { echo "FAIL: prebuilts clang"; exit 1; }
[[ -f "$OHOS_ROOT/device/board/rk/rk3568_evb/kernel/build_kernel.sh" ]] || echo "WARN: 板级尚未 apply"
echo "== 磁盘 / 内存 =="
df -h "$OHOS_ROOT"
free -h
echo "== PASS 基本项 =="
chmod +x ~/ohos-env-check.sh
OHOS_ROOT=~/ohos ~/ohos-env-check.sh
WARN 可以先记着。FAIL 不要去跑 build.sh。磁盘和内存只是打印,你自己看:可用磁盘小于 80 GB 时,一次全量很危险;内存加 swap 小于 24 GB 时,做好 137 的心理准备。
9. 干净树上第一次全量会撞的墙(先认识,编的时候才动手改)
环境搭好不等于 ./build.sh 一次过。干净 Ubuntu 上,板级叠进去之后,我们连撞过这些。打包那篇会在失败现场再写操作。这里先知道「报这个错不是环境没装完」。
9.1 白名单:depend part c_utils, need set part deps info
相机 host VDI 那一组 GN 依赖,构建系统会做 parts 依赖检查。板级产品名不在 build/compile_standard_whitelist.json 里,配置阶段直接失败。修法是把板级那几条加进白名单(对照公版 hihope 的写法),然后:
rm -rf out/preloader
preloader 每次普通 ./build.sh(没有 --fast-rebuild)会重新生成。拷了白名单还报,多半是 out 里旧副本,或文件被 repo sync 盖回去了。md5 对一下白名单,确认是你改过的那份。
这不是缺 apt,是缺产品登记。环境章把它列出来,免得你回头重装 Ubuntu。
9.2 Lume 缺 khrplatform.h
图形 3D 的 Lume 着色器编译器编到 spirv_cross_helpers_gles.cpp,间接 include <KHR/khrplatform.h>。编译命令给的 -I 指向 third_party/openGLES/api/GL,于是它找:
third_party/openGLES/api/GL/KHR/khrplatform.h
干净树里这个文件经常没有。同仓库 third_party/EGL/api/KHR/khrplatform.h 是有的,Khronos 同一份头。
mkdir -p third_party/openGLES/api/GL/KHR
mkdir -p third_party/openGLES/api/KHR
cp third_party/EGL/api/KHR/khrplatform.h third_party/openGLES/api/GL/KHR/
cp third_party/EGL/api/KHR/khrplatform.h third_party/openGLES/api/KHR/
overlay 一般不打包这份(它属于 third_party 原树缺失),所以 apply.sh 过后仍要你手做一次。做过就稳,跟环境安装是同一天的事,建议现在做。
9.3 cdc_ncm.c:no member named 'rx_speed'
5G 网卡走 CDC NCM 时会编到内核的 drivers/net/usb/cdc_ncm.c。开源鸿蒙的内核补丁从 struct usbnet 里删了 rx_speed / tx_speed 两个字段,公版 cdc_ncm.c 还在访问它们。报错:
error: no member named 'rx_speed' in 'struct usbnet'
板级 overlay 应带一份改过的 cdc_ncm.c:用局部变量接 le32_to_cpu,自己做去重,不依赖结构体成员。apply 时覆盖到 kernel/linux/linux-5.10/drivers/net/usb/cdc_ncm.c。没覆盖,内核编到 USB 网卡就停。这不是 5G 模块没插的问题,是编译期。
9.4 退出码 137
前面说过。再给一个判断口诀:日志最后不是 error: 某个 .c 的语法错,而是 Killed、ninja: build stopped,echo $? 是 137。看 dmesg | grep -i oom 或 sudo journalctl -k | grep -i oom。有 Out of memory: Killed process ... ld.lld 或 clang,就是它。加 swap:
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
加完不必重装系统。正在跑的 build 已经被杀了,重新 ./build.sh --ccache,ccache 和已经编完的 .o 还在。
9.5 ninja dupbuild
开源鸿蒙的 GN 有时会让两个 target 写同一个输出。ninja 默认当错误。构建命令里加:
-w dupbuild=warn
板级 build.sh 包装或你自己的 ninja 调用要带上。不带,错误信息是 duplicate output,看起来像两个模块抢文件,其实公版就这样,warn 掉才能过。实际编译命令里要带上。
10. 和官方文档的差异,避免你对照着点错
官方 quickstart-ide-env-ubuntu.md 的步骤是:改 dash → 下 Device Tool 的 zip → sudo ./devicetool-linux-tool-xxx.sh → 图形界面远程。下面停在「改 dash」,后面走命令行。
官方还提到 Docker 镜像:
22.04:docker pull swr.cn-north-4.myhuaweicloud.com/ci-service/openharmony-standard-build-env-22.04:4.0.0
CI 用这个很合适。咱们要改设备树、改内核、进 out/kernel/src_tmp 手编 dtb,Docker 里挂源码、挂 USB、挂串口,每一次都比实体 Ubuntu 或多核虚拟机别扭。要可重复交付再考虑把这台虚拟机打快照,而不是一上来 Docker。
官方内存写 32 GB、磁盘 250 GB。磁盘我建议 300 GB,因为 out/ 比他们写 quickstart 时更肥。其余一致:用户名无中文、shell 必须 bash。
Device Tool 想装也可以,跟命令行并存。别让 IDE 的构建按钮和你在终端里的 ./build.sh 同时写一个 out/。GN 不喜欢两个 ninja 抢同一份 ninja_log。
11. 日常使用这台编译机的几个规矩
用 bash 跑构建。 ./build.sh 在 zsh/fish 里可能能进,脚本内部再调 bash 也行,但环境变量、数组、source build/envsetup 一类在 zsh 下偶发怪。登录壳用 bash,少一层翻译。
不要用 root 编。 源码树属主应是你的普通用户。root 编出来的 out/ 以后你改不了,hap 签名、打包脚本混在一起更乱。必须 sudo 的只有 apt、dpkg-reconfigure、swap、软链。
源码不要放 /mnt/hgfs。 共享盘给产物:sd_image.img、boot_linux.img、md5、hap。源码在虚拟机虚拟磁盘上。hgfs 的 I/O 和文件锁,撑不住 ninja -j16。
给 out/ 留在 SSD。 编完不要为了「干净」就删 out,除非你知道自己在强制重建内核(第 12、15 章)。删 out 等于下次全量 40 分钟。
ccache 目录默认在 ~/.ccache。 也可以 export CCACHE_DIR=/data/ccache 放到大盘。第一次全量之后 ccache -s 看命中率。命中率低不一定是坏事,LTO 和部分动作不走 ccache。
时间同步。 虚拟机时间若跳,ninja 会觉得文件「来自未来」,该重编的不编、不该重编的狂编。装 chrony 或至少开机对一下时。
踩过的坑
/bin/sh 仍是 dash。 echo $SHELL 是 bash 骗了你。看 ls -l /bin/sh。构建错误在很深的脚本,不像 shell 问题。
中文用户名 / 中文路径。 报错找不到文件,路径打印出来是乱码或被截断。新建英文用户。
16 GB 无 swap,137。 不是代码错。dmesg 搜 oom。加 16 GB swap 或加内存。
pip 装了 hb,新终端没有。 ~/.local/bin 不在 PATH。写进 bashrc,新开终端。
repo 脚本其实是 HTML。 网关劫持。head 看内容。
git-lfs 没装。 bin 文件 130 字节。file 看 clang 是不是 ELF。
prebuilts 没下完就 build。 clang not found。
源码在共享盘上编。 慢、偶发 stale file、锁错误。
两个 ninja 同时写 out。 IDE 和终端,或两个终端。ninja_log 损坏后行为随机。
libtinfo.so.5。 装 libtinfo5 或软链 so.6。
apply.sh 没跑。 产品名 rk3568_evb 不存在,或编出公版配置。
白名单 / khrplatform / cdc_ncm。 不是环境缺包,是树和产品登记。上文那几面墙。
Java 17 当默认。 编译可能过,签 hap 时才爆。现在切 11。
Ubuntu 24.04。 旧 so、旧 python 包、libtinfo5 仓库没有。能打工但要自己补依赖。22.04 少麻烦。
自检脚本全绿之后再跑全量。第一次全量还会撞白名单、khrplatform.h、cdc_ncm.c 的 rx_speed、OOM 137,那些不是「环境没搭完」,别重装系统。
官方 Device Tool 路径可以并存,不要和终端里的 ./build.sh 同时写一个 out/。
系列第 6 篇 · 芯片:瑞芯微 RK3568 · OpenHarmony 4.1(API 11) · Linux 5.10
更多推荐



所有评论(0)