硬件配置要求
本机配置:
- 设备: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
方案二:使用外接硬盘
格式化时请选择:区分大小写,日志式 格式
- 最好禁用索引,不然每次连接硬盘都要读写,很麻烦
源码分支选择
~/bin/repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r36
# 同步
~/bin/repo sync -j15
⚠️ 重要提醒:
在 Mac 上编译时,必须选择 2021年6月22日之前 的分支,否则会遇到各种兼容性问题。
分支查找步骤:
- 访问 Android 源码标记和版本
- 选择合适的分支版本
设备驱动下载
- 记录 Build ID:例如
RQ2A.210505.002 - 下载驱动:访问 Google Android 驱动页面
-
安装驱动:
-
解压下载的驱动文件
-
将驱动文件导入 Android 源码目录
-
* 在命令行中运行两个驱动安装脚本
* 输入 `I ACCEPT` 接受许可协议
编译源码
# 环境准备
source build/envsetup.sh
# 选择编译目标,可单独运行 lunch 查看支持哪个
lunch aosp_blueline-userdebug
# 开始编译(使用多线程)
m -j10
刷机流程
- 解锁设备:启用开发者选项,解锁 OEM
- 进入 Fastboot 模式:重启设备到 fastboot 模式
-
执行刷机:
fastboot flashall -w
导入 Android Studio
生成项目文件:
# 编译 idegen 工具
mmm development/tools/idegen/
# 生成 IDE 项目文件
./development/tools/idegen/idegen.sh
导入步骤:
使用 Android Studio 打开生成的 Android.ipr 文件
常见问题解决
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系统以提升效率。)