阅读 483

安卓11源码编译教程与排错指南(安卓反编译教程)

安卓11已经发布了很长一段时间了,网上也有很多有关安卓11编译的教程,但是我个人在参照这些教程进行编译时候遇到了很多大坑,历尽千辛万苦终于是把它编译出来了,现在我对编译过程作出一些总结,包括我个人编译中遇到的问题和解决方案,提供给大家作为参考,说不定也可以帮助电脑前的你解决困惑,话不多说,先上图为证。

02.jpg
安卓11编译成功后使用emulator启动效果

零、准备工作

在开始之前,您的开发工作站必须达到或超出以下硬件要求:

  • 如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。

  • 如果要检出代码,至少需要 250 GB 可用磁盘空间;如果要进行构建,则还需要 150 GB。如果要进行多次构建,则需要更多空间。

  • 至少需要 16 GB 的可用 RAM,但 Google 建议提供 64 GB。

从 2021 年 6 月起,Google 使用 72 核机器,内置 RAM 为 64 GB,完整构建过程大约需要 40 分钟(增量构建只需几分钟时间,具体取决于修改了哪些文件)。相比之下,RAM 数量相近的 6 核机器执行完整构建过程需要 3 个小时。

操作系统

如果您要针对 AOSP master 分支进行开发,请使用 Ubuntu 18.04 (Bionic Beaver)。

警告:自 2021 年 6 月 22 日起,安卓操作系统不再支持在 Windows 或 MacOS 上进行构建。

JDK

AOSP 中的 Android master 分支带有预构建版本的 OpenJDK;因此无需另行安装。
旧版 Android 需要单独安装 JDK。在 Ubuntu 上,请使用 OpenJDK。

一、下载

1、REPO下载

由于传统的aosp获取方式在国内是行不通的,所以我们采用repo镜像地址进行repo工具的下载。

mkdir ~/bin PATH=~/bin:$PATH curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo chmod a+x ~/bin/repo 复制代码

因为Android源码引用了很多开源项目,每一个子项目都是一个Git仓库,每个Git仓库都有很多分支版本,为了方便统一管理各个子项目的Git仓库,需要一个上层工具批量进行处理,因此repo诞生。repo实际上是由一系列的Python脚本组成的,这些Python脚本通过调用Git命令来完成自己的功能。

2、修改REPO工具

repo工具在每次使用时,都会访问repo源更新自己,这是repo的设计者为了保持版本一致性而设计的,同样,reop源地址在国内无法连接,所以我们需要用镜像地址替换之前的源地址。

# 编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的: REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo' 复制代码

3、建立工作目录(名字任意)

mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY 复制代码

4、源码下载

由于aosp源码规模庞大,故您需要在网络良好的情况下完成本步,这里提供两种方式进行aosp源码的下载,您可以根据自身情况酌情选择。

(1)使用每月更新的初始化包

由于首次同步需要下载约 95GB 数据,过程中任何网络故障都可能造成同步失败,好在清华大学镜像站为我们提供了初始化包进行初始化。
下载 mirrors.tuna.tsinghua.edu.cn/aosp-monthl…,下载完成后记得根据 checksum.txt 的内容校验一下。
由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。
使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包 tar xf aosp-latest.tar cd AOSP   # 解压得到的 AOSP 工程目录 # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录 repo sync # 正常同步一遍即可得到完整目录 # 或 repo sync -l 仅checkout代码 复制代码

此后,每次只需运行 repo sync 即可保持同步。

(2)传统初始化方法

初始化仓库:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest 复制代码

如果需要某个特定的 Android 版本(列表):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1 复制代码

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

repo sync 复制代码

当您成功同步源码树之后,您将在您的终端看到如下结果:

... 正在检出文件: 100% (15779/15779), 完成.检出文件:   7% (1251/15779)    正在检出文件: 100% (29/29), 完成.  正在检出文件:  27% (8/29)    Syncing work tree: 100% (568/568), done. 复制代码

目前安卓源码实测整个下载下来需要130G左右的空间,这一部将耗费您至少2小时以上时间,具体时间视您的网络环境而定。

