Ubuntu 22.04 搭建编译Android源码环境
环境准备
操作系统
编译Android源码需要一个区分文件大小写的系统环境,一般使用Ubuntu,可以采用单独安装Ubuntu、虚拟机等形式。这里使用VMware虚拟机的形式,具体安装过程省略,虚拟机下载教程及Ubuntu下载地址如下:
2024年最新VMware Workstation Pro下载与安装教程- 掘金
https://juejin.cn/post/7432703426415067151
下载Ubuntu,本文使用的长期支持版本是22.04.3 LTS
https://cn.ubuntu.com/download/desktop
环境配置
安装Ubuntu后,打开“终端”
安装和配置git
$ sudo apt install git
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
配置python
Ubuntu 22.04.3已内置python3,安装位置在/usr/bin/python3.10。可以使用python3 --version命令查看python3版本,我查到的版本是3.10.12。
AOSP 12及以上
Google 正在将 Android 源代码树中的所有脚本迁移到 Python 3,如果是下载AOSP 12以上版本只需要建立一个python的链接,后续步骤可以略过
$ sudo ln -s /usr/bin/python3 /usr/bin/python
请查阅:
下载源代码 | Android 开源项目 | Android Open Source Project
https://source.android.google.cn/docs/setup/build/downloading?hl=zh-cn
AOSP 12以下
有些AOSP版本需要安装python2
$ sudo apt install python2-minimal
$ python2 --version
Python 2.7.18
经查询,python2的安装路径为/usr/bin/python2.7。因为系统中安装了多个python版本,需要使用update-alternatives来切换版本,update-alternatives是Linux上的一个版本管理工具
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 3
update-alternatives后面按顺序共5个参数,其中:
第一个参数--install表示向update-alternatives注册服务名。
第二个参数/usr/bin/python是注册的最终地址,以后管理就是管理这个软链
第三个参数python为服务名
第四个参数为被管理命令的绝对路径
第五个参数为优先级,数字越大优先级越高
配置完毕后,可以使用python --version查看当前使用的python版本
查看python配置
$ update-alternatives --display python
python - 手动模式
最佳链接版本为 /usr/bin/python3.10
链接目前指向 /usr/bin/python3.10
链接 python 指向 /usr/bin/python
/usr/bin/python2.7 - 优先级 2
/usr/bin/python3.10 - 优先级 3
选择python版本
后面如果需要切换python版本,执行如下命令
$ sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/python3.10 3 自动模式
1 /usr/bin/python2.7 2 手动模式
* 2 /usr/bin/python3.10 3 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:
根据情况输入编号1或2进行切换
安装repo
本部分参照官方文档 https://source.android.google.cn/source/downloading 有补充和调整
- 创建bin文件夹
$ mkdir ~/bin
$ PATH=~/bin:$PATH
- 安装curl
$ sudo apt install curl
- 下载 Repo 工具,并确保它可执行:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
如果上述地址下载失败,可以换成
$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
下载源码
根据官方资料,如果要检出代码,至少需要 250 GB 可用磁盘空间;如果要进行构建,则还需要 150 GB。请准备足够的硬盘空间。
要求 | Android 开源项目 | Android Open Source Project
https://source.android.google.cn/docs/setup/start/requirements?hl=zh-cn
确定要下载的分支版本,可以在下面这个网址查询
代号、标签和内部版本号 | Android 开源项目 | Android Open Source Project
https://source.android.google.cn/docs/setup/about/build-numbers#source-code-tags-and-builds
如果使用手机进行测试,注意“支持的设备”这一列。本文写作时最新的分支为android-13.0.0_r44,我选用的是android-13.0.0_r43。
上述页面可能更新不及时,更多分支可以访问下面这个网址(要FQ)
https://android.googlesource.com/platform/manifest/+refs
因从google官网下载源码较慢,故采用清华大学 AOSP 镜像
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
方式1:传统同步方式(慢,不建议)
创建一个文件夹存放源码,如aosp
$ mkdir aosp
$ cd aosp
使用-b参数进行指定分支
$ repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r43
repo 在运行过程中会尝试访问官方的 git 源更新自己,如果上述命令执行失败,可以使用 tuna 的镜像源进行更新,先执行如下命令。
$ export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
同步源码,同步完就能看见文件了
$ repo sync -c --no-tags
-c 只拉取当前分支代码
--no-tags 不拉取tags
Android源码非常大,需要同步很长的时间,如果同步过程中有出现某个地方卡顿了很久,可以使用Ctrl+Z来中断同步,重新执行 repo sync进行同步
方式2:使用每月更新的初始化包
同步方式耗时较长,可以使用每月更新的初始化包,这个网址列出了每月的初始化包,aosp-latest.tar为最新的包,目前的大小为68.9GB
https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/
用命令行或者下载工具下载,下载后解压,会出现一个aosp文件夹,里面有一个隐藏的.repo文件夹,解压大小在我电脑上是73.7G
$ wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
$ tar xf aosp-latest.tar
$ cd aosp
指定分支后再执行同步
$ repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r43
$ repo sync -c --no-tags
Checking out: 100% (1136/1136), done in 52m20.190s
repo sync has finished successfully.
这种方式可以大大加快源码同步的速度,同步完成后aosp文件夹大小为151G
编译前注意事项
关闭电脑睡眠
我编译成功花了6个小时,为了不影响编译,需要把主机和虚拟机的睡眠功能关闭
Windows11关闭睡眠,打开“控制面板”
1、“电源选项”-“更改计划设置”,将“使计算机进入睡眠状态”改为“从不”,显示器可根据需要设置关闭的时间
2、点击“更改高级电源设置”,将“硬盘”-“在此时间后关闭硬盘”的时间改为0
ubuntu的休眠设置可以参考下文
ubuntu20.04禁止自动休眠的几种方式_ubuntu设置不休眠_zeeq_的博客-CSDN博客
https://blog.csdn.net/weixin_44120025/article/details/123184263
调低虚拟机CPU内核数
如果虚拟机处理器内核总数和主机的内核数一致,编译开始后主机会很卡,建议比主机内核数低1-2个
增加交换空间
编译时提示最少需要16G的内存,实际上我分配了20G内存后来也编译失败了,建议内存+交换空间要达到30G,而Ubuntu的交换空间只有2G
安装一些软件包
sudo apt install libssl-dev libffi-dev gnupg flex bison gperf zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses-dev x11proto-core-dev libx11-dev zlib1g-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
源码编译
使用envsetup.sh脚本初始化环境,lunch后选择需要编译的镜像,或者直接指定,如lunch sdk_car_x86_64-userdebug
$ cd aosp
$ source build/envsetup.sh
$ lunch
编译类型分为user、userdebug、eng
user:用来正式发布到市场的版本,权限受限,如没有root权限、不能dedug、adb默认处于停用状态。
userdebug:在user版本的基础上开放了root权限和debug权限,adb默认处于启用状态,一般用于调试真机。
eng:开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置,一般用于模拟器。
执行make进行编译,使用-j指定线程数,Google推荐执行源码编译的线程数=CPU核心数x2+2
$ make -j8
编译完成后执行emulator可启动模拟器
$ emulator
删除上次的编译结果
$ make clobber
编译中出现的问题
问题1 拉代码报错
Checking out: 3% (41/1053) device/google/barbet-sepolicyfatal: 该操作必须在一个工作区中运行
error.GitError: Cannot checkout device/google/bonito: Cannot initialize work tree for device/google/bonito
error: Cannot checkout device/google/bonito
Checking out: 3% (41/1053), done in 2.008s
error: Unable to fully sync the tree.
error: Checking out local projects failed.
Failing repos:
device/google/bonito
Try re-running with "-j1 --fail-fast" to exit at the first error.
按照提示操作无效,网上也没找到解决方法,后面把aosp目录删除,重新解压aosp-latest.tar,再拉代码就正常了
问题2 编译出错,日志文件为空
02:13:41 ninja failed with: exit status 137
编译失败后控制台没有提示具体的错误,out目录下的error.log内容是空的,这种情况一般是内存不够,加大交换空间之后继续编译即可
编译成功后
要在Ubuntu虚拟机中成功启动模拟器,需要在VMWare中编辑虚拟机设置,在“处理器”选项中勾选“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(V)”,同时进行如下设置(不设置会提示“此平台不支持虚拟化的Intel VT-x/EPT”,无法启动Ubuntu)
Win11家庭版设置
1、在Windows命令行中输入services.msc,打开服务
2、找到 HV主机服务,设置为 禁用
3、打开Windows PowerShell(管理员),运行bcdedit /set hypervisorlaunchtype off
4、打开设置——隐私和安全——Windows安全中心——设备安全性——内核隔离,关闭“内存完整性”
5、重启计算机
如果是Win11专业版,还需关闭Hyper-V,之后重启计算机
参考资料
下载AOSP源码编译、调试、刷机 - 简书
https://www.jianshu.com/p/197096d3206d
感谢阅读,欢迎打赏。原创文章,未经允许不得转载。特别鄙视转载不注明出处者!