为什么选择 Podman 而不是 Docker?
尽管 Docker 是容器工作流的标准,并且与 CI/CD 平台(如 GitHub Actions、GitLab CI、Jenkins)集成更紧密,但 Podman 在本地 AOSP 构建中有以下优势:
- 默认无须 root:对开发者来说更安全、操作更简单,不需要 daemon 或 sudo
- 文件权限正确:容器中创建的文件保留主机用户的权限
- 权限问题更少:避免 Docker 常见的挂载权限和 UID 不匹配的问题
- 无守护进程:容器以用户进程运行(无需 dockerd),本地调试更方便
Podman 更适合本地开发环境。如果你专注于高效编译 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