You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在云服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:17:04