Android Remote Browser Debug

Polar Sponsor
爱发电 赞助
.NET 9.0

远程调试安卓手机浏览器(Edge/Chrome),通过 ADB + Chrome DevTools Protocol 直接连接,查看 Console 日志、网络请求、DOM 快照、执行 JS、截图。适用于手机调试、安卓浏览器、手机 Console、手机网页调试。

安卓浏览器远程调试 Skill

功能概述

安卓浏览器远程调试 Skill是一项面向实际任务的技能,主要用于通过 USB + ADB 端口转发,将安卓手机上 Chromium 系浏览器(Edge、Chrome)的;DevTools Protocol 映射到本地,实现远程调试;

核心要点

  • 手机开启 USB 调试 (开发者选项 → USB 调试);
  • USB 数据线连接 Mac 和手机;
  • ADB 已安装 (Android SDK platform-tools);

使用与执行

本机 ADB。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

安卓浏览器远程调试 Skill

通过 USB + ADB 端口转发,将安卓手机上 Chromium 系浏览器(Edge、Chrome)的 DevTools Protocol 映射到本地,实现远程调试。

前置条件

  1. 手机开启 USB 调试(开发者选项 → USB 调试)
  2. USB 数据线连接 Mac 和手机
  3. ADB 已安装(Android SDK platform-tools)

本机 ADB 路径:

/Users/song/Library/Android/sdk/platform-tools/adb

建立连接

1. 确认设备连接

/Users/song/Library/Android/sdk/platform-tools/adb devices
# 应显示设备 ID + "device" 状态

2. 查找浏览器 DevTools Socket

/Users/song/Library/Android/sdk/platform-tools/adb shell "cat /proc/net/unix" | grep -i devtools

常见 socket 名:

  • @chrome_devtools_remote — Chrome / Edge 浏览器
  • @webview_devtools_remote_ — WebView 调试
  • @huawei_webview_devtools_remote_ — 华为 WebView

3. ADB 端口转发

# Edge / Chrome 浏览器
/Users/song/Library/Android/sdk/platform-tools/adb forward tcp:9222 localabstract:chrome_devtools_remote

# 如果要调试 WebView(替换 )
/Users/song/Library/Android/sdk/platform-tools/adb forward tcp:9223 localabstract:webview_devtools_remote_

4. 验证连接

# 列出可调试的页面
curl -s http://localhost:9222/json/list | python3 -m json.tool

# 查看浏览器版本信息
curl -s http://localhost:9222/json/version | python3 -m json.tool

调试操作

所有操作通过 Node.js 脚本 + WebSocket 连接 CDP(Chrome DevTools Protocol)完成。

通用脚本模板

// tmp_phone_debug.js
const WebSocket = require('ws');
const http = require('http');

http.get('http://localhost:9222/json/list', (res) => {
  let data = '';
  res.on('data', chunk => data += chunk);
  res.on('end', () => {
    const pages = JSON.parse(data);
    // 选择目标页面(默认第一个)
    const wsUrl = pages[0].webSocketDebuggerUrl;

    const ws = new WebSocket(wsUrl);
    ws.on('open', () => {
      // 发送 CDP 命令
      ws.send(JSON.stringify({
        id: 1,
        method: 'Runtime.evaluate',
        params: { expression: 'YOUR_JS_HERE', returnByValue: true }
      }));
    });
    ws.on('message', (msg) => {
      const r = JSON.parse(msg.toString());
      if (r.id === 1) {
        console.log(JSON.stringify(r.result.result.value, null, 2));
        ws.close();
        process.exit(0);
      }
    });
    ws.on('error', e => { console.error('Error:', e.message); process.exit(1); });
    setTimeout(() => { console.error('Timeout'); process.exit(1); }, 10000);
  });
}).on('error', e => { console.error(e.message); process.exit(1); });

查看 Console 日志

需要先启用 Runtime domain 来接收 console 事件:

// 启用后监听 consoleAPICalled 事件
ws.send(JSON.stringify({id: 1, method: 'Runtime.enable'}));
ws.send(JSON.stringify({id: 2, method: 'Log.enable'}));

或者用 HTTP 接口快速查看已有日志(不需要 WebSocket):

# 通过 evaluate 获取 console 错误
node -e "..." # 用上面模板,expression 设为检查逻辑

查看网络请求

// 启用 Network domain
ws.send(JSON.stringify({id: 1, method: 'Network.enable'}));
// 之后会收到 Network.requestWillBeSent / Network.responseReceived 事件

执行 JS 并获取结果

ws.send(JSON.stringify({
  id: 1,
  method: 'Runtime.evaluate',
  params: {
    expression: 'document.title',
    returnByValue: true
  }
}));

截图

