Framework#1:VMware/双系统安装 · AOSP编译环境准备 · 编译AOSP/SDK · Docker多版本编译 · Linux常用命令

78 阅读11分钟

一. VMware配置Ubuntu

【ubuntu 20.04.6LTS】(该版本 VMware 兼容性好):releases.ubuntu.com/focal/

【Vmware pro17】www.alipan.com/s/jnPinK3c2… psw:xa75

1.1 激活VMware

安装好VMware之后,打开,提示输入许可证,这时候打开Keymaker目录下keymake.exe,生成激活码,输入到VMware即可。

1.2 新建虚拟机

省略号代表默认设置,直接点击下一步。

自定义(高级)-> ... -> 稍后安装操作系统 -> Linux、Ubuntu 64位 -> 填入虚拟机名称、安装位置 -> 处理器数量1、内核数量填入真机CPU线程数 -> 设置内存(不低于20G) -> 使用桥接网络 -> ... -> 最大磁盘大小(不低于500G) -> ... -> 自定义硬件 -> 处理器:勾选"虚拟化Intel VT-x/EPT或AMD-V/RVI" -> 新CD/DVD(SATA):使用ISO映像文件,选中ubuntu映像文件-> 完成

1.3 安装Ubuntu

先右上角图标分辨率修改为1080P以上,缩放改为200%,这才安装界面UI才能显示完全。双击虚拟机桌面Install Ubuntu图标启动,默认下一步,到了Updates and other software界面,Other Options取消勾选Download updates while installing Ubuntu,默认下一步,输入用户名、密码,等待安装完成,完成重启之后进入系统。

【坑1:安装完成重启后蓝屏】注意映像文件必须完整,否则安装失败会进入Memtest86+内存检测工具的启动界面 dad.png

【坑2:无法联网】"Connection failed. Activation of network connection failed."虚拟系统一直弹出该提示,在浏览器无法访问互联网,真实系统网络正常。需要在VMware-编辑-虚拟网络编辑器,删掉多余适配器,保留一个桥接,然后选择当前能上网的网卡,重启虚拟系统直到浏览器能正常访问国内网络。如果各种设置依然无效,考虑重新配置虚拟系统。

屏幕截图 2026-03-06 163421.png

【坑3:BIOS一直重复进入安装镜像】开机瞬间按F2键,检查BIOS启动顺序,确保启动顺序是: 1. Hard Drive (硬盘) 2. CD/DVD Drive (光驱) ,进入虚拟机设置,CD/DVD(SATA)取消勾选 “已连接” 和 “启动时连接”

1.4 安装VMware tools

为方便剪贴板共享、传输文件方便,需要给虚拟系统安装该工具。如果在VMware菜单项-虚拟机-安装的话,只会生成DVD驱动在虚拟系统里面,还需要手动安装驱动里面的文件,极容易失败(甚至导致整个系统崩溃无法连接网络,从而需要重新安装,别问我是怎么知道的),这里我们选择Linux官方建议,推荐用open-vm-tools而不是手动安装:

sudo apt update
sudo apt install open-vm-tools open-vm-tools-desktop -y

二. 双系统安装Ubuntu

由于宿主机32G内存分给虚拟机最多只有27G,无法满足编译AOSP10需要,保留已安装的Windows同时安装Ubuntu彻底释放内存是更好的选择(其实在虚拟机中用swap制作虚拟内存也可以解决内存不足问题,纯蠢折腾了)

我有一个 4T 的固态D盘,我需要保留 2.5T 作为文件存储给Windows 11使用,剩下的都可以分配给Linux。固态盘留出目标1.5T空间,AOSP Android10要300G+,Android 16要500G+,两者加起来要1T+,这里我预留了1.5T。

以下无特殊说明,参数保持默认即可。

2.1 UltraISO制作U盘安装盘

文件 —> 打开 —> 选中Ubuntu 20.04.6工具 —> 写入硬盘映像 —> 确认选择U盘

屏幕截图 2026-03-09 004720.png

2.2 DiskGenius调整硬盘大小