二、源码编译

源码下载成功后,我们就要开始编译环节了,在这一部Android官网提供了较为详细的介绍,但是我实际编译后遇到了无法启动模拟器的情况,这是由于,如果现在使用lunch,你是看不到sdk_phone_x86_64这个选项的,而实际上该mk文件是存在的,只能lunch这个版本,其他的都是针对专有设备的,会导致模拟器无法正常工作

1、设置环境

使用 envsetup.sh 脚本初始化环境:

source build/envsetup.sh 复制代码

2、选择目标 [lunch]

使用 lunch 选择要构建的目标。lunch product_name-build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m 和其他类似命令的调用读取。
确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整构建,并且启用所有调试功能。

lunch sdk_phone_x86_64 复制代码

注意安卓官网这步给出的lunch aosp_arm-eng在实际编译完成后是无法正常运行的,这个是很大的坑,很多人都是在这一步卡住了很久,真正能在模拟器上运行的是sdk_phone_x86_64

如果在没有参数的情况下运行,则 lunch 会提示您从菜单中选择目标。

所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

构建类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置

3、构建代码

使用 m 构建所有内容。m 可以使用 -jN 参数处理并行任务。如果您没有提供 -j 参数,构建系统会自动选择您认为最适合您系统的并行任务计数。

m 复制代码

一般来讲,多线程编译可以选择的最佳线程是您处理器核心的4倍,逻辑线程的两倍,比如,我的编译主机CPU为8核16线程,所以我可以选择使用32线程进行编译,编译命令变成了 m -j32

4、启动模拟器

编译流程会自动将模拟器添加到您的路径中。如需运行模拟器,请输入以下命令:

emulator 复制代码

如果一帆风顺的话,在这一步您已经可以看到由自己亲手构建的安卓系统已经跑在了模拟器上,但正如前文所说,编译过程大多不是一帆风顺的,如果您遇到了问题,您可以参看下面的问题排查

[附录]问题排查

1、repo出现语法错误

如果您运行repo init或其他有关repo的命令时出现了类似以下的输出,说明您使用的安repo版本与您电脑系统的python版本不匹配。

File "./repo" line 175 except OSError e: SyntaxError: invalid syntax 复制代码

值得注意的是,google官方已经放弃了repo python2.x版本,现有的repo使用的是python3.x版本,您需要更新您的python版本到3.x或者使用如下命令使用repo(其中 ~/bin/repo是您的repo所安装的路径):

python3 ~/bin/repo 复制代码

2、'userdata-qemu.img': No such file or directory

如果您运行emulator命令出现了以下输出,说明您在lunch这一步选择了专用于其他设备的安卓系统,您需要重新执行lunch sdk_phone_x86_64这个命令进行选择,并重新构建您的安卓源码。

root@xxx:~/aosp# emulator emulator: Android emulator version 30.7.4.0 (build_id 7479360) (CL:N/A) emulator: WARNING: encryption is off handleCpuAcceleration: feature check for hvf cannot add library /root/aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/lib64/vulkan/libvulkan.so: failed added library /root/aosp/prebuilts/android-emulator/linux-x86_64/lib64/vulkan/libvulkan.so emulator: ERROR: VkCommonOperations.cpp:537: Failed to create Vulkan instance. qemu-system-x86_64: Could not open '/root/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory 复制代码

3、Unable to connect to adb daemon on port: 5037

如您运行emulator的时候出现了以下输出,说明您的adb工具还未运行。

emulator: ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037 复制代码

您需要执行以下代码运行adb工具

adb start-server 复制代码

以上就是我编译安卓11源码的全流程与遇到的问题,其实编译安卓源码花费了我近一个月的时间,有很多大坑小坑都没能及时的记录下来,如果您在编译过程中遇到了其他错误,也非常欢迎您在下方留言,如果我正巧遇到过,就可以为您提供一些参考,同时也可以把这篇文章的排错指南丰富一下。


作者:wiseFeng
链接:https://juejin.cn/post/7043063280704684063


文章分类
ANDROID
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