Mac Arm架构 Android 11源码编译环境及 pixel3 刷入

182 阅读5分钟

硬件配置要求

本机配置:

  • 设备:MacBook Pro
  • 芯片:Apple M1 Max
  • CPU 核心:10 核(8 性能核心 + 2 能效核心)
  • 内存:32 GB
  • 外接存储:三星 T7 1TB(若系统预留空间大于 400GB,可不需要)
  • 系统版本:macOS 15.5

参考资料:


存储空间准备

方案一:创建大小写敏感的磁盘镜像

# 创建稀疏磁盘镜像
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 350g ~/android.dmg

# 挂载磁盘
hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

# 卸载磁盘
hdiutil detach /Volumes/android

# 扩容(如需要)
hdiutil resize -size 400g ~/android.dmg.sparseimage

方案二:使用外接硬盘

格式化时请选择:区分大小写,日志式 格式

  • 最好禁用索引,不然每次连接硬盘都要读写,很麻烦

image.png


源码分支选择

~/bin/repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r36

# 同步
~/bin/repo sync -j15

⚠️ 重要提醒image.png

在 Mac 上编译时,必须选择 2021年6月22日之前 的分支,否则会遇到各种兼容性问题。

分支查找步骤:

  1. 访问 Android 源码标记和版本
  2. 选择合适的分支版本

image.png


设备驱动下载

  1. 记录 Build ID:例如 RQ2A.210505.002
  2. 下载驱动:访问 Google Android 驱动页面

image.png

  1. 安装驱动

    • 解压下载的驱动文件

    • 将驱动文件导入 Android 源码目录

image.png

*   在命令行中运行两个驱动安装脚本
*   输入 `I ACCEPT` 接受许可协议

image.png


编译源码

# 环境准备
source build/envsetup.sh
# 选择编译目标,可单独运行 lunch 查看支持哪个
lunch aosp_blueline-userdebug 
# 开始编译(使用多线程)
m -j10

image.png


刷机流程

  1. 解锁设备:启用开发者选项,解锁 OEM
  2. 进入 Fastboot 模式:重启设备到 fastboot 模式

image.png

  1. 执行刷机

    fastboot flashall -w
    

image.png

image.png

导入 Android Studio

生成项目文件:

# 编译 idegen 工具
mmm development/tools/idegen/

# 生成 IDE 项目文件
./development/tools/idegen/idegen.sh

导入步骤:
使用 Android Studio 打开生成的 Android.ipr 文件

image.png


常见问题解决

1. ulimit 文件句柄限制

错误现象:

