Ubuntu 22.04 搭建编译Android源码环境

环境准备

操作系统

编译Android源码需要一个区分文件大小写的系统环境,一般使用Ubuntu,可以采用单独安装Ubuntu、虚拟机等形式。这里使用VMware虚拟机的形式,具体安装过程省略,虚拟机及Ubuntu下载地址如下:

Download VMware Workstation Pro | CN
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
下载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 有补充和调整

  1. 创建bin文件夹
$ mkdir ~/bin
$ PATH=~/bin:$PATH
  1. 安装curl
$ sudo apt install curl
  1. 下载 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

posted @ 2022-12-28 17:22  fly263  阅读(4997)  评论(0编辑  收藏  举报