下载安装
手机扫描左侧二维码即可直接下载(二维码指向本 APK 地址)。
出问题怎么把日志给我(不用截图、不用抄):打开 App → 底部 调试 → 面板最底部
「自动上报:关」点一下变成 开。开启的瞬间会立刻上传一份自检日志
(弹「日志已上报」= 通道正常;弹失败会带原因)。之后 App 每到 15 秒发现有新日志就自动推一份上来,
复现问题时什么都不用做,我直接读服务器上的日志文件(存在网站根目录之外,未公开)就能看到版本、机型、预设、
载入/重排/注入/尺寸计数、页面资源数和你那边的完整日志。设备信息行末尾会显示
上报 HH:MM:SS 成功,一眼能看出通道通不通。也可以随时手动点 上传日志。
多窗口
底部导航栏的 「窗口」 按钮(⋮ 更多 → 窗口:新建 / 窗口:列表 / 切换 里也有) 可以同时开多个窗口,最多 12 个。每个窗口是一个独立的 WebView, 历史记录、滚动位置、缩放与设备预设各自独立;Cookie 与登录态共享, 所以在 A 窗口登录过的后台,B 窗口打开同一站点仍是登录状态。
- 网页自己开的新标签也会进来:页面里
target="_blank"/window.open()打开的新窗口不会再被丢掉,会变成一个 App 窗口。 - 窗口面板:「+ 新建窗口」「从当前网址新建」「关闭其它窗口」; 点某一条=切过去,长按=复制网址 / 关闭这个窗口。
- 切窗口时会把视口与缩放按当前设置重新套一遍,避免上一个窗口的尺寸残留。
- 冷启动恢复:关掉 App 再打开会恢复上次的窗口列表(最多 8 个),只先加载当前窗口,切过去再加载。
加载状态(进度条一直动)
顶部进度条在加载期间一直都在动,不会出现「卡在某个百分比像死掉」的错觉。
进度超过 1.2 秒没有变化就自动切换成来回滚动的等待动画,状态栏同时显示
⏳ 加载中 62% · 已用 1.8s · 网址;等待服务器响应时显示
⏳ 加载中(等待服务器响应 4.2s)…。加载完成后状态栏会补一句 预览已加载 · 用时 X.Xs。
说明:App 里是整页重绘(不是图片、不是 iframe),所以页面会自上而下一点点出现; 页面自身的骨架/懒加载也会按网站自己的节奏出。要确认到底在不在加载,看顶部进度条动没动、状态栏的秒数有没有在走即可。
自动化 · 登录表单精确绑定
入口在 ⋮ 更多 → 自动化:登录表单绑定(底部导航栏的「账号」按钮已移除,账号记忆改成自动化能力)。 绑定身份不是「一个域名一条」,而是 网站 + 页面 + 表单 + 字段 四段精确定位: 同一个域名下的多个登录页(比如不同工具的后台)、同一个页面上的多个登录表单,各记各的,互不串。
- 绑定身份:
协议+主机+端口(https://a.xx.com与http://a.xx.com分开算) + 页面路径(自动剔除token / redirect / t / v这类易变参数,保证同一个登录页稳定命中) + 表单指纹(表单的name / id / action)+ 字段签名(每个输入框按name / id / type生成指纹)。 - 只记最后一次正确登录:提交登录时先把账号密码当成候选,不立刻覆盖已有记录; 只有这次登录确实成功、登录表单消失(跳转走或整页刷新过)才写入。 登录失败、表单还在就丢弃候选,之前存好的账号密码不受影响。
- 自动填入:页面出现密码框就按上面的身份去找,命中的那一组自动填; 站点自己预填过的内容不会被覆盖,你手动输过的也不会被改;慢渲染的登录框会自动重试 + 监听 DOM 变化; 搜索框和账号框同时存在时不会填错位置。
- 同一页多个表单:面板顶部会列出「当前页面检测到的登录表单」,逐个标注 已绑定 / 用站点通配兜底 / 未绑定,每个表单填各自绑定的那组;也可以点某个表单把账号重新绑定到它。
- 旧的按域名账号:会自动迁移成 「站点通配」兜底(
页面=*、表单=*), 只在找不到精确绑定时才用;打开面板里的 「仅精确绑定」 开关就完全不用兜底。 - 三个开关:面板顶部的「自动填入」「记住登录」「仅精确绑定」,随时可关。
- 面板里点什么:点某一组=填入当前页面;长按=重新绑定到当前表单 / 复制账号 / 复制密码 / 删除。
- 隐私:密码用 Android Keystore 里的密钥做 AES/GCM 加密后存在 App 私有目录
(
files/logins.json),不上传、不写入网页;JS 侧只按当前页面的绑定身份取自己那一组, 第三方 iframe 一律拒绝,网址不匹配也不给。
局限:只在顶层页面工作(iframe 里的登录框不填也不记);两步登录(先账号下一步密码)能记住。
访问记录(底部「记录」)
浏览过的 http/https 站点会自动记下来,入口在底部导航栏最右侧的「记录」,
「⋮ 更多」里也有一个入口。用途就是你说的那件事:登录过的后台,下次直接点一下回去,
不用重新输账号密码,也不用回忆域名。
- 搜索:顶部搜索框,标题 / 网址 / 域名都能搜(大小写不敏感)。
- 按日期归档:自动分组为「今天 · 9月17日」「昨天 · 9月16日」「9月7日 · 周三」,跨年会带年份。
- 收藏列表:面板顶部有并列的
全部/★ 收藏 N两个按钮,★ 收藏上的数字就是收藏条数,点它直接进收藏列表(也可从「⋮ 更多 → ★ 收藏夹」直达)。 - 怎么收藏:每条右侧的 ☆ 点一下变 ★ 即收藏,收藏的站点常去的后台钉在最前面找起来最省事。
- 长按某一条:收藏 / 复制链接 / 在系统浏览器打开 / 删除这条。
- 清空只清访问记录,不会动网站登录态(Cookie 不受影响)。
- 同一条网址只保留一条,重复访问会累加「访问 N 次」并更新标题,最多保留 800 条(收藏的不参与淘汰)。
记录存在 App 私有目录(files/history.json),卸载 App 才会消失;
登录态则由系统 WebView 的 Cookie 保持,关掉 App 再打开仍是登录状态。
登录后台 / 保持登录态 / 切换账号
登录页就是顶层页面,不是 iframe。输入账号密码、验证码、短信验证、扫码登录都与手机浏览器一致; 登录成功后 Cookie 由系统 WebView 原生保存,关掉 App 再打开仍是登录状态。
切换账号,按推荐顺序:
- 优先用网站后台自带的「退出登录」——最干净。
- 找不到退出入口时,用调试面板的 「退出本站登录」:只清当前网站的 Cookie 与 localStorage,其它网站的登录态完全不受影响。
- 想彻底重来:存储/缓存 → 清除所有站点的 Cookie 与站点数据,会退出全部网站。
说明:WordPress 的 wordpress_logged_in_* 是 HttpOnly 长期 Cookie,浏览器里的 JS 删不掉,
普通的「清会话 Cookie」也无效。本 App 通过 CookieManager 把这些 Cookie 逐个置为过期,
对 WordPress、宝塔面板、phpMyAdmin 这类后台都能可靠退出登录。
安装步骤
- 用手机浏览器打开本页,或扫描上面的二维码下载 .apk 文件。
- 点击下载完成的文件进行安装;系统提示「不允许安装未知来源应用」时,选择允许此来源。
- 本 APK 使用调试签名,安装时可能提示「未知开发者」,属正常现象,确认继续即可。
- 首次打开后,可在「更多 → 授予摄像头/麦克风/定位权限」一次性授权,方便调试需要这些权限的网页。
它解决了什么问题
原调试台把目标网站放进 <iframe> 里预览,因此会遇到两个硬限制:
目标站点发送 X-Frame-Options / frame-ancestors 时直接拒绝加载;
并且 iframe 属于第三方上下文,Cookie、登录态、localStorage 都与真实访问不一致。
本 App 用系统 WebView 把目标页面作为顶层文档加载,等于一个真正的浏览器: 没有 iframe 限制,Cookie 与登录态就是站点真实状态,且可以直接对任意页面注入脚本。
核心功能
使用说明
| 打开网页 | 顶部地址栏输入网址回车;不带协议的会自动补 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)
- 手机进入「设置 → 关于手机」,连点版本号开启开发者选项,再打开 USB 调试。
- 用数据线连接电脑,电脑 Chrome 地址栏输入
chrome://inspect/#devices。 - 在 Remote Target 列表中找到本 App 内的页面,点 inspect。
- 即可使用完整 DevTools:Elements、Console、Network、Sources、Application(查看/编辑 Cookie)。
无线调试(Android 11+,同一 WiFi):在「开发者选项 → 无线调试」配对后执行
adb pair 手机IP:端口、adb connect 手机IP:端口。
设备切换(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] 判定行)。
注意事项
· 应用已允许明文 HTTP 并信任用户证书,便于调试内部站点;请勿用它登录来路不明的网站。
· 卸载应用会同时清除其保存的 Cookie 与站点数据。