官网链接

https://sonic-cloud.gitee.io/#/SIB

背景

有时在团队里,想远程触发设备的 wda 或者 fastbot 一类 xctest 的时候,有非常多的限制,因为设备只能在本地。而在 sonic 团队开发时,我们设备比较缺少,每次开发 sib 的新功能时,经常出现团队内有人有对应设备了,但是主程没有对应设备,只能盲打然后再让有设备的成员帮忙验证,非常耗费时间。做移动端的人多多少少都用过,stf 的 adbkit 里面的 usb-device-to-tcp 功能,它可以将连接的设备在局域网中分享出来,提供给其他的 adb client 连接,这个功能可以很方便的给 adb cli 开发人员调试。研究过源码的话,其实可以发现当前市面上的 iOS DTX 工具和 adb 的架构是很类似的,那为什么 sonic 不能做出类似 adbkit usb-device-to-tcp 效果的功能呢?

现状

目前主流的平台大多数暴露的 iOS 远程连接调试,都是暴露 wda 的远程 url,可以让 client 端利用 Appium 一类的工具连接这个 url 进行自动化操作。虽说这样能满足大部分需求,但是对于走协议层进行更多操作的用户来说,wda 提供的功能很少,而且前提要远程设备先开启 wda 服务。于是我们计划是往下走一层,从协议层提供远端连接。

大体思路

sib 依赖于 gidevice,而 gidevice 依赖于 usbmux,而每次进行设备连接时,都会进行一次 usbmux 的连接,然后往里面发送相关的 DTX 数据,如果研究过相关文章,就会知道 usbmux 本质上是一个本地的 tcp 服务。基于这些特性,于是我们在 sonic-gidevice 中对 gidevice 进行二次开发,设计思路:对外暴露一个 remote tcp server,可以让其他客户端往这个 remote tcp server 里发送 DTX,然后 server 端将这些 DTX 数据转发到本地的 usbmux tcp server,当 usbmux tcp server 产生回报信息后,remote tcp server 转发这些信息给对应的客户端。
在这里非常感谢组织成员 aoliaoaoaojiao 的辛勤付出

使用

在电脑 A 分享设备:

sib remote share -u <you device udid> -p <share port>

在电脑 B 连接:

执行

sib remote connect --host <you share device pc ip> -p <share port>

之后就可以通过通过 devices 获取到这个远程设备的信息

sib devices

类似如下

之后使用 sib 时的其他功能时,指定远程设备的 uuid,即可正常使用这些功能,就像手机连接在本地一样使用。

触发远程设备启动 wda:

sib run wda -b xxxxx

监控远程设备性能信息:

sib perfmon

或者其他所有 sib 的功能都可以直接使用了!

电脑 B 断开连接:

sib remote disconnect --host <you share device pc ip> -p <share port>

或者电脑 A 直接停止 share 进程

结语

目前 sib 已经更新了,sonic 平台的话也将在 12 月的 2.1.0 版本正式引入这个功能,届时可以直接在前端页面获取设备远程调试的链接,然后用户可以自己本地 sib remote connect 就可以像本地链接一样使用啦!


↙↙↙阅读原文可查看相关链接,并与作者交流