基于 Redroid 的无头 ADB 容器

Redroid 是一个专为云和容器环境打造的 Android 系统,它完美支持在无图形界面的服务器上运行,并通过 ADB 进行完全控制。

部分内容采用AI生成

步骤 1:准备宿主机(Gentoo)

确保内核支持 KVM 并已加载 kvm 模块。这是性能的关键。

# 检查 KVM 是否可用
ls -l /dev/kvm
# 如果不存在,加载模块并确保启动时自动加载
sudo modprobe kvm_intel # 或 kvm_amd
# 将用户加入 kvm 组
sudo usermod -aG kvm $USER
newgrp kvm # 或重新登录生效

步骤 2:创建并运行无头 Android 容器

我们使用 Docker 运行一个预配置好的 redroid 镜像,并只暴露 ADB 端口。

# 创建一个专用的 Docker 网络(可选,便于管理)
docker network create android-net

# 运行 Redroid 容器(无头模式)
docker run -d \
  --name android-arknights \
  --restart unless-stopped \
  --network android-net \
  --privileged \ # 必须的特权模式
  -p 5555:5555 \ # 将容器的 ADB 端口映射到宿主机
  -v /dev/kvm:/dev/kvm \ # 关键:透传 KVM 设备以实现硬件加速
  -v ./android-data:/data \ # 持久化 Android 数据(应用、游戏数据等)
  redroid/redroid:11.0.0-latest \ # 或指定 AMD64 架构的镜像 redroid/redroid:12.0.0_64only-latest
  androidboot.hardware=redroid \
  androidboot.console=ttyAMA0 \
  ro.boot.redroid_audio=null \ # 禁用音频(节省资源,脚本不需要)
  ro.boot.redroid_gpu_mode=auto \ # 或设置为 ‘host’ 如果遇到图形问题
  ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
  ro.product.cpu.abilist64=x86_64,arm64-v8a \
  ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi

关键参数解释:

  • -p 5555:5555: 将容器内部的 ADB 服务端口 (5555) 映射到宿主机的同一端口。MAA 和 adb 命令将通过 localhost:5555 连接。
  • -v ./android-data:/data: 将主机上的一个目录挂载为容器的 /data 分区。这可以持久化安装的应用(如《明日方舟》)和其数据,避免容器重建后游戏需要重新下载和更新。
  • ro.boot.redroid_audio=null: 禁用音频,减少不必要的资源开销。
  • ro.boot.redroid_gpu_mode=auto: 让 Redroid 自动选择最佳的图形渲染模式。对于脚本运行,即使使用软件渲染也是可以接受的。

步骤 3:通过 ADB 连接并控制容器

容器启动后,你就可以从宿主机(或同一网络下的其他机器)通过 ADB 与之通信。

# 1. 连接 ADB
adb connect localhost:5555

# 2. 查看设备状态
adb devices
# 应列出:localhost:5555 device

# 3. 安装《明日方舟》APK
adb install path/to/arknights.apk

# 4. 启动游戏(需要知道游戏的主 Activity)
# 通常可以用 monkey 命令来启动
adb shell monkey -p com.hypergryph.arknights 1
adb shell am start -n com.hypergryph.arknights/com.u8.sdk.U8UnityContext

# 5. 执行任何你需要的 ADB 命令或脚本
# 例如:截图、模拟点击、输入文本等

步骤 4:配置和使用 MAA

  1. 下载 Linux 版 MAA并解压。
  2. 打开 MAA,进入 设置 -> 连接设置
  3. 连接地址 中填写:127.0.0.1:5555
  4. 点击 检测连接。如果成功,MAA 就能识别到容器内的 Android 系统。
  5. 现在你可以在 MAA 中配置各种自动化任务(刷图、基建换班等),并完全通过命令行脚本触发它们。

自动化与管理脚本示例

你可以编写简单的 Shell 脚本来管理整个生命周期:

start_arknights.sh (启动容器和游戏)

#!/bin/bash
# 启动容器
docker start android-arknights

# 等待容器内的 ADB 服务就绪
sleep 10

# 连接 ADB
adb connect localhost:5555

# 启动游戏
adb shell monkey -p com.hypergryph.arknights 1

echo "Arknights container and game started."

stop_arknights.sh (停止容器)

#!/bin/bash
# 停止容器
docker stop android-arknights

# 断开 ADB 连接
adb disconnect localhost:5555

echo "Arknights container stopped."

方案优势总结

  1. 高度脚本化:整个环境(Android 系统本身)可以通过 Docker 命令一键创建、启动、停止和销毁。所有游戏操作都通过 ADB 协议进行,极易自动化。
  2. 资源高效:无图形界面、可禁用音频,只运行必要的 Android 服务,资源占用相对较低。
  3. 环境纯净且一致:Docker 容器保证了每次运行的环境都是完全一致的,避免了宿主机环境变化带来的问题,非常适合持续集成(CI)和定时任务。
  4. 部署简单:只需在拥有 Docker 和 KVM 支持的 Linux 服务器上运行一条命令即可搭建好整个安卓游戏环境。
  5. 易于扩展:可以很容易地同时运行多个容器(使用不同的外部端口,如 -p 5556:5555),实现多开。

这个方案完美契合了“脚本化运行、无需图形界面、远程连接操作”的核心需求,是实现自动化挂机和管理的最佳实践。


references: