移动调试浏览器

安卓专用调试浏览器 · 多窗口 · 顶层加载不依赖 iframe · 设备视口模拟 · 登录表单精确绑定 · 真实登录态

v3.0.4 · Android 8.0+ · 350 KB

下载安装

⬇ 下载 APK
版本:3.0.4 包名:com.svipf.mobiledebug
大小:358,440 字节 最低系统:Android 8.0 (API 26)
SHA-256:cd87ad558ea70c781a9c8db7254514d2fff527ac37fa4d0d347869116b6658ad

手机扫描左侧二维码即可直接下载(二维码指向本 APK 地址)。

出问题怎么把日志给我(不用截图、不用抄):打开 App → 底部 调试 → 面板最底部 「自动上报:关」点一下变成 开。开启的瞬间会立刻上传一份自检日志 (弹「日志已上报」= 通道正常;弹失败会带原因)。之后 App 每到 15 秒发现有新日志就自动推一份上来, 复现问题时什么都不用做,我直接读服务器上的日志文件(存在网站根目录之外,未公开)就能看到版本、机型、预设、 载入/重排/注入/尺寸计数、页面资源数和你那边的完整日志。设备信息行末尾会显示 上报 HH:MM:SS 成功,一眼能看出通道通不通。也可以随时手动点 上传日志。

多窗口

底部导航栏的 「窗口」 按钮(⋮ 更多 → 窗口:新建 / 窗口:列表 / 切换 里也有) 可以同时开多个窗口,最多 12 个。每个窗口是一个独立的 WebView, 历史记录、滚动位置、缩放与设备预设各自独立;Cookie 与登录态共享, 所以在 A 窗口登录过的后台,B 窗口打开同一站点仍是登录状态。

加载状态(进度条一直动)

顶部进度条在加载期间一直都在动,不会出现「卡在某个百分比像死掉」的错觉。 进度超过 1.2 秒没有变化就自动切换成来回滚动的等待动画,状态栏同时显示 ⏳ 加载中 62% · 已用 1.8s · 网址;等待服务器响应时显示 ⏳ 加载中(等待服务器响应 4.2s)…。加载完成后状态栏会补一句 预览已加载 · 用时 X.Xs。

说明:App 里是整页重绘(不是图片、不是 iframe),所以页面会自上而下一点点出现; 页面自身的骨架/懒加载也会按网站自己的节奏出。要确认到底在不在加载,看顶部进度条动没动、状态栏的秒数有没有在走即可。

自动化 · 登录表单精确绑定

入口在 ⋮ 更多 → 自动化:登录表单绑定(底部导航栏的「账号」按钮已移除,账号记忆改成自动化能力)。 绑定身份不是「一个域名一条」,而是 网站 + 页面 + 表单 + 字段 四段精确定位: 同一个域名下的多个登录页(比如不同工具的后台)、同一个页面上的多个登录表单,各记各的,互不串。

局限:只在顶层页面工作(iframe 里的登录框不填也不记);两步登录(先账号下一步密码)能记住。

访问记录(底部「记录」)

浏览过的 http/https 站点会自动记下来,入口在底部导航栏最右侧的「记录」, 「⋮ 更多」里也有一个入口。用途就是你说的那件事:登录过的后台,下次直接点一下回去, 不用重新输账号密码,也不用回忆域名。

记录存在 App 私有目录(files/history.json),卸载 App 才会消失; 登录态则由系统 WebView 的 Cookie 保持,关掉 App 再打开仍是登录状态。

登录后台 / 保持登录态 / 切换账号

登录页就是顶层页面,不是 iframe。输入账号密码、验证码、短信验证、扫码登录都与手机浏览器一致; 登录成功后 Cookie 由系统 WebView 原生保存,关掉 App 再打开仍是登录状态。

切换账号,按推荐顺序:

  1. 优先用网站后台自带的「退出登录」——最干净。
  2. 找不到退出入口时,用调试面板的 「退出本站登录」:只清当前网站的 Cookie 与 localStorage,其它网站的登录态完全不受影响。
  3. 想彻底重来:存储/缓存 → 清除所有站点的 Cookie 与站点数据,会退出全部网站。

说明:WordPress 的 wordpress_logged_in_* 是 HttpOnly 长期 Cookie,浏览器里的 JS 删不掉, 普通的「清会话 Cookie」也无效。本 App 通过 CookieManager 把这些 Cookie 逐个置为过期, 对 WordPress、宝塔面板、phpMyAdmin 这类后台都能可靠退出登录。

安装步骤

  1. 用手机浏览器打开本页,或扫描上面的二维码下载 .apk 文件。
  2. 点击下载完成的文件进行安装;系统提示「不允许安装未知来源应用」时,选择允许此来源。
  3. 本 APK 使用调试签名,安装时可能提示「未知开发者」,属正常现象,确认继续即可。
  4. 首次打开后,可在「更多 → 授予摄像头/麦克风/定位权限」一次性授权,方便调试需要这些权限的网页。

它解决了什么问题

原调试台把目标网站放进 <iframe> 里预览,因此会遇到两个硬限制: 目标站点发送 X-Frame-Options / frame-ancestors 时直接拒绝加载; 并且 iframe 属于第三方上下文,Cookie、登录态、localStorage 都与真实访问不一致。

本 App 用系统 WebView 把目标页面作为顶层文档加载,等于一个真正的浏览器: 没有 iframe 限制,Cookie 与登录态就是站点真实状态,且可以直接对任意页面注入脚本。

核心功能

顶层加载,无 iframe绕过 X-Frame-Options / frame-ancestors,任何站点都能打开。
多窗口(最多 12 个)每个窗口独立 WebView,历史与缩放各自独立、Cookie 与登录态共享;页面里 target=_blank / window.open 的新标签也会进来。
进度条一直在动加载中进度条持续动画,超过 1.2 秒不变就切成来回滚动的等待动画,状态栏显示百分比与已用秒数。
20 个设备预设按视口宽度从大到小排列,1920 排第一常显;更大的 2048/2560/3440/3840 收在左侧「+」里。
视口级模拟强制页面按目标设备宽度重新布局,真实检验响应式断点;支持横竖屏与缩放。
元素点选调试调试模式下点选任意元素,红色描边、上一层/下一层、复制 DOM 开头。
真实登录态原生 CookieManager + localStorage,登录一次即保持,关掉 App 依然是登录状态。
按站点退出登录只清当前网站的 Cookie(含 HttpOnly),其它网站登录态保留,方便切换账号。
注入 Eruda / vConsole手机端就能看 Console、Elements、Network、Resources。
远程 Chrome DevTools已开启 WebView 远程调试,电脑 Chrome 打开 chrome://inspect 即可用完整 DevTools。
桌面 / 手机 UA 切换一键切换判断响应式布局,也可切回移动端 UA。
执行自定义 JS在面板里直接输入 JS 并查看返回值,操作任意页面的 DOM。
Cookie / 存储管理查看并复制当前站点 Cookie、清除缓存、清除站点数据、重置登录态。
文件上传与下载支持网页 file 选择器、下载管理器,以及摄像头 / 麦克风 / 定位授权。

使用说明

打开网页顶部地址栏输入网址回车;不带协议的会自动补 https://,非网址内容会走搜索。
手机端调试底部点「调试」打开面板 → 「注入 Eruda」,页面右下角出现圆形按钮,点开即可用 Console / Elements / Network。
自动注入面板中「自动注入:开」后,每次页面加载完成都会自动注入 Eruda,适合连续调试。
执行 JS面板输入框写代码(如 document.cookie),点「执行 JS」,结果显示在下方的日志区。
PC 端完整调试数据线连接电脑 + 开启 USB 调试 → 电脑 Chrome 打开 chrome://inspect/#devices → 在 Remote Target 点 inspect。
登录后台地址栏输入后台地址直接登录即可,Cookie 原生保存;关掉 App 再打开仍是登录状态。
切换账号优先用网站自带的「退出登录」;否则用「调试 → 退出本站登录」(只清本站,其它站点登录保留)。
登录表单绑定⋮ 更多 → 自动化:登录表单绑定:按「网站 + 页面 + 表单 + 字段」精确记,同一个域名下的多个登录页 / 同一页的多个表单各记各的,只留下最后一次正确登录;失败不覆盖。长按某一组可重新绑定到当前表单 / 复制账号 / 复制密码 / 删除。
多窗口底部「窗口」=新建 / 切换 / 关闭窗口(最多 12 个),页面里 target=_blank / window.open 也会变成一个窗口;各窗口历史与缩放独立、Cookie 与登录态共享。
加载进度加载期间顶部进度条一直在动:进度超过 1.2 秒不变就切成来回滚动的等待动画,状态栏显示百分比 / 已用秒数 / 网址,完成后提示「预览已加载 · 用时 X.Xs」。
长页面底部 ◀ ▶ 前进后退,⟳ 刷新,「回顶」「调试」「记录」「窗口」四个面板入口,⋯ 更多菜单(含「回到主页」)。

远程调试(PC 上看完整 DevTools)

  1. 手机进入「设置 → 关于手机」,连点版本号开启开发者选项,再打开 USB 调试。
  2. 用数据线连接电脑,电脑 Chrome 地址栏输入 chrome://inspect/#devices。
  3. 在 Remote Target 列表中找到本 App 内的页面,点 inspect。
  4. 即可使用完整 DevTools:Elements、Console、Network、Sources、Application(查看/编辑 Cookie)。

无线调试(Android 11+,同一 WiFi):在「开发者选项 → 无线调试」配对后执行 adb pair 手机IP:端口、adb connect 手机IP:端口。

源码与重新构建

附带完整安卓工程源码(Java + WebView,无第三方依赖,已内置 Eruda / vConsole),可自行修改后重新打包。

⬇ 下载源码包(309 KB)

工程结构:app/AndroidManifest.xml、app/res/、app/assets/、 app/java/com/svipf/mobiledebug/MainActivity.java、 app/java/com/svipf/mobiledebug/LoginStore.java(登录表单精确绑定)、build.sh
build.sh 使用 Android SDK 的 aapt2 + d8 + apksigner 直接编译签名,无需 Gradle;也可直接导入 Android Studio 构建。

设备切换(20 个预设,按视口宽度从大到小,1920 排第一)

点一下即切换,页面会按「该设备的视口宽度」重新布局,所以能真实检验响应式断点,而不是只把画面缩小。 设备条下面的信息行会实时显示「设备名 · 视口 · dpr · 来源说明 · 缩放」。

1920 常显、并且排在第一位;只有大于 1920 的预设(2048 / 2560 / 3440 / 3840)默认收起在设备条最左侧的 + 里, 点 + 展开、点 - 收起。收起时若当前正在用被收起的预设,会自动切回 1920。

桌面1920×1080(1080p 100%,常显排第一)· 1920×1080 dpr2(4K 屏开 200%)
桌面(+内)3840×2160(4K 100%)· 3440×1440(21:9 带鱼屏)· 2560×1440(2K 100% / 4K 150% / 5K 200%,dpr 1 / 1.5 / 2)· 2048×1152(2K 屏开 125%)· 1920×1080(1080p 100% / 4K 屏开 200%)
笔记本1536×864 dpr1.25(1080p 屏开 125%)· 1440×900 dpr1(MacBook Air 默认)· 1366×768 dpr1(老笔记本 100%)· 1280×720 dpr1.5(1080p 屏开 150%)
平板iPad Pro 12.9 1024×1366 · Pro 11 834×1194 · iPad Air 820×1180 · 安卓平板 800×1280 · iPad mini 744×1133(均 dpr2)
手机安卓手机 412×915 dpr2.625 · iPhone 15 393×852 dpr3 · iPhone SE 375×667 dpr2

电脑端的宽度是 系统显示缩放之后的有效 CSS 视口:同一台 1920×1080 显示器,显示缩放 100% / 125% / 150% 时浏览器拿到的是 1920×1080 / 1536×864 / 1280×720,断点行为完全不同,所以电脑端不能只留一个 1920。

设备操作:↻ 横竖屏(宽高互换)、⌗ 适应窗口、− / + 缩放、 缩放比例(适应窗口 / 10% / 20% / 30% / 50% / 65% / 80% / 100%)、全屏。

缩放与屏幕限制:缩放比例只决定设备框在手机屏幕上的显示大小,不改变被测页面的视口宽度,断点始终由预设的宽 × 高决定。 显示比例硬性限制在「适应窗口」以内(选中会超出屏幕的比例时自动按适应窗口显示并在日志说明实际比例),所以设备框永远完整可见。

为什么不会再有横向滚动条 / 右边缺失:页面里的 WebView 视图按设备真实尺寸布局 (宽 = 设备宽 × 屏幕密度 物理像素),页面拿到的 CSS 视口天然就等于设备宽、1:1 渲染,页面本身不会横向溢出; 整块画面再由 App 侧做视图缩放缩进设备框。整套流程不依赖 WebView 自己的视口缩放判定, 因此不会再出现「右侧被裁 + 一条滑不动的横向滚动条」。日志里会打印 [视口] 布局宽 1920/可见宽 1920(目标 1920),无横向溢出 供核对。 想看本机真实视口的 1:1 效果,用 全屏按钮或把手机横过来。

双指缩放:在设备框里用两根手指捏合,即可像浏览器一样放大 / 缩小页面内容(双击放大还原), 用于看清 18% 缩放下看不清的文字细节;信息栏会实时显示「页面 150%」这样的页面缩放值。 页面缩放只放大画面、不会改变被测页面的视口宽度,断点判定不受影响; 切换设备 / 换横竖屏 / 点 ⌗ 适应窗口 会回到 100%。 页面加载过程不会自动改动缩放(上一版就是加载后自动缩放导致画面不停闪烁、图片像重新加载,2.6.2 已修掉), 页面级缩放的最小值是 100%,不会被缩到比整页还小。 站点若写了 user-scalable=no,注入脚本会自动放开缩放权限(全屏模式同样处理)。 若某台手机的手势识别不灵,调试面板里还有 页面缩小 / 页面放大 / 页面还原 三个按钮兜底。 底部导航栏的 回顶 按钮可直接把页面拉回顶部。

3.0.4 页面里不再自己弹出 f12(Eruda)面板;「自动注入」默认关闭。 原因:自动注入走的是 injectEruda(),里面写着 if(window.eruda){eruda.show();…}——而 wp-admin / Elementor 这类页面一次加载会多次触发 onPageFinished(history API 的页内跳转也算),第二次注入时页面里已经有 eruda,于是 show() 把整个 f12 面板弹了出来糊住页面。现在拆成两条路: 自动注入只保证「有 eruda」,不会打开面板;只有你手动点「注入 Eruda」才把面板打开。 同时把「自动注入 Eruda」默认改回关(老设置会被重置一次,需要时在调试面板一键打开)。

3.0.3 修掉「装上后一打开就闪退」。 3.0.0 起把 WebView 改成「一个窗口一个」,创建时漏改了一处旧字段名: createWebView() 里 cm.setAcceptThirdPartyCookies(web, true) 用的是刚被改成多窗口后的 web 字段(此刻还是 null),而新 WebView 是局部变量 w → Chromium 内部 setAcceptThirdPartyCookies() 去调 web.getSettings() 直接空指针, 于是在 onCreate 里就崩(日志:crash → 初始化失败 → createWebView 空指针)。 改成 w 即修复。同时给 onPause() / onResume() 的 web 加了 null 兜底。

3.0.2 增加崩溃自动上报(启动闪退也能定位)。 有人反馈 3.0.1 装上后一打开就闪退,但闪退时 App 来不及把日志发出来,服务端只能看到旧版本的日志。 现在在 MainActivity.onCreate() 最开始就装了 Thread.setDefaultUncaughtExceptionHandler: 闪退瞬间把完整堆栈写进 files/last-crash.txt,并用独立线程直接 POST 到日志接口(标签 crash, 最多等 5 秒保证发出去),下次启动若发现上次的崩溃文件还会补发一次(标签 crash-prev)。 setContentView 与初始化两段各自也套了 catch:真出错时不再直接闪退,而是弹窗显示堆栈前几行, 可一键复制,同时把完整堆栈上报。这样「一打开就闪退」也能直接看到原因。

