17、日志与调试:WifiLogger、BugReport 分析、常用 adb 命令
做 Wi-Fi 开发,说白了就是跟看不见的信号打交道。你写再多代码,最后跑起来出问题,第一反应肯定是——日志呢?
我个人习惯,拿到一个 Wi-Fi 问题,先不看代码,先翻日志。日志不会骗人,它只会忠实地记录下每一帧、每一次扫描、每一个状态机跳转。今天我们就来聊聊,怎么用好 Android 系统给我们的这些调试工具。
17.1 WifiLogger:你的随身黑匣子
WifiLogger 是 Android 系统内置的一个日志收集工具。它不像 adb logcat 那样什么都抓,而是专门抓 Wi-Fi 相关的日志。我当年第一次接触它,是在排查一个 Wi-Fi 频繁断连的问题时。当时 logcat 刷得飞快,根本找不到重点。后来用了 WifiLogger,问题一下子就清晰了。
WifiLogger 的核心能力:
- 自动抓取 Wi-Fi 驱动日志(firmware log)
- 记录 Wi-Fi 状态机变化
- 保存扫描结果和连接事件
- 生成 bugreport 级别的压缩包
怎么用?很简单。在开发者选项里,找到「开启 Wi-Fi 详细日志记录」。打开后,系统会开始记录 Wi-Fi 子系统内部的所有关键事件。日志文件通常保存在 /data/misc/wifi/logs/ 目录下。
// 手动触发 WifiLogger 抓取日志
adb shell am broadcast -a com.android.wifi.action.WIFI_LOGGER_START
adb shell am broadcast -a com.android.wifi.action.WIFI_LOGGER_STOP
// 拉取日志文件
adb pull /data/misc/wifi/logs/ ./wifi_logs/
嗯,这里要注意。WifiLogger 的日志是循环覆盖的。如果你遇到一个偶现问题,最好在问题复现后立刻停止日志抓取,否则关键信息会被冲掉。我曾经因为这个吃过亏,排查一个两小时才出现一次的断连问题,结果日志被覆盖了三轮,最后只能重来。
17.2 BugReport 分析:从海量信息中捞针
BugReport 是 Android 系统最全面的诊断报告。它包含了系统所有进程的状态、内存信息、日志缓冲区、网络状态等等。对于 Wi-Fi 问题,BugReport 里藏着大量线索。
我一般会重点关注以下几个部分:
| BugReport 章节 | Wi-Fi 相关关键信息 |
|---|---|
| SYSTEM LOG | wpa_supplicant、hostapd 的日志 |
| EVENTS LOG | Wi-Fi 状态机切换、连接事件 |
| NETWORK | IP 配置、DNS、路由表 |
| WIFI | Wi-Fi 配置、扫描结果、连接记录 |
| PROCESSES | wificond、wpa_supplicant 进程状态 |
拿到 BugReport 后,别急着从头读到尾。先搜关键词。我个人常用的搜索词有:
wpa_supplicant—— 看看 supplicant 有没有报错WifiStateMachine—— 状态机有没有异常跳转CONNECTED/DISCONNECTED—— 连接事件的时间线E/—— 所有 Error 级别的日志firmware—— 驱动层面的问题
小技巧: 用 grep 命令过滤 BugReport 文件。比如 grep -i "wifi" bugreport.txt | grep -i "error",能快速定位到 Wi-Fi 相关的错误信息。
17.3 常用 adb 命令:调试的瑞士军刀
adb 命令是 Android 调试的基础。对于 Wi-Fi 开发,有几个命令我几乎每天都会用。
17.3.1 查看 Wi-Fi 状态
// 查看 Wi-Fi 是否开启
adb shell dumpsys wifi
// 查看当前连接的 Wi-Fi 信息
adb shell dumpsys wifi | grep "mWifiInfo"
// 查看扫描结果
adb shell dumpsys wifi | grep "ScanResult"
dumpsys wifi 的输出非常详细。它会列出 Wi-Fi 服务内部的所有状态,包括当前连接、扫描缓存、PNO 列表、网络选择逻辑等等。我排查问题时,第一步永远是跑这个命令,看看系统当前认为 Wi-Fi 处于什么状态。
17.3.2 模拟操作
// 开启/关闭 Wi-Fi
adb shell svc wifi enable
adb shell svc wifi disable
// 连接指定 SSID
adb shell cmd wifi connect-network "MyWiFi" wpa2 "mypassword"
// 断开当前连接
adb shell cmd wifi disconnect
这些命令在自动化测试中特别有用。我曾经写过一个脚本,用 adb 命令循环连接/断开不同的 AP,用来复现一个概率性的连接失败问题。跑了整整一夜,终于抓到了关键日志。
17.3.3 调试 Wi-Fi 扫描
// 触发一次单次扫描
adb shell cmd wifi start-scan
// 查看扫描结果
adb shell dumpsys wifi | grep -A 20 "ScanResults"
// 设置扫描间隔(毫秒)
adb shell settings put global wifi_scan_interval_ms 5000
注意: 修改扫描间隔会影响功耗。调试完成后记得恢复默认值。默认间隔通常是 20000 毫秒(20秒)。
17.3.4 抓取 Wi-Fi 日志
// 只过滤 Wi-Fi 相关日志
adb logcat -s wpa_supplicant WifiStateMachine WifiMonitor
// 带时间戳的日志
adb logcat -v time -s wpa_supplicant
// 保存到文件
adb logcat -d -f /data/local/tmp/wifi_log.txt -s wpa_supplicant
我个人习惯用 -v time 参数。为什么?因为 Wi-Fi 问题往往跟时序有关。比如扫描结果回来了,但状态机还没准备好,这种问题不看时间戳根本发现不了。
17.4 实战:一次断连问题的排查过程
讲个真实案例。有一次,用户反馈手机连接公司 Wi-Fi 后,每隔几分钟就会断一次,然后自动重连。我拿到问题后,按以下步骤排查:
- 抓 WifiLogger 日志:在开发者选项开启详细日志,让用户复现问题。
- 拉取 BugReport:问题复现后,立刻生成 BugReport。
- 分析日志:在 WifiLogger 日志中,发现每次断连前都有一个
DISCONNECT事件,原因码是8(DISCONNECTED_BY_STA)。这说明是手机主动断开的。 - 查看 dumpsys wifi:发现手机的 RSSI 在断连前突然下降到 -85dBm 以下,触发了漫游阈值。
- 结论:AP 信号不稳定,手机漫游算法误判,导致频繁断连。最终通过调整漫游阈值解决了问题。
你看,整个排查过程,全靠日志说话。没有日志,你就是在黑暗中摸索。
17.5 本章知识体系
下面这张图,总结了 Wi-Fi 调试的核心工具和它们之间的关系:
调试 Wi-Fi 问题,说白了就是用好这三板斧。WifiLogger 抓细节,BugReport 看全局,adb 命令做精准操作。三者配合,大部分问题都能找到线索。
最后说一句,日志分析是个熟能生巧的活。你见得多了,自然就知道哪些日志是噪音,哪些是真正的线索。别怕日志多,怕的是你不去看。