右键选中目标盘 —> 调整分区大小 —> 输入需要保留空间(剩下的就是分配给Ubuntu系统的空间)—> 开始

屏幕截图 2026-03-09 012241.png

任务完成后,系统会弹出无法识别D盘,这时候我们需要重启才能正常在 Windows 11 使用该硬盘。此时,它的容量已经变小为我们想要的 2.5T。多出来的空间就处于空闲状态。我这里后面还有两个小分区,是之前安装双系统时分配的,现在嫌小了想缩小存储空间、扩容Ubuntu系统空间:

右键删除当前分区 ——> 保存更改

空闲分区会自动合并为一个大的空闲分区。接下来就是重启进入BIOS。

2.3 BIOS设置

关闭快速启动:为了方便,关闭这个以后Ubuntu的GRUB会接管启动引导,界面能够停留自主选择系统。

IMG_20260309_012857.jpg

关闭安全设置:我的华硕主板没办法关闭安全设置,找到该项:启动\安全启动 ——> 操作系统类型 ——> 其他操作系统、安全启动模式也改为标准。默认是UEFI windows,不然的话进入Ubuntu它会因为非Windows而进行安全拦截,界面报错停止启动。

IMG_20260309_012817.jpg

从USB启动盘启动:在BIOS拖动顺序,确认从U盘启动即可。

2.4 安装系统

接下来会进入GRUB,选择第二项,第一项会直接卡死:选择Ubuntu (safe graphics) —> 安装系统界面

屏幕截图 2026-03-09 183559.png

开始安装Ubuntu:语言和键盘布局默认US —> 更新和其他软件:取消安装Ubuntu 时更新 —> 安装类型:something else —> 找到空闲目标分区

IMG_20260309_014004.jpg

先创建交换分区(swap):size:2G、use as:swap area

IMG_20260309_014216.jpg

再创建主分区:剩余空间(空闲分区减去swap大小)、use as: ext4 journaling file system、mount point :/

IMG_20260309_014256.jpg

继续下一步就进入安装,直到提示安装成功重启,然后要求拔掉U盘:

IMG_20260309_015411.jpg

2.5 GUN GRUB操作

启动之前先确认BIOS启动优先级是否Ubuntu优先:

IMG_20260309_021746.jpg

无问题继续重启进入高级选项 —> 选择第一个recovery mode —> 选择grub,执行修复,完毕之后继续选择resume

IMG_20260309_015653.jpg IMG_20260309_015707.jpg

编辑grub文件,终端输入:sudo gedit /etc/default/grub

2026-03-09_02-14.png

对应位置0改成2(方便倒计时结束默认进入Windows ),对应位置插入nomodeset(解决引导界面直接选择Ubuntu 卡死)

刷新grub 文件,终端输入: sudo update-grub

重启,然后GRUB界面直接选择第一项Ubuntu启动

2026-03-09_02-15.png

这个时候第一项不会卡死了,系统成功进入可用状态。

2.6 安装显卡驱动

系统安装完毕之后,显示器显示不正常,只有720P,也没帧率可以选。

2026-03-09_02-21.png

应用中心找到并打开 Software & Updates-> Additional Drivers,有最新选最新,选open kernel,不要选择server版本,应用修改。

2026-03-09_02-24.png

重启之后,显示器选项恢复正常。

2026-03-09_02-29.png

双系统安装完毕,实测Linux/Windwos系统中点重启会直接进入Windows,正常关机才会切换出现grub引导。

三. AOSP编译环境准备

Android 系统开发(AOSP编译)的环境准备命令,用于安装编译 Android 源码所需的所有依赖包:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python

各软件包详细解释:

屏幕截图 2026-03-06 171428.png

按照功能划分:

屏幕截图 2026-03-06 171548.png

3.1 repo下载及配置

repo是google编写的python脚本,方便管理多个git库。按顺序执行以下操作,避免踩坑。

# 创建在/home/lesile创建bin目录,用于存放repo
mkdir bin

# 这里使用清华镜像,避免网络问题,同时将repo安装到~/bin文件夹下
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo 

# 赋予可执行权限
chmod +x ~/bin/repo

# 安装vim
sudo apt install vim