3.0.1 移除底部 ⌂(回到主页)图标。 底部导航栏原本是 ◀ ▶ ⟳ ⌂ 回顶 调试 记录 窗口,因为「窗口」占位后偏挤,去掉了 ⌂; 回到内置主页改从 ⋮ 更多 → 回到主页 进入,其余按钮不变。

3.0.0 新增多窗口与加载进度,账号记忆升级为「登录表单精确绑定」。 ① 多窗口:底部导航栏新增 「窗口」(原来的「账号」按钮移除),一个窗口一个 WebView,最多 12 个, 页面里 target=_blank / window.open 打开的标签也会变成 App 窗口;各窗口历史与缩放独立、Cookie 与登录态共享, 冷启动最多恢复 8 个窗口。② 加载进度:进度条在加载期间一直动,超过 1.2 秒不变就切成来回滚动的等待动画, 状态栏显示 ⏳ 加载中 62% · 已用 1.8s 与「等待服务器响应 X.Xs」,完成后提示「预览已加载 · 用时 X.Xs」,避免「以为没在加载」的错觉。 ③ 登录绑定:绑定身份从「一个域名一条」升级为 网站 + 页面 + 表单 + 字段, 同一域名下的多个登录页(不同工具)、同一页上的多个表单各记各的;只保留最后一次正确登录(提交先记候选,登录成功、表单消失才落库,失败不覆盖); 旧的按域名账号自动迁移为「站点通配」兜底,可用「仅精确绑定」关掉。 存储从 files/credentials.json 换成 files/logins.json(仍为 AES/GCM 加密)。

2.9.2 修掉桌面预设下「上下滑动出现大片空白」。 2.9.1 把 WebView 换成 Activity 上下文后,1920 预设需要的页面缩放变成 18%,低于 WebView 的缩放下限, 于是每次加载都会走兜底:视图被撑到 1920 × 2.956 ≈ 5676px 宽(约 1800 万像素)再缩 0.21 倍显示, 栅格化预算爆掉,滑动就出现空白。现在兜底只把视图铺到「最小可用页面缩放」对应的宽度: 1920 预设约 1747px 宽(约 170 万像素,轻 10 倍以上),页面缩放约 26%,布局宽度仍是 1920 不受影响。 日志里会打印 [视口] …已改用兜底:视图铺到 1747px 宽、页面缩放约 26%。

2.9.1 修掉「页面里的原生下拉框全都点不开」。 原因是 WebView 用了 createConfigurationContext()(density 改 160)创建,它不是带窗口 token 的 UI context;而安卓 WebView 在手机上会把 <select> 弹成 AlertDialog, Dialog.show() 抛出的 BadTokenException 又被 Chromium 静默吞掉, 于是所有下拉框点了都没反应。现在改用 Activity 上下文创建 WebView,下拉框恢复正常。 注意:去掉 density=1 之后,1920 预设信息栏里的「页面缩放」会从 ~63% 变成 ~18%(等于预设缩放, 这是正常口径),屏幕上的显示大小不变。

2.9.0 新增「账号密码」(按站点记住所有账号 + 自动填充)。 入口:底部导航栏的「账号」,或「⋮ 更多 → 账号密码(自动填充)」。 (注:3.0.0 起底部「账号」按钮已移除,改为 ⋮ 更多 → 自动化:登录表单绑定,老数据自动迁移为「站点通配」兜底。) 每个主机名一份账号库(二级域名各算各的),登录时自动采集,打开登录页自动填入用过最多的那一组, 面板里可以搜索、填入、复制、设为默认、删除,密码用 Android Keystore 的密钥做 AES/GCM 加密后 存在 App 私有目录。详见上方「自动化 · 登录表单精确绑定」一节。

2.8.4 把访问记录的「关闭」文字按钮换成通用叉号图标。 新增矢量图 res/drawable/ic_close.xml:24dp、两条 2dp 描边路径(圆头线帽)、不填充, 就是常见的 SVG 线性图标写法(stroke-linecap="round" 的等价物),矢量缩放不糊。 按钮仍沿用其它芯片的浅底描边样式,高度与 全部 / ★ 收藏 / 清空 对齐, 并带无障碍描述「关闭」。

2.8.3 修掉「选中的按钮看不清」。 访问记录面板顶部的 全部 / ★ 收藏 选中态用的是实心绿底 (@color/primary #0F766E),文字却还是深绿 primary_dark, 绿底配深绿字,选中反而更糊。现在选中态统一成 绿底 + 白字,与「调试」「全屏」两个开关按钮一致; 未选中仍是浅底深字。

2.8.2 修掉「在访问记录 / 收藏列表里按手机返回键会把 App 退出」。 访问记录面板是盖在页面上的浮层,之前返回键没有接管它:系统返回键会直接去回退网页, 没有可回退的页面就把 App 退到后台。现在返回键的第一优先级就是关闭访问记录 / 收藏列表面板, 关掉面板回到主界面后,再按返回键才轮到你熟悉的那套顺序:调试面板 → 调试模式 → 网页后退 → 退出。 关面板时会顺带收起键盘、清掉搜索框内容,不会残留选中状态。

2.8.1 把「收藏列表」从藏起来的切换态改成常显入口。 上一版「★ 收藏」是做在「全部」按钮上的切换态,不点一下根本看不出还有收藏列表。 现在面板顶部是并列的两个按钮:全部 和 ★ 收藏 N (N 就是收藏条数,为 0 时不显示数字);点「★ 收藏」直接进收藏列表, 按钮会高亮成选中态。「⋮ 更多」里也新增了一项 ★ 收藏夹,一步直达收藏列表。 收藏仍可在列表里点每条右侧的 ☆ 完成,收藏的条目永不参与淘汰。

2.8.0 新增「访问记录」,并顺手修掉一个会放大卡顿的隐患。 记录入口在底部导航栏的 「记录」:浏览过的站点自动收集,可搜索、可按日期归档、可收藏, 点一下直接回到登录过的后台(登录态靠 Cookie 保持,不用二次登录)。详见上方「访问记录」一节。 另外,注入脚本以前每切换一次设备 / 缩放比例就会重新叠加一遍事件监听, 切十次设备就等于十个监听器同时上报,把上报频率顶到 30 行/秒,UI 线程被拖慢。 现在监听器按文档只注册一次、重注入只更新配置,实测同样 30 次切换的日志量 从 216 条降到 68 条、瞬时峰值从 32 条/400ms 降到 8 条/400ms。

2.7.1 修掉「严重偏移、右侧看不到、有一条滑不动的水平滑条」。 根因是注入的 viewport meta 里写了 minimum-scale=1:它把「整页缩到视图宽度」的自适应缩放 钉死在 100%。而 WebView 的 CSS 宽度 = 视图物理宽 ÷ 设备密度(你这台 vivo 是 ÷3.5), 1920 的桌面视口只需要约 18.6% 才能铺满,被 100% 卡住后布局视口虽然是 1920、可见宽却只有 549, 页面只露左边约 1/3.5,右侧全被推到可视区外 —— 就是那条「看得见却滑不动」的水平滑条。 另外 Chromium 的页面缩放还自带 25% 的硬下限,所以光删掉 minimum-scale=1 也不够, 必须同时用 minimum-scale=0.03 把这个下限放开。改完后实测(真实 Chromium 移动仿真): 1920 → 布局 1920 / 可见 1920、1536 → 1536 / 1536、393 → 393 / 393, 整页刚好铺满设备框,断点判定也仍然是目标设备宽度。 换设备 / 换缩放比例后还会自动重贴一次;万一某台机器的 WebView 仍不放开缩放下限, App 会自动退回「视图按设备宽铺开 + 视图缩放」的兜底方案(布局一定正确,代价是更吃 GPU), 并在日志里打印 [视口] …已改用兜底方案。

2.7.0 修掉「一直闪、图片像从头重新加载」(前两版 2.6.2 / 2.6.4 都改错了地方)。真正的两个成因: ① 注入脚本用 requestAnimationFrame 每帧递归上报视口数据,约 60 条/秒, 宿主每收到一条就重建一次日志文本(最多 400 行)并滚到底,UI 线程被占满,页面就一直在闪、 图片像重新加载——视口越宽(1920 / 2048)刷屏行越长,所以电脑端特别明显; ② renderFrame() 在布局回调里同步改文字,而 TextView.setText 会 requestLayout(), 于是「改布局 → 改文字 → 再改布局」变成无限重排环。 现在上报改成事件驱动 + 限流(只在 resize / load 时上报,最短间隔 400ms,内容没变就不发), 布局回调只在尺寸真的变了才响应,文字刷新合并到 60ms 一次且内容没变不 setText, 日志合并成 250ms 刷一次、只渲染最近 220 行、面板没打开时也不滚动。 另外 onPageCommitVisible(首次绘制前)就注入视口宽度,页面只按目标宽度排一次版, 不再像以前那样加载完成后又整页重排第二次。 信息栏末尾的 载入 / 重排 / 注入 / 尺寸 四个计数仍然保留:页面静止时数字不再变化才正常。

调试模式(与原调试台一致)

工具条上的 预览 / 调试 切换。进入调试模式后点页面上的任意元素即可选中: 元素会显示红色描边,且阻止该次点击的默认行为(不会误触页面按钮、不会跳转)。

2.6.3 起调试模式彻底禁止跳转:点选时会拦掉 click / submit / pointer / mouse 事件链, 阻止站点脚本抢跑;宿主还额外拦截所有「带用户手势」的主框架导航请求, 所以点带链接的模块、按钮、表单提交、target=_blank 都只会选中元素,绝不会跳出当前页面 (日志会打印 [debug] 调试模式已拦截点击跳转:…)。需要正常跳转时点一下 预览 即可。 站点自己发起的跳转(例如登录成功后自动跳转)不受影响,方便继续调试登录流程。

元素信息显示当前选中元素的 <标签>
上一层选中当前元素的父级元素
下一层选中当前元素的第一个子元素
复制 DOM 开头复制带全部属性的开头标签(自动剔除调试用 class)
↑ / ↓按 78% 视口高度平滑滚动页面
复制 URL复制当前页面的真实地址
执行 JS面板里输入任意 JS,显示返回值或错误信息
调试日志带时间戳记录页面 console、点选、滚动、切换设备等操作

原工具因为用 iframe,跨域页面点选和 JS 都会失败(同源限制); 本 App 是顶层加载,任意站点都能点选和注入脚本。

日志上报(把手机上的日志直接发给开发者)

调试面板底部有 上传日志 按钮:点一下即把当前日志 POST 到本站 mobile-debug-app/log.php,按时间落盘到服务器上(网站根目录之外)的私有日志目录, 开发者直接读文件排查,不需要你截图或手抄。

旁边的 自动上报:关/开 打开后,一旦检测到「3 秒内主框架加载 ≥3 次」或 「3 秒内 WebView 尺寸变化 ≥4 次」这类异常,会自动上传一份日志(20 秒内不重复), 复现闪烁时你什么都不用做。

上报内容:App 版本 / 机型 / Android 版本 / 屏幕与 dpr / 当前设备预设与缩放 / 当前页面地址与页面缩放 / 四个诊断计数(载入·重排·注入·尺寸)/ 开关状态 / 完整调试日志(最近 400 行,含 console 与 [diag] 判定行)。

注意事项

· 本 APK 使用调试签名,仅适合自用/内部调试,请勿上架应用商店。
· 应用已允许明文 HTTP 并信任用户证书,便于调试内部站点;请勿用它登录来路不明的网站。
· 卸载应用会同时清除其保存的 Cookie 与站点数据。