macOS Ventura(13.6)/macOS Sonoma(14.0)编译Android 10.0/Android 11.0源码过程总结(MacBook Pro 2023-Apple M2 Pro)

前置条件


  • macOS Ventura(13.6)/macOS Sonoma(14.0) MacBook Pro 2023-Apple M2 Pro (4能效核、8性能核、32GB内存、2TB磁盘)
  • Homebrew (4.0.28 或更高版本)
  • Xcode Version 15.0 (15A240d)
  • Android Studio Giraffe | 2022.3.1 Patch 1

从Intel版本MacBook Pro迁移到MacBook Pro 2023(Apple M2 Pro)的设备,参考 从Intel版本MacBook Pro 2013迁移到MacBook Pro 2023(Apple M2 Pro)后HomeBrew报错"Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)" 重新安装 Homebrew

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

尝试过使用 Podman Desktop / Docker 方式进行编译、也尝试过借助 OrbStackLima 这些纯虚拟机通过安装 ubuntu 22.04 系统镜像的方式进行编译,结果都在执行 lunch 命令的时候长时间卡住,观察系统进程发现名为 nsjail 进程的 CPU 占用持续卡住在 100% 上无法继续编译,并且由于 Docker 或者虚拟机文件系统是 Linux 文件系统,而宿主机的文件系统是 AppleFS 文件系统,导致需要进行文件转换,中间的转换性能代价非常高,性能很差。

通过 UTM 虚拟机,使用 MacOS 提供的虚拟机执行编译的话,性能会更好。但是目前测试发现存在严重的文件系统缺陷,编译/大量文件复制过程中,经常出现文件系统损坏,导致编译失败。

需要在 M2 上使用UTM 虚拟机编译的,可以参考 macOS Sonoma(14.1.1)通过UTM虚拟机编译Android 11.0源码过程总结(MacBook Pro 2023-Apple M2 Pro) 通过 UTM 虚拟机借助 Rosetta 2 的方式进行编译。目前测试来看,性能勉强能用。

另外,我们需要安装 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 更加友好。参考如下命令:

安装依赖

代码拉取&构建

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

清华大学的镜像

2.Android 模拟器编译(必选)

如果报错:

则说明编译器版本太高,当前的编译配置中缺少指定版本的SDK导致的。

则在源代码代码目录下的 external/qemu/android/scripts/unix/gen-android-sdk-toolchain.sh 文件中找到 prepare_build_for_darwin / prepare_build_for_darwin_aarch64 这两个函数,然后在其中的 OSX_SDK_SUPPORTED 变量列表中增加 14.0 版本,如下:

修改完成后,继续执行上述的编译命令即可。

3.编译源代码

如果报错:

则手工删除 .flake8 这个目录,重新同步。

执行如下命令:

如果报错:

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

执行如下命令:

如果报错:

则需要撤销由于编译模拟器而进行的代码修复,否则无法成功切换代码分支,执行如下命令:

如果报错:

则需要查看自己电脑上安装的 MacOSX.sdk ,执行如下命令:

然后在 build/soong/cc/config/x86_darwin_host.go 文件中找到 "darwinSupportedSdkVersions" 添加 MacOSX.sdk 对应的版本号 14.0 。如下:

如果报错:

问题参考 https://stackoverflow.com/questions/47703239/ld-library-not-found-for-lrt,在旧的 Linux 系统中有 -lrtGNU libc 使用,但是在新的 glibc (after 2.17 from 2013) 之后就没有这个了。解决办法为在 external/v8/Android.bp 找到 -lrt 这一行,把整行全部注释掉。

可以简单的执行如下命令:

如果报错:

则参考 satckoverflow 上的说明,直接在 system/core/base/include/android-base/cmsg.h 中增加 PAGE_SIZE 定义,如下:

修改后的结果大致如下:

如果报错:

则需要在编译配置文件( build/soong/cc/config/x86_darwin_host.go )中的  "darwinCflags" 配置中,增加对 sprintf 不安全的警告的忽略( -Wno-deprecated-declarations ),如下:

如果报错:

则需要在编译配置文件( build/soong/cc/config/x86_darwin_host.go )中的  "darwinCflags" 配置中,增加对指针转换安全的警告的忽略( -Wno-incompatible-pointer-types ),如下:

如果报错:

原因为2021年1月8日 V8 升级导致的,我们直接强制回退 V8 版本到之前的版本,执行如下命令:

如果报错:

我们需要修改 frameworks/base/tools/aapt/Android.bp 移除 -D_DARWIN_UNLIMITED_STREAMS 的定义,可以执行如下命令:

如果报错:

这个问题是由于 macOS 不支持静态链接 libc++ 导致的,需要修改 system/sepolicy/tests/Android.bp ,移除 stl: "libc++_static" 这一行。

可以简单的执行如下命令:

如果报错:

这个原因是由于高版本的 macOS Sonoma(14.0) 已经默认不再内置 Python 2(默认内置的是 Python 3 )导致的,我们需要使用转换成 Python 3 格式的脚本。

转换后可用的脚本内容如下: