1.构建

运行以下命令构建,只用运行一次镜像构建,如果修改了 dockerfile 才重新再运行:

1
docker_build.sh

docker_build.sh:

1
2
3
4
5
6
7
#!/bin/bash
set -e # 任何一步失败立即退出,不再误报"构建完成"
IMAGE_NAME=rk3288-android10-env
IMAGE_TAG=latest

docker build -t ${IMAGE_NAME}:${IMAGE_TAG} -f Dockerfile .
echo "构建完成: ${IMAGE_NAME}:${IMAGE_TAG}"

Dockerfile:

可自行修改添加编译依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# RK3288 Android 10 SDK 编译环境
FROM ubuntu:18.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai

# ---------- 1. 编译依赖 ----------
# 新增: 开启 multiverse 源(rar 在里面)+ i386 架构(zlib1g-dev:i386 需要)
RUN sed -i 's/ main universe$/ main universe multiverse/' /etc/apt/sources.list \
&& dpkg --add-architecture i386 \
&& apt-get update && apt-get install -y --no-install-recommends \
# 版本控制 / 源码获取
git git-core repo curl wget ssh \
# Android 编译基础
gnupg flex bison gperf build-essential make zip unzip rar \
zlib1g-dev zlib1g-dev:i386 lib32z1-dev \
gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev libncurses5 libncurses5-dev \
x11proto-core-dev libx11-dev libgl1-mesa-dev \
libxml2-utils xsltproc m4 bc \
python python-dev python-networkx python3 python3-dev \
openjdk-8-jdk \
# u-boot / kernel 编译
lzop libssl-dev liblz4-tool device-tree-compiler u-boot-tools swig cpio \
# 刷机 / 调试工具
adb fastboot \
# 常用工具
ccache expect gawk texinfo chrpath diffstat \
python3-pyelftools sudo vim less file rsync locales ca-certificates \
passwd tzdata \
&& rm -rf /var/lib/apt/lists/*

# ---------- 2. 时区 ----------
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# ---------- 3. UTF-8 语言环境(Android 编译必需)----------
RUN locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

# ---------- 4. 普通用户 htx ----------
# UID/GID 固定 1000,与宿主机挂载的 SDK 目录属主一致
ARG USER_NAME=htx
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN groupadd -g ${GROUP_ID} ${USER_NAME} \
&& useradd -u ${USER_ID} -g ${GROUP_ID} -m -s /bin/bash ${USER_NAME} \
&& echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER_NAME} \
&& chmod 0440 /etc/sudoers.d/${USER_NAME}

USER ${USER_NAME}
ENV HOME=/home/${USER_NAME}
WORKDIR /workspace/sdk
CMD ["/bin/bash"]

2.运行

1
./docker_run.sh

docker_run.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# 用法: ./docker_run.sh -> 以 htx 进入,exit 后自动停止容器
# ./docker_run.sh root -> 以 root 进入,exit 后自动停止容器
CONTAINER_NAME=rk3288-build
IMAGE=rk3288-android10-env:latest
SDK_DIR=/media/zero/data1/RK_Android_10.0_sdk
CCACHE_DIR=${HOME}/.ccache

mkdir -p "${CCACHE_DIR}"

# 首次运行:创建命名容器(不用 --rm,文件系统永久保留)
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "首次运行,创建容器 ${CONTAINER_NAME} ..."
docker create -it \
--name ${CONTAINER_NAME} \
--hostname rk3288-build \
-v ${SDK_DIR}:/workspace/sdk \
-v ${CCACHE_DIR}:/home/htx/.ccache \
--net host \
-w /workspace/sdk \
${IMAGE}
fi

# 没在运行则启动
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
docker start ${CONTAINER_NAME} > /dev/null
fi

# 进入容器
if [ "$1" = "root" ]; then
docker exec -it -u root -w /workspace/sdk ${CONTAINER_NAME} /bin/bash
else
docker exec -it -u htx -w /workspace/sdk ${CONTAINER_NAME} /bin/bash
fi

# exit 返回宿主机后:自动停止容器 如果需要exit退出容器不停止注释以下两行
docker stop ${CONTAINER_NAME} > /dev/null
echo "容器 ${CONTAINER_NAME} 已自动停止(文件系统已保留,下次 ./docker_run.sh 直接恢复)"

3.保存导出当前 docker 镜像

1
./docker_save.sh

docker_save.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
CONTAINER_NAME=rk3288-build
IMAGE=rk3288-android10-env:latest
OUT_FILE=rk3288-android10-env_$(date +%Y%m%d).tar.gz

# 关键:先 commit,容器里后来 apt 装的包才会一起保存
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "提交容器当前状态 -> ${IMAGE}"
docker commit ${CONTAINER_NAME} ${IMAGE}
fi

echo "导出镜像 -> ${OUT_FILE}"
docker save ${IMAGE} | gzip > "${OUT_FILE}"
echo "完成,大小: $(du -h "${OUT_FILE}" | cut -f1)"
echo "目标机器恢复: docker load -i ${OUT_FILE}"

4.日常使用

1
2
3
4
5
6
### 容器内随时切换:
sudo -i # htx -> root(免密)
su - htx # root -> htx
### 容器内随用随装,退出不丢失:
sudo apt-get install -y xxx
./docker_save.sh # 备份(自动 commit 容器状态后再导出)