如何在云服务器Docker容器中启用虚拟化以运行Android模拟器
Android模拟器在Docker容器中启用虚拟化的解决方案
问题背景
我正在开发一款自动化特定任务的管理应用,部分任务需与无所有权、无公共API的外部应用交互。为此搭建了基于WebdriverIO的Express服务器,用于自动化Android模拟器内操作,模拟器通过AVD Manager和Android Studio emulator启动。部署时选择Docker并将容器部署在云服务器上。
已配置好包含Express服务器、Appium、WebdriverIO、Android模拟器及所需二进制文件的容器,但运行容器时出现以下错误:
✔ Container android Recreated 0.1s Attaching to android android | INFO | Android emulator version 32.1.14.0 (build_id 10330179) (CL:N/A) android | INFO | Found systemPath /opt/android-sdk-linux/system-images/android-30/google_apis/x86_64/ android | WARNING | Please update the emulator to one that supports the feature(s): Vulkan android | WARNING | Failed to process .ini file /root/.android/avd/test.avd/quickbootChoice.ini for reading. android | ERROR | x86_64 emulation currently requires hardware acceleration! android | CPU acceleration status: /dev/kvm is not found: VT disabled in BIOS or KVM kernel module not loaded android | More info on configuring VM acceleration on Linux: android | https://developer.android.com/studio/run/emulator-acceleration#vm-linux android | General information on acceleration: https://developer.android.com/studio/run/emulator-acceleration. android | INFO | Crashreporting disabled, not reporting crashes. android | INFO | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag. android exited with code 1
当前配置文件
Docker Compose(docker-compose.yml)
version: "3.9" services: # rest: # ... # appium: # ... android: container_name: android privileged: true env_file: .env image: android command: opt/android-sdk-linux/emulator/emulator -avd test -netdelay none -netspeed full -no-window -no-audio -no-boot-anim -no-snapshot build: context: . dockerfile: dockerfile.android target: android
Dockerfile(dockerfile.android)
FROM ubuntu:20.04 AS android RUN apt-get update && \ apt-get install -y wget unzip openjdk-8-jdk-headless qemu-kvm \ libvirt-daemon-system libvirt-clients bridge-utils && \ rm -rf /var/lib/apt/lists/* RUN apt-get update && \ apt-get install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils && \ rm -rf /var/lib/apt/lists/* RUN adduser `id -un` libvirt RUN adduser `id -un` kvm RUN wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && \ unzip sdk-tools-linux-4333796.zip -d /opt/android-sdk-linux && \ rm sdk-tools-linux-4333796.zip ENV ANDROID_HOME=/opt/android-sdk-linux ENV PATH=$PATH:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools RUN yes | sdkmanager --licenses && \ sdkmanager "platform-tools" "platforms;android-30" "emulator" "system-images;android-30;google_apis;x86_64" RUN echo "no" | avdmanager create avd --force --name test --abi google_apis/x86_64 --package "system-images;android-30;google_apis;x86_64" --device "pixel" --tag "google_apis" CMD ["opt/android-sdk-linux/emulator/emulator", "-avd", "test", "-netdelay", "none", "-netspeed", "full", "-no-window"]
解决方案
核心问题分析
错误提示明确指出x86_64模拟器依赖硬件加速,但容器内无法访问宿主机的/dev/kvm设备,原因是宿主机未启用虚拟化支持,或容器未正确映射宿主机的虚拟化资源。
1. 宿主机层面配置
- 启用CPU虚拟化:确认宿主机CPU支持Intel VT-x/AMD-V,并在BIOS/UEFI中开启该选项;云服务器需在控制台开启嵌套虚拟化权限(部分服务商默认关闭)。
- 加载KVM内核模块:
sudo modprobe kvm # Intel CPU执行下方命令,AMD CPU替换为kvm_amd sudo modprobe kvm_intel - 验证KVM可用性:执行
ls /dev/kvm,能看到设备文件说明宿主机虚拟化环境已就绪。
2. Docker容器配置优化
修改docker-compose.yml
添加设备映射和共享内存配置,确保容器能访问宿主机的虚拟化资源:
version: "3.9" services: android: container_name: android privileged: true env_file: .env image: android # 增加-accel on强制启用硬件加速 command: opt/android-sdk-linux/emulator/emulator -avd test -netdelay none -netspeed full -no-window -no-audio -no-boot-anim -no-snapshot -accel on build: context: . dockerfile: dockerfile.android target: android # 映射宿主机kvm设备到容器内 devices: - /dev/kvm:/dev/kvm # 共享宿主机/dev/shm,解决模拟器内存不足问题 volumes: - /dev/shm:/dev/shm
优化Dockerfile.android
移除冗余操作,调整用户权限配置:
FROM ubuntu:20.04 AS android # 合并重复的依赖安装命令 RUN apt-get update && \ apt-get install -y wget unzip openjdk-8-jdk-headless qemu-kvm \ libvirt-daemon-system libvirt-clients bridge-utils && \ rm -rf /var/lib/apt/lists/* # 容器默认以root运行,直接将root加入kvm和libvirt组 RUN usermod -aG kvm,libvirt root RUN wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && \ unzip sdk-tools-linux-4333796.zip -d /opt/android-sdk-linux && \ rm sdk-tools-linux-4333796.zip ENV ANDROID_HOME=/opt/android-sdk-linux ENV PATH=$PATH:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools RUN yes | sdkmanager --licenses && \ sdkmanager "platform-tools" "platforms;android-30" "emulator" "system-images;android-30;google_apis;x86_64" RUN echo "no" | avdmanager create avd --force --name test --abi google_apis/x86_64 --package "system-images;android-30;google_apis;x86_64" --device "pixel" --tag "google_apis" # CMD中增加-accel on确保启用硬件加速 CMD ["opt/android-sdk-linux/emulator/emulator", "-avd", "test", "-netdelay", "none", "-netspeed", "full", "-no-window", "-accel on"]
3. 验证配置
启动容器后,进入容器执行ls /dev/kvm,若能看到设备文件说明KVM映射成功;重新运行模拟器命令,硬件加速错误应不再出现。
额外注意事项
- 部分云服务器机型仅支持嵌套虚拟化,需额外配置宿主机内核参数
- 保持模拟器命令中
-no-snapshot参数,避免快照导致的启动异常 - 若仍出现性能问题,可调整模拟器的内存分配(在AVD配置中修改)
内容的提问来源于stack exchange,提问作者Facundo Serrano
相关产品推荐
相关产品推荐

