Android Remote Browser Debug — Android Remote Browser 调试
v0.1.0远程调试安卓手机浏览器(Edge/Chrome)。通过 ADB + Chrome Dev工具s Protocol 直接连接手机浏览器,查看 Console 日志、网络请求、DOM 快照、执行 JS、截图。 当用户提到手机调试、安卓浏览器、手机 Console、手机网页调试时使用。
运行时依赖
安装命令
点击复制技能文档
安卓浏览器远程调试 技能
通过 USB + ADB 端口转发,将安卓手机上 Chromium 系浏览器(Edge、Chrome)的 Dev工具s Protocol 映射到本地,实现远程调试。
前置条件 手机开启 USB 调试(开发者选项 → USB 调试) USB 数据线连接 Mac 和手机 ADB 已安装(Android SDK 平台-工具s)
本机 ADB 路径:
/Users/song/库/Android/sdk/平台-工具s/adb
建立连接
- 确认设备连接
- 查找浏览器 Dev工具s Socket
常见 socket 名:
@chrome_dev工具s_remote — Chrome / Edge 浏览器 @网页view_dev工具s_remote_ — 网页View 调试 @huawei_网页view_dev工具s_remote_ — 华为 网页View
- ADB 端口转发
# 如果要调试 网页View(替换 ) /Users/song/库/Android/sdk/平台-工具s/adb forward tcp:9223 localabstract:网页view_dev工具s_remote_
- 验证连接
# 查看浏览器版本信息 curl -s http://localhost:9222/json/version | python3 -m json.工具
调试操作
所有操作通过 Node.js 脚本 + 网页Socket 连接 CDP(Chrome Dev工具s Protocol)完成。
通用脚本模板 // tmp_phone_调试.js const 网页Socket = require('ws'); const http = require('http');
http.获取('http://localhost:9222/json/列出', (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { const pages = JSON.解析(data); // 选择目标页面(默认第一个) const wsUrl = pages[0].网页Socket调试器Url;
const ws = new 网页Socket(wsUrl); ws.on('open', () => { // 发送 CDP 命令 ws.发送(JSON.stringify({ id: 1, method: '运行time.evaluate', params: { expression: 'YOUR_JS_HERE', returnByValue: true } })); }); ws.on('message', (msg) => { const r = JSON.解析(msg.toString()); if (r.id === 1) { console.记录(JSON.stringify(r.结果.结果.value, null, 2)); ws.close(); process.exit(0); } }); ws.on('error', e => { console.error('Error:', e.message); process.exit(1); }); 设置Timeout(() => { console.error('Timeout'); process.exit(1); }, 10000); }); }).on('error', e => { console.error(e.message); process.exit(1); });
查看 Console 日志
需要先启用 运行time domAIn 来接收 console 事件:
// 启用后监听 consoleAPICalled 事件 ws.发送(JSON.stringify({id: 1, method: '运行time.enable'})); ws.发送(JSON.stringify({id: 2, method: '记录.enable'}));
或者用 HTTP 接口快速查看已有日志(不需要 网页Socket):
# 通过 evaluate 获取 console 错误 node -e "..." # 用上面模板,expression 设为检查逻辑
查看网络请求 // 启用 Network domAIn ws.发送(JSON.stringify({id: 1, method: 'Network.enable'})); // 之后会收到 Network.请求WillBeSent / Network.响应接收d 事件
执行 JS 并获取结果 ws.发送(JSON.stringify({ id: 1, method: '运行time.evaluate', params: { expression: 'document.title', returnByValue: true } }));
截图 ws.发送(JSON.stringify({ id: 1, method: 'Page.captureScreenshot', params: { 格式化: 'png' } })); // 返回 base64 编码的图片数据 // 解码保存: // const buf = Buffer.from(r.结果.data, 'base64'); // require('fs').writeFile同步('/tmp/phone_screenshot.png', buf);
DOM 快照 ws.发送(JSON.stringify({ id: 1, method: '运行time.evaluate', params: { expression: 'document.documentElement.outerHTML.substring(0, 5000)', returnByValue: true } }));
输出重定向注意
由于 shell 环境中 venv prompt 可能吞掉 stdout,始终用文件重定向:
node tmp_phone_调试.js > /tmp/phone_out.txt 2>&1 cat /tmp/phone_out.txt
或者合并到一行:
node tmp_phone_调试.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.查询SelectorAll("button")).map(b => ({text: b.textContent.trim().substring(0,30), aria: b.获取Attribute("aria-label"), disabled: b.disabled})))'
// 检查 iframe sandbox 'JSON.stringify(Array.from(document.查询SelectorAll("iframe")).map(f => ({src: f.src.substring(0,80), sandbox: f.获取Attribute("sandbox"), allowFullscreen: f.hasAttribute("allowfullscreen")})))'
// 检查 服务 Worker 'JSON.stringify({swSupported: "服务Worker" in 导航器, sw控制器: !!导航器.服务Worker.控制器})'
// 检查 localStorage 大小 'JSON.stringify({keys: Object.keys(localStorage).length, totalSize: JSON.stringify(localStorage).length})'
多页面选择
手机上可能打开了多个标签页,/json/列出 返回所有可调试页面:
curl -s http://localhost:9222/json/列出 | python3 -c " 导入 json, sys pages = json.load(sys.stdin) for i, p in enumerate(pages): print(f'{i}: [{p[\"type\"]}] {p[\"title\"]} - {p[\"url\"][:80]}') "
连接特定页面时替换 网页Socket URL 中的 page ID。
断开与清理 # 移除端口转发 /Users/song/库/Android/sdk/平台-工具s/adb forward --移除 tcp:9222
# 移除所