19、移动端调试:使用 Chrome DevTools 远程调试 Android WebView 中的 WebRTC 应用

说实话,做 WebRTC 开发最头疼的是什么?不是信令逻辑写不对,也不是 SDP 协商搞不定——而是你明明在 PC 上跑得好好的,一上手机就翻车。音频卡顿、视频黑屏、连接断断续续……这些问题在桌面端很难复现。

我个人习惯是,从一开始就把移动端调试环境搭好。别等到上线前才手忙脚乱。今天我们就聊聊怎么用 Chrome DevTools 远程调试 Android WebView 里的 WebRTC 应用。

为什么需要远程调试?

你想想看,WebRTC 在移动端的行为和桌面端差别很大。网络切换、CPU 降频、内存限制、摄像头权限……这些因素在模拟器里根本测不出来。我曾在项目里遇到过一个问题:视频通话在小米手机上偶尔黑屏,但在 PC 上完全正常。后来一查,是 WebView 的硬件解码器兼容性问题。

远程调试能让你直接看到移动端 WebView 里的控制台日志、网络请求、DOM 结构,甚至还能打断点。说白了,就是把 Chrome 开发者工具搬到手机上用。

准备工作

嗯,这里要注意几个前提条件:

  • 一台 Android 手机(系统版本 4.4+)
  • 一根 USB 数据线(别用那种只能充电的线)
  • PC 上安装 Chrome 浏览器(版本 32+)
  • 手机开启 USB 调试模式

USB 调试怎么开?不同手机路径略有不同,但大致是:设置 → 关于手机 → 连续点击「版本号」7 次 → 返回设置 → 开发者选项 → 开启 USB 调试

⚠️ 注意: 有些国产手机(比如华为、小米)默认会关闭「仅充电模式下允许 USB 调试」,记得在开发者选项里手动打开。我曾经在这上面浪费了半小时。

第一步:连接手机与 PC

用 USB 线连上手机。PC 上打开 Chrome,在地址栏输入:

chrome://inspect

你会看到这样的界面:

chrome://inspect 界面

如果手机没显示出来,检查一下:

  • USB 线是不是只充电不传数据?换一根试试。
  • 手机上有没有弹出「允许 USB 调试」的对话框?要点确定。
  • Chrome 版本是不是太旧了?更新一下。

第二步:打开 WebView 的调试开关

这一步很关键。默认情况下,App 里的 WebView 是不开启调试的。你需要让开发人员在 Android 代码里加上一行:

// 在 Activity 的 onCreate 中
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

注意:正式发布的 APK 一定要去掉这行代码,否则会有安全风险。我一般会在 build.gradle 里加一个 debug 专用的配置:

android {
    buildTypes {
        debug {
            // 只有 debug 版本才开启 WebView 调试
            buildConfigField "boolean", "WEBVIEW_DEBUG", "true"
        }
        release {
            buildConfigField "boolean", "WEBVIEW_DEBUG", "false"
        }
    }
}

然后在代码里判断:

if (BuildConfig.WEBVIEW_DEBUG) {
    WebView.setWebContentsDebuggingEnabled(true);
}
💡 小技巧: 如果你用的是 React Native 或 Flutter,它们内部用的也是 WebView。React Native 的 WebView 默认不开启调试,需要手动设置 androidHardwareAccelerationDisabled 和 mixedContentMode 等参数。Flutter 的 webview_flutter 插件需要在 AndroidManifest.xml 里加上 android:usesCleartextTraffic="true"。

第三步:开始调试 WebRTC

回到 chrome://inspect 页面,点击你设备下的「inspect」链接。会弹出一个新的 DevTools 窗口,里面显示的就是手机 WebView 里的页面。

这时候你可以:

  • 看 Console 日志:WebRTC 的 ICE 状态、连接错误、SDP 信息都会打印出来
  • 看 Network 面板:检查信令服务器的 WebSocket 连接是否正常
  • 看 Sources 面板:打断点调试 JavaScript 代码
  • 看 Application 面板:检查 LocalStorage、IndexedDB 等存储

我个人最常用的是 Console 面板。在 WebRTC 代码里加一些关键日志:

// 监听 ICE 连接状态变化
peerConnection.oniceconnectionstatechange = () => {
    console.log('[WebRTC] ICE 状态:', peerConnection.iceConnectionState);
};

// 监听连接状态变化
peerConnection.onconnectionstatechange = () => {
    console.log('[WebRTC] 连接状态:', peerConnection.connectionState);
};

// 监听候选者收集
peerConnection.onicecandidate = (event) => {
    if (event.candidate) {
        console.log('[WebRTC] ICE 候选者:', event.candidate.candidate);
    }
};

为什么这么做?因为移动端 WebView 的日志不会自动保存,你没法像 PC 那样按 F12 看。有了这些日志,一旦出问题,你就能在 DevTools 里看到完整的调用链。

第四步:模拟移动端网络环境

WebRTC 对网络波动特别敏感。在 PC 上调试时,你可以用 DevTools 的 Network 面板模拟 3G、4G 网络。但在移动端,你没法直接在手机上模拟。

我的做法是:在 PC 的 DevTools 里,点击「Network conditions」标签,勾选「Emulate network conditions」,然后选择「Slow 3G」或「Fast 3G」。这样手机 WebView 里的网络请求也会受到限制。

不过要注意,这个模拟只对 HTTP/HTTPS 请求有效,对 WebRTC 的 UDP 媒体流影响有限。要真正测试弱网环境,还是得用专门的网络损伤工具,比如 Clumsy 或 NetEm。

常见问题与避坑指南

我在项目里遇到过不少坑,挑几个典型的说说:

🔴 问题 1:WebView 里 getUserMedia 不工作

症状:调用 navigator.mediaDevices.getUserMedia 返回 undefined 或直接报错。

原因:Android WebView 默认没有开启摄像头和麦克风权限。需要在 AndroidManifest.xml 里声明:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

同时,在代码里动态请求权限(Android 6.0+):

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
🔴 问题 2:WebView 不支持 WebRTC

症状:RTCPeerConnection 未定义。

原因:某些旧版 Android 系统(4.4 以下)的 WebView 不支持 WebRTC。或者 App 使用了旧版 WebView 内核。

解决方案:

  • 升级 Android System WebView(通过 Google Play 更新)
  • 在 App 里使用 Chrome Custom Tabs 代替 WebView
  • 或者使用第三方 WebRTC 库,如 Jitsi Meet SDK
🔴 问题 3:远程调试连不上

症状:chrome://inspect 页面一直显示「Pending」或「Offline」。

我曾经遇到过这个问题,折腾了半天发现是 USB 线的问题。换了一根原装线就好了。另外,有些电脑的 USB 端口供电不足,也会导致连接不稳定。建议用电脑背面的 USB 接口。

知识体系总览

下面这张图总结了移动端 WebRTC 调试的核心流程:

移动端 WebRTC 调试流程 1. 开启 USB 调试 2. 连接 USB 线 3. 打开 chrome://inspect 4. 点击 Inspect WebView 需开启调试模式:WebView.setWebContentsDebuggingEnabled(true) Console 面板 查看 ICE 状态、SDP 信息 检查连接错误日志 打印候选者信息 Network 面板 检查信令 WebSocket 查看媒体流传输 模拟网络条件 Sources 面板 打断点调试 JS 查看调用堆栈 修改变量值

写在最后

移动端 WebRTC 调试其实没那么玄乎。核心就三点:USB 连接要稳、WebView 调试要开、日志要打全。把这三点做到位,大部分问题都能在 DevTools 里定位到。

我个人习惯是在开发阶段就把调试环境搭好,每次改完代码都真机跑一遍。别等到集成测试才发现问题,那时候定位成本就高了。

嗯,今天就聊到这儿。如果你在调试过程中遇到什么奇葩问题,欢迎来公众号找我聊聊。


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