基于Chrome devTools远程调试技术方案

移动端页面因为开发采用的方案不同,调试方法也有差别。H5页面调试方案分为两种:基于调试框架支持的调试方案 和 基于原生系统支持的调试方法。本篇文章基于在天猫超市目前做的远程调试研究,介绍anydebugger调试技术方案,理论上支持任意环境下的web页面调试。

基于调试框架支持的调试方案

先比较一下现有的调试框架

能力\框架weinreanyproxyspy-debuggerVorlonvConsolejsConsolewhistleghostlabReact Native (Hybrid)Weex (Hybrid)
介绍老牌调试框架阿里系请求代理工具包装了weinre和anyproxy微软出品微信手机端调试工具远程输出控制台数据请求代理工具(包装了weinre, log)基于chrome devtools protocol调试可基于chrome devtools protocol调试可基于chrome devtools protocol调试
调试级别console network elementproxy

onsole

network

proxy element

console network element js debugconsole network elementconsoleconsole network proxy elementonsole network proxy element jsdebugonsole network element jsdebugonsole network element jsdebug
使用方法链接 插入js脚本链接 配置代理链接 配置代理(代理自动插入脚本)链接 插入js脚本链接 插入js脚本链接 插入js脚本链接 配置代理(代理自动插入脚本)链接 托管应用,代理自动插入脚本链接链接
开源开源(不维护) repo开源 repo开源 repo开源 repo开源 repo开源 repo开源 repo收费开源开源
零配置扫码调试支持支持支持支持支持(server中转)支持(server中转) ios:debug JS remote基于JavaScriptCore(参考) android:基于stetho(参考支持(server中转) ios基于xx android基于xx

开销: 几乎所有的调试框架都需要注入JS代码实现,因为要收集DOM和CSS,需要处理console信息。比较好的方式是通过代理自动注入js代码。

基于原生系统支持的调试方法

原生系统支持的调试方法需要首先确认权限问题,所以需要首次连接USB数据线。 IOS可以在后期保持wifi链接调试。 Android手机重启后需要再次链接数据线开启tcp调试端口。

能力\机型Android (Debug包)IOS (debug包)
局限需要首次链接USB开启wifi调试需要首次链接USB开启wifi调试
使用方法链接 基于数据线连接,然后可以开启adb over wifi链接
原理Android 4.4以上webview可以配置调试模式,会开启调试unix domain socket(基于Chrome Devtools Protocol),链接,可以对接Chrome Devtools 调试开启safari的web inspector 即可,基于ios web调试协议,配合Safari调试,也可以基于remotedebug-ios-webkit-adapter项目把调试协议转成Chrome Devtools Protocol,使用Chrome Devtools调试

AnyDebugger方案AnyDebugger方案是支持零配置扫码调试的方案,实现Chrome Devtools Protocol,直接基于Chrome Devtools调试页面。

方案介绍

目前通用的web调试框架是在页面插入inspector脚本,然后基于自有通讯协议,在自有的server调试页面上展示获取的调试信息,扩展和通用性较弱。Hybrid APP的调试是基于Android或者ios的调试协议的客户端实现。

AnyDebugger的不同之处是用JS实现Chrome Devtools Protocol,通过AnyDebugger服务端桥接到Chrome Devtools 上实现远程调试。

功能介绍

主要分为AnyDebugger.js和 AnyDebugger server两部分。 基于Chrom Devtools Protocol (tip of tree): https://chromedevtools.github.io/devtools-protocol/

  1. anydebugger.js功能设计注入到页面上,需要在最先出加载,以便捕捉数据。功能点和流程图如下:
anydebugger.js功能点说明
向服务端注册页面注册页面,服务端生成对应的websocket channel
websocket链接到服务端将初始化的数据收集,发送到服务端,服务端会先缓存,等chrome devtools连接到这个channel后发出
处理Page域请求初始化页面frame, 导航刷新等功能
处理Runtime域请求主要是运行时相关,包含console的重写和交互处理
处理DOM域请求主要是DOM信息维护,重新编排,DOM节点增删改查
处理CSS域请求主要是stylesheet处理,样式解析,匹配,增删改查
处理Network域请求主要监听网络请求和相关信息统计,可以增加对mtop请求的特殊处理
1. anyDebugger server功能设计 主要负责桥接 websocket, 维护页面信息,维护anydebugger.js的连接 和 Chrome Devtools的连接。功能点和流程图如下:
anydebugger server功能点说明(简化功能,page页面保留在内存数据中)
功能主页提供调试页面入口,可以搜索已经注册的页面
调试功能页面不用开发,基于ChromeDevTools/devtools-frontend 项目
API - /register注册页面接口
API - /json列出可以inspect的页面信息,兼容Chrome Devtools inspect 协议
client web socket链接anydebugger.js 的websocket
devtools web socket链接 Chrome Devtools的websocket
anydebug web page socketanydebug入口页面获取可调式页面信息,打开调试页面
3. MOCK功能设计 mock功能基于重写mtop request请求实现,基于API匹配规则,匹配的请求走到给定的mock数据。
mock功能点说明
重写request请求增加hook函数,并统计接口相关信息,入参,返回值,cookie等
提供mock数据钩子函数,用于匹配mock规则,mock数据根据mock数据配置,匹配的接口直接走mock数据,否则走正常请求。
请求信息统计,用于连接anyDebugger的network统计请求数据将请求参数,cookie,请求返回值等通过chrome devtools protocol回传,用于接口调试
4. 功能结构图

anydebugger的功能结构主要包含:webview层面,socketserver+webserver层面,Chrome devtools层面。

业务接入

接入参考github:anydebugger

npm install anydebugger -g

anydebugger -v //see version

anydebugger //start debug

anydebugger -p 9000 //start debug


请遵守《互联网环境法规》文明发言,欢迎讨论问题
扫码反馈

扫一扫,反馈当前页面

咨询反馈
扫码关注
返回顶部