ADB Wi-Fi 2.0 ,Android 17 把无线调试的连接链路重新做了一遍

0 阅读5分钟

有多少之前用过 ADB Wi-Fi 的,有没有被它的稳定性恶心到了?这次在 Android 17 上官方终于做了优化:

  • 自动连接成功率提高了 32%
  • 在 90% 的连接场景里,建立连接的速度提高了 66%

用的方式和之前的 ADB Wi-Fi 没什么区别,还是原本的流程,主要发生发生在底层实现上,比如:

电脑如何发现设备、设备换网络以后怎么处理无线 ADB、连接中断后怎样重新找到对方,还有 Android Studio 怎样把这一套流程重新设计。

简单来说就是,配对一次之后设备会变成接近 USB ADB 那种“机器在,它就在”的状态

Wireless debugging 我记得应该是 Android 11 开始有的了,但是稳定性一直很一般,设备开启 Wireless debugging 后会启动 TLS Server,然后通过 mDNS 公布连接服务,电脑上的 adb server 会监听这些服务,如果发现一个已经配对过的设备,就会自动建立 TLS 连接。

但是实际体验里,经常是手机明明还在同一个 Wi-Fi,然后 Wireless debugging 也开着,但是 adb devices 里设备就总是模型消失后者断开,有时候是重启一下 adb server 或者重新连接 Wi-Fi 后又恢复,这个过程就很恶心。

然后这次 Google 重新整理了 mDNS 实现,用新的发现栈换掉了之前用的 Bonjour 和旧 mDNS 路径

  • Platform-Tools 35.0.2 开始就把 Open Screen mDNS backend 设为所有平台的默认实现
  • 到了 37.0.0,Google 把新的 libadbmdns 改成默认 backend,Open Screen 只保留为 fallback,正式进入弃用状态
  • 37.0.1 又把 Open Screen backend 彻底清理,现在只留下 libadbmdns

所以 Android 17 的 ADB Wi-Fi 2.0 其实从 35 版本就开始准备了,然后到了 Platform-Tools 37 开始,就会把电脑端服务发现统一到自己的 libadbmdns,然后 Android 17 同时提供新的设备端行为,Android Studio Quail 3 再把设备发现和配对入口接进 IDE,也就是实际上是三部分一起组成 Google 所说的 Wi-Fi 2.0。

这里的 mDNS 就是这次 2.0 的关键,因为 adb server 不希望开发者亲自维护 “这台 Pixel 当前 IP 是什么、连接端口是多少” 这种状态,毫无意义,毕竟设备可以今天拿到 192.168.1.35,睡一觉又变成 192.168.1.82,无线调试用的 TLS 端口也可能变化,在需求上其实设备只需要重新广播 _adb-tls-connect._tcp ,然后 adb server 重新发现它,然后根据之前保存的配对身份确认这是不是可信设备,就够了啊

所以现在 ADB Wi-Fi 2.0 执行 adb mdns track-services --proto-text ,就可以看到类似下面的数据:

tls {
  service {
    instance: "adb-35121FDJH000R8-xyMD0H"
    service: "_adb-tls-connect._tcp"
    ipv4: "192.168.84.23"
    ipv6: "fe80:0:0:0:fc7a:299d:8d38:6c1c"
    port: 37895
    product_model: "Pixel 8"
    build_version_sdk_full: "37.0"
    given_name: "sherifeid Pixel"
    serial: "35121FDJH000R8"
    mdns_service_version: "2.0"
    hostname: "Android_CXUKYJY1.local"
  }
}

比如 IP、IPv6、端口、设备型号、设备名、序列号、主机名和 mDNS 协议版本都进入了发现信息,Android Studio 页可以在设备还没完成实际 ADB transport 建立之前,就知道局域网里有哪些 Android 开发设备,官方现在也直接用 mdns_service_version: "2.0" 判断设备是否支持 ADB Wi-Fi 2.0。

最重要是现在设备会判断当前网络是否属于用户允许进行无线调试的网络,如果进入一个不受信任的网络以后关闭 ADB Wi-Fi,会回到用户允许的网络后再自动启用,也就是:

  • 电脑通过二维码或者六位配对码完成配对以后,设备会记住这个工作站,可以决定这台电脑有没有资格建立 ADB TLS 连接
  • Wireless debugging 第一次在某个 Wi-Fi 上启用时,Android 还会询问是否允许当前网络进行无线调试,并提供“Always allow on this network”

而且 Quail 3 以后,只要手机开启 Wireless debugging,然后设备能够通过局域网被发现,它就可以直接出现在 Android Studio Device Manager 里,开发者选择设备后完成配对就可以了,也就是不需要先知道 IP,也不需要手动建立 ADB TCP 连接:

目前完整推荐环境是 Android 17、Platform-Tools 37.0.0 + 还有 Android Studio Quail 3。

而且现在有排障接口,可以直接检查电脑端 server 状态:

adb server-status

同时还直接看电脑到底有没有收到设备的 mDNS 广播:

adb mdns track-services --proto-text

如果 mDNS 可以看到设备,还可以顺便检查是不是支持 2.0:

mdns_service_version: "2.0"

就算再出现偶发断连时,现在也可以拿到完整 adb server 日志:

export ADB_TRACE=all
adb kill-server
adb start-server
​
# 复现问题以后
adb server-status

server-status 输出里会提供 log_absolute_path,可以直接找到 adb server 日志,而且 Platform-Tools 37.0.1 还增强了 ADB_TRACE,可以按模块设置日志级别,比如对 USB 或 services 分别控制 verbose、warning 等级。

所以,现在 ADB Wi-Fi 2.0 可以做到比之前好不少的体验,就是使用条件目前还比较局限,都需要相对较新的场景和设备,不过再过一段时间应该就可以普及起来了。

链接

developer.android.com/tools/adb