在docker中部署alas+redroid+ws-scrcpy

在docker中部署alas+redroid+ws-scrcpy

在docker中部署alas+redroid+ws-scrcpy
Sakisaki Lv1

关于 Nvidia 显卡驱动

我个人不太推荐在NVIDIA平台上运行Redroid或WayDroid

无论是 ReDroid 还是 waydroid, 想要使用英伟达显卡进行硬件加速都需要使用 QEMU+virtio-gpu 的虚拟机环境。

相较于后者来说,redroid 在 QEMU 模拟器中仍需要使用 docker 来启动。因此你真的想要用N卡来加速模拟器, 我更推荐你参考此处来搭建一个无头 waydroid 环境, 本文只针对 redroid 环境, 对 waydroid 不多做讨论。

不过二者都支持使用软件渲染,在不使用显卡的情况下也可以正常运行。此外 redroid 还支持N卡的开源驱动 nouveau, 如果你不需要用显卡来做其他图形计算可以考虑安装此驱动来进行硬件加速。

需要的工具

示例环境

本文默认你能访问所有互联网环境。如果遇到任何问题,请搜索相关项目文档以及Google。

  • 系统: ArchLinux
  • 内核: linux-zen (6.12.4.zen1-1)
  • 显卡: AMD Lucienne
  • CPU: AMD Ryzen 7 5700U
  • 显卡驱动: amdgpu

准备工作

安装Docker

直接安装 Docker Desktop 是安装 Docker 最方便的方式。如果你不想安装桌面应用,可以参考官方文档来安装。

1
2
3
4
5
6
7
8
# 安装
$sudo pacman -S docker docker-compose

# 启动 docker
$sudo systemctl enable --now docker

# 将当前用户加入到 docker 组
$sudo usermod -aG docker $USER

安装android-tools

1
$sudo pacman -S android-tools

更换内核

关于N卡: 如果你不是nouveau驱动, 那么更换为 zen 内核时,需要安装对应的 dkms 版本的 nvidia 驱动。

1
$sudo pacman -S linux-zen linux-zen-headers

安装完成后,更新 grub。

1
2
$sudo grub-mkconfig -o /boot/grub/grub.cfg
$sudo reboot

部署

在部署时出现问题,请参考对应项目的官方文档、本文的注意事项和Google。

以下所有操作均在同一文件夹下进行

1
2
$mkdir alas
$cd alas

编写 ws-scrcpy 镜像

因为 ws scrcpy 并没有官方的 docker 镜像,因此我们需要自己构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
FROM node:16

WORKDIR /ws-scrcpy

RUN npm install -g node-gyp \
&& apt update; apt install android-tools-adb -y \
&& git clone https://github.com/NetrisTV/ws-scrcpy.git . \
&& npm install \
&& npm run dist \
&& echo '#!/bin/sh\n\
\n\
until adb devices | grep -w $DEVICE; do \n\
echo "Waiting for ($DEVICE) to connect..."; \n\
sleep 1; \n\
adb connect $DEVICE\n\
done\n\
\n\
node dist/index.js' > /usr/local/bin/wait-for-device.sh \
&& chmod +x /usr/local/bin/wait-for-device.sh

EXPOSE 8000

ENTRYPOINT ["sh", "/usr/local/bin/wait-for-device.sh"]

创建 docker-compose.yml

先拉取 AzurLaneAutoScript 仓库到本地

1
$git clone https://github.com/LmeSzinc/AzurLaneAutoScript.git

然后在当前文件夹下创建docker-compose.yml, ws-scrcpy 和 alas 都在 compose 中构建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
services:
redroid:
container_name: redroid
image: redroid/redroid:14.0.0_64only-latest
stdin_open: true
tty: true
privileged: true
restart: always
ports:
- "5555:5555"
volumes:
- ./data14:/data
command:
- androidboot.redroid_width=1280
- androidboot.redroid_height=720
- androidboot.redroid_gpu_mode=auto

ws-scrcpy:
container_name: wssc
build: .
tty: true
privileged: true
restart: always
depends_on:
- redroid
environment:
- DEVICE=redroid:5555
ports:
- "8000:8000"
volumes:
- ./scrcpy-web/:/data

alas:
container_name: 'alas'
image: 'alas'
restart: always
ports:
- "22267:22267"
volumes:
- './AzurLaneAutoScript/:/app/AzurLaneAutoScript:rw'
- '/etc/localtime:/etc/localtime:ro'
build:
context: ./AzurLaneAutoScript/deploy/docker/
dockerfile: ./Dockerfile

修改配置

redroid 本身就是使用 docker 驱动的,因此官方文档中就提供了详细的配置选项,直接在 redroid 的 command 下添加即可。

