这篇文章上次修改于 309 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

设想你有很多手机,但是一般也就带两个手机在身边,多不方便...

结合本方案,再打通公网访问,就能随时随地访问你的『云真机』了


前言

在之前的文章中,介绍了ya-webadb + websockify实现在浏览器中远程控制手机

但根据个人体验,基于无障碍实现的Android到Android远程控制体验并不好

综合体验还是scrcpy体验更好,所以这里就根据这篇文章再扩展一下,实现基于scrcpy的Android到Android远程控制

其实这个功能在ya-webadb的介绍中就已经说明了:

All features are working on Chrome for Android, use a C-to-C cable or run WebSockify in Termux to connect.

本文对run WebSockify in Termux to connect进行实践

步骤

配置Termux(被控方手机)

下载安装:

配置环境:

  1. 选择一个国内源
termux-change-repo
  1. 更新升级
pkg update
pkg upgrade
  1. 安装android-tools
pkg install android-tools

配置ADB

这一步的最终目的是开启ADB无线调试,并运行在固定端口,也就是adbd进程要监听在固定端口

如果你恰好有电脑、电脑配置好了ADB,并且能用数据线连接电脑,那么在手机连接好电脑之后,执行下面的命令即可:

adb tcpip 5555

如果没有电脑,但是有Android到Android远程控制的需求,那么肯定有至少两个手机,那么按下面的步骤操作:

  1. 被控方手机连接到控制方手机的热点,因为无线调试必须要连接WIFI
  2. 打开开发者模式,进入开发者模式开启无线调试功能
  3. 进入无线调试界面,在该界面进行分屏,选择termux
  4. 点击使用配对码配对设备
  5. 在termux中输入adb pair ip:port,回车输入无线调试界面上的配对码,再次回车确定

  1. 配对成功后输入adb connect ip:port进行连接,注意这里的端口和上一步的不一定相同,以你的界面上的端口为准
  2. 连接上之后输入adb tcpip 5555,这样ADB就会在5555上监听了

无线调试界面上的端口会再次刷新,但是已经不用担心了,这个时候关闭WIFI也不会影响了

用netstat可以发现监听了两个端口,如果断开WIFI,那么另外一个监听会消失,但是5555不会

oriole:/ # netstat -tunlp | grep adbd
tcp6       0      0 [::]:45579              [::]:*                  LISTEN      7498/adbd
tcp6       0      0 [::]:5555               [::]:*                  LISTEN      7498/adbd

PS,netstat这个命令root下才能看到进程名,这里是为了说明确实监听了5555端口

配置Termux(控制方手机)

控制方需要在termux中安装websockify这个库,同样先安装好termux,然后执行下面的命令:

  1. 选择一个国内源
termux-change-repo
  1. 更新升级
pkg update
pkg upgrade
  1. 安装python等环境
pkg install python
pkg install rust
pkg install binutils
pip install cffi
pip install setuptools
pip install setuptools_rust
pkg install python-numpy
  1. 安装websockify

下载websockify代码,放入sdcard下并解压(记得先手动开启termux的存储访问权限)

当然直接在termux中下载解压也是一样的,解压路径没有要求

然后在termux中进入解压目录,执行下面的命令安装websockify

python setup.py install

最终成功安装的截图:

远控测试

在termux中执行下面的命令,其中192.168.1.118是被控方手机ip

注意两个手机应该在同一个局域网,当然一个给另外一个开热点也行

python -m websockify 5555 192.168.1.118:5555

或者在termux中进入websockify解压目录,运行下面的命令

python websockify 5555 192.168.1.118:5555

然后打开在线网页:https://yume-chan.github.io/ya-webadb/scrcpy

点击Add,选择WebSocket,输入ws://127.0.0.1:5555,然后点击Connect

注意第一次连接的时候,被控方手机会弹出USB调试授权,记得允许

Scrcpy一栏,将Forward Audio关掉(可选,因为这个打开了可能会影响连接),然后点击Start即可

最后来看一下效果吧

总结

  1. 被控方只要能开无线调试,然后控制方手机在同一局域网,那么adb配对也可以在控制方这边完成,这样被控方就不用安装termux了

    • 我这里拆开步骤,主要是担心有用户的网络有问题,局域网不通什么的...
    • 当然一个设备给另一个开热点肯定没问题
  2. ya-webadb在移动端全屏后,控制延时其实有一点高,主要是涉及编解码之类的,不过优势是操作跟手,双指缩放也能做到;最重要的是,全屏状态下和用自己手机一样,不像一些远程控制软件操作很割裂
  3. 应用场景:

    • 控制电视端APP,有些APP的控件无法通过遥控器定位到,而且遥控器操作很慢
    • 异地组网批量控制,虽然这个有更多方案,但这个方案作为自己用还是有可取之处
    • ya-webadb除了scrcpy功能,还提供了文件管理、shell和安装apk等功能
  4. 缺点:

    • 不管怎么设置清晰度似乎还是不够,但是用PC端scrcpy直接投屏清晰度明显好很多,不知道这个是怎么回事
    • 解码都在手机上,控制方会多用些CPU算力

能实现本文效果的还有:


上面的操作步骤总结如下:

  1. 被控方开启无线ADB,监听5555端口
  2. 控制方配置websockify,监听5555端口,转发远程websocket请求与被控方交互
  3. 控制方通过浏览器访问websocket,实现远程控制

这个过程可以也有其他组合,比如websockify这一部分也可以在被控方运行

不过这一定程度上会加重被控方的负担,自行取舍

比如被控方是安卓TV,众所周知安卓TV性能一般不咋样,而且要安装APP,还做这么多操作肯定很麻烦

这个时候安卓TV只管开无线调试即可,其他的都交给控制方实现

甚至可以让你的路由器、开发板来做websockify这一部分,啊,板子终于不用吃灰了