我在VM(Debian Stable)中使用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
在容器内启动这样的模拟器时:
emulator/emulator -avd android-x86_64 -no-window -no-audio -no-boot-anim -no-accel -gpu off
我收到以下错误:
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
它似乎与硬件加速有关(是吗?)。无视这种环境的目的性(VM内的Docker中的模拟器),是否可以在这样的上下文中运行模拟器?我怎样才能解决我的问题?
谢谢,
答案 0 :(得分:2)
我们正在(或尝试使用)完全相同的方案进行自动化测试。
问题:x86和x86_64仿真器需要硬件加速。硬件加速(VT-X或AMD-V)通常在虚拟环境中不可用(请参阅:https://askubuntu.com/questions/328748/how-to-enable-nested-virtualization-in-ubuntu)
这意味着您最好的选择是使用ARM仿真器,这真的很慢。在VM内的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
然后您可以像这样启动仿真器:
${ANDROID_HOME}/emulator/emulator \
-avd arm_emulator \
-gpu swiftshader_indirect \
-memory 512 \
-no-audio \
-no-boot-anim \
-no-window &
在我的本地计算机上的Docker内部运行此程序需要模拟器大约4-5分钟才能完成引导。当Docker环境在VirtualBox内运行时,它会变得更慢。
即使可以正常工作,通过ADB安装应用程序之类的某些命令也会因为花费太长时间而失败。
如果可能的话,最好是与虚拟机(例如,在同一主机上)并行启动仿真器,然后通过网络连接到仿真器。