ws.send(JSON.stringify({
  id: 1,
  method: 'Page.captureScreenshot',
  params: { format: 'png' }
}));
// 返回 base64 编码的图片数据
// 解码保存:
// const buf = Buffer.from(r.result.data, 'base64');
// require('fs').writeFileSync('/tmp/phone_screenshot.png', buf);

DOM 快照

ws.send(JSON.stringify({
  id: 1,
  method: 'Runtime.evaluate',
  params: {
    expression: 'document.documentElement.outerHTML.substring(0, 5000)',
    returnByValue: true
  }
}));

输出重定向注意

由于 shell 环境中 venv prompt 可能吞掉 stdout,始终用文件重定向:

node tmp_phone_debug.js > /tmp/phone_out.txt 2>&1
cat /tmp/phone_out.txt

或者合并到一行:

node tmp_phone_debug.js 1>/tmp/dbg.txt 2>/tmp/dbg_err.txt; echo "---stdout---"; cat /tmp/dbg.txt; echo "---stderr---"; cat /tmp/dbg_err.txt

常用诊断表达式

// 页面基本信息
'JSON.stringify({url: location.href, title: document.title, innerW: innerWidth, innerH: innerHeight, screenW: screen.width, screenH: screen.height, dpr: devicePixelRatio})'

// 全屏状态
'JSON.stringify({fullscreenEnabled: document.fullscreenEnabled, isFullscreen: !!document.fullscreenElement, fullscreenEl: document.fullscreenElement ? document.fullscreenElement.tagName : null})'

// 所有按钮列表
'JSON.stringify(Array.from(document.querySelectorAll("button")).map(b => ({text: b.textContent.trim().substring(0,30), aria: b.getAttribute("aria-label"), disabled: b.disabled})))'

// 检查 iframe sandbox
'JSON.stringify(Array.from(document.querySelectorAll("iframe")).map(f => ({src: f.src.substring(0,80), sandbox: f.getAttribute("sandbox"), allowFullscreen: f.hasAttribute("allowfullscreen")})))'

// 检查 Service Worker
'JSON.stringify({swSupported: "serviceWorker" in navigator, swController: !!navigator.serviceWorker.controller})'

// 检查 localStorage 大小
'JSON.stringify({keys: Object.keys(localStorage).length, totalSize: JSON.stringify(localStorage).length})'

多页面选择

手机上可能打开了多个标签页,/json/list 返回所有可调试页面:

curl -s http://localhost:9222/json/list | python3 -c "
import json, sys
pages = json.load(sys.stdin)
for i, p in enumerate(pages):
    print(f'{i}: [{p["type"]}] {p["title"]} - {p["url"][:80]}')
"

连接特定页面时替换 WebSocket URL 中的 page ID。

断开与清理

# 移除端口转发
/Users/song/Library/Android/sdk/platform-tools/adb forward --remove tcp:9222

# 移除所有转发
/Users/song/Library/Android/sdk/platform-tools/adb forward --remove-all

# 删除临时脚本
rm -f tmp_phone_debug.js tmp_debug*.js

踩坑记录

❌ WebSocket 403 Forbidden

错误信息:Rejected an incoming WebSocket connection from the http://localhost:9222 origin

原因:某些版本的 Chromium 要求 WebSocket 连接的 Origin 匹配白名单。

解决:Node.js 的 ws 库默认不发 Origin header,直接 new WebSocket(url) 即可连接。 如果用 Python 的 websocket-client,它会自动加 Origin 导致 403。

❌ ADB 设备显示 unauthorized

手机上弹出了 USB 调试授权对话框,需要在手机上点"允许"。

❌ 没有 devtools socket

浏览器可能没有打开任何页面,或者 USB 调试模式未正确开启。 确保手机上浏览器有至少一个打开的标签页。

❌ stdout 输出被 venv prompt 吞掉

shell 环境中 conda/venv 的 PS1 prompt 可能干扰输出捕获。 始终用 > /tmp/xxx.txt 重定向后再 cat。

❌ 页面 ID 变了

手机上刷新页面或切换标签后,page ID 会变。每次操作前先 curl http://localhost:9222/json/list 获取最新 ID。

与 Kiro Chrome DevTools MCP 的关系

Kiro 内置的 Chrome DevTools MCP 工具连接的是本地 Mac 上的 Chrome 浏览器, 无法直接切换到手机的调试端口。手机调试必须通过本 skill 描述的 ADB + Node.js WebSocket 方式进行。

如果未来 MCP 支持自定义连接端口,可以考虑将手机页面也纳入 MCP 管理。

相关专题

更多
Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

824

5

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

465

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

3917

7

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2247

5

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

842

4

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.6万人学习

Java 教程
Java 教程

共578课时 | 193.4万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 9.6万人学习