为AOSP 6构建定制的Android模拟器(ranchu)

10

我需要构建一个定制版本的Android模拟器,开始尝试重新构建AOSP 6.0.1 R62的模拟器源码,但未做任何更改。

令人惊讶的是,AOSP中不再包含模拟器源代码。模拟器似乎是预构建的,并存储在AOSP存储库中。经过一些研究,我成功地构建了qemu(ranchu)本身:

  1. 我下载了qemu源代码:

git clone -b qemu-android-2.2.0 \
https://android.googlesource.com/platform/external/qemu-android
  • 我从一个不同的代码库中下载了qemu的Android构建脚本:

  • git clone https://qemu-android.googlesource.com/qemu-ranchu
    
  • 我运行了qemu-ranchu/scripts/rebuild.sh

  • 该脚本构建了qemu,生成了一个名为qemu-system-aarch64的二进制文件,位于qemu-ranchu/binaries/linux-x86_64/。在AOSP中,也有一个同名文件位于$aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/,但这不是最终用户要执行的文件。Android开发人员会运行位于$aosp/prebuilts/android-emulator/linux-x86_64/下的可执行文件emulator,似乎这是一种包装裸的qemu二进制文件的方式。

    实际的问题是:

    1. 是否有任何关于ranchu构建及其所有内容的文档?我找不到 :(
    2. emulator*可执行文件是否包含qemu或它们会执行外部的qemu二进制文件?
    3. 如果我用自定义二进制文件覆盖aosp/prebuilts/android-emulator/linux-x86_64/qemu/linux-x86_64/中的qemu二进制文件,运行emulator是否会实际调用我的自定义qemu?
    4. 我能否跳过emulator,直接运行qemu-system-aarch64来启动AOSP镜像?还是这样做太疯狂了?
    5. 所有emulator*二进制文件的源代码在哪里?
    1个回答

    0

    "ranchu"模型是"goldfish"平台的下一代。它是"virt"板的轻量级调整,具有一些VirtIO设备(块、网络、控制台),以及自定义的para-virtualised "pipe"设备。这使得客户端的用户空间能够与主机通信,用于与主机上的adb通信以及加速OpenGL命令的传递接口等功能。

    "emulator"命令是一个包装器,正确地推测是主要(大量分叉)QEMU二进制文件的包装器。它提供了QEMU本身和模拟手机的皮肤显示之间的粘合剂。除了adb、控制台和GL之外,它还进行一些跟踪和内存监视。

    现在有一个更现代化的模拟器叫做cuttlefish,它放弃了一些更NIH谷歌的添加,并使用VirtIO作为更标准化的设备模型。模拟器本身基于CrosVM设计,可在KVM下运行,更适合在云中进行规模化测试。

    总结回答您的问题:

    1. 唯一真正的文档在源代码中。
    2. 模拟器执行外部分叉版本的QEMU。
    3. 也许,我似乎记得它构建的QEMU叫做“qemu-android”。
    4. 一个普通的QEMU构建很难工作,尽管您可能会花费足够的努力只获取Android的命令行版本。
    5. 代码在AOSP树中。

    我的(非常旧的)注释如下:

    repo init -u https://android.googlesource.com/platform/manifest -b emu-master-dev
    cd ${REPO_ROOT}external/qemu
    ./android-configure.sh --no-strip --debug
    make -j4
    
    #The actual "QEMU2" emulator will be in ../qemu-android but the qemu
    #directory includes all the wrapper programs you need. The emulator
    ##configure script overrides and replaces the upstream configure script
    #and ensures it is properly linked in with the OpenGL wrappers.
    
    export ANDROID_PRODUCT_OUT=/home/alex/lsrc/qemu/android/hackbox.generic
    ./objs/emulator -verbose -show-kernel -logcat '*:s' -selinux permissive -kernel ~/lsrc/qemu/linux.git/arch/arm/boot/zImage -sysdir /home/alex/lsrc/qemu/android/hackbox.generic -data userdata.img -ranchu -memory 2548 -qemu -d unimp,guest_errors
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接