0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从踩坑到落地:全志 H618 Android12 Docker 编译环境完整搭建指南

jf_44130326 来源:Linux1024 作者:Linux1024 2026-05-09 11:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文为真实开发踩坑全记录,覆盖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,说明打包成功

wKgZPGn-rumAX6T6AABMvVWqd7E446.png

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的常见问题分析

    Docker 已经是现代运维和开发的基础设施,但在生产环境中使用 Docker,由于环境的复杂性和容器的特殊性,很多在物理机或虚拟机上不会出的问题在容器
    的头像 发表于 05-14 10:28 375次阅读

    直播预告 | 睿擎派3506 Ubuntu开发实战:环境搭建整包固件制作,一次讲透

    ,我们用一场直播,带你完整走一遍睿擎派3506Ubuntu系统开发流程,搭建环境制作整包
    的头像 发表于 03-13 17:45 1818次阅读
    直播预告 | 睿擎派3506 Ubuntu开发实战:<b class='flag-5'>从</b><b class='flag-5'>环境</b><b class='flag-5'>搭建</b><b class='flag-5'>到</b>整包固件制作,一次讲透

    高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得

    高效落地:关键词搜索淘宝天猫商品列表 API 的实操心得 (适合做:选品、比价、代购集运、店铺上货、数据分析、返利工具的同学直接
    的头像 发表于 02-28 14:22 1617次阅读

    高效落地:淘宝天猫商品详情 API 的实操心得

    在电商数据开发、竞品分析等场景中,淘宝天猫商品详情API是获取商品数据的核心入口。初期频繁报错、调用低效,如今稳定支撑业务,我沉淀了一套实操逻辑,本文拆解流程点与
    的头像 发表于 02-26 16:51 1403次阅读

    香橙派系列开发板适配OpenClaw教程

    普惠新篇章:香橙派系列开发板全面拥抱OpenClaw时代 AI智能体正加速概念走向普及,但高性能硬件的门槛是否让许多创新者望而却步?香橙派
    发表于 02-25 18:29

    初次编译rk3568(rk3576)Linux 6.1内核记录:报错终止成功解决的完整流程

    很多刚接触瑞芯微 rk 系列芯片开发的小伙伴,在初次编译基于 Linux 6.1 内核的系统时,很容易因为环境依赖问题卡壳。最近我在编译 rk3576(rk3568 流程类似)Linux 6.1 内核时就遇到了典型报错,
    的头像 发表于 02-06 16:47 3506次阅读
    初次<b class='flag-5'>编译</b>rk3568(rk3576)Linux 6.1内核<b class='flag-5'>踩</b><b class='flag-5'>坑</b>记录:<b class='flag-5'>从</b>报错终止<b class='flag-5'>到</b>成功解决的<b class='flag-5'>完整</b>流程

    RK3568 Android11编译环境搭建及报错解决指南

    在嵌入式开发领域,RK3568 芯片凭借其出色的性能被广泛应用。基于 RK3568 进行 Android11 系统的开发,首先要搭建编译环境。本文将详细介绍在 Ubuntu20.04
    的头像 发表于 02-04 17:37 2376次阅读
    RK3568 <b class='flag-5'>Android</b>11<b class='flag-5'>编译</b><b class='flag-5'>环境</b><b class='flag-5'>搭建</b>及报错解决<b class='flag-5'>指南</b>

    RK3399 Android12自动调节屏幕亮度问题排查与解决

    在嵌入式设备开发中,屏幕自动亮度调节功能直接影响用户体验与功耗控制。近期在 RK3399 芯片 + Android12 系统的设备上,遇到了自动亮度调节的异常问题 —— 系统自动调节时亮度最低只能
    的头像 发表于 02-04 17:36 2083次阅读
    RK3399 <b class='flag-5'>Android12</b>自动调节屏幕亮度问题排查与解决

    记ESP32CAM解决指南,已反映商家

    中国香河英茂科工没有一个鸭蛋是白吃的,没有一分钱融资是百花的,都转化为科技成果----记ESP32CAM解决指南,已反映商家 https://user.qzone.qq.com/382905282/blog/1770127
    发表于 02-03 22:23

    RK3576+Android15+Linux6.1调试EM05 4G模块全记录:底层到上层的与破局

    )服务。最近我们在 RK3576 开发板 + Android15 系统 + Linux6.1 内核 环境下调试EM05 4G 模块 时,就遇到了“RIL 起不来” “库缺失” 再
    的头像 发表于 02-03 15:27 3857次阅读
    RK3576+<b class='flag-5'>Android</b>15+Linux6.1调试EM05 4G模块全记录:<b class='flag-5'>从</b>底层到上层的<b class='flag-5'>踩</b><b class='flag-5'>坑</b>与破局

    嵌入式开发效率革命!明远智睿H618核心板

    嵌入式开发效率革命!明远智睿H618核心板:硬件服务的全方位赋能 在当今快节奏的技术迭代浪潮中,嵌入式开发项目的“效率”与“成本”已成为决定项目成败的关键因素。传统开发模式下,开发者往往需要面对
    的头像 发表于 10-28 15:48 789次阅读

    赋能多场景创新:明远智睿H618核心板

    赋能多场景创新:明远智睿H618核心板引领智能终端行业新变革 当智能电视盒子进入8K时代、教育平板迈向“交互化教学”、边缘计算设备成为物联网数据处理的“关键节点”,市场对核心处理器的场景适配能力提出
    的头像 发表于 09-09 17:17 897次阅读

    明远智睿 H618 核心板:以硬核性能重塑多媒体智能终端新生态

    场景的深度适配,以及高性价比的产品定位,迅速成为多媒体处理领域的 “潜力股”,为多个行业的智能升级注入强劲动力。​ 核心架构来看,H618 核心板采用四核 Cortex-A53 架构,这一架构在性能与功耗之间实现了精妙平衡,成为中高端多媒
    的头像 发表于 09-09 17:16 1279次阅读

    h618的armbian 镜像解包,打包

    寻找大佬指导h618的armbian 镜像用imgRePacker 解包以后,我用mount挂载修改了rootfs 文件以后,如何打包,直接复制进来替换以后,烧录报错
    发表于 08-29 11:32

    H618核心板:高性能嵌入式系统的理想选择

    **引言**   随着物联网(IoT)、人工智能(AI)和边缘计算的快速发展,高性能嵌入式核心板的需求日益增长。H618核心板凭借其强大的计算能力、低功耗设计以及丰富的接口资源,成为工业控制、智能
    的头像 发表于 06-30 15:14 2699次阅读