iOS 测试 重磅!全新 sib remote 功能上线,iOS 远程调试的福音!

Eason for Sonic云真机系列 · 2022年12月04日 · 最后由 陈恒捷 回复于 2023年01月16日 · 11582 次阅读
本帖已被设为精华帖!

官网链接

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 就可以像本地链接一样使用啦!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞

@Lihuazhang 申精~

看起来很牛逼的样子

😆 不过也就平时用惯 adbkit 的才能感受到 ios 出了同类工具的那种感觉

这么牛的技术居然没人关注!

cc 回复

😅 可能年底大家都忙吧

陈恒捷 将本帖设为了精华贴 12月16日 14:13

@ZhouYixun 远程连接上后,除了 sib,设备是否也会出现在其他调试工具的设备列表里?比如 tidevice、xcode 等。

之前有调研过这个方向,facebook 的 idb 也有提供类似的功能,但连接上的设备只能使用 idb 提供的功能,无法类似 adb 那样所有调试工具都可以连接上。

陈恒捷 回复

目前只有 sib 能看的,我们组织这边落地效果不错,打通了很多流程。安卓 ios 能共用一套逻辑了。

本质 tidevice、xcode、idb 都是 usbmuxd 的 client,要做到其他 client 工具都能出现的话,估计得二开魔改 usbmuxd,事情就不是这么简单了😅

陈恒捷 回复

这个玩意有个土办法实现,写个程序监听 usbmux 的对应本地 TCP 服务收发的数据包,获取到 plist 获取设备的相关上下文请求时,将远程设备信息插入到返回的包,如果后续操作针对这个远程设备操作,那就通过这个监听程序做双向代理把包互相发过去。。。。看官方的 xcode 可以远程打包,应该有更好的实现方式,欢迎有能力的小伙伴加入 sonic 一同建设

点赞。

之前试过 usbmux 改为用远程另一个 mac mini 的 socket,是可以直接拿到那台设备的 ios 设备并映射到所有上传工具中的,缺陷是本地的设备就会被忽略了,相当于替换,而非合并。

如果可以实现这个合并,那就很强大了。

顺便说说实现方案呗

陈恒捷 回复

这个方案,会把另一台 macmini 上所有 ios 设备调试权限都拿过来吧

codeskyblue 回复

你可以看看文章的大体思路这块,里面就是它的方案思路,当然,这是由于我缺少 Mac 设备自己用的土办法,有能力你也可以看看我 #9 说的 xcode 方案

JamesChung 回复

是的。所以只适合用来确认原理,但不适合真正业务上使用。

当时还有想过一种方法,更底层的 usb over ip 方案,把 usb 设备的数据直接通过网络传输,比如 https://sourceforge.net/projects/usbip/ ,你有兴趣可以试试。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册