VKDevTool App黑盒调试工具
YvetteAbner
8年前
<p><a href="/misc/goto?guid=4959713676201099800" rel="nofollow,noindex">App内调试工具 Github VKDevTool</a></p> <p>允许在</p> <ul> <li>在脱离Xcode Debug的情况下</li> <li>黑盒真机情况下</li> </ul> <p>进行App的调试工作,包括:</p> <ul> <li>调试内存对象</li> <li>打印内存数据</li> <li>修改UI</li> <li>查看NSLog</li> <li>查看所有网络请求记录</li> <li>查看App界面层级</li> </ul> <p>方便在黑盒测试+内部体验的环境下,发现Bug后,直接在Bug现场调试内存,分析问题</p> <h2>使用介绍</h2> <h2>工程配置</h2> <ul> <li>将 VKDevTool 文件夹拖入工程文件</li> <li>将 VKDevToolLogHeader.h 写入pch,以便开启NSLog的动态拦截记录,不导入ConsoleLog模块无法捕获NSLog</li> <li>可以修改 VKDevToolDefine.h 中的 #ifdef DEBUG 来进行自定义的编译控制,如果不修改,默认Debug模式下VKDevTool工具才有效</li> </ul> <h2>编写代码</h2> <pre> <code class="language-objectivec">[VKDevTool enableDebugMode]; </code></pre> <p>一行代码即可开启DevTool的功能,该功能内部有编译控制,Release版本会自动失效,无需使用者在这行代码外围在套一层 #ifdef DEBUG</p> <h2>如何使用</h2> <p>进行完工程配置与写入代码之后可以通过如下方式,在App内打开工程模式菜单</p> <ul> <li>模拟器下,使用键盘command+x快捷键唤起菜单</li> <li>真机运行下,使用摇一摇唤起菜单</li> </ul> <p><img src="https://simg.open-open.com/show/876831f0d145e9a7c77d8e2cd471489f.jpg"></p> <p>主菜单模块包含4个模块</p> <ul> <li>DebugScript</li> <li>ConsoleLog</li> <li>NetworkLog</li> <li>ViewHierarchy3D</li> </ul> <p>VKDevTool采取模块化设计,每个模块Module都可以独立分拆分离,同时支持用户定义扩展自己的模块,图中的额外2个模块为自定义模块</p> <h2>黑盒调试功能DebugScript</h2> <ul> <li>在主菜单中选择 DebugScript</li> <li>按提示点选任意一个界面元素</li> <li>进入代码控制台</li> <li>上面是代码输入框</li> <li>下面是输出框</li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/dbd3876b30fce1cc8f13c50d0a501c82.jpg"></p> <p>以上是一个预览界面,上方输入的代码都是基于JSPatch的,所有JSPatch的语法规则这里都一模一样可以使用,戳这里看JSPatch如何使用 <a href="/misc/goto?guid=4959713676292044363" rel="nofollow,noindex">JSPatch语法</a></p> <ul> <li>真机摇一摇 or 模拟器Command+X 可以唤起DebugScript模块子菜单</li> <li>模拟器下如果输入过代码Command+X可能不好使,通过模拟器菜单 Shake Gesture 功能模拟摇一摇,依旧可以唤起</li> </ul> <p>子菜单包含以下几个功能</p> <ul> <li> <p>GetTarget :自动往输入框中输入getTarget的脚本代码,执行以后print Target信息,便于后续直接调试target的任意内存数据和执行方法</p> </li> <li> <p>Get TargetVC :自动往输入框中输入getTargetVC的脚本代码,执行以后print Target所在的当前vc的信息,便于后续直接调试targetVC的任意内存数据和执行方法</p> </li> <li> <p>ChangeTarget :自动往输入框中输入切换所选target的代码,执行后,重新返回选择target界面</p> </li> <li> <p>ClearInput :清空输入区域</p> </li> <li> <p>ClearOutput :清空输出区域</p> </li> <li> <p>Exit :退出DebugScript</p> </li> </ul> <p>除此之外,DebugScript为JS代码添加了一个功能print()函数,可以print任意OC对象,如果对象是View,还会有额外的frame等信息输出</p> <p>我们通过一个GIF动画,大体看一下调试JS代码如何使用,此处的Gif是旧的Gif,新版本的颜色样式都已经调整,加了子菜单快捷方式,但是用法完全不变</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/861c701002a9a4eb9704a1548b5de218.gif"></p> <h2>日志拦截功能ConsoleLog</h2> <p>在PCH中加入了 VKDevToolLogHeader.h 后,本模块会拦截所有NSLog打印日志,以及NSError生成记录,在这个界面进行列表展示</p> <ul> <li>NSLog记录采用宏覆盖的方式,拦截接管了所有NSLog请求,以白色展现在界面内。</li> <li>NSError记录采用Runtime Swizzle的方式,拦截了NSError的init,以红色展现在界面内</li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/a47a6b9d4248e297739356553312491c.jpg"></p> <p>真机摇一摇 or 模拟器Command+X 可以唤起ConsoleLog模块子菜单</p> <ul> <li>NSError Hook:开启和关闭NSError拦截</li> <li>Copy to Pasteboard:把所有日志信息拷贝到剪切板</li> <li>Search Keyword:在众多日志中搜索关键字,关键字以蓝色展示</li> <li>Exit:退出</li> </ul> <h2>网络拦截功能NetworkLog</h2> <p>VKDevTool会采用NSURLProtocol的方案,拦截hook所有的http请求,一一记录起来,以列表的形式,展现在NetworkLog模块内</p> <p>每个cell,都可以点击查看每一条网络请求的真实返回数据,并且支持复制到剪切板</p> <p>真机摇一摇 or 模拟器Command+X 可以唤起NetworkLog模块子菜单</p> <ul> <li>Network Hook:可以选择开启和关闭http拦截</li> <li>Change Filter:可以通过过滤器,过滤含有固定字符串的网络请求,方便查找搜索</li> <li>Exit:退出</li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/3d10c75f6fc1c96970a2c636606bdd46.jpg"></p> <p>如果NetworkHook无效,查看是否是因为AFN sessionManager需要注册NSURLProtocol导致的</p> <pre> <code class="language-objectivec">NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration defaultSessionConfiguration]; NSArray *protocolArray = @[[VKURLProtocol class]]; configuration.protocolClasses = protocolArray </code></pre> <h2>页面层级ViewHierarchy3D</h2> <p>VKDevTool采用YY大神开源的 <a href="/misc/goto?guid=4959713676392844633" rel="nofollow,noindex">YYViewHierarchy3D</a> ,实现了这个页面层级模块</p> <ul> <li>真机摇一摇 or 模拟器Command+X 可以唤起ViewHierarchy3D模块子菜单</li> <li>模拟器下Command+X可能不好使,通过模拟器菜单 Shake Gesture 功能模拟摇一摇,依旧可以唤起</li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/917fa99ef29bc74218b72d71ec1a3105.jpg"></p> <h2>其他扩展代码</h2> <pre> <code class="language-objectivec">[VKDevTool changeNetworktModuleFilter:@“xxxxx”]; </code></pre> <p>这个接口控制网络请求HookLog的过滤器,只拦截含有xxxx字符串的http网络请求,同时在DevTool内还可以通过菜单,修改网络拦截过滤器</p> <p>如果全都拦截,可以省略</p> <pre> <code class="language-objectivec">[VKDevTool registKeyName:@"custom module name"withExtensionFunction:^{ //todo your code }]; </code></pre> <p>VKDevTool采取模块化设计,每个模块Module都可以独立分拆分离,同时支持用户定义扩展自己的模块</p> <p>这个接口用于给VKDevTool扩展主菜单模块,可以省略不写,只使用自带的4个模块。</p> <p> </p> <p>来自:http://awhisper.github.io/2016/09/01/VKDevTool/</p> <p> </p>