macOS Sonoma(14.2.1)通过Docker编译Android 12.1源码过程总结(MacBook Pro 2023-Apple M2 Pro)

前置条件


根据 Google 官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们在 Applic SiliconmacOS 系统是不能直接成功构建后续版本的,但是之前的版本可以在修改编译配置后成功编译,只是是否能正常运行存疑

另外,我们需要安装 Rosetta 2 支持运行部分 x86_64 应用。注意  Rosetta 2 只支持 64 位应用,不支持 32 位应用。 参考 Does Rosetta 2 support 32-bit Intel apps?

Important: Platform development on MacOS isn't supported as of June 22, 2021.

准备环境


创建大小写敏感分区

创建大小写敏感的 APFS 卷宗,相对于文件镜像,性能更好,尤其是针对 TimeMachine 更加友好。参考如下命令:

安装依赖

安装Docker Desktop

Docker Desktop 官网,安装最新版本的 Docker Desktop 安装包。

配置 Docker Desktop

启用 Docker Desktop 对于 x86_64 的支持

配置 Docker Desktop 可以调用的 CPU,内存,磁盘等资源

自定义Docker镜像脚本

构建编译镜像

运行镜像

代码拉取&构建

1.使用镜像下载Android源代码

清华大学的镜像

2.编译源代码

注意,如果执行 

的时候长时间卡住,Ctrl + C 停止之后报错:

则观察当前执行的进程,会发现名为 nsjail 的进程长时间卡住,并且 100% CPU 占用,如下:

nsjailAndroid 用于建立隔离环境,防止进程之间相互干扰的一个沙箱工具,功能类似 Docker

应用位于源代码的位置: prebuilts/build-tools/linux-x86/bin/nsjail

Rosetta 转译造成应用运行异常,最简单的方案,就是直接重命名或者删除 prebuilts/build-tools/linux-x86/bin/nsjail,让编译工具找不到 nsjail, 不使用沙箱进行编译即可。

如下:

针对警告 “Build sandboxing disabled due to nsjail error.” 可以直接无视。

如果报错:

则说明当前的 repo 版本太低,需要更新到最新版本。

执行如下命令:

如果报错:

这个需要修改源代码去除 build/soong/ui/build/proc_sync_test.go 对于文件锁定的检测代码,注释去掉如下代码:

如果报错:

报错内容提示的是 OpenJDK 64-Bit Server VM (11.0.4+0-5935077) for linux-amd64 运行异常。

Java 代码完全可以使用 ARM64 版本的 Java 进行编译。

我们可以链接 ARM64Java 编译器到指定的目录,执行如下命令:

运行镜像

选择 system-qemu.imgvendor-qemu.img,这两个镜像是专门为 qemu 运行制作的,如果选择 system.img vendor.img,则 avd 运行失败。

上面运行起来的镜像是从 /Volumes/aosp/aosp/out/target/product/emulator_arm64/hardware-qemu.ini 读取配置信息的,但是这个文件直接修改无效。我们如果需要修改参数,只能从启动参数中设置。

比如我们如果需要增大内存,开启 GPU 的支持,则执行如下命令:

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注