在 ArchLinux 上通过树莓派的 Docker 运行 scrcpy 控制 Android 设备

in #cn-dev24 days ago

image.png

前言

本文将详细介绍如何在 Arch Linux 系统上,通过 SSH 连接到无桌面环境的树莓派,利用 Docker 容器运行 scrcpy,并将图形界面转发到本地,实现对连接在树莓派上的 Android 设备的远程控制。

前提条件

  • 树莓派已安装 Docker 并能正常运行
  • Android 设备已开启 USB 调试并连接到树莓派
  • Arch Linux 本地机能够通过 SSH 连接到树莓派
  • 树莓派和本地机处于同一网络环境

核心原理

  1. 在树莓派上通过 Docker 容器运行 scrcpy(适配 ARM 架构)
  2. 利用 SSH 的 X11 转发功能,将容器内 scrcpy 的图形界面传输到 Arch Linux 本地
  3. 通过 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

若设备未被识别:

  1. 确认手机已开启 USB 调试并授权树莓派
  2. 在树莓派上配置 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 的分辨率和码率参数以获得最佳体验。

Sort:  

Upvoted! Thank you for supporting witness @jswit.