txtyb's Blog

The quieter you be, the more you can hear.

  1. 1. 准备
    1. 1.1. 设备要求
    2. 1.2. 安装依赖
  2. 2. 配置构建环境
    1. 2.1. 新建文件夹
    2. 2.2. 安装repo工具
    3. 2.3. 开启ccache缓存工具加速编译
    4. 2.4. 初始化源码仓库并同步
    5. 2.5. 准备好设备专用的仓库
  3. 3. 开始编译

本文基于编译Android 12的流程编写,编译早期版本的Android需要的依赖和过程可能不同(如所需要的内存容量,是否需要额外安装JAVA等)。

准备

设备要求

编译Android 12建议至少需要32G的物理内存和200G左右的硬盘空间用来存放源码和编译产物。如果没有那么多的物理内存,也可以考虑采用16G的物理内存加上约12G的swap来保证满足编译需求。关于硬盘,使用SSD存放源码的编译速度肯定会比HDD快上不少,选择什么主要还是看自己的条件。

至于系统,那一般的Linux都是可以的。

安装依赖

如果你和我一样使用的是ArchLinux或者基于Arch并同样采用pacman包管理器的Manjaro,那么你只需安装打包好的元软件包aosp-devel以及lineageos-devel(即便是编译基于AOSP的rom也建议安装此包,因为设备树中的内容可能会需要此依赖)即可。

如果是Ubuntu或是其他采用apt和其他包管理器的系统,则需要分别安装以下软件包:bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

配置构建环境

新建文件夹

mkdir exthmui,创建一个文件夹,用于存放源码。

安装repo工具

同样的,如果你是ArchLinux,只需安装aur包yay repo即可。其他系统的话手动下载安装,参考:

1
2
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

添加环境变量。

1
2
3
4
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

开启ccache缓存工具加速编译

更改目录为你期望的缓存存储路径。

1
2
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

添加以下内容至你的~/.bashrc或者~/.zshrc文件来设置缓存大小限制。

1
ccache -M 50G

添加如下语句来启用缓存压缩:

1
ccache -o compression=true

初始化源码仓库并同步

这里以同步exTHmUI源码为例。

1
2
repo init -u https://github.com/exthmui/android.git -b exthm-12
repo sync

也可以使用depth参数限定深度来节省空间。

1
2
repo init -u https://github.com/exthmui/android.git -b exthm-12 --depth=1
repo sync

当然,你的机器如果在国内的话,魔法是必不可少的。

准备好设备专用的仓库

为了能够从源码中编译出专用于你的设备的rom,一般还需要三样东西:device tree,kernel以及vendor。

vendor为从设备原厂rom中提取出的闭源二进制文件,如vendor_xiaomi_raphael,device tree即设备树,你可以自己从零开始bring up,不过第一次的话还是先找一个现成的来用,名称格式大概是像这样:device_xiaomi_raphael,同理,内核为kernel_xiaomi_raphael)

将以上仓库添加进源码根目录的.repo/local_manifests中的配置文件中后,重新repo sync,代码就准备好了。

开始编译

1
2
3
. build/envsetup.sh
lunch exthm_[您的设备代号]-[构建类型]
make bacon

lunch exthm_raphael-userdebug

编译产物会生成在$OUT中。

本文最后更新于 天前,文中所描述的信息可能已发生改变