如何在Mac M1设备上编译AOSP 6.0镜像并运行模拟器
解决Mac M1上编译并运行自定义AOSP 6.0镜像的问题
一、编译环境适配(Mac M1架构兼容)
AOSP 6.0原生工具链与M1的arm64架构不兼容,需通过Rosetta 2+Docker x86容器保证编译环境一致性:
- 先安装Rosetta 2:
softwareupdate --install-rosetta - 启动x86_64架构的Ubuntu 14.04容器(与你之前的Intel Linux编译环境一致):
docker run --platform linux/amd64 -it ubuntu:14.04 /bin/bash - 在容器内配置AOSP编译依赖(如
git、repo、openjdk-7-jdk等),再拉取并编译aosp-6.0.0_r6源码,避免直接在M1原生arm环境编译导致的产物兼容性问题。
二、编译目标与配置校验
编译时需严格对齐Android Studio官方镜像的编译参数:
- 执行
lunch sdk_phone_armv7-userdebug后,强制指定交叉编译环境变量:export ARCH=arm export CROSS_COMPILE=arm-linux-androideabi- export TARGET_ARCH=arm export TARGET_CROSS_COMPILE=arm-linux-androideabi- - 编译完成后,检查
out/build-info.txt,确认所有工具链均为x86版本的arm交叉编译器,避免混入arm64工具链产物。
三、模拟器启动参数优化(M1专属)
M1模拟器为arm64架构,运行armv7镜像需启用兼容层并调整启动参数:
- 使用AOSP编译产出的x86版
emulator二进制(路径:out/host/darwin-x86/bin/emulator),依赖Rosetta 2运行 - 启动时强制指定CPU架构、关闭快照并开启硬件加速:
./emulator -sysdir out/target/product/generic/ -system system.img -data userdata.img -ramdisk ramdisk.img -cpu cortex-a7 -memory 2048 -accel on -no-snapshot -no-snapshot-save - 提前验证硬件加速状态:执行
emulator -accel-check,确保返回accel: 0(表示虚拟化已开启,需在Mac系统设置→隐私与安全性中启用“虚拟化”选项)
四、兼容性补丁(解决启动卡死问题)
AOSP 6.0原生代码在M1模拟器上存在启动卡死问题,需针对性修改:
- 内核层面:修改
kernel/arch/arm/kernel/setup.c,添加对M1虚拟机CPU的识别兼容逻辑 - Init进程层面:修改
system/core/init/init.c,优化armv7进程在arm64主机下的启动流程 - 模拟器图形驱动:替换
external/qemu中的老旧渲染代码为Android Studio自带qemu的适配版本(针对Metal API做兼容)
五、替代方案:复用Android Studio官方AVD运行自定义镜像
若编译后直接启动仍有问题,可将自定义镜像替换到官方AVD目录:
- 找到Android Studio的armv7 Android 6.0镜像目录:
~/Library/Android/sdk/system-images/android-23/armeabi-v7a/ - 备份原有
system.img、userdata.img、ramdisk.img,将AOSP编译产出的对应文件复制到该目录 - 通过Android Studio启动该AVD,利用官方模拟器的M1适配逻辑完成运行
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