[100% 57/57] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
error: external/robolectric-shadows/processor/Android.bp:63:1: module "Robolectric_processor_tests_resources": glob: open /Volumes/android/Android11/external/robolectric-shadows/processor/src/test/resources/mock-source/org/robolectric/shadow: too many open files
error: packages/inputmethods/LatinIME/common/Android.bp:15:1: module "latinime-common" variant "darwin_common": glob: open /Volumes/android/Android11/packages/inputmethods/LatinIME/common/src: too many open files
error: external/robolectric-shadows/shadowapi/Android.bp:5:1: module "Robolectric_shadowapi" variant "darwin_common": glob: open /Volumes/android/Android11/external/robolectric-shadows/shadowapi/src/main/java: too many open files
error: cts/tests/framework/base/windowmanager/translucentapp/Android.bp:15:1: module "cts-wm-translucent-app": glob: open /Volumes/android/Android11/cts/tests/framework/base/windowmanager/translucentapp/src/android/server: too many open files
error: external/guava/Android.bp:34:1: module "guava-both" variant "darwin_common": glob: fcntl: too many open files
error: external/python/setuptools/Android.bp:15:1: module "py-setuptools" variant "darwin_x86_64_PY2": glob: open /Volumes/android/Android11/external/python/setuptools/pkg_resources/_vendor: too many open files
error: external/python/rsa/rsa/Android.bp:14:1: module "py-rsa" variant "darwin_x86_64_PY2": doesn't have any source files!
error: tools/acloud/Android.bp:174:1: module "acloud_reconnect" variant "darwin_x86_64_PY2": doesn't have any source files!
error: tools/acloud/Android.bp:139:1: module "acloud_setup" variant "darwin_x86_64_PY2": doesn't have any source files!
error: tools/acloud/Android.bp:182:1: module "acloud_pull" variant "darwin_x86_64_PY2": doesn't have any source files!
error: external/python/pyasn1-modules/pyasn1_modules/Android.bp:14:1: module "py-pyasn1-modules" variant "darwin_x86_64_PY2": doesn't have any source files!
error: frameworks/base/tools/codegen/Android.bp:12:1: module "codegen-version-info" variant "darwin_common": glob: fcntl: too many open files
error: external/protobuf/Android.bp:617:1: module "libprotobuf-java-full" variant "darwin_common": glob: fcntl: too many open files
error: frameworks/wilhelm/Android.bp:30:1: module "libOpenSLES_ndk_headers": srcs ["include/SLES/**/*.h"] matched zero files
error: libcore/tools/upstream/Android.bp:19:1: module "libcore-compare-upstreams" variant "darwin_common": glob: fcntl: too many open files
error: external/libchrome/Android.bp:690:1: module "jni_registration_generator" variant "darwin_x86_64_PY2": glob: fcntl: too many open files
error: frameworks/base/tools/sdkparcelables/Android.bp:1:1: module "sdkparcelables" variant "darwin_common": glob: fcntl: too many open files
error: frameworks/base/tools/locked_region_code_injection/Android.bp:1:1: module "lockedregioncodeinjection" variant "darwin_common": glob: fcntl: too many open files
error: hardware/interfaces/common/aidl/Android.bp:1:1: module "android.hardware.common-api" (created by module "android.hardware.common_interface"): glob: open /Volumes/android/Android11/hardware/interfaces/common/aidl/aidl_api/android.hardware.common/current: too many open files
error: system/tools/aidl/build/Android.bp:98:1: module "test-piece-2-api" (created by module "test-piece-2_interface"): glob: open /Volumes/android/Android11/system/tools/aidl/build/aidl_api/test-piece-2/current: too many open files
error: system/tools/aidl/build/Android.bp:111:1: module "test-piece-3-api" (created by module "test-piece-3_interface"): glob: fcntl: too many open files
error: hardware/interfaces/graphics/common/aidl/Android.bp:1:1: module "android.hardware.graphics.common-api" (created by module "android.hardware.graphics.common_interface"): glob: open /Volumes/android/Android11/hardware/interfaces/graphics/common/aidl/aidl_api/android.hardware.graphics.common/current: too many open files
error: hardware/interfaces/power/aidl/Android.bp:15:1: module "android.hardware.power-api" (created by module "android.hardware.power_interface"): glob: fcntl: too many open files
error: cts/tests/tests/binder_ndk/libbinder_ndk_test/Android.bp:15:1: module "libbinder_ndk_test_interface-api" (created by module "libbinder_ndk_test_interface_interface"): glob: open /Volumes/android/Android11/cts/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current: too many open files
12:08:45 soong bootstrap failed with: exit status 1

#### failed to build some targets (01:55 (mm:ss)) ####

解决方案:
~/.zshrc 文件中添加以下配置:

ulimit -n 65536
ulimit -u 2048

2. 分支选择注意事项

⚠️ 关键提醒

  • Mac 编译环境必须选择 2021年6月22日之前 的分支
  • 违反此规则会导致各种编译问题

3. 系统架构限制

⚠️ 架构兼容性

  • Apple 芯片的 VM 虚拟机无法有效编译高版本 Android
  • AOSP 主要针对 x86_64 架构优化
  • VM 环境只能安装 ARM 版本的 Ubuntu 镜像,存在兼容性问题

总结

  • 在Mac环境(Apple芯片)下编译Android 11源码时,关键在于必须选择2021年6月22日之前的分支版本,否则可能因架构兼容性问题导致编译失败或启动时卡在LOGO界面。

  • 个人建议优先采用虚拟硬盘方式,以避免Mac每次连接硬盘时进行检测。如果条件允许使用Ubuntu系统,强烈推荐选择Ubuntu,以减少不必要的麻烦。(需注意,Arm架构的Mac只能安装Arm版本的Ubuntu虚拟机,而在该环境下编译AOSP仍可能遇到问题。如果有条件使用Windows系统,建议直接选择Windows系统以提升效率。)