在AOSP环境外启动AOSP虚拟机

研究特定版本的安卓CVE,但懒得编译AOSP,于是让朋友发来编译好的AOSP output目录,看我如何在Windows下把它运行起来。

错误方案尝试

  • 下载一个AndroidStudio里的emulator,将 emulator 的 文件全部替换为 AOSP 的image,无法启动
  • 使用 emulator.exe,手动指定各种参数,无法启动

正确方案省流

设置这两个环境变量,让 emulator.exe 自动识别和加载

ANDROID_BUILD_TOP 必须要有值,随便指定什么目录,例如 C:\temp
ANDROID_PRODUCT_OUT 必须要有正确的值,指向 C:\Users\LeadroyaL\temp\emulator_x86_64 目录,包含一堆img文件。

源码对应位置

https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-36-1-release/android/android-emu/android/main-common.c

当你运行 emulator 且这两个变量已设置时,模拟器的启动流程如下(基于 main-common.c):

  1. 选项初始化与解析 (emulator_parseCommonCommandLineOptions):
    • 初始化配置结构体,解析命令行参数(即使没有参数也会执行默认初始化)。
  2. 自动检测 AVD (createAVD):
    • 由于未提供 AVD 名称,模拟器尝试从环境变量 ANDROID_PRODUCT_OUT 获取路径。
    • 如果找到该路径且 ANDROID_BUILD_TOP 也存在,模拟器会调用 avdInfo_newForAndroidBuild,绕过标准的 AVD
      配置文件(.ini),直接根据编译输出目录创建虚拟设备信息。
  3. 硬件配置加载 (avdInfo_initHwConfig):
    • 根据编译目标(如 x86_64)加载默认的硬件配置。
  4. 镜像文件自动配置 (emulator_handleCommonEmulatorOptions):
    • 内核探测:在 ANDROID_PRODUCT_OUT 中寻找内核镜像(如 kernel-ranchu)。
    • 分区路径设置:自动将系统、厂商、数据、内存盘等分区的镜像路径指向 ANDROID_PRODUCT_OUT 下对应的 .img 文件。
    • 大小调整:读取这些镜像文件的实际字节数,并据此自动调整虚拟机分区的容量大小。
  5. CPU 加速检测 (handleCpuAcceleration):
    • 检测主机的硬件加速能力(如 Linux 上的 KVM)。如果是 x86 架构且未开启加速,模拟器通常会报错退出。
  6. 功能与特性初始化:
    • 初始化摄像头、网络加速、DNS 服务器、传感器等模拟组件。
  7. 引擎拉起:
    • 完成所有参数和路径准备后,模拟器最后将这些配置传递给底层引擎(通常是 QEMU2/Ranchu),从而正式拉起安卓系统。