努力
加油

使用阿里云部署手机模拟器做自动化测试有哪些步骤?

在阿里云上部署手机模拟器进行自动化测试,核心逻辑其实和自建机房差不多,但痛点在于网络延迟、GPU资源分配以及多开稳定性。很多团队直接拿 ECS 跑 Android 模拟器(如雷电、MuMu 企业版或官方 Genymotion),结果发现要么卡顿到无法接受,要么因为带宽限制导致 UI 操作超时。

下面我按实际落地经验,梳理一套比较稳健的方案。主要基于 ECS(云服务器) + Android 模拟器集群 + Appium/Selenium 架构。

一、 选型与准备阶段

  1. 实例选型:必须选 GPU 实例或高主频实例

    • 误区:很多人为了省钱买通用型 g6/g7 系列,结果跑模拟器时 CPU 占用率 100%,UI 渲染极慢。
    • 建议:如果预算允许,优先选择带 GPU 提速的实例(如 gn4、gn5 系列,或者最新的 GPU 计算型)。如果没有 GPU 需求,至少选择高主频类型(如 c6、c7 的高配版本),保证单核性能。
    • 系统镜像:推荐 CentOS 7.9 或 Ubuntu 20.04/22.04 LTS。CentOS 对某些老旧自动化脚本兼容性更好,Ubuntu 社区资源更多。
  2. 网络规划

    • 内网互通:如果你后续要接入 CI/CD 流水线(如 Jenkins),确保 ECS 和 Jenkins Server 在同一 VPC 下,使用内网 IP 通信,避免公网带宽瓶颈。
    • 带宽策略:模拟器本身不消耗太多上行带宽,但如果需要远程查看画面(VNC/RDP)或传输大量 APK,建议购买固定带宽包或按需流量计费。
  3. 软件准备

    • 操作系统依赖:Linux 内核需支持 KVM(阿里云 ECS 默认开启虚拟化辅助)。
    • ADB 驱动:需要在 Linux 环境下安装 Android SDK Platform-Tools。
    • 模拟器软件:推荐使用 MuMu 模拟器企业版(网易出品,对 Linux 支持较好,支持多开且资源隔离较好)或 Genymotion Cloud(如果是纯云端托管方案,不想自己维护 OS)。这里我们讨论的是自建场景,以 MuMu 或雷电 Linux 版为例。

二、 环境搭建步骤

1. 基础环境配置

登录 ECS 后,先更新系统并安装必要依赖:

# CentOS 示例
yum update -y
yum install -y wget unzip net-tools vim git python3-pip

# 安装 JDK (Appium 依赖)
yum install -y java-11-openjdk-devel

# 验证 Java 版本
java -version

2. 安装 ADB 和 Android SDK

从 Google 或国内镜像下载 platform-tools:

wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
unzip platform-tools-latest-linux.zip
mv platform-tools /usr/local/
echo 'export PATH=$PATH:/usr/local/platform-tools' >> ~/.bashrc
source ~/.bashrc
adb version

3. 部署模拟器

假设你使用的是 MuMu 模拟器企业版(通常提供 .sh 安装包):

chmod +x mumu-enterprise-linux-x86_64.sh
./mumu-enterprise-linux-x86_64.sh --install-dir /opt/mumu

安装完成后,启动第一个实例:

/opt/mumu/bin/mumu start instance1

4. 配置无头模式与端口映射(关键)

为了让自动化脚本能控制模拟器,你需要将模拟器的 ADB 端口映射到宿主机,或者直接使用模拟器的远程调试接口。

  • 方法 A:本地 ADB 连接
    模拟器启动后,会监听 localhost:5037。你需要确保你的自动化框架(如 Appium)通过 localhost 连接。但在容器化或多机调度时,这会有局限。

  • 方法 B:端口转发(推荐用于远程调用)
    在 ECS 的安全组中放行特定端口,然后在模拟器内部设置 ADB 监听 TCP 端口:

    adb shell setprop service.adb.tcp.port 5555
    adb kill-server
    adb start-server
    # 此时可以通过 ip:5555 连接该设备

三、 自动化框架集成

推荐使用 Appium 作为核心驱动,因为它对 Android 原生应用支持最好。

  1. 安装 Appium Server

    npm install -g appium
    appium --version
  2. 编写 Capabilities 配置
    在 Python 或 Java 脚本中,指定连接到 ECS 上的模拟器:

    from appium import webdriver
    
    desired_caps = {
        "platformName": "Android",
        "deviceName": "emulator-5554",  # 对应模拟器的 ADB ID
        "appPackage": "com.example.test",
        "appActivity": ".MainActivity",
        "automationName": "UiAutomator2",
        "noReset": True,
        "fullReset": False,
        "unicodeKeyboard": True,
        "resetKeyboard": True
    }
    
    # 注意:host 指向你的 ECS 内网 IP
    driver = webdriver.Remote("http://<ECS_IP>:4723/wd/hub", desired_caps)
  3. 多开集群管理
    如果需要同时运行 10 台模拟器,手动管理会很痛苦。建议使用 MuMu 的多开功能 或编写 Shell 脚本批量启动:

    for i in {1..10}; do
        /opt/mumu/bin/mumu start instance$i
        sleep 5  # 等待每个实例初始化完成
    done

四、 常见问题与优化技巧

  1. CPU 占用过高

    • 模拟器是重量级进程。如果单核性能不足,会出现“假死”。
    • 解决:限制每个模拟器的 CPU 核心数(如果模拟器支持),或者减少并发数量。对于高并发场景,考虑拆分任务,不同批次使用不同的 ECS 实例。
  2. 网络不稳定导致断连

    • 阿里云 ECS 的内网 DNS 有时解析较慢。
    • 解决:在模拟器内部或宿主机 /etc/resolv.conf 中配置公共 DNS(如 223.5.5.5 或 8.8.8.8)。
  3. 截图与日志获取

    • 自动化测试失败时需要截图。由于 ECS 没有图形界面,不能直接用 printscreen。
    • 解决:通过 ADB 命令截图:
      adb -s emulator-5554 shell screencap -p /sdcard/screen.png
      adb pull /sdcard/screen.png ./screenshots/
  4. 成本优化

    • 抢占式实例(Spot Instance):如果测试是非实时、可中断的(如夜间回归测试),强烈建议使用阿里云的抢占式实例,价格仅为按量付费的 10%-20%。记得设置“自动释放”策略,并在代码中加入重试机制。
    • 弹性伸缩(ESS):结合 OSS 存储测试结果图片,通过 ESS 根据队列长度动态增减 ECS 节点,实现真正的云原生自动化。

五、 替代方案对比

方案 优点 缺点 适用场景
自建 ECS + 模拟器 完全可控,成本低,数据私有 运维复杂,需处理驱动、网络、稳定性 长期稳定运行,对数据隐私要求高
真机云平台(如 Testin、WeTest) 无需运维,机型丰富,即开即用 成本高,定制性差,网络延迟可能较高 短期爆发测试,兼容性问题排查
容器化模拟器(如 Docker+Genymotion) 轻量级,快速启停 需要较强的容器编排能力,GPU 直通复杂 微服务架构下的轻量级测试

总结

在阿里云上部署手机模拟器自动化测试,关键在于选择合适的 ECS 实例类型(重视 CPU/GPU 性能)和网络配置。不要试图用最低配的机器去扛多开压力。

建议起步阶段先用一台高配 ECS 跑通单点流程,再逐步扩展到多开集群。如果业务量大,最终会走向“ESS 弹性伸缩 + 抢占式实例 + 对象存储 OSS 归档日志”的云原生测试架构。