从技术角度探索安卓群控实现的基本思路

群控实现的方式我了解的大体有两种(你的系统也可以兼备)

  • 方案一:基于ADB+集线器+AutoJS+QtScrcpy,依赖ADB和AutoJs的能力,实现基本ADB指令的下发,可指定设备
  • 方案二:基于AutoJS+WebSocket+QtScrcpy,依赖无障碍+网络互联能力,实现脚本指令的下发

注意点:
1.整体缺乏对中文的支持,一切命名尽量英文为宜,否则可能无法执行(或者你配置了中文支持)
2.开启USB调试(不同机型可能还会要求SIM卡等,才能打开完整的USB调试功能,请注意)
3.开启无障碍服务(开启悬浮框权限、后台弹出权限、安装未知应用权限等)

方案一:基于ADB+AutoJS+QtScrcpy

1.查看设备的接入

adb deivices

2.指定设备执行操作

adb -s [deviceId] ....

3.ADB基础指令

基础指令大全,协助你执行单个基础操作

基本用法
命令语法
为命令指定目标设备
启动/停止
查看 adb 版本
以 root 权限运行 adbd
指定 adb server 的网络端口
设备连接管理
查询已连接设备/模拟器
USB 连接
无线连接(Android11 及以上)
无线连接(需要借助 USB 线)
无线连接(无需借助 USB 线)
应用管理
查看应用列表
所有应用
系统应用
第三方应用
包名包含某字符串的应用
安装 APK
卸载应用
清除应用数据与缓存
查看前台 Activity
查看正在运行的 Services
查看应用详细信息
查看应用安装路径
与应用交互
启动应用/ 调起 Activity
调起 Service
停止 Service
发送广播
强制停止应用
收紧内存
文件管理
复制设备里的文件到电脑
复制电脑里的文件到设备
模拟按键/输入
电源键
菜单键
HOME 键
返回键
音量控制
媒体控制
点亮/熄灭屏幕
滑动解锁
输入文本
查看日志
Android 日志
按级别过滤日志
按 tag 和级别过滤日志
日志格式
清空日志
内核日志
查看设备信息
型号
电池状况
屏幕分辨率
屏幕密度
显示屏参数
android_id
IMEI
Android 系统版本
IP 地址
Mac 地址
CPU 信息
内存信息
更多硬件与系统属性
修改设置
分辨率
屏幕密度
显示区域
关闭 USB 调试模式
允许/禁止访问非 SDK API
状态栏和导航栏的显示隐藏
实用功能
屏幕截图
录制屏幕
重新挂载 system 分区为可写
查看连接过的 WiFi 密码
设置系统日期和时间
重启手机
检测设备是否已 root
使用 Monkey 进行压力测试
开启/关闭 WiFi
刷机相关命令
重启到 Recovery 模式
从 Recovery 重启到 Android
重启到 Fastboot 模式
通过 sideload 更新系统
安全相关命令
启用/禁用 SELinux
启用/禁用 dm_verity
更多 adb shell 命令
查看进程
查看实时资源占用情况
查看进程 UID
其它
常见问题
启动 adb server 失败
com.android.ddmlib.AdbCommandRejectedException
adb 的非官方实现

4.与AutoJS结合

  • AutoJs从4.1开始,就关闭免费版本的使用,开始了45元一次性买入的AutoJsPro,如果有长期使用需求的建议购买(付费版本更为可靠有效)
  • AutoXJs作为AutoJs4.X后换人维护的持续开源版,也可以尝试,目前使用与AutoJs表象一致,可尝试

可使用 adb 进行手机 Autojs 的安装或批量安装:
adb -s [deviceId] install apk在电脑上的路径

  • 使用intent的方式,向手机发送需要执行的JS脚本文件,JS脚本语法见
adb -s [deviceId] shell am start -n org.autojs.autoxjs.v6/org.autojs.autojs.external.open.RunIntentActivity -d file:///storage/emulated/0/Autojs/Test/Test1.js -t text/javascript
  • 以上指令的格式是:adb -s [deviceId] shell am start -n [packageName]/[className] -d [filePathOnPhone] -t text/javascript
  • 其中包名和类名,我这边是使用autoxjs的版本,所以在源代码中找到类名,包名的获取有点周折,我是获取了autoxjs的启动activity的日志,才找到了包名,与源码中对应的包名并不一样,如果不一致就会出现提示你 Activity not exist的问题
  • 对于 AutoJSPro / AutoJs 的版本可以参考包名/类名:org.autojs.autojs/.external.open.RunIntentActivity,因为版本不同,不确定后期会有所变化
  • 针对手机上的JS脚本文件,可以在 Autoxjs 的APP中书写,也可以在电脑上书写后push过去
  • 表面的原理看着像是依赖adb网络调试的端口进行操控的,未实际研究(setprop service.adb.tcp.port 5555)
  • 本人的测试是可以将使用adb指令执行JS文件脚本:打开APP执行自动操作

5.关于投屏与控制

以上就是实现批量控制的思路,对于其他需要页面上实时回传手机画面的:

  • 有使用adb截屏回传的(USB):无额外侵入,但是效率低,如果只是监控级别看一下屏幕是可以尝试的
  • 有集成开源的安卓投屏软件QtScrcpy(WIFI/USB):主打低延迟,能够托管鼠标和键盘,同步手机画面,现在开源、功能挺强、使用人群较多,可以尝试,

方案二:WebSocket+AutoJS+QtScrcpy

  • WebSocket 的方案起源于 VsCode 可以使用 AutoJS 的插件,通过WiFi互联对手机进行 debug
  • 依赖这样的思路,借用 VsCode AutoJS 的连接的实现原理,就可以复刻这样的思路,将本地脚本在手机上进行 debug
  • 同样可以根据websocket的端口指定具体的手机
  • 此外,如果需要同方案一样进行页面投屏与控制,也可以引入QtScrcpy
  • 可供学习的参考项目

你可能感兴趣的