通过 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.xxx
和adb shell
命令登录。
不过这两种方法都存在以下局限性:
- 要明确知道 Android 设备存在;
- 要手动配置 Android 设备(连接 USB 线,或查询 IP)。
1. 通过 mDNS 发现和登录设备
是否存在一种方法,让 Android 设备启动后,主动通知我可以进行登录了呢?
有的,那就是通过 Android 自带的网络服务发现功能(详情参考 mDNS discovery 和 NSD)。
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
工具进行桌面投屏。