# 修改repo官方源地址,避免网络问题
vim .bashrc

# i切换vim为插入模式,文件末尾插入,输入完毕按esc回到普通模式,再输入:wq,按enter退出
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
PATH=~/bin:$PATH

# 更新source
source .bashrc

3.2 repo初始化、下载AOSP源码

# 输入git邮箱和用户名
git config --global user.email "1825609597@qq.com"
git config --global user.name "JokeCheung"

# 创建aosp目录并定位到该目录
mkdir aosp
cd aosp

# 1.初始化操作: -u代表下载地址 -b代表版本,会弹出是否彩色显示,Y确定
# android 10 (使用清华源)
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r41

# android 16 (该版本清华源有问题,改用中科大源)
repo init -u https://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-16.0.0_r2

# 验证是否已生效 该搜索命令有输出则代表生效
grep -r "ustc.edu.cn" .repo/manifests.git/config

# 2.同步代码:这一步开始真正下载源码,等待时间比较久,需要1-2小时
repo sync

下载完毕,验证aosp目录,有如下目录结构则同步完毕:

屏幕截图 2026-03-07 000136.png

四. 编译AOSP/SDK

4.1 AOSP编译

# 前置工作:引入脚本命令
source build/envsetup.sh

# andoird10 发起编译时会弹出版本选择,会打印一系列product列表让你选择
lunch
# 选择26 product: aosp_x86_64-eng
26

# android16 没有列表输出需要自行指定
lunch sdk_phone64_x86_64-bp2a-eng

# 开始编译 默认根据cpu线程数选择用m即可,手动指定线程数命令,避免吃光性能:make -j16
m

4.2 SDK编译

修改过的系统,原生SDK不再适用,如特殊开放的系统权限、接口等,SDK找不到类文件会报错,需要自行编译独属于你系统的SDK提供应用开发能力。

# 前置工作:引入脚本命令
source build/envsetup.sh

# 因为之前编译aosp时已经选择了product 这里lunch直接填入版本
lunch sdk-eng

# 开始编译sdk
make sdk
屏幕截图 2026-03-07 002301.png

五. Docker多版本编译

由于不同aosp版本需要不同的工具链,工具链不同版本之间会互相影响,Android10要求python2python3jdk8,而Android16需要python3jdk17,这个时候就需要用到docker进行环境隔离。

5.1 配置docker

官方脚本自动安装无法应用在旧版Ubuntu上,比如Ubuntu20.04就会报错。用手动方式安装:

# 1. 卸载旧版本(可选)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新包索引并安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 4. 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 6. 启动 Docker 服务
sudo systemctl start docker

# 7. 设置开机自启
sudo systemctl enable docker

# 8. 验证安装(运行 Hello World 容器)
sudo docker run hello-world

验证安装之后如果没有配置国内代理应该会报错:

屏幕截图 2026-03-10 082824.png

Docker客户端(docker命令)的成功安装,与Docker守护进程(dockerd)能否成功访问外网资源(如Docker Hub)是两件独立的事情。所以这里下载hello-word镜像可能会失败。配置国内代理可以解决问题。

# 创建 Docker 配置目录
sudo mkdir -p /etc/docker

# 编辑配置文件(使用 vim 或 nano)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

# 接着上面内容回车后手动输入
EOF

# 重启 Docker 服务使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

屏幕截图 2026-03-10 083023.png

有输出红框内容说明安装正常。可以开始下载Ubuntu镜像了。

5.2 保存 docker 镜像

我们需要aosp_10aosp_16两个容器,那么两个容器环境就要求不同的工具链,考虑启动容器之后配置好工具链再保存为镜像,下次直接用镜像启动就自带对应的环境了。

# 1.拉取Ubuntu20作为aosp10的环境,android10工具链下载
sudo docker pull ubuntu:20.04

# 2.拉取Ubuntu22作为aosp16的环境,android16工具链下载
sudo docker pull ubuntu:22.04

# 3.检查镜像(存在Unbuntu20和22 和 hello docker)
sudo docker images

