AOSP源码编译

下载AOSP源码

根据中科大的来:AOSP 镜像使用帮助 — USTC Mirror Help 文档

这里我用的是第二种方法,虽然不推荐,但是必须得尝试一下。

首先是下载 repo 工具:

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

如果 repo 已经下载好了,但是使用不了 repo 指令,需要重新加载环境,执行如下指令:

1
2
PATH=~/bin:$PATH
//chmod a+x ~/bin/repo (应该不需要)

然后在桌面建一个文件夹(名称任意),并进入到该目录下:

1
2
mkdir AOSP_COMPILE
cd AOSP_COMPILE

在该目录下初始化仓库(可以使用 -b 来指定Android版本,我这里直接指定了Android10版本的):

1
2
//指定Android10版本
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1

最后同步源码树(以后只需执行这条命令来同步):

1
repo sync

如果在同步中失去连接,重新执行该命令即可,它会在之前下载断开的位置开始继续下载。

编译AOSP

编译前的环境配置

在开始编译AOSP之前,我们需要配置好编译环境。

下载工具

  1. 下载 libncurses5

    1
    2
    3
    4
    //32-bit 机器
    sudo apt-get install libncurses5:i386
    //64-bit 机器
    sudo apt-get install libncurses5

    否则会出现如下错误:

    1
    2
    3
    prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: 
    error while loading shared libraries: libncurses.so.5:
    cannot open shared object file: No 15:44:33 ninja failed with: exit status 1

    (参考Android 源码 (AOSP) 下载与编译 - 掘金 (juejin.cn)

  2. 安装 openjdk-8

    系统内置的 openjdk-11 太新了,会报错,装个官网要求的 openjdk-8 。

    华为镜像源中下载jdk,我这里下载的是 jdk-8u191-linux-x64.tar.gz。需要根据自己的虚拟机架构选择,通过以下命令可以查看虚拟机架构:

    1
    uname -m

    然后将其解压缩到 /usr/lib/jvm 目录下(如果没有该目录就创建一下):

    1
    2
    3
    4
    //创建目录,存在该目录可忽略该命令
    sudo mkdir /usr/lib/jvm
    //解压
    tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/lib/jvm

    之后要给jdk配置环境,将以下命令添加到 ~/.zshrc中(普通用户目录下和root用户目录下尽量都添加) :

    1
    2
    3
    4
    export JAVA_HOME="/usr/lib/jvm/jdk1.8.0_191"  //你自己下载的jdk所在路径
    export JRE_HOME="${JAVA_HOME}/jre"
    export CLASSPATH=".:${JAVA_HOME}/lib:${JRE_HOME}/lib"
    export PATH="${JAVA_HOME}/bin:$PATH"

    最后使环境生效:

    1
    2
    source ~/.zshrc
    exec $SHELL

    此外,如果你安装了多个版本的jdk,可以通过如下命令切换:

    1
    sudo update-alternatives --config java

    最前面带星号的就是当前正在使用的java版本,通过键入编号选择使用哪个版本。

    (参考Linux之Ubuntu18.04安装Java JDK8的三种方式_ubuntu安装jdk8_软测小生的博客-CSDN博客中的第三种方法)

  3. 下载 m4

    1
    sudo apt install m4

    否则在编译的时候会报错,即找不到 m4 指令,如下图所示:

增大交换空间

执行如下指令:

1
2
3
4
5
6
//创建一个名为 swapfile 的文件,并将文件大小设置为 10GB
dd if=/dev/zero of=swapfile bs=1M count=10240
//将 swapfile 格式化为交换分区,用于在物理内存不足时作为虚拟内存的扩展
mkswap swapfile
//启动交换空间
sudo swapon swapfile

增大内存

我给虚拟机开了16G内存,在编译过程中,通过htop工具查看发现内存使用情况可以达到14G左右(没截图)。当然并不是要你给这么多,而是在合适的范围内尽量给虚拟机多一点内存。

增大JVM虚拟机的堆内存

执行如下指令增大JVM的堆内存:

1
2
3
4
//增大堆内存,设置初始堆内存大小为512MB,最大堆大小为 4GB
export JAVA_TOOL_OPTIONS="-Xms512m -Xmx4g"
//查看JVM的配置参数
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

否则可能会跟我一样,在编译过程中出现如下情况:

不过没关系,这并不会导致你需要重头开始编译,解决玩这个问题之后,重新执行 make -jx 即可(x为线程数,与虚拟机的cpu核数一致就可以了,多了也没多余的核来处理)。

开始编译AOSP

打开终端控制台,进入到源码目录中,执行如下命令:

1
source build/envsetup.sh

然后在编译前执行如下命令,用于删除构建过程中生成的所有中间文件、目标文件以及生成的可执行文件等,以便重新开始编译:

1
make clobber

在这之后,执行如下命令,然后选择你所需要编译的版本(版本可详细参考刷写设备 | Android 开源项目 | Android Open Source Project (google.cn)):

1
lunch

最后开始编译:

1
make -j4

当然,在100%的时候,他会执行 /device/generic/goldfish/tools/目录下的 mk_combined_img.py 文件,然后会报如下错误:

显然是由于使用python3编译python2导致的,所以也很容易解决。首先确定你下载了python2,其次修改 mk_combined_img.py 文件中的首行,将#!/usr/bin/python 改成 #!/usr/bin/python2

(参考/device/generic/goldfish/tools/mk_combined_img.py”,第48行打印”‘%s‘无法转换为整数“% lin[2]-腾讯云开发者社区-腾讯云 (tencent.com)

如果幸运的话,应该就可以得到如下结果,这意味着我们编译成功了!

可在 /out/target/product/generic_x86_64 目录下查看到编译出的 img 文件(generic_x86_64 是我选择的编译版本)。


参考:

死磕Android_AOSP编译过程 - 知乎 (zhihu.com)

2020年安卓源码编译指南及FART脱壳机谷歌全设备镜像发布-安全客 - 安全资讯平台 (anquanke.com)

Android 源码 (AOSP) 下载与编译 - 掘金 (juejin.cn)

AOSP 镜像使用帮助 — USTC Mirror Help 文档

Linux之Ubuntu18.04安装Java JDK8的三种方式_ubuntu安装jdk8_软测小生的博客-CSDN博客


AOSP源码编译
http://example.com/2023/08/28/Android安全/AOSP源码编译/
作者
gla2xy
发布于
2023年8月28日
许可协议