记一次编译Android 开源项目 (Android Open Source Project) 的过程。
搭建构建环境
根据谷歌-搭建构建环境部分的描述,需要使用Linux环境。
这里,我使用的是VM创建了Ubuntu18.04的虚拟机。
Ubuntu18.04镜像的下载链接
注:我配置的虚拟机为12核/64G,实测编译耗时为2小时11分钟。
硬件要求
您的开发工作站必须达到或超出以下硬件要求:
-
如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
-
如果要检出代码,至少需要 250 GB 可用磁盘空间;如果要进行构建,则还需要 150 GB。如果要进行多次构建,则需要更多空间。
-
至少需要 16 GB 的可用 RAM,但 Google 建议提供 64 GB。
注意:如果您要检出镜像,就需要更多空间,因为完整的 Android 开源项目 (AOSP) 镜像包含所有使用过的 Git 代码库。
从 2021 年 6 月起,Google 使用 72 核机器,内置 RAM 为 64 GB,完整构建过程大约需要 40 分钟(增量构建只需几分钟时间,具体取决于修改了哪些文件)。相比之下,RAM 数量相近的 6 核机器执行完整构建过程需要 3 个小时。
软件要求
AOSP 分支历来都是在 Ubuntu 长期支持 (LTS) 版本中进行开发和测试,但也可以使用其他分发版本。如需了解所需的其他软件包以及用于安装这些软件包的命令,请参阅搭建构建环境。
工作站必须具有下面列出的软件。这些要求适用于 AOSP master 分支。对于 Android 5.0 版(Lollipop 或 L)到 Android 8.0 版(Oreo 或 O),请考虑使用随附的 Dockerfile,以简化所有必需软件包的安装。
操作系统
如果您要针对 AOSP master 分支进行开发,请使用 Ubuntu 18.04 (Bionic Beaver)。
注意:自 2021 年 6 月 22 日起,谷歌已不再支持在 Windows 或 MacOS 上进行构建。
编译步骤
以下为在Ubuntu18.04上编译Android 11的过程。
配置环境
- 配置git
- 下载git
sudo apt install git
- 配置git
git config --global user.email "电子邮件地址"
git config --global user.name "名字"
- 下载repo工具
repo工具就是一堆python脚本的集合,调用git命令去clone代码,所以要保证git先配置好。
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
- 安装编译所需的软件包
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
注意:不同Ubuntu版本有所不同,此处是Ubuntu18.04。其它版本安装命令,参考文档
同步代码
- 创建工作目录
mkdir AOSP
cd AOSP
- 初始化仓库
以下二选一:
A:
使用清华大学镜像站
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
B:
使用谷歌的镜像
repo init -u https://android.googlesource.com/platform/manifest
如需签出 master 分支,请运行以下命令:
repo init -u https://android.googlesource.com/platform/manifest -b master
此处,由于我需要Android11的版本,因此,输入命令修改为如下内容
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r46
其它版本,参考源代码标记按需修改上述命令即可。
- 同步代码
repo sync
开始同步代码…
驱动安装
若使用模拟器,则可跳过此步骤。
- 下载对应驱动
这里,我使用的设备型号为 pixel 4,AOSP版本为11.0.0_r41。
驱动下载链接如下:
https://developers.google.cn/android/drivers?hl=zh-cn#flamerq3a.211001.001
找到对应版本号的驱动,下载得到
-
google_devices-flame-rq3a.211001.001-649f84da.tgz
-
qcom-flame-rq3a.211001.001-9f0ccb39.tgz
将其解压得到两个*.sh文件,将其拷贝至ubuntu中对应的AOSP根目录下。
- 安装驱动
执行extract-qcom-flame.sh和extract-goole_devices-flame.sh两个文件。
生成以下两个目录,且其中包含了相关镜像
- AOSP根目录/vendor/google_devices
- AOSP根目录/vendor/qcom
注意:在AOSP(11.0.0_r41)编译flame(Pixel 4) 时有坑,后文有做记录。
编译系统
- 使用
envsetup.sh
脚本初始化环境
source build/envsetup.sh
或者
. build/envsetup.sh
envsetup.sh
脚本会导入若干命令,让您能够使用 Android 源代码,其中包括本练习中使用的命令。
如需查看可用命令的完整列表,请运行以下命令:
hmm
- 选择目标
使用 lunch
选择要构建的目标。lunch product_name-build_variant
会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m
和其他类似命令的调用读取。
确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整构建,并且启用所有调试功能。
$ lunch
#或也可以直接选择
$ lunch aosp_arm-eng
#或也可以直接选择序号
$ lunch 1
执行lunch
后,输入序号选择构建目标
相关后缀说明:
- user:限制所有权限,用于发布给用户使用的最终版本。
• 安装带有 user 标记的模块。
• 除了带有标记的模块之外,还会根据产品定义文件安装相应模块。
• ro.secure=1
• ro.debuggable=0
• adb 默认处于停用状态。 - userdebug: 开放部分权限,允许root。
• 还会安装带有 debug 标记的模块。
• ro.debuggable=1
• adb 默认处于启用状态。 - eng:工程师模式,开放所有权限并且有额外的调试工具。
• 安装带有 eng 或 debug 标记的模块。
• 除了带有标记的模块之外,还会根据产品定义文件安装相应模块。
• ro.secure=0
• ro.debuggable=1
• ro.kernel.android.checkjni=1
• adb 默认处于启用状态。
- 构建代码
使用 m
构建所有内容。m
可以使用 -jN
参数处理并行任务。如果您没有提供 -j
参数,构建系统会自动选择您认为最适合您系统的并行任务计数。
make -j12
开始构建
经过漫长的等待,编译完成
注:本次编译是一次过,中途未出现其它问题。
可能需要注意的地方
- 同步代码时确保网络稳定,以免文件遗失
- 编译产物较多,确保磁盘空间足够
刷机
进入bootloader,在AOSP根目录执行命令
注:需在“. build/envsetup.sh”后执行
fastboot flashall -w
踩坑记录
编译AOSP时报错
报错信息:
FAILED: ninja ‘vendor/qcom/coral/proprietary/com.qualcom.qcrilmsgtunnel.xml’, needed by ‘out/target/product/flame/system_ext/ext/permissions/com.qualcomm.qcrilmsgtunnel.xml’ …
问题原因:
找不到vendor/qcom/coral/proprietary/com.qualcom.qcrilmsgtunnel.xml
分析:
pixel4对应的是“flame”,此处出现了代号“coral”
修改:
找到“AOSP根目录/vendor/qcom/flame/proprietary/device-partial.mk”文件,将“coral”修改为“flame”
# blob(s) necessary for flame hardware
PRODUCT_COPY_FILES := \
... vendor/qcom/flame/proprietary/com.qualcomm.qcrilmsgtunnel.xml:system_ext/etc/permissions/com.qualcomm.qcrilmsgtunnel.xml \
...
刷机后卡开机画面
我的设备在此前刷了Android13的原厂镜像,刷AOSP(11.0.0_r41)时未执行“fastboot -w”清除数据,在开机时卡在开机动画界面。
执行"fastboot -w" -> "fastboot flashall”重刷后解决
参考链接
从头搭建Android源码编译环境(Ubuntu 18.04 / 20.04 / 22.04)