# 4.首次启动 Android10 容器后面不需要了,直接用start命令启动
sudo docker run -it --name aosp_android10 --privileged \
  -v /home/lesile/aosp/aosp_10:/aosp \
  -w /aosp \
  ubuntu:20.04 \
  /bin/bash
  
# 同理,启动ANDROID16 容器
sudo docker run -it --name aosp_android16 --privileged \
  -v /home/lesile/aosp/aosp_16:/aosp \
  -w /aosp \
  ubuntu:22.04 \
  /bin/bash
  
  
# 5.更新软件包地址,非常重要,否则直接报错找不到以下软件包
apt-get update
  
# 6.安装编译Android10工具链(JDK8 Python2、Python3)
apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig rsync python python3 python3-pip openjdk-8-jdk 

# 同理,Android16 编译链工具(JDK17 Python3)
apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig rsync python3 python3-pip openjdk-17-jdk python-is-python3

# 9.确认python、jdk版本,
# Android10:python2、python3、jdk8
# Android16:python3、jdk17
java -version 
python --version

# 如果遗漏安装python,单独安装
apt-get install -y python
#  如果遗漏安装jdk,单独安装
apt-get install -y openjdk-8-jdk

# 10.保存为镜像
docker commit aosp_android10 aosp10_builder:1.0

5.3 docker 编译

接下来按照三.编译AOSP内容进行编译了,命令和顺序都是一样的。 镜像文件保存在目录:/home/lesile/aosp/aosp_10/out/target/product/generic_x86_64

回到宿主机打开终端进入目录:/home/lesile/aosp/aosp_10,输入命令:emulator即可唤起虚拟机运行刚编译的系统

同一机器 Android 10Android 16顺利编译成功!

2026-03-09_20-33.png

5.4 docker 常用命令

# 如果不需要该镜像了,可以删除
docker rmi aosp10_builder

# 查看所有容器(包括已停止的)
sudo docker ps -a

# 查看正在运行的容器
sudo docker ps

# 启动容器(后台没有在运行)
sudo docker start aosp_android16

# 进入容器
sudo docker attach aosp_android16

# 容器已经在运行,不需要 start,直接使用 exec进入
sudo docker exec -it aosp_build /bin/bash

# 检查镜像(存在Unbuntu20和22 和 hello docker)
sudo docker images

# 临时挂起docker放后台:Ctrl+ P,然后Ctrl+ Q
# 立即退出容器或者直接输入 exit
sudo docker stop aosp_android16

# 将当前用户加入 docker 组(不然回到宿主机无法访问编译输出目录)
sudo usermod -aG docker \$USER

# 重启终端或执行以下命令使权限生效
newgrp docker

六. Linux命令(网络代理、虚拟内存)

# 查看系统网络代理文件 永久设置代理,需重启
sudo nano /etc/environment

http_proxy="http://192.168.31.180:7890"
https_proxy="http://192.168.31.180:7890"
ftp_proxy="http://192.168.31.180:7890"
HTTP_PROXY="http://192.168.31.180:7890"
HTTPS_PROXY="http://192.168.31.180:7890"
FTP_PROXY="http://192.168.31.180:7890"
no_proxy="localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
NO_PROXY="localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"

退出:Ctrl+X → Y → Enter

# 临时设置代理 关闭终端则失效
export https_proxy=http://192.168.31.60:7890

# 测试谷歌连接,返回状态码200代表成功
curl -I https://www.google.com

# 安装tar.gz包 (-xzf 文件名 -C 解压路经)
tar -xzf android-studio-ide-192.6392135-linux.tar.gz -C ~/aosp/aosp_10/opt/

# 查看Swap内存
free -h

# 查看swap 分区/文件的详细信息
swapon --show

# 关闭旧Swap
sudo swapoff /swapfile

# 删除旧文件
sudo rm /swapfile

# 创建新的32G虚拟内存文件
sudo fallocate -l 32G /swapfile

# 设置权限(只有root能读写)
sudo chmod 600 /swapfile

# 格式化为swap分区
sudo mkswap /swapfile

# 启用新swap
sudo swapon /swapfile

# 永久生效(开机自动挂载)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab