通过 mDNS 发现和登录局域网内的 Android 设备

通过 mDNS 发现和登录局域网内的 Android 设备

注意:本文基于 Android 11 撰写
Qidi 2025.05.16


0. 常规连接方式的局限

无论是 Android 系统开发还是应用开发,都少不了使用 adb 连接设备,继而执行操作。

通常我们会使用两种方法登录 Android 设备:

  • 使用 USB 直接将电脑和 Android 设备相连,然后执行 adb shell 命令登录;
  • 让电脑和 Android 设备连入同一个网络。检查 Android 设备 IP,然后执行 adb connect xxx.xxx.xxx.xxxadb shell 命令登录。

不过这两种方法都存在以下局限性:

  • 要明确知道 Android 设备存在;
  • 要手动配置 Android 设备(连接 USB 线,或查询 IP)。

1. 通过 mDNS 发现和登录设备

是否存在一种方法,让 Android 设备启动后,主动通知我可以进行登录了呢?

有的,那就是通过 Android 自带的网络服务发现功能(详情参考 mDNS discoveryNSD)。

Android 系统默认启用 mDNS 服务。在系统进程列表中可以看到:

b07-1:/ $ ps -e | grep -i dns
mdnsr          3997      1 10241512  1224 0                   0 S mdnsd

这个 mdnsd 就是提供 mDNS 服务的后台进程(详情参考 external/mdnsresponder/README.txt)。

和我们处于同一局域网上的 Android 设备,只要开启了 USB调试无线ADB连接 功能,我们都可以利用 mDNS 发现它。进而通过 adb 与其建立连接。

由于 adb 31.0.2 及之后的版本默认关闭了 mDNS 发现,要使用此功能必须手动打开并重启 adb server,所以我写了个脚本 listADB.bat 来更方便地进行操作。脚本内容如下:

@echo off

if "%1"=="-f" (
        set ADB_MDNS_OPENSCREEN=
)

set | findstr ADB_MDNS_OPENSCREEN 1>nul
if %errorlevel% neq 0 (
        set ADB_MDNS_OPENSCREEN=0
)

if %ADB_MDNS_OPENSCREEN% neq 1 (
        echo Restarting adb server with mDNS support...
        set ADB_MDNS_OPENSCREEN=1
        adb kill-server
        adb start-server
        adb mdns check
        echo.
        echo Waiting devices online...
        timeout /t 3 /nobreak 1>nul
)

echo.

adb mdns services

使用这个脚本可以很方便地搜索出局域网中所有可供连接的 Android 设备。搜索结果类似下方:

D:\myScripts>listadb

List of discovered mdns services
adb-5fcbd86f    _adb._tcp       10.42.163.1:5555
adb-5fcbd86f    _adb._tcp       10.42.163.1:5555
adb-5fcbd86f    _adb._tcp       10.42.163.1:5555

以此搜索结果为例,要连接/登录设备,只需要执行下列任意一个 adb 命令:

adb connect adb-5fcbd86f._adb._tcp

adb connect 10.42.163.1:5555

连接到 Android 设备后,还可以搭配 scrcpy 工具进行桌面投屏。


2. 扩展阅读

《WHAT IS MDNSD》

posted @ 2025-05-30 15:43  Qidi_Huang  阅读(381)  评论(0)    收藏  举报