在 ArchLinux 上通过树莓派的 Docker 运行 scrcpy 控制 Android 设备
前言
本文将详细介绍如何在 Arch Linux 系统上,通过 SSH 连接到无桌面环境的树莓派,利用 Docker 容器运行 scrcpy,并将图形界面转发到本地,实现对连接在树莓派上的 Android 设备的远程控制。
前提条件
- 树莓派已安装 Docker 并能正常运行
- Android 设备已开启 USB 调试并连接到树莓派
- Arch Linux 本地机能够通过 SSH 连接到树莓派
- 树莓派和本地机处于同一网络环境
核心原理
- 在树莓派上通过 Docker 容器运行 scrcpy(适配 ARM 架构)
- 利用 SSH 的 X11 转发功能,将容器内 scrcpy 的图形界面传输到 Arch Linux 本地
- 通过 ADB 实现容器与 Android 设备的通信
详细步骤
1. 配置 Arch Linux 本地环境
首先确保本地系统已安装必要的工具:
sudo pacman -Syu openssh xorg-xauth xorg-xeyes
测试本地 X 服务器是否正常工作:
xeyes # 应弹出一个带眼睛的窗口,移动鼠标会跟随
2. 验证 SSH X11 转发功能
使用 -Y 选项(比 -X 更宽松的安全策略)SSH 登录树莓派:
ssh -Y pi@树莓派IP
登录后,在树莓派上安装 X11 测试工具并验证转发是否生效:
# 在树莓派的 SSH 会话中执行
sudo apt install x11-apps # 安装测试工具
xeyes # 若 Arch Linux 本地弹出眼睛窗口,说明 X 转发正常
3. 准备 scrcpy 的 Docker 环境
方案 A:使用现有镜像
如果 ety001/scrcpy 镜像可用,可以直接使用:
# 在树莓派上拉取镜像
sudo docker pull ety001/scrcpy
方案 B:自行构建镜像(推荐)
如果现有镜像存在依赖问题,建议在树莓派上自行构建:
创建 Dockerfile:
FROM arm64v8/archlinux:latest # 或 arm32v7/archlinux(根据树莓派架构)
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm scrcpy adb ffmpeg sdl2 && \
rm -rf /var/cache/pacman/pkg/*
构建镜像:
sudo docker build -t scrcpy-arch-arm .
4. 启动 scrcpy 容器并转发图形界面
使用以下命令启动容器,注意替换镜像名称(如果使用自定义镜像):
docker run -it --rm \
--privileged \
-v /dev/bus/usb:/dev/bus/usb \ # 挂载 USB 设备
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 共享 X11 套接字
-e DISPLAY=$DISPLAY \ # 传递 Arch 本地的 DISPLAY 变量
-e XAUTHORITY=/root/.Xauthority \ # 显式指定 X 授权文件路径
-v $HOME/.Xauthority:/root/.Xauthority:ro \ # 挂载 Arch 本地的 X 授权文件
--net=host \
scrcpy-arch-arm \ # 使用自定义镜像;若使用现有镜像则替换为 ety001/scrcpy
scrcpy -m 720 --bit-rate 1M --encoder OMX.google.h264.encoder
5. 解决常见问题
权限问题
如果遇到 X 授权相关错误,可临时调整权限:
# 在 Arch 本地执行
chmod 644 ~/.Xauthority
测试成功后建议改回 600 权限:
chmod 600 ~/.Xauthority
编码器兼容性问题
若出现 MediaCodec$CodecException 错误,尝试降低分辨率和码率:
# 在启动命令的 scrcpy 后添加更严格的参数
scrcpy -m 480 --bit-rate 512K --encoder OMX.google.h264.encoder
设备识别问题
检查容器内是否能识别手机:
# 测试容器内的 adb 设备识别
docker run -it --rm --privileged -v /dev/bus/usb:/dev/bus/usb scrcpy-arch-arm adb devices
若设备未被识别:
- 确认手机已开启 USB 调试并授权树莓派
- 在树莓派上配置 udev 规则:
# 替换 12d1 为实际的设备 vendor ID(可通过 lsusb 查看)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
总结
通过以上步骤,我们实现了在 Arch Linux 系统上,通过 SSH 连接到树莓派,利用 Docker 容器运行 scrcpy 并将图形界面转发到本地,从而远程控制连接在树莓派上的 Android 设备。关键在于正确配置 X11 转发和解决设备编码兼容性问题。
这种方案的优势在于:
- 树莓派无需安装桌面环境
- 利用 Docker 隔离 scrcpy 运行环境
- 可通过网络远程控制 Android 设备
根据实际设备性能和网络环境,可能需要调整 scrcpy 的分辨率和码率参数以获得最佳体验。

Upvoted! Thank you for supporting witness @jswit.