简介

旨在让你能在Mac上运行可自行定制的模拟器和Android系统.

分两个部分,分别编译模拟器emulator和AOSP模拟器镜像, 其中以Android 14为例.

准备

DepotTools

1
2
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/path/to/depot_tools:$PATH

显然你必须将/path/to/depot_tools正确替换为实际路径

其中,export命令最好加到.bashrc中,让你的所有终端都能生效

拉取qemu源码并编译

用于将编译得到的镜像运行起来

注意:这一步可以跳过,因为AOSP源码自带一个emulator.如果你想研究emulator的实现才需要自行编译

1
2
3
4
5
6
mkdir emu
cd emu
repo init -u https://android.googlesource.com/platform/external/qemu --depth=1
repo sync -qcj 4
cd external/qemu
python android/build/python/cmake.py --target=darwin_aarch64

如果repo init有问题,可以改用git.可以切到一个稳定的分支,如aosp-emu-30-release

1
git clone https://android.googlesource.com/platform/external/qemu

其中,emu的源码在这,感兴趣可以研究

1
https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-master-dev
  • 最后一个python命令会进行大量target的初始化.当你看到终端输出表明编译已经开始了,那么终止这个编译,直接用如下这个命令能让你编译更快
1
ninja -C objs install/strip

编译产物:

1
/path/to/external/qemu/objs/distribution/emulator

签名:

1
./sign-objs-binaries.sh

这一步将编译得到的emulator及其相关产物进行签名

编译Android

编译Android比较麻烦.因为Mac的文件系统并不区分大小写…并不兼容AOSP.

因此,请在Linux下编译AOSP

1
2
3
4
mkdir aosp14
cd aosp14
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r20 --depth=1
repo sync -qcj 4

把这个patch打到build/make/target/board/emulator_arm64/BoardConfig.mk,移除32位支持: https://android-review.googlesource.com/c/platform/build/+/1518218

启动编译:

1
2
3
source build/envsetup.sh
lunch sdk_phone_arm64-userdebug
make -j12

其中,lunch的target有平板:sdk_tablet_x86_64, GooglePhone: sdk_gphone_arm64; 当然,它们都可以添加’-userdebug’

打包镜像

把产物打包到zip,放到Mac下面/Applications/Android\ Emulator.app/Contents/MacOS/aosp-master-arm64-v8a/

其中,产物打包脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
echo $ANDROID_PRODUCT_OUT
export ZIPPED_NAME=$1
mkdir -p $ZIPPED_NAME/files
cd $ZIPPED_NAME/files
cp $ANDROID_PRODUCT_OUT/system-qemu.img system.img
cp $ANDROID_PRODUCT_OUT/vendor.img vendor.img
cp $ANDROID_PRODUCT_OUT/ramdisk.img ramdisk.img
cp $ANDROID_PRODUCT_OUT/ramdisk.img ramdisk.img
if [ -f $ANDROID_PRODUCT_OUT/kernel-ranchu-64 ]; then
cp $ANDROID_PRODUCT_OUT/kernel-ranchu-64 kernel-ranchu-64
else
cp $ANDROID_PRODUCT_OUT/kernel-ranchu kernel-ranchu
fi;
cp -r $ANDROID_PRODUCT_OUT/data .
cp -r $ANDROID_PRODUCT_OUT/advancedFeatures.ini advancedFeatures.ini
cp -r $ANDROID_PRODUCT_OUT/userdata.img .
cp -r $ANDROID_PRODUCT_OUT/encryptionkey.img .
cp -r $ANDROID_PRODUCT_OUT/build.prop .
mkdir system
cp -r $ANDROID_PRODUCT_OUT/build.prop system/build.prop
cp -r $ANDROID_PRODUCT_OUT/VerifiedBootParams.textproto .
cp -r $ANDROID_PRODUCT_OUT/source.properties .

cd ..
zip -1rq $ZIPPED_NAME.zip files
ls -l $ZIPPED_NAME.zip

启动

直接打开Mac中emulator应用的图标,或者敲命令:

1
/Applications/Android Emulator.app/Contents/MacOS/emulator/emulator -avd foo

其中-avd是设备名称