為什麼選擇 Podman 而非 Docker?
雖然 Docker 是容器化工作流程的標準,並且與 CI/CD 平台(例如 GitHub Actions、GitLab CI、Jenkins)整合得更緊密,但 Podman 在本地 AOSP 編譯環境中具備以下優勢:
- 預設無需 root 權限:對個人開發者來說更安全也更簡單,不需要守護程序或 sudo
- 正確的檔案擁有權:容器內建立的檔案在主機上會保留正確的使用者擁有權
- 較少的權限問題:避免 Docker 常見的掛載權限與 UID 不一致問題
- 無需守護程序:容器以使用者程序獨立執行(不需要 dockerd),更容易在本地除錯
Podman 特別適合本地開發環境,當你重視簡潔性、檔案權限一致性與隔離性多於 CI 相容性時,它是更好的選擇。若你專注於有效率地作為開發者編譯 AOSP,Podman 是個理想工具。
- 安裝 Podman
sudo apt update
sudo apt install -y podman
- 建立簡易的 AOSP 編譯容器映像檔
- 在
~/aosp-builder
目錄中建立 Dockerfile:
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=C.UTF-8
ENV USE_CCACHE=1
ENV CCACHE_DIR=/ccache
ENV CCACHE_EXEC=/usr/local/bin/ccache
RUN apt-get update && apt-get install -y --no-install-recommends \
git-core \
gnupg \
flex \
bison \
build-essential \
zip \
curl \
zlib1g-dev \
libc6-dev-i386 \
x11proto-core-dev \
libx11-dev \
lib32z1-dev \
libgl1-mesa-dev \
libxml2-utils \
xsltproc \
unzip \
fontconfig \
rsync \
openssl \
&& apt-get clean
COPY ccache /usr/local/bin/ccache
WORKDIR /workspace
- 建立映像檔:
cd ~/aosp-builder
podman build -t aosp-builder -f .
- 準備 AOSP 原始碼(在主機上)
如果你已經同步完成:
cd ~/aosp-src
如果尚未同步,請執行:
repo init -u https://android.googlesource.com/platform/manifest -b android-15.0.0_r30
repo sync -c -j$(nproc)
- 啟動 AOSP 編譯容器
從 AOSP 原始碼資料夾執行 Podman:
cd ~/aosp-src
podman run -it --rm -v "$PWD":/workspace -v /home/administrator/.cache/ccache:/ccache aosp-builder bash
這會將本機的原始碼掛載到容器內的 /workspace
。
- 編譯 Android 15 AOSP(在容器內)
source build/envsetup.sh
lunch aosp_arm64-trunk_staging-userdebug
m
- 編譯完成
最終會看到類似的輸出:
[100% 169029/169029] touch out/soong/ndk_abi_diff.timestamp (priority: 0)
#### build completed successfully (04:39:53 (hh:mm:ss)) ####
- 驗證主機上的檔案擁有權
退出容器後,確認所有產出的檔案(例如 out 資料夾)仍由你目前使用者所擁有:
ls -ld out
範例:
drwxr-xr-x 14 administrator administrator 4096 May 7 04:10 out