Android 源码编译环境搭建教程
前言
之前在 KVM 虚拟机编译安卓,但是由于 QEMU 虚拟磁盘的特性,最终磁盘文件大小已经大于设置的磁盘文件的最大容量,然后盘就满了。
KVM 虚拟机就直接暂停了,也没法使用其他 Linux 的 LiveCD,一挂载也会暂停。
使用各种办法挽救,速度忒慢,索性直接重建环境,比那些操作快,毕竟没什么重要文件。
环境介绍
- 系统:Ubuntu 24.04 LTS
- 示例系统源码:AviumUI 16.2 (Android 16)
更换源与更新系统
此处默认已进行更换,如果没有,更换源在镜像站一般都有教程。
更新系统
1sudo apt update && sudo apt upgrade安装依赖
所做修改
- 修正找不到包的问题:
git-core/libncurses5/lib32ncurses5-dev已不可用,替换为git/libncurses6/lib32ncurses-dev repo同步工具:源里已有,不需手动设置 PATH。deb 系更新较慢,会报版本不是最新的警告,可忽略ccache:在build/envsetup.sh未定义或未手动启用时不会自动开启,参考类原生编译脚本带了它libssl-dev:解决编译内核时提示<openssl/bio.h>缺失的问题git-lfs:部分仓库需要用到,缺少可能导致同步的文件显示 LFS 指针而非本体文件
安装命令
1sudo apt install git gnupg flex bison build-essential zip curl \2 zlib1g-dev libc6-dev-i386 libncurses6 lib32ncurses-dev \3 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \4 libxml2-utils xsltproc unzip fontconfig libssl-dev \5 openjdk-8-jdk repo ccache git-lfs libelf-dev rsync设置 Git 信息
源码同步会提示要求设置 Git 的信息,直接设置即可:
1git config --global user.email "你的 GITHUB 邮箱(或其他)"2git config --global user.name "你的 GITHUB 用户名(或其他)"初始化 Repo 同步清单
创建源码目录
1mkdir android && cd android设置 Repo 下载地址
替换默认被墙的 Google 源,使用清华大学 git-repo 镜像:
1export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'初始化 Repo
以 AviumUI 为例,清单地址前加上 https://gh-proxy.com/ 使用国内加速,结尾 --depth=1 减少空间占用:
1repo init -u https://gh-proxy.com/https://github.com/AviumUI/android_manifests \2 -b avium-16.2 --git-lfs --depth=1如果是 AOSP 官方源码或 LineageOS 源码,可以使用国内镜像源,教程参考 清华源文档。
可用的源推荐清华源和中科大源,不同之处就是替换 URL 的问题。
修改清单指向加速源
使用你喜欢的编辑器编辑 .repo/manifests 文件夹,依次编辑 default.xml 和存在的其他 .xml 文件:
- 对于
https://github.com的链接,在最前面加上https://gh-proxy.com/ - 对于
https://android.googlesource.com的链接,更换为 AOSP 镜像源所要求的 URL
示例
1<remote name="aosp"2 fetch="https://mirrors.ustc.edu.cn/aosp" />3
4...5
6<remote name="avium"7 fetch="https://gh-proxy.com/https://github.com/AviumUI/"8 sync-c="true"9 sync-j="4"10 revision="refs/heads/avium-16" />同步源码
以下为 AviumUI 的同步命令:
1repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags⚠️ 注意
由于硬盘 I/O 资源有限,Git 服务器每 IP 限制 5 个并发连接。
repo sync默认使用 4 个并发连接,请勿使用-j参数增加并发连接数。
自动重试脚本
如果网络不稳定容易失败,可使用以下脚本自动重试直到同步成功或手动退出:
1#!/bin/bash2
3echo "====== start repo sync ======"4
5# 执行 repo sync 命令6repo sync7
8# 使用 while 循环检查命令的退出状态9while [ $? -eq 1 ]; do10 echo "====== sync failed, re-sync again ======"11 sleep 312 repo sync13done使用方法:
1# 保存为 repo_sync.sh2chmod +x repo_sync.sh3./repo_sync.sh获取设备树文件
注: 此部分内容为 2025-12-08 追加。
什么是设备树?设备树即描述设备情况的一系列文件,包括平台配置、内核、专有驱动等,用于告诉 Android 构建系统有哪些要求、应该使用什么。
由于 AviumUI 完全兼容 LineageOS 的设备树,这里以 LineageOS 设备树作为演示。
Tips: 设备树仓库一般以一定规律命名,如
android_device_(oem)_(product)。
设备描述 (device)
以小米 Mix 3 为例,设备厂商为 xiaomi,代号为 perseus:
- 打开 LineageOS 组织仓库,搜索
perseus - 找到代码仓库
android_device_xiaomi_perseus - 复制仓库链接,克隆到源码目录:
1git clone https://github.com/LineageOS/android_device_xiaomi_perseus \2 device/xiaomi/perseus- 进入目录,打开
lineage.dependencies,查看需要获取的其他设备树文件 - 按相同方式克隆,如
sdm845-common:
1git clone https://github.com/LineageOS/android_device_xiaomi_sdm845-common \2 device/xiaomi/sdm845-common内核 (Kernel)
从 lineage.dependencies 中查看,获取 kernel 源码。因为内核提交信息非常多,可加 --depth=1 减少下载量:
1git clone https://github.com/duckyduckG/android_kernel_xiaomi_sdm845_419 \2 kernel/xiaomi/sdm845 --depth=1ℹ️ 注意
如果你所使用的内核包含 KernelSU 且将 KernelSU 作为子模块,请务必在克隆内核后初始化 KernelSU:
Terminal window 1git submodule init2git submodule update
厂商私有文件 (vendor)
LineageOS 组织没有 vendor 内容。翻阅 LineageOS Wiki 会要求从设备提取,但实际上 vendor 内容保存在 TheMuppets,其中包含了 LineageOS 维护的设备的 vendor 文件。
硬件特性 (hardware)
都在 LineageOS 仓库,具体参考 lineage.dependencies。以小米 Mix 3 为例,需要 android_hardware_xiaomi:
1git clone https://github.com/LineageOS/android_hardware_xiaomi hardware/xiaomi初始化编译
1. 确保使用 bash
1# 如非 bash,请手动切换2bash2. 加载编译环境
1source build/envsetup.sh3. 选择编译目标
1lunch lineage_perseus-bp2a-user参数说明:
user:构建类型bp2a:代表 Android 16 初始版本 (QPR0)lineage_perseus:目标名称,定义在device/xiaomi/perseus/lineage_perseus.mk
4. 开始编译
1make bacon部分信息可能已经过时