| 本文为真实开发踩坑全记录,覆盖Linux服务器、Windows WSL2双场景,解决编译环境依赖、权限报错、环境持久化、跨系统移植全流程问题,看完就能从零搭建一套可复用的Android编译环境。 |
前言
做嵌入式Android系统开发的朋友都懂:Android源码编译对环境依赖极其苛刻,不同Android版本要求的JDK、Python、系统工具链天差地别。
不同版本的ubuntu系统环境和依赖都不一样。
直接在物理机装环境,很容易把系统搞乱;用VMware虚拟机,不仅启动慢、资源占用高,共享文件夹还一堆权限坑。
而Docker容器化方案,能完美解决这些痛点:环境隔离、秒级启动、资源占用极低、环境可一键移植,是编译Android源码的最优解。
本文就以全志H618平台Android12.0源码编译为例,把从0到1搭建Docker编译环境的完整流程、所有踩过的坑和解决方案,一次性全部分享给大家。
一、先搞懂:Docker编译Android,比VMware好在哪?
很多朋友会问,我用VMware装Ubuntu也能编译,为什么非要用Docker?一张表给你讲透差异:
| 对比维度 | Docker容器 | VMware虚拟机 |
| 启动速度 | 秒级启动,瞬间进入编译环境 | 开机几十秒到几分钟,需等待完整系统启动 |
| 资源占用 | 仅占用编译所需资源,无冗余系统进程,内存占用极低 | 完整系统本身就要吃掉2-4G内存,后台进程大量占用资源 |
| 文件互通 | 直接挂载宿主机目录,宿主机改代码,容器里直接编译,无延迟 | 共享文件夹卡顿、权限坑多,文件传输麻烦 |
| 环境一致性 | 镜像一次配置,永远一致,删了重开还是一模一样的环境 | 长期使用环境会变脏,依赖冲突频发,重装需从头配置 |
| 编译性能 | 接近原生物理机性能,IO损耗极低 | 有明显性能损耗,编译速度普遍比Docker慢20%以上 |
| 环境移植 | 一个tar包就能跨机器、跨系统迁移 | 虚拟机镜像动辄几十GB,迁移极其麻烦 |
结论:单纯编译Android /嵌入式SDK,Docker全方位吊打VMware,完全没必要用虚拟机。
二、环境准备
本文覆盖两个最常用的开发场景,大家按需选择即可:
1.Linux服务器场景:Dell PowerEdge R720xd物理服务器,Ubuntu系统
2.Windows办公机场景:Win10/Win11台式机/笔记本,用WSL2+Docker实现编译
前置要求
•Linux服务器:已安装Docker,内存≥16GB(推荐32GB),CPU核心数≥8核
•Windows机器:已开启虚拟化,Win10 2004+/Win11系统,内存≥16GB,源码存放于NVMe SSD(机械硬盘编译会巨慢)
三、Linux服务器:Docker编译环境完整搭建
这是最稳定、性能最好的场景,我们从拉取基础镜像开始,一步步搞定完整编译环境。
3.1拉取适配的基础镜像
Android12.0编译最适配的Ubuntu版本是20.04/22.04,这里我们选择长期支持的ubuntu:22.04:
# 拉取官方基础镜像sudodocker pull ubuntu:22.04# 验证镜像是否拉取成功sudodocker images
3.2正确启动容器(避坑核心)
很多新手第一个坑就踩在这里:启动容器的命令不对,要么退出就删环境,要么源码挂载不上。
错误命令(退出就删环境)
# 带--rm参数,退出容器会自动删除,装的依赖全没了!sudodocker run -it --rm-v $(pwd):/h618-android12.0 -w /h618-android12.0 ubuntu:22.04
正确命令(持久化容器,环境永久保留)
# 给容器命名,不带--rm,退出后容器仅停止,环境完全保留sudodocker run -it --name h618-build -v $(pwd):/h618-android12.0 -w /h618-android12.0 --privileged ubuntu:22.04
命令参数详解:
•-it:以交互式终端进入容器
•--name h618-build:给容器命名,方便后续管理
•-v 宿主机路径:容器路径:把宿主机的Android源码目录挂载到容器内
•-w:指定进入容器后的默认工作目录,直接进入源码根目录
•--privileged:给容器最高权限,避免编译过程中权限不足
3.3容器内:全量编译依赖安装(一次性避坑)
进入容器后,第一步就是安装Android12编译所需的所有依赖,把后续会踩的坑一次性解决:
aptinstall git bc bison build-essential curl flex libsdl1.2-devaptinstall g++-multilib gcc-multilib gnupg gperf libncurses5-devaptinstall imagemagick lib32ncurses5-dev lib32readline-dev squashfs-toolsaptinstall lib32z1-dev liblz4-tool xsltproc libssl-dev libwxgtk3.0-gtk3-devapt install libxml2 libxml2-utils schedtool lzop pngcrush rsyncaptinstall yasm zip zlib1g-dev python device-tree-compileraptinstall python-pip gawk openjdk-8-jdk u-boot-tools patchelf expectpipinstall pyelftools
3.4容器内:前置配置修复(解决必现报错)
安装完依赖,先做两个配置修复,否则编译一定会报错:
# 1. 修复git安全目录问题,解决挂载目录的git权限报错git config --global--addsafe.directory /h618-android12.0# 2. 配置git换行符,避免Windows和Linux换行符冲突导致脚本报错git config --globalcore.autocrlf input
3.5高频报错合集&解决方案
这里把编译过程中99%会遇到的报错,全部整理好,遇到直接复制命令解决:
报错1:python: command not found
•原因:Ubuntu22.04默认只有python3命令,没有python命令,老的编译脚本只认python
•解决方案:
ln-s /usr/bin/python3 /usr/bin/python# 或者直接安装python-is-python3包(上面依赖安装已经包含)
报错2:fatal: detected dubious ownership in repository at 'xxx'
•原因:容器内root用户,不信任宿主机挂载的git仓库目录
•解决方案:上面的git safe.directory配置命令
报错3:xxd: command not found
•原因:缺少xxd工具,编译bootloader必备
•解决方案:apt install -y xxd(上面依赖安装已经包含)
报错4:cpio: not found
•原因:缺少cpio工具,编译内核和boot.img必备
•解决方案:apt install -y cpio(上面依赖安装已经包含)
报错5:permission denied while trying to connect to the Docker daemon socket
•原因:当前普通用户没有权限访问Docker的socket文件
•解决方案:把当前用户加入docker用户组,永久免sudo
# 创建docker组(若不存在)sudogroupadd docker# 把当前用户加入docker组sudousermod -aG docker$USER# 关键:退出当前SSH会话重新登录,权限才会生效
报错6:Unable to find image 'xxx:latest' locally
•原因:镜像标签不对,Docker默认找latest标签,而你的镜像标签不是latest
•解决方案:运行命令必须带上完整的镜像标签,比如h618-android-build:v1,不能只写镜像名
3.6容器的日常使用命令
# 退出容器:exit# 下次重新进入容器(环境全保留)sudodocker start h618-buildsudodockerexec-it h618-build bash# 停止容器sudodocker stop h618-build# 删除容器(环境乱了可以删了重建)sudodockerrm-f h618-build
四、Windows办公机:WSL2+Docker编译环境搭建
很多朋友只有Windows办公机,也想编译Android源码,这里给大家一套替代VMware的最优方案,性能接近原生Linux。
4.1开启WSL2(前置步骤)
1.以管理员身份打开PowerShell,执行安装命令:
wsl--install
2.命令会自动启用WSL、虚拟机平台,下载安装Ubuntu,完成后重启电脑
3.重启后会弹出Ubuntu窗口,设置用户名和密码(用户名必须小写字母开头,只能包含小写字母、数字、下划线、短横,否则会报错)
4.验证WSL是否正常:
wsl-l -v
看到Ubuntu Running 2,说明WSL2安装成功
4.2 Docker Desktop安装与配置
1.官网下载Docker Desktop安装包,双击安装,必须勾选Use WSL 2 instead of Hyper-V
2.安装完成后重启电脑,打开Docker Desktop
3.进入Settings → General,确认勾选Use the WSL 2 based engine
4.进入Settings → Resources → WSL Integration,勾选Ubuntu,保存并重启Docker
5.验证Docker是否正常:
dockerrun hello-world
出现欢迎信息,说明Docker安装成功
4.3启动编译容器(和Linux服务器完全一致)
PowerShell进入你的Android源码所在目录,执行启动命令:
docker run -it --name h618-build` -v D:h618-android12.0:/h618-android12.0 ` -w /h618-android12.0` --privileged `ubuntu:22.04
后续的依赖安装、配置修复、编译命令,和Linux服务器场景完全一致。
4.4更稳的替代方案:直接用WSL2原生编译
如果Docker Desktop启动失败,完全可以不用Docker,WSL2本身就是完整的Linux系统,直接在里面安装依赖编译即可:
1.PowerShell输入wsl进入Ubuntu系统
2.执行本文3.3的全量依赖安装命令
3.进入源码目录:cd /mnt/d/h618-android12.0(Windows的D盘对应WSL里的/mnt/d/)
4.执行编译命令即可,效果和Docker完全一致
五、编译环境持久化与跨系统移植
环境配置好之后,我们可以把它打包成自定义镜像,实现一劳永逸,还能跨机器、跨系统移植。
5.1把配置好的容器打包成自定义镜像
1.先保持容器处于运行状态,不要退出
2.新开一个终端窗口,执行commit命令,把容器打包成镜像:
# 格式:docker commit 容器名 镜像名:标签sudodocker commit h618-build h618-android-build:v1
3.验证镜像是否打包成功:
sudodocker images
能看到h618-android-build:v1,说明打包成功

5.2自定义镜像的使用
以后编译,直接用这个打包好的镜像启动容器,进去就能直接编译,所有依赖、配置都已经预装好:
sudodocker run -it --rm -v $(pwd):/h618-android12.0 -w /h618-android12.0 h618-android-build:v1
5.3镜像跨系统移植
方案一:离线导出/导入(推荐,无网络也能用)
1.源机器导出镜像为tar包:
# 若是tar.gz包,先解压gunzip h618-android-build-v1.tar.gz# 导入镜像sudodocker load -i h618-android-build-v1.tar
2.把tar包通过U盘、scp、局域网共享等方式,传输到目标机器
3.目标机器导入镜像:
# 若是tar.gz包,先解压gunzip h618-android-build-v1.tar.gz# 导入镜像sudodocker load -i h618-android-build-v1.tar
4.验证:sudo docker images能看到镜像,说明移植成功
方案二:Docker Registry推送(适合有网络、多人共享)
1.给镜像打仓库标签(以Docker Hub为例):
sudodocker tag h618-android-build:v1 你的DockerHub用户名/h618-android-build:v1
2.登录Docker Hub并推送:
sudodocker tag h618-android-build:v1 你的DockerHub用户名/h618-android-build:v1
3.目标机器直接拉取镜像:
sudodocker pull 你的DockerHub用户名/h618-android-build:v1
六、最终编译验证
环境全部配置好之后,进入容器的源码目录,执行标准Android编译命令即可:
SDK$sourcebuild/envsetup.shSDK$lunch apollo_p2-userdebugSDK$make installclean -j32
七、核心避坑总结
1.启动容器不要随便加--rm参数,除非是临时测试,否则退出容器环境就会被删除
2.Ubuntu22.04默认没有python命令,必须安装python-is-python3或者做软链接
3.挂载的git仓库目录,必须配置git safe.directory,否则一定会报权限错误
4.Docker权限问题,优先把用户加入docker用户组,不要每次都用sudo
5.镜像操作必须带上完整标签,Docker默认找latest标签,很容易踩坑
6.Windows下源码不要放在机械硬盘,必须放在NVMe SSD,否则编译速度会慢到离谱
结尾
以上就是全志H618 Android12 Docker编译环境的完整搭建流程,从踩坑到落地,所有细节和解决方案都毫无保留地分享给大家。
按照这个流程操作,不管是Linux服务器还是Windows办公机,都能快速搭建一套稳定、可复用的Android编译环境,再也不用为环境问题头疼。
如果大家在操作过程中遇到任何问题,欢迎在评论区留言交流,我会一一回复。如需镜像,请留言。
审核编辑 黄宇
-
编译
+关注
关注
0文章
698浏览量
35365 -
全志
+关注
关注
25文章
322浏览量
55077
发布评论请先 登录
生产环境中使用Docker的常见问题分析
从踩坑到高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得
从踩坑到高效落地:淘宝天猫商品详情 API 的实操心得
香橙派全志系列开发板适配OpenClaw教程
初次编译rk3568(rk3576)Linux 6.1内核踩坑记录:从报错终止到成功解决的完整流程
RK3568 Android11编译环境搭建及报错解决指南
RK3399 Android12自动调节屏幕亮度问题排查与解决
记ESP32CAM踩坑解决指南,已反映商家
RK3576+Android15+Linux6.1调试EM05 4G模块全记录:从底层到上层的踩坑与破局
从踩坑到落地:全志 H618 Android12 Docker 编译环境完整搭建指南
评论