无法在 Docker 容器中启动 Android 模拟器 x86_64(在 VM 中)

piw*_*iwi 5 android android-emulator docker

我在 VM(Debian 稳定版)中使用 Docker。我想在 Docker 容器中为 x86_64 运行一个 Android 模拟器。

以下是 Docker 镜像的构建方式:

FROM debian:stable

RUN apt-get update && apt-get install --yes curl unzip openjdk-8-jdk libqt5widgets5

RUN useradd foo --shell /bin/bash --create-home --user-group
USER foo

WORKDIR /home/foo
RUN curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip
RUN unzip sdk-tools-linux.zip && rm sdk-tools-linux.zip
RUN yes | tools/bin/sdkmanager 'system-images;android-24;default;x86_64' 'emulator' 'build-tools;26.0.1' 'platform-tools' 'platforms;android-24'
RUN echo no | tools/bin/avdmanager create avd --package 'system-images;android-24;default;x86_64' --name android-x86_64
Run Code Online (Sandbox Code Playgroud)

在容器内像这样启动模拟器时:

emulator/emulator -avd android-x86_64 -no-window -no-audio -no-boot-anim -no-accel -gpu off
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

emulator: WARNING: encryption is off
emulator: WARNING: x86_64 emulation may not work without hardware acceleration!
path /home/foo/.android/avd/android-x86_64.avd/system.img.qcow2
qemu-system-x86_64: -device virtio-blk-pci,drive=system,iothread=disk-iothread,modern-pio-notify: ioeventfd is required for iothread
Run Code Online (Sandbox Code Playgroud)

它似乎与硬件加速有关(是吗?)。不考虑这种环境(VM 内 Docker 内的模拟器)的目的性,是否有可能在这种上下文中运行模拟器?我该如何解决我的问题?

谢谢,

Mar*_*kus 3

我们正在使用(或尝试使用)这个完全相同的场景进行自动化测试。

问题:x86 和 x86_64 模拟器需要硬件加速。硬件加速(VT-X 或 AMD-V)通常在虚拟环境中不可用(请参阅:https://askubuntu.com/questions/328748/how-to-enable-nested-virtualization-in-ubuntu

这意味着您最好的选择是使用 ARM 模拟器,它的速度非常慢。在虚拟机内的 Docker 中运行它会更慢

您可以像这样创建模拟器:

# NOTE: Must use ARM, since x86 requires hardware acceleration, which is not available inside
# a docker container running inside a virtual machine
echo no | ${ANDROID_HOME}/tools/bin/avdmanager create avd \
 --abi "armeabi-v7a" \
 --device 'Nexus 4' \
 --force \
 --name arm_emulator \
 --package "system-images;android-25;google_apis;armeabi-v7a" \
 --sdcard 64M
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样启动模拟器:

${ANDROID_HOME}/emulator/emulator \
 -avd arm_emulator \
 -gpu swiftshader_indirect \
 -memory 512 \
 -no-audio \
 -no-boot-anim \
 -no-window &
Run Code Online (Sandbox Code Playgroud)

在我的本地计算机上的 Docker 中运行此命令需要模拟器大约 4-5 分钟才能完成启动。当 Docker 环境在 VirtualBox 中运行时,预计它会更慢。

即使这样工作,一些命令(例如通过 ADB 安装应用程序)也会失败,因为它们花费的时间太长。

如果可能的话,与虚拟机并行启动模拟器(例如在同一主机上)然后通过网络连接到模拟器可能是更好的选择。