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 更加友好。参考如下命令:

注意:

上述命令可能失败:

原因为系统上的磁盘文件名可能已经不是 disk1 ,有可能已经变成 disk2 或者 disk3 ... 具体的磁盘名,参考下图:

安装依赖

安装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 的支持,则执行如下命令:

参考链接


发布者

《macOS Sonoma(14.2.1)通过Docker编译Android 12.1源码过程总结(MacBook Pro 2023-Apple M2 Pro)》上有6条评论

  1. 你好!这里我没看明白,sudo apt install openjdk-11-jdk,安装的应该是 x86_64 的 jdk 吧?怎么得到了 usr/lib/jvm/java-11-openjdk-arm64 这种 arm64 的 jdk 呢?求解,感谢!

    1. 我这个地方写的不够规范,应该是 docker build --platform linux/amd64,linux/arm64 -f Dockerfile -t docker-aosp-jammy . 才对,构建的是多镜像平台才对,刚刚改过来了。

      macOS系统上安装的虚拟机是ARM64的 ubuntu ,然后在 ARM64的ubuntu上通过 Rosetta 2 运行 x86的应用程序。因为 macOS 自身运行在ARM的CPU上,安装 ARM版本的ubuntu 可以直接通过ARM指令运行,没有任何转换开销。如果安装 x86 版本的 ubuntu 的话,性能就非常差了。

      1. 噢噢,试过了,docker 编译太慢了,尤其是读取文件。试了用OrbStack (https://orbstack.dev) 运行x86_64的Ubuntu会快很多很多!缺点是在编译最后构建.img镜像时失败了,试了把工作目录所在的APFS分区改为用ETX4分区更不行,直接Too many open files错误。

发表回复

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