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 后,每隔几分钟就会断一次,然后自动重连。我拿到问题后,按以下步骤排查:

  1. 抓 WifiLogger 日志:在开发者选项开启详细日志,让用户复现问题。
  2. 拉取 BugReport:问题复现后,立刻生成 BugReport。
  3. 分析日志:在 WifiLogger 日志中,发现每次断连前都有一个 DISCONNECT 事件,原因码是 8(DISCONNECTED_BY_STA)。这说明是手机主动断开的。
  4. 查看 dumpsys wifi:发现手机的 RSSI 在断连前突然下降到 -85dBm 以下,触发了漫游阈值。
  5. 结论:AP 信号不稳定,手机漫游算法误判,导致频繁断连。最终通过调整漫游阈值解决了问题。

你看,整个排查过程,全靠日志说话。没有日志,你就是在黑暗中摸索。

17.5 本章知识体系

下面这张图,总结了 Wi-Fi 调试的核心工具和它们之间的关系:

Wi-Fi 调试工具体系 WifiLogger BugReport adb 命令 驱动日志 / 状态机 系统状态 / 事件日志 dumpsys / logcat / svc 定位 Wi-Fi 问题根因 三者结合使用,覆盖从驱动到应用层的全链路调试

调试 Wi-Fi 问题,说白了就是用好这三板斧。WifiLogger 抓细节,BugReport 看全局,adb 命令做精准操作。三者配合,大部分问题都能找到线索。

最后说一句,日志分析是个熟能生巧的活。你见得多了,自然就知道哪些日志是噪音,哪些是真正的线索。别怕日志多,怕的是你不去看。


公众号:蓝海资料掘金营,微信deep3321