macOS Big Sur(11.7.5)编译Android 11.0源码过程总结

Android 11系统映像可直接将 ARM 指令转换成 x86 指令,因此以前很多需要真机测试的情况,现在只需要模拟器就可以进行操作了。

不过,根据官方博客 Run ARM apps on the Android Emulator 尾部的一段注意事项:

Note that the ARM to x86 translation technology enables the execution of intellectual property owned by Arm Limited. It will only be available on Google APIs and Play Store system images, and can only be used for application development and debug purposes on x86 desktop, laptop, customer on-premises servers, and customer-procured cloud-based environments. The technology should not be used in the provision of commercial hosted services.

这段事项说明,自己编译的镜像是没办法用上这个功能的,必须是Google编译好的镜像。

前置条件


  • macOS Big Sur(11.7.5)
  • Homebrew (1.1.9 或更高版本)
  • Xcode (13.2.1或更高版本)
  • Android Studio Electric Eel | 2022.1.1 Patch 2

注意:根据Google官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们只能构建之前的版本,或者之后发布的以前版本的补丁修复。目前测试最高只能编译到Android 12.0,  Android  12.1编译不通过。

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

准备环境


创建大小写敏感分区

如果文件系统不是大小写敏感的磁盘分区,则需要创建大小写敏感分区用于Android系统编译。

针对文件系统不是 AppleFS 的磁盘,建议创建大小写敏感的文件镜像并挂载。参考如下命令:

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

代码拉取&构建

运行镜像

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

上面运行起来的镜像是从/Volumes/aosp/AndSrc/out/target/product/generic_x86_64/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU的支持,则执行如下命令:

解决报错

解决方案

可以去 github 下载支持的SDK版本,然后解压缩到以下目录:

例如日志中支持的最新SDK版本是10.15,恰好Xcode 13.2.1支持的最低版本正好是这个版本,于是下载该版本并直接解压缩到上面的目录(也可本站下载),然后继续编译:

但是如果系统使用的是 Xcode (13.2.1或更高版本) 那么上面的操作之后,依旧不能解决错误。原因是 Xcode 13.2.1 版本开始,允许的最小 SDK 版本是 11.0。

如下图:

修改成 10.15 即可解决此问题。

如果出现如下报错信息:

解决方法:

根据Google官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们只能构建之前的版本,或者之后发布的以前版本的补丁修复。目前测试最高只能编译到Android 12.0,Android 12.1编译不通过。

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

编译支持ARM应用的镜像

尽管根据

Note that the ARM to x86 translation technology enables the execution of intellectual property owned by Arm Limited. It will only be available on Google APIs and Play Store system images, and can only be used for application development and debug purposes on x86 desktop, laptop, customer on-premises servers, and customer-procured cloud-based environments. The technology should not be used in the provision of commercial hosted services.

我们自己编译的镜像是没办法直接从源代码编译支持安装运行 ARM 应用的。

但是有两个变通方案:

  1. Google官方的 Android 11 镜像中提取需要的文件塞到我们自己编译的镜像里,参考方案: Adding ARM native bridge to the AOSP11 x86 emulatorandroid_vendor_google_emu-x86
  2. 使用 Intel Houdini 实现支持,参考方案:Include Intel Houdini in Android-x86

首先,我们尝试从Google官方的 Android 11 镜像中提取需要的文件,在 ubuntu 22.04 (macOS系统可自建虚拟机) 系统上执行如下脚本:

上述命令执行成功后,整个目录拷贝到 AOSP 代码的根目录。

也可本站下载已经完成提取的文件

执行如下命令编译:

使用Android Studio阅读源码

如无特殊说明,以下命令执行都在所下载源码的根目录下。

1、生成工程信息文件

依次执行以下命令,生成IDE工程信息文件 android.iprandroid.iml

2、修改Android Studio配置

加大VM内存:

修改文件大小限制,打开区分大小写选项

3、重启Android Studio

重启Android Studio使配置生效,然后用Android Studio打开第一步中生成的 android.ipr 文件,由于工程很大,需要较长的时间建立索引(我这台机器花了将近2个小时),请耐心等待。

4、创建JDK 1.8 (No Libraries)

此时当我们打开文件的时候,IDE会有以下提示

所以我们需要创建JDK 1.8 (No Libraries),点击 Configure...,然后选择Add JDK

直接选择jdk1.8.0_181.jdk/Contents/Homeopen之后JDK 1.8 (No Libraries)就创建好了

然后我们需要在项目的SDK 配置中删掉刚才创建的JDK 1.8 (No Libraries)中Classpath里面所有的jar,以保证跳转到AOSP的源码而不是系统安装的JDK中:

5、删除Modules中的dependencies

6、添加生成的资源文件ID目录

完成以上步骤然后同步一下,就可以愉快的在Android Studio中阅读Android源码了,相比于使用sublime等纯文本工具阅读代码,这种方式的优势在于在跟进方法调用时很方便,可以直接control+鼠标左键 进行代码跳转,而这种便捷的代价就是可能需要花上数天完成 环境配置 + 代码下载 + 源码整编。

参考链接


发布者

发表回复

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