Android 13 源码下载与编译
最近在研究Android源码定制相关的内容,刚好在B站上看高乐高
大佬的课程,就跟着学习,也顺便整理一下资料写点博客,毕竟目前互联网上关于这方面的内容确实比较少,同时也感谢高乐高
大佬的免费课程,干货满满。
接下来我们进入正题:
本文在Ubuntu 22.04 下进行,由于Google推荐使用Ubuntu进行Android系统编译与开发,因此默认阅读本文的同学电脑中已经安装了了Ubuntu系统,并拥有一定的Linux基础。
同时,本文所使用的的Ubuntu已经配置了清华的Ubuntu软件源,若一些软件下载比较慢的同学可以参考如下地址进行配置:
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
一些可有可无的话
由于众所周知的原因,我们很难从Google的官方代码库中下载aosp,因此本文使用中科大的镜像,北方的同学可以使用清华的
-
中科大aosp镜像使用帮助:AOSP 镜像使用帮助 — USTC Mirror Help 文档
-
清华aosp镜像使用帮助:AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
建议编译以及开发aosp时在一个专用的文件夹里面进行,我是在用户根目录下创建了一个Android目录,但是这个目录在安装Android Studio的时候SDK也是下载在该目录的,路径如下:~/Android/Sdk
,而aosp的目录是~/Android/aosp
其实并不冲突,但是介意的同学可以另建一个目录进行
cd ~ # 进入到用户根目录
mkdir Android # 创建Android 文件夹
cd Android # 进入刚创建的文件夹
一、下载aosp
下载之前我们需要保证Ubuntu中安装了wget,没有下载的同学可以使用如下命令安装:
# sudo apt update # 没有进行软件源更新的可以调用
sudo apt install wget -y
接下来我们使用中科大的镜像下载aosp
# 这里我们添加 -c 参数表示断点续传
wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar
执行完该命令之后根据你的网速可能需要等待40分钟或更久(主要看你的网络情况,这个文件有70G,如果你的网速比较快的话可能下得比较快,反之越慢)
当下载完了之后我们对文件做一下md5码校验,以防没有下载完全或文件损坏等
md5sum aosp-latest.tar
我们拿运行的结果来跟https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar.md5
的内容做比对,若md5一致则表示文件没有问题,就可以进行下一步操作了
当文件下载无误之后我们就可以把aosp-latest.tar
文件解压了
tar xvf aosp-latest.tar
由于这个文件比较大,因此可能需要等待20~30分钟,当然这跟你的硬盘性能有关。当文件解压完成之后我们就可以在该目录下看到有一个aosp
文件夹了,如果我们这个时候进去会发现这个文件夹只有一个.repo
文件夹,并没有任何代码,这是因为我们下载的仅仅是一个相当于一些配置文件的东西,我们还要进行代码同步,.repo
文件夹的作用就与Git项目的.get
文件夹类似
在等待的时候可以再开一个终端来参照下面的教程安装与配置一些需要的环境
二、同步Android 源码
在拉取Android源代码之前我们需要确认机器中安装了需要的环境
2.1 安装Git
首先我们安装与配置git
,已经安装并配置好的同学可以跳过这步
sudo apt install git -y
当安装好了之后我们再调用如下命令配置Git
git config --global user.email xxx@qq.com
git config --global user.name "xxxxx"
2.2 安装 repo
接下来我们安装repo
mkdir ~/.repo # 在用户根目录创建一个.repo的文件夹,用于下载repo
# 下载repo 到用户根目录下的.repo文件夹
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.repo/repo
# 给repo文件授予权限
chmod a+x ~/.repo/repo
# 将.repo 目录添加到环境变量中
echo "PATH=~/.repo:\$PATH" >> ~/.bashrc
# 使.bashrc 生效
source ~/.bashrc
安装了repo之后我们还要给repo配置国内源,否则进行代码同步的时候可能会出现异常
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'
2.3 安装Python
由于repo
是由一系列python脚本组成,因此我们还需要安装python环境,repo其实用的是python2 但是为了避免出现一些状况我们就把python3 也安装了
#Ubuntu中默认安装了python3,可以调用一下python3命令,如果有了的话可以跳过这步
sudo apt install python3 -y
sudo apt install python2 -y
如果安装好了之后我们调用一下 python2
命令可以发现已经开启了python2终端,但是我们调用python命令的话还是提示没有找到该命令,因此我们需要添加一个软链接
sudo ln -s /usr/bin/python2 /usr/bin/python
注意如果执行python命令的时候提示的python版本是python3 也要执行一下这个命令才可以,但是在执行之前需要先执行如下命令删除掉之前设置的软链接
sudo rm -rf /usr/bin/python
如果这里成功了我们就可以运行python命令了
2.4 安装JDK
网上的一些教程是要我们安装openjdk 8 但是我在编译的时候提示了jvm版本过低的错,因此我们直接安装openjdk11 即可
sudo apt update # 更新Ubuntu软件源
sudo apt install openjdk-11-jdk -y # 安装openjdk 11
2.5 安装编译依赖项
安装好了上面的软件那之后我们要再安装一些软件包来支持源码编译
sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libncurses5
2.6 同步Android 源码
当我们配置好了所需的环境之后我们就可以同步Android源代码了,这里我同步的是android-13.0.0_r24
cd aosp # 进入源码目录
指定源码版本,建议指定前先查看aosp镜像有没有该版本
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24
如果我们看到repo has been initialized in /home/zhen/Android/aosp
这个提示表示已经初始化完成,此时就可以进行下一步了
同步Android 源码
repo sync
由于Android源码比较庞大,所以这个步骤需要等待20分钟左右
三、源码编译
3.1 初始化编译环境
当Android源码同步完了之后,我们就可以开始编译Android源码了
首先我们要初始化编译环境
source build/envsetup.sh
执行这个命令没有任何报错即可进行下一步,值得注意的是,这个命令在每次我们重新打开一个终端进行编译等操作的时候都要执行一遍
3.2 清除编译内容
第一次编译的时候我们需要将之前编译的内容清除掉(按理说这步不用也可以,但是为了防止后面出现什么乱七八糟的问题所以就执行一下)
make clean
3.3 选择编译版本
接下来我们要先选择一个要编译的版本之后就可以进行编译了
这个部分我们可以执行lunch
命令之后再选择你想要编译的版本
You're building on Linux
Lunch menu .. Here are the common combinations:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_barbet-userdebug
4. aosp_bluejay-userdebug
5. aosp_bluejay_car-userdebug
6. aosp_bramble-userdebug
7. aosp_bramble_car-userdebug
8. aosp_car_arm-userdebug
9. aosp_car_arm64-userdebug
10. aosp_car_x86-userdebug
...
65. rb5-userdebug
66. sdk_car_arm-userdebug
67. sdk_car_arm64-userdebug
68. sdk_car_portrait_x86_64-userdebug
69. sdk_car_x86-userdebug
70. sdk_car_x86_64-userdebug
71. sdk_pc_x86_64-userdebug
72. silvermont-eng
73. uml-userdebug
74. yukawa-userdebug
75. yukawa_sei510-userdebug
Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng):
也可以在lunch
命令后添加参数,添加参数有两种方式,我使用的是第二种方式
- 使用序号编译
lunch 1 # 与 lunch aosp_arm-eng 等价
- 使用版本名称编译使用序号编译
lunch sdk_phone_x86_64-userdebug
phone
-> 编译的是手机的固件
x86_64
-> 编译的是x86架构 64位的系统
userdebug
-> 这个是指编译的固件类型,可选参数有user、userdebug、eng,他们的区别如下
需要注意的是,从Android12 开始,如果需要编译虚拟机固件需要编译带sdk前缀的版本
3.4 开始编译
选择完了编译版本之后我们就可以开始进行编译了
make -j8
这个j6代表使用6的线程进行编译,这个参数看你的CPU参数与内存,即最大线程数不能超过CPU支持的最大线程数,但是如果你的内存比较小就得选择较小的线程数,我们可以在编译报了137错误的时候适当选择小一点的线程数或者增加交换空间大小,但是建议交换空间大小不超过内存的一半,比如你的内存是16G的就可以设置为8G,如果你的内存是32G的就可以设置为16G
交换空间的设置方法可以参考这篇博客:ubuntu调整交换空间 - 简书
编译这个部分的时间是最久的,可能得等上4个小时以上,当然如果你的CPU性能比较好时间就会少一点
3.5 验证是否编译成功
当我们编译完了之后就可以执行如下命令来启动虚拟机,以验证是否编译成功
emulator
四、错误解决
4.1 A new version of repo (XXX) is available.
这个错误表示repo有更新的版本,因此我们要将~/.repo
目录下的repo文件替换为.repo/repo
下的repo文件
# 在aosp目录下执行
cp .repo/repo/repo ~/.repo/repo
然后再执行刚刚报这个错误的命令就看可以了
4.2 编译到一半终端闪退了
我有一台旧主机,i5-6500 - 16G内存的,我在上面编译就会出现这个问题,然后换到新主机上就没事,暂时不知道是内存小还是什么原因
参考资料
这里只是部分参考的文献,有一些文章因为我当时急于解决问题所有忘了记录了,后面就找不到了,因此就不贴出来了
高乐高521的个人空间-Android13 逆向 ROM定制ART定制入门系列-哔哩哔哩视频
jdk版本对应的java版本数字-青岛软件培训-Java培训-Python培训学校-万码学堂
AOSP 镜像使用帮助 — USTC Mirror Help 文档