想要修改 ws-scrcpy 的配置,需要将 docker-compose.yml 中的 ws-scrcpy 部分修改为如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ws-scrcpy:
container_name: wssc
build: .
tty: true
privileged: true
restart: always
depends_on:
- redroid
environment:
- DEVICE=redroid:5555
- WS_SCRCPY_PATHNAME=/data/config.yaml
ports:
- "8000:8000"
volumes:
- ./scrcpy-web/:/data

然后在 ./scrcpy-web/config.yaml 中就可以定义 ws-scrcpy 的配置。关于具体的配置示例,请参考此处

安装游戏

下载游戏到本地,然后通过 ADB 安装到redroid。

1
2
3
$wget https://pkg.biligame.com/games/blhx_8.2.1_0820_1_20240830_041443_51682.apk
$adb connect 127.0.0.1:5555
$adb -s 127.0.0.1:5555 install blhx_8.2.1_0820_1_20240830_041443_51682.apk

启动

关于 Docker 和 docker-compose 的一切内容,请参考官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
$docker compose up -d

## 停止
# docker compose stop

## 启动
# docker compose start

## 重启
# docker compose restart

## 卸载
# docker compose down

启动后,访问 http://localhost:8000/ 即可看到 ws-scrcpy 界面。访问 http://localhost:22267/ 可看到 alas 界面。

alas 配置中,在 Alas > Alas设置 > 模拟器设置 > 模拟器Serial 下填入 redroid:5555 就能连接到模拟器了。

(可选) 在手机上访问 redroid

这里推荐 甲壳虫ADB助手,输入地址后可以通过adb连接到redroid,非常好用。

注意事项

ws-scrcpy 无法访问

ws-scrcpy 无法访问的大部分情况都是由于无法连接到模拟器导致的。

首先查看 ws-scrcpy 是否正常运行

1
$docker logs wssc

如果出现了如下提示,代表 ws-scrcpy 无法连接到 redroid。

1
2
3
4
5
6
7
8
9
10
11
12
13
$docker logs wssc
* daemon not running; starting now at tcp:5037
* daemon started successfully
unable to connect to redroid:5555: No route to host
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...
Waiting for (redroid:5555) to connect...

此时就需要判断是不是 redroid 无法启动,尝试在本地连接到 redroid

1
2
3
4
$adb connect redroid:5555
* daemon not running; starting now at tcp:5037
* daemon started successfully
already connected to redroid:5555

如果本地连接成功,那么可以手动连接

1
$docker exec -it wssc bash -c 'adb connect redroid:5555' 

redroid 无法启动/黑屏/scrcpy没有界面

在本地尝试 adb 连接 redroid 时,如果出现如下提示,代表 redroid 无法启动。

1
failed to connect to redroid:5555

redroid 无法启动可能是多种原因导致的,例如显卡驱动、gpu模式、内核、Android版本等。具体情况请根据自己的设备环境仔细查询官方文档issues
这里提供这种几种可能的解决方案:

使用软件渲染

redroid 的默认显卡模式是 auto,他会优先调用本地的显卡进行渲染。如果你的显卡不支持就可能出现黑屏或无法启动的问题。

此时需要在 docker-compose.yml 中修改 redroid_gpu_nodeguest 来使用软件渲染。

1
2
3
4
5
redroid:
...
command:
...
- androidboot.redroid_gpu_mode=guest

如果还是无法解决问题,就代表当前不是显卡驱动导致的。

更换 Android 版本

Android 版本是个非常玄学的部分。对于不同的设备和游戏,可能只有某个版本的 Android 才能正常运行。

可以更换 redroid 的镜像来更换 Android 版本。需要注意的是不同的 Android 版本间的 data 文件夹不能通用

redroid 目前支持的 Android 版本如下:

  • Android 15 (redroid/redroid:15.0.0-latest)
  • Android 15 64bit only (redroid/redroid:15.0.0_64only-latest)
  • Android 14 (redroid/redroid:14.0.0-latest)
  • Android 14 64bit only (redroid/redroid:14.0.0_64only-latest)
  • Android 13 (redroid/redroid:13.0.0-latest)
  • Android 13 64bit only (redroid/redroid:13.0.0_64only-latest)
  • Android 12 (redroid/redroid:12.0.0-latest)
  • Android 12 64bit only (redroid/redroid:12.0.0_64only-latest)
  • Android 11 (redroid/redroid:11.0.0-latest)
  • Android 10 (redroid/redroid:10.0.0-latest)
  • Android 9 (redroid/redroid:9.0.0-latest)
  • Android 8.1 (redroid/redroid:8.1.0-latest)

redroid 没有网络

首先检查本地设备是否能正常访问互联网。

这通常是N卡驱动导致的,尝试将 redroid 更改为软件渲染查看是否能解决问题。

参考

https://github.com/NetrisTV/ws-scrcpy
https://github.com/remote-android/redroid-doc/issues/282#issuecomment-1339173984
https://github.com/remote-android/redroid-doc/issues/594

评论