境從零搭建—【萬物智能之開源鴻蒙 OpenHarmony 系統(tǒng)實戰(zhàn)開發(fā)系列教程】)
桌面能進(jìn)了。若只寫應(yīng)用Windows 就夠。今天搭 Ubuntu 編譯機改設(shè)備樹、改驅(qū)動、自己打鏡像都從這里開始。Windows 上把板子刷亮以后手里那份鏡像多半是別人編的。要改設(shè)備樹、改內(nèi)核得自己編。開源鴻蒙標(biāo)準(zhǔn)系統(tǒng)不是在 Windows 上nmake一下就出來的。用戶態(tài)、內(nèi)核、HDF、圖形棧整棵樹幾十 GB構(gòu)建系統(tǒng)是 GN Ninja預(yù)編譯工具鏈?zhǔn)?Linux x86_64 的 clang。官方自己也寫了現(xiàn)階段大部分開發(fā)板源碼不支持在 Windows 下編譯。對照文檔就這篇搭建 Ubuntu 環(huán)境。官方那篇還想讓你裝 DevEco Device Tool用 Windows 遠(yuǎn)程到 Ubuntu 上去點按鈕。按鈕可以點下面不靠它。原因和刷機那篇一樣失敗時你要能看見完整命令、完整日志、完整退出碼。./build.sh跑在 bash 里日志能重定向OOM 137 能看見ninja 的-w dupbuildwarn能加上。IDE 把這些包起來之后你多了一層不知道該不該重啟的服務(wù)。先讓一臺 Ubuntu 22.04 變成能拉源碼、能下預(yù)編譯包、能開始./build.sh的機器。環(huán)境沒夯實就全量失敗時你會把鍋甩給源碼。1. 機器要什么樣少了哪一項會在哪一步爆官方寫的是 Ubuntu 18.0422.04推薦 22.04內(nèi)存 32 GB 及以上硬盤 250 GB 及以上用戶名不含中文。我按真編過 RK3568 標(biāo)準(zhǔn)系統(tǒng)的機器給你加碼。項最低能開機建議少了會怎樣系統(tǒng)Ubuntu 20.04**22.04**18.04 的包太老python / java 要自己翻24.04 某些預(yù)編譯二進(jìn)制會缺舊 soCPU8 核16 核以上全量 3040 分鐘會變成 1.5 小時倒不至于編不過內(nèi)存16 GB**32 GB 16 GB swap**鏈 vmlinux、thinLTO 大 so 時 OOM退出碼 **137**磁盤250 GB**300 GB 以上 SSD**源碼約 40 GBprebuilts 約 17 GBout/ 一次全量 6080 GB疊起來輕松破 200用戶名純英文純英文家目錄也英文中文用戶名會在某些腳本的路徑拼接里炸掉報錯不一定提到中文shellbashbash且 /bin/sh → bash官方明確要求dash 跑構(gòu)建腳本會在數(shù)組、管道處陰死16 GB 內(nèi)存「能裝 Ubuntu、能 repo sync」不等于「能編完」。標(biāo)準(zhǔn)系統(tǒng)有 LTO。鏈接vmlinux那一下clang 會吃掉十幾 GB。物理內(nèi)存不夠Linux 的 OOM killer 發(fā) SIGKILLninja 只告訴你某個動作失敗退出碼 137。137 128 9就是被 SIGKILL。不是編譯錯誤是被系統(tǒng)開槍。你若在 16 GB 機器上硬編先把 swap 加到 16 GB并且關(guān)掉不必要的瀏覽器。更省心的辦法是 32 GB。虛擬機里給內(nèi)存時別只給 8 GB 再開「動態(tài)分配」——動態(tài)分配在鏈接高峰來不及要頁一樣 137。磁盤我寫成 300 GB 不是嚇唬你。out/不能當(dāng)臨時目錄用完就刪來省空間因為增量編譯靠它。你若只有 256 GB 的盤源碼 prebuilts 一份 out 還能活兩份 out比如你rm -rf out重建失敗、舊的沒刪干凈就滿了。滿了的表現(xiàn)是 ninja 報No space left on device有時報在打system.img那種幾 GB 的 ext 鏡像時看起來像鏡像腳本的 bug。df -h一眼能看出來先養(yǎng)成編之前看一眼磁盤的習(xí)慣。用戶名中文這件事官方寫在 quickstart 里不是客套。構(gòu)建樹里有 python、有 bash、有 GN 的rebase_path任何一處按字節(jié)切路徑碰到 UTF-8 用戶名都可能變成「找不到文件」。家目錄放/home/ohos比/home/張三少很多玄學(xué)。已經(jīng)建了中文用戶別改名改到一半新建一個英文用戶做編譯省事。虛擬機還是實體機都能編。虛擬機要注意三點磁盤分配成預(yù)分配的單文件不要彈性盤編到一半再擴擴的過程能把正在寫的 out 搞壞共享目錄用來丟鏡像不要把源碼樹直接放共享盤上編hgfs 的鎖和性能都不夠CPU 虛擬化打開否則 16 核變成 16 個很慢的核。2./bin/sh必須是 bash官方寫了咱們也撞過打開官方 Ubuntu 環(huán)境文檔第一條操作不是裝軟件是確認(rèn) shell。ls -l /bin/sh你要看到/bin/sh - bashUbuntu 默認(rèn)/bin/sh是dash。dash 是 POSIX 殼啟動快所以 Debian 系拿它當(dāng)sh。開源鴻蒙的構(gòu)建腳本按 bash 寫數(shù)組、source、[[ ]]、某些管道。在 dash 下這些不是立刻報語法錯就是在很深的某一步用到數(shù)組時掛錯誤信息跟「你的 sh 是 dash」毫無字面關(guān)系。你會被帶去改源碼。改法就是官方那條sudo dpkg-reconfigure dash彈出問題要不要把 dash 設(shè)成/bin/sh的默認(rèn)。選No。再ls -l /bin/sh應(yīng)指向 bash。有人會問我的交互式 shell 已經(jīng)是 bash 了echo $SHELL輸出/bin/bash還要改嗎要。構(gòu)建腳本用#!/bin/sh或通過sh script.sh調(diào)走的是/bin/sh這個符號鏈接不是你的登錄殼。交互式 bash 救不了腳本里的 dash。改完之后新開一個終端。已經(jīng)開著的會話不一定受影響但新進(jìn)程會。改完要新開終端后面 PATH 還有幾次。3. apt 依賴一次裝齊別編到一半再 sudo下面這組包是按真編 RK3568 標(biāo)準(zhǔn)系統(tǒng)攢的比官方 Device Tool 那篇列的多。官方那篇重心在 IDE不是命令行全量。缺哪個的癥狀我標(biāo)在后面你可以對照著裝。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 \ lib32stdc6 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和lib32stdc6預(yù)編譯工具和部分打包二進(jìn)制是 32 位的。64 位系統(tǒng)沒有 32 位運行時報No such file or directory即使文件就在那兒——這是動態(tài)鏈接器找不到的經(jīng)典假象。file afptool若顯示ELF 32-bit缺 32 位 libc 就會這樣。為什么要libtinfo5這是第一面墻。不少預(yù)編譯工具舊 ncurses、部分打包器鏈的是libtinfo.so.5。Ubuntu 22.04 有l(wèi)ibtinfo5包更新的發(fā)行版可能已經(jīng)從倉庫拿掉。裝不上就# 先看系統(tǒng)有沒有 so.6 ls /lib/x86_64-linux-gnu/libtinfo.so.6 # 有 6 沒 5 時軟鏈能應(yīng)急 sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5軟鏈應(yīng)急能讓工具跑起來不保證 ABI 完全兼容。優(yōu)先裝包。報錯原文一般是error while loading shared libraries: libtinfo.so.5: cannot open shared object file出現(xiàn)在menuconfig、某些 u-boot 工具、偶爾在打包器上。別去重裝整個 ncurses。為什么要openjdk-11-jdkhap 簽名工具是 Java 11 的 jar。系統(tǒng)里只有 17 或 21簽名可能怪。編譯階段不一定立刻用到但同一臺機器后面會簽系統(tǒng)應(yīng)用現(xiàn)在裝了省得混。java -version應(yīng)看到 11。若update-alternatives被 17 占了sudo update-alternatives --config java選 11。為什么要ccache后面./build.sh --ccache會用它。沒裝也能編只是第二次全量不會快。裝上之后第一次仍然慢cache 是空的。genext2fs用來打boot_linux.imgext2。缺了它內(nèi)核編過了打包 boot 分區(qū)時報命令找不到。u-boot-tools提供mkimage一類。dosfstools/mtools給某些 FAT 資源用。缺了都是打包階段才爆離你敲 build.sh 已經(jīng)過了半小時所以現(xiàn)在裝。git-lfs源碼樹里有大文件走 LFS。沒裝的話repo sync看起來成功某個 bin 其實是 130 字節(jié)的指針文本。后面鏈接或打包會報文件損壞。裝完git lfs install4. python 軟鏈、pip、hb構(gòu)建腳本里又是python又是python3。Ubuntu 22.04 默認(rèn)沒有/usr/bin/python。不建軟鏈第一批腳本就會python: command not found。which python3 sudo ln -sf /usr/bin/python3 /usr/bin/python python --version應(yīng)看到 Python 3.10.x22.04 自帶。不要把 python 指到 python2也不要指到自己編譯的 3.12——預(yù)編譯的 python 包和 hb 按發(fā)行版自帶的 3.10 測的。然后裝ohos-build。它提供hb命令是 OpenHarmony 構(gòu)建的一層包裝。pip3 install --user ohos-build--user裝到~/.local/lib/python3.x/site-packages命令在~/.local/bin/hb。這個目錄默認(rèn)不在 PATH 里。不加 PATH你會覺得「pip 成功了但 hb 不存在」。把下面兩行寫進(jìn)~/.bashrczsh 用戶寫~/.zshrc但構(gòu)建本身要在 bash 里跑別用 zsh 去./build.shexport PATH$HOME/.local/bin:$HOME/.bin:$PATH~/.bin是下一節(jié)放repo的地方。寫完source ~/.bashrc which hb hb --help能出幫助就行。hb set會讓你選產(chǎn)品文中產(chǎn)品名是rk3568_evb。也可以不 hb set直接./build.sh --product-name rk3568_evb --ccache。pip 裝到用戶目錄不要sudo pip3。sudo 會裝到系統(tǒng)的 python 里和發(fā)行版包打架下次apt upgrade可能把你覆蓋掉。網(wǎng)絡(luò)不好時 pip 走官方 PyPI 會超時。換國內(nèi)鏡像pip3 install --user ohos-build -i https://pypi.tuna.tsinghua.edu.cn/simple5. 裝 repo拉 OpenHarmony 4.1 源碼OpenHarmony 不是一個 git 倉庫是幾百個 git 倉庫的清單。repo是 Google 那套多倉工具的 Python 實現(xiàn)。國內(nèi)常用 Gitee 上改過的repo-py3。mkdir -p ~/.bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/.bin/repo chmod x ~/.bin/repo # 上一節(jié)已經(jīng)把 ~/.bin 放進(jìn) PATH 的話 repo --versionrepo本質(zhì)是一個 python 腳本第一行 shebang 要能找到 python。所以第 4 節(jié)的軟鏈得先做好。腳本下下來若是 HTML公司網(wǎng)關(guān)返回登錄頁repo --version會語法錯誤。head -5 ~/.bin/repo應(yīng)看到 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國內(nèi)環(huán)境經(jīng)常沒那套公鑰。然后同步repo sync -c -j4 --no-tags --no-clone-bundle-c只拉當(dāng)前分支省空間。-j4并發(fā) 4 個倉。網(wǎng)絡(luò)穩(wěn)可以-j8不穩(wěn)反而越并越容易斷。--no-tags少拉標(biāo)簽。第一次 sync 要一段時間幾十 GB 的對象。斷了再跑同一條repo sync它會續(xù)。不要刪半截目錄重來除非清單本身 init 錯了分支。失敗常見原因某個子倉 403 / 超時過幾分鐘再repo sync。Gitee 有頻率限制。git lfs沒裝大文件是指針。裝完 lfs 再 sync。磁盤滿df -h。滿了的 sync 會在隨機一個倉報奇怪的 I/O 錯。公司 HTTPS 代理需要git config --global http.proxy和https.proxy。設(shè)了之后 repo 走 git 也會用。sync 看起來結(jié)束后抽查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、二進(jìn)制源碼樹里的 clang、 rust、部分 Java 工具、 hap 簽名相關(guān)不在 git 里太大。build/prebuilts_download.sh按清單去下。cd ~/ohos bash build/prebuilts_download.sh這步大約 17 GB時間看網(wǎng)速。失敗了再跑腳本多數(shù)能續(xù)。下完看ls prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang ls prebuilts/build-tools du -sh prebuiltsclang必須是可執(zhí)行文件。若是一個幾十字節(jié)的文本又是 LFS 或下載被 HTML 替換。file prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang應(yīng)看到 ELF 64-bit。為什么必須先下 prebuilts 再./build.shGN 的工具鏈指向這些路徑。沒有 clang配置階段就會掛錯誤在prebuilts/.../clangnot found。有人 repo sync 完直接 build以為源碼樹自帶編譯器。標(biāo)準(zhǔn)系統(tǒng)不自帶。下載腳本會訪問開源鴻蒙的預(yù)編譯倉庫。網(wǎng)絡(luò)不行就多試或在能訪問的機器上下完把prebuilts/整目錄拷過來??降臅r候保持權(quán)限位chmod x一下 clang。7. 板級代碼怎么進(jìn)這棵樹repo sync拉下來的是開源鴻蒙 4.1 和芯片公版 RK3568 支持。產(chǎn)品名寫成rk3568_evb板級在device/board/rk/rk3568_evb/ vendor/rk/rk3568_evb/公版樹里可能已經(jīng)有一份device/board/rk/下的 dayu / evb 參考。你的板級是疊在上面的設(shè)備樹、init、fstab、loader、打包腳本、相機 VDI、音頻。交付時通常是一份 overlay 加apply.sh在源碼根執(zhí)行bash apply.sh /home/you/ohos腳本把 overlay 里的文件按相對路徑覆蓋進(jìn)去再校驗一組關(guān)鍵文件在不在。冪等跑兩次結(jié)果一樣。缺哪項它會喊比你自己cp -a少漏。沒有 overlay、板級已經(jīng)在 git 里那這步跳過。有 overlay 卻忘了 apply第一次./build.sh --product-name rk3568_evb會報產(chǎn)品不存在或編出來的是公版 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都不會憑空造出這個二進(jìn)制所以它得在源碼樹里不在 out 里。8. 環(huán)境自檢腳本建議你跑一遍再去編把下面存成~/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 21 | head -1 echo hb / repo which hb hb --help /dev/null which repo repo --version echo 關(guān)鍵 apt 二進(jìn)制 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 不在 PATHclang 在 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.5menuconfig / 部分工具可能炸 echo 源碼樹 [[ -d $OHOS_ROOT/kernel/linux/linux-5.10 ]] || { echo FAIL: 內(nèi)核源碼; 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 磁盤 / 內(nèi)存 df -h $OHOS_ROOT free -h echo PASS 基本項 chmod x ~/ohos-env-check.sh OHOS_ROOT~/ohos ~/ohos-env-check.shWARN 可以先記著。FAIL 不要去跑build.sh。磁盤和內(nèi)存只是打印你自己看可用磁盤小于 80 GB 時一次全量很危險內(nèi)存加 swap 小于 24 GB 時做好 137 的心理準(zhǔn)備。9. 干凈樹上第一次全量會撞的墻先認(rèn)識編的時候才動手改環(huán)境搭好不等于./build.sh一次過。干凈 Ubuntu 上板級疊進(jìn)去之后我們連撞過這些。打包那篇會在失敗現(xiàn)場再寫操作。這里先知道「報這個錯不是環(huán)境沒裝完」。9.1 白名單depend part c_utils, need set part deps info相機 host VDI 那一組 GN 依賴構(gòu)建系統(tǒng)會做 parts 依賴檢查。板級產(chǎn)品名不在build/compile_standard_whitelist.json里配置階段直接失敗。修法是把板級那幾條加進(jìn)白名單對照公版 hihope 的寫法然后rm -rf out/preloaderpreloader 每次普通./build.sh沒有--fast-rebuild會重新生成。拷了白名單還報多半是 out 里舊副本或文件被 repo sync 蓋回去了。md5 對一下白名單確認(rèn)是你改過的那份。這不是缺 apt是缺產(chǎn)品登記。環(huán)境章把它列出來免得你回頭重裝 Ubuntu。9.2 Lume 缺khrplatform.h圖形 3D 的 Lume 著色器編譯器編到spirv_cross_helpers_gles.cpp間接 includeKHR/khrplatform.h。編譯命令給的-I指向third_party/openGLES/api/GL于是它找third_party/openGLES/api/GL/KHR/khrplatform.h干凈樹里這個文件經(jīng)常沒有。同倉庫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 過后仍要你手做一次。做過就穩(wěn)跟環(huán)境安裝是同一天的事建議現(xiàn)在做。9.3cdc_ncm.cno member named rx_speed5G 網(wǎng)卡走 CDC NCM 時會編到內(nèi)核的drivers/net/usb/cdc_ncm.c。開源鴻蒙的內(nèi)核補丁從struct usbnet里刪了rx_speed/tx_speed兩個字段公版cdc_ncm.c還在訪問它們。報錯error: no member named rx_speed in struct usbnet板級 overlay 應(yīng)帶一份改過的cdc_ncm.c用局部變量接le32_to_cpu自己做去重不依賴結(jié)構(gòu)體成員。apply 時覆蓋到kernel/linux/linux-5.10/drivers/net/usb/cdc_ncm.c。沒覆蓋內(nèi)核編到 USB 網(wǎng)卡就停。這不是 5G 模塊沒插的問題是編譯期。9.4 退出碼 137前面說過。再給一個判斷口訣日志最后不是error:某個.c的語法錯而是Killed、ninja: build stoppedecho $?是 137??磀mesg | grep -i oom或sudo journalctl -k | grep -i oom。有Out of memory: Killed process ... ld.lld或clang就是它。加 swapsudo 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加完不必重裝系統(tǒng)。正在跑的 build 已經(jīng)被殺了重新./build.sh --ccacheccache 和已經(jīng)編完的 .o 還在。9.5 ninjadupbuild開源鴻蒙的 GN 有時會讓兩個 target 寫同一個輸出。ninja 默認(rèn)當(dāng)錯誤。構(gòu)建命令里加-w dupbuildwarn板級build.sh包裝或你自己的 ninja 調(diào)用要帶上。不帶錯誤信息是 duplicate output看起來像兩個模塊搶文件其實公版就這樣warn 掉才能過。實際編譯命令里要帶上。10. 和官方文檔的差異避免你對照著點錯官方quickstart-ide-env-ubuntu.md的步驟是改 dash → 下 Device Tool 的 zip →sudo ./devicetool-linux-tool-xxx.sh→ 圖形界面遠(yuǎn)程。下面停在「改 dash」后面走命令行。官方還提到 Docker 鏡像22.04docker pull swr.cn-north-4.myhuaweicloud.com/ci-service/openharmony-standard-build-env-22.04:4.0.0CI 用這個很合適。咱們要改設(shè)備樹、改內(nèi)核、進(jìn)out/kernel/src_tmp手編 dtbDocker 里掛源碼、掛 USB、掛串口每一次都比實體 Ubuntu 或多核虛擬機別扭。要可重復(fù)交付再考慮把這臺虛擬機打快照而不是一上來 Docker。官方內(nèi)存寫 32 GB、磁盤 250 GB。磁盤我建議 300 GB因為out/比他們寫 quickstart 時更肥。其余一致用戶名無中文、shell 必須 bash。Device Tool 想裝也可以跟命令行并存。別讓 IDE 的構(gòu)建按鈕和你在終端里的./build.sh同時寫一個out/。GN 不喜歡兩個 ninja 搶同一份 ninja_log。11. 日常使用這臺編譯機的幾個規(guī)矩用 bash 跑構(gòu)建。./build.sh在 zsh/fish 里可能能進(jìn)腳本內(nèi)部再調(diào) bash 也行但環(huán)境變量、數(shù)組、source build/envsetup一類在 zsh 下偶發(fā)怪。登錄殼用 bash少一層翻譯。不要用 root 編。源碼樹屬主應(yīng)是你的普通用戶。root 編出來的out/以后你改不了hap 簽名、打包腳本混在一起更亂。必須 sudo 的只有 apt、dpkg-reconfigure、swap、軟鏈。源碼不要放/mnt/hgfs。共享盤給產(chǎn)物sd_image.img、boot_linux.img、md5、hap。源碼在虛擬機虛擬磁盤上。hgfs 的 I/O 和文件鎖撐不住 ninja -j16。給out/留在 SSD。編完不要為了「干凈」就刪 out除非你知道自己在強制重建內(nèi)核第 12、15 章。刪 out 等于下次全量 40 分鐘。ccache 目錄默認(rèn)在~/.ccache。也可以export CCACHE_DIR/data/ccache放到大盤。第一次全量之后ccache -s看命中率。命中率低不一定是壞事LTO 和部分動作不走 ccache。時間同步。虛擬機時間若跳ninja 會覺得文件「來自未來」該重編的不編、不該重編的狂編。裝chrony或至少開機對一下時。踩過的坑/bin/sh仍是 dash。echo $SHELL是 bash 騙了你??磍s -l /bin/sh。構(gòu)建錯誤在很深的腳本不像 shell 問題。中文用戶名 / 中文路徑。報錯找不到文件路徑打印出來是亂碼或被截斷。新建英文用戶。16 GB 無 swap137。不是代碼錯。dmesg搜 oom。加 16 GB swap 或加內(nèi)存。pip 裝了 hb新終端沒有。~/.local/bin不在 PATH。寫進(jìn) bashrc新開終端。repo 腳本其實是 HTML。網(wǎng)關(guān)劫持。head看內(nèi)容。git-lfs 沒裝。bin 文件 130 字節(jié)。file看 clang 是不是 ELF。prebuilts 沒下完就 build。clang not found。源碼在共享盤上編。慢、偶發(fā) stale file、鎖錯誤。兩個 ninja 同時寫 out。IDE 和終端或兩個終端。ninja_log損壞后行為隨機。libtinfo.so.5。裝libtinfo5或軟鏈 so.6。apply.sh 沒跑。產(chǎn)品名 rk3568_evb 不存在或編出公版配置。白名單 / khrplatform / cdc_ncm。不是環(huán)境缺包是樹和產(chǎn)品登記。上文那幾面墻。Java 17 當(dāng)默認(rèn)。編譯可能過簽 hap 時才爆?,F(xiàn)在切 11。Ubuntu 24.04。舊 so、舊 python 包、libtinfo5 倉庫沒有。能打工但要自己補依賴。22.04 少麻煩。自檢腳本全綠之后再跑全量。第一次全量還會撞白名單、khrplatform.h、cdc_ncm.c的rx_speed、OOM 137那些不是「環(huán)境沒搭完」別重裝系統(tǒng)。官方 Device Tool 路徑可以并存不要和終端里的./build.sh同時寫一個out/。系列第 6 篇 · 芯片瑞芯微 RK3568 · OpenHarmony 4.1API 11 · Linux 5.10