前置条件
- macOS Sonoma (14.2.1) 强烈建议至少是这个版本的系统,更早的系统虚拟机稳定性存在问题 ( Fatal Error Encountered: Rosetta 2 Emulation with Java VM Inside Container #7068 )
- MacBook Pro 2023-Apple M2 Pro (4能效核、8性能核、32GB内存、2TB磁盘)
- Homebrew (4.0.28 或更高版本)
- Docker Desktop (4.27.2 或更高版本,从 4.27.0 版本开始集成文件系统报错问题的修正补丁(synchronized filesystem caches))
根据 Google 官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们在 Applic Silicon 的 macOS 系统是不能直接成功构建后续版本的,但是之前的版本可以在修改编译配置后成功编译,只是是否能正常运行存疑。
另外,我们需要安装 Rosetta 2 支持运行部分 x86_64 应用。注意 Rosetta 2 只支持 64 位应用,不支持 32 位应用。 参考 Does Rosetta 2 support 32-bit Intel apps?
准备环境
创建大小写敏感分区
创建大小写敏感的 APFS 卷宗,相对于文件镜像,性能更好,尤其是针对 TimeMachine 更加友好。参考如下命令:
注意:
上述命令可能失败:
原因为系统上的磁盘文件名可能已经不是 disk1 ,有可能已经变成 disk2 或者 disk3 ... 具体的磁盘名,参考下图:
安装依赖
安装Docker Desktop
去 Docker Desktop 官网,安装最新版本的 Docker Desktop 安装包。
配置 Docker Desktop
启用 Docker Desktop 对于 x86_64 的支持
配置 Docker Desktop 可以调用的 CPU,内存,磁盘等资源
自定义Docker镜像脚本
构建编译镜像
运行镜像
代码拉取&构建
1.使用镜像下载Android
源代码
清华大学的镜像
2.编译源代码
注意,如果执行
的时候长时间卡住,Ctrl + C 停止之后报错:
则观察当前执行的进程,会发现名为 nsjail 的进程长时间卡住,并且 100% CPU 占用,如下:
nsjail 是 Android 用于建立隔离环境,防止进程之间相互干扰的一个沙箱工具,功能类似 Docker 。
应用位于源代码的位置: prebuilts/build-tools/linux-x86/bin/nsjail
Rosetta 转译造成应用运行异常,最简单的方案,就是直接重命名或者删除 prebuilts/build-tools/linux-x86/bin/nsjail,让编译工具找不到 nsjail, 不使用沙箱进行编译即可。
如下:
针对警告 “Build sandboxing disabled due to nsjail error.” 可以直接无视。
如果报错:
则说明当前的 repo 版本太低,需要更新到最新版本。
执行如下命令:
如果报错:
这个需要修改源代码去除 build/soong/ui/build/proc_sync_test.go 对于文件锁定的检测代码,注释去掉如下代码:
如果报错:
报错内容提示的是 OpenJDK 64-Bit Server VM (11.0.4+0-5935077) for linux-amd64 运行异常。
而 Java 代码完全可以使用 ARM64 版本的 Java 进行编译。
我们可以链接 ARM64 的 Java 编译器到指定的目录,执行如下命令:
运行镜像
选择 system-qemu.img 和 vendor-qemu.img,这两个镜像是专门为 qemu 运行制作的,如果选择 system.img 和 vendor.img,则 avd 运行失败。
上面运行起来的镜像是从 /Volumes/aosp/aosp/out/target/product/emulator_arm64/hardware-qemu.ini
读取配置信息的,但是这个文件直接修改无效。我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启 GPU
的支持,则执行如下命令:
参考链接
- macOS Big Sur(11.7.5)编译Android 12.0源码过程总结
- ubuntu 20.04编译Android 11源代码&模拟器
- macOS Big Sur 编译Android11.0源码过程总结
- 代号、标记和 build 号
- AOSP 编译Android12源码全记录
- Android 开发者代码实验室
- macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码
- How can I download and install macOS 10.12 SDK?
- Fix depends on disabled module "libbit_field_derive" error when building.
- 搭建编译环境
- [android-building] Platform development on MacOS isn't supported as of June 22, 2021.
- Can I download AOSP and compile the Android OS on a MacBook or other macOS device?
- Platform development on MacOS isn't supported as of June 22, 2021.
- Building Android 11 for x86 with ARM compatibility
- 使用VsCode调试Android Framework C/C++源代码
- How to build AOSP on M1
- Error in compiling android (12) aosp on mac 13.3 m1 max
- Intel/Apple Silicon架构MacOS平台编译AOSP源码
- 在Mac平台使用Docker搭建AOSP(Android源代码)编译环境
- ubuntu 22.04.2编译Android 12.1源代码&模拟器
- 五、Docker 数据持久化存储与性能调优
- 如何提高 Docker 在 Mac 下的文件读写速度?
- 如何提升Docker for Mac性能
- docker性能分析命令 docker 磁盘性能 转载
- Speed boost achievement unlocked on Docker Desktop 4.6 for Mac
- File system performance improvements #1592
- Docker volumes 挂载时 cached 和 delegated 的区别和选择
- Docker 优化之 Docker-sync 解决 Docker 挂载缓慢
- Enabling aarch64 as a host architecture for Android Build (WIP)
- Re: [android-building] AOSP on aws a1 instance (arm)
- [Docker Desktop for Mac] - Support for running x86-64 binaries with Rosetta 2
- M1 和 Docker 谈了个恋爱
- Using Rosetta in a UTM Linux VM with Docker on Apple Silicon
- Running Intel Binaries in Linux VMs with Rosetta
- WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)
- Docker多架构支持-buildx构建多架构镜像
- Liviable now shares folders in Linux VMs, and should support Rosetta 2
- Running Intel Binaries in Linux VMs with Rosetta
- Rosetta in Docker
- macOS-Linux-VM-with-Rosetta
- 利用 Lima 在 M1 執行 x86 的 Ubuntu
- Compare Podman Desktop vs lima and see what are their differences.
- UTM:开源的多面手 macOS 虚拟机(更新到 2023.8.20)
- WSL Ubuntu 20.04下Android源码编译与导入Android Studio
- WSL进行aosp下载编译
- UTM:开源的多面手 macOS 虚拟机(更新到 2023.8.20)
- ubuntu server硬盘扩容(LVM)
- Build sandboxing disabled due to docker
- "Build sandboxing disabled due to nsjail error. This may become fatal in the future."
- google/nsjail
- Intel-on-ARM and ARM-on-Intel
- Intel/Apple Silicon架构MacOS平台编译AOSP源码
- MacOSX 11.6 下编译 AOSP android11 系统源代码
- FAILED: out/target/product/generic_arm64/obj/PACKAGING/vndk_intermediates/check-list-timestamp
- android-emulator-m1-preview
- 模拟器版本说明
- repo sync出现contains uncommitted changes错误解决办法
- boringssl_self_test_apex64 error, endless boot loop, emulator screen stuck on "Connecting to the Emulator"
- AVD (API 31) black screen
- Android-11 build for Raspberry Pi4
- arpi 11 : framework patch
- Build faild #71
- Android Emulator MacOS Development
- [android-kernel环境搭建]emulator_kernel
- AOSP sepolicy_tests_intermediates/sepolicy_tests error on building using MAC Catalina
- android/prebuilts/qemu-kernel
- make public aosp 11/10 build and run on M1
- Rosetta results with error for any AMD64 binary #5567
- Linux 使用strace命令查找进程卡死原因
- 内核futex的BUG导致程序hang死问题排查
- How to Install the Latest Mainline Linux Kernel Version in Ubuntu [GUI and Terminal Methods]
- Android Clang/LLVM Toolchain
- Android Clang/LLVM Prebuilts
- Android8.1源码编译问题集锦
- Source build Error Help #355
- Android dex2oat build:ERROR: Dex2oat failed to compile a boot image
- Compiling a deodexed AOSP?
- docker/roadmap
- [Docker Desktop] Improve Mac File system performance #7
- Volume synchronization bug on M1 Mac #6219
- virtiofs breaks initial startup of Postgres container #6270
你好!这里我没看明白,sudo apt install openjdk-11-jdk,安装的应该是 x86_64 的 jdk 吧?怎么得到了 usr/lib/jvm/java-11-openjdk-arm64 这种 arm64 的 jdk 呢?求解,感谢!
我这个地方写的不够规范,应该是 docker build --platform linux/amd64,linux/arm64 -f Dockerfile -t docker-aosp-jammy . 才对,构建的是多镜像平台才对,刚刚改过来了。
macOS系统上安装的虚拟机是ARM64的 ubuntu ,然后在 ARM64的ubuntu上通过 Rosetta 2 运行 x86的应用程序。因为 macOS 自身运行在ARM的CPU上,安装 ARM版本的ubuntu 可以直接通过ARM指令运行,没有任何转换开销。如果安装 x86 版本的 ubuntu 的话,性能就非常差了。
噢噢,试过了,docker 编译太慢了,尤其是读取文件。试了用OrbStack (https://orbstack.dev) 运行x86_64的Ubuntu会快很多很多!缺点是在编译最后构建.img镜像时失败了,试了把工作目录所在的APFS分区改为用ETX4分区更不行,直接Too many open files错误。
太感谢了 真是救我命了。在你这找到解决方法
谢谢兄弟,在你这找到解决方法了,真是救我命