开源 | App 开发神仙工具:帮你抓 Bug
作者:氚雨
阿里妹導(dǎo)讀:本文分享優(yōu)酷開源的?iOS 開發(fā)提效工具啄幕鳥,抓包、驗埋點、視覺走查都很方便,離案也可隨時定位問題,可幫助大家提高發(fā)現(xiàn)問題的效率。產(chǎn)品、測試、運營、UED 及開發(fā)人員皆宜。
一? 背景
客戶端日常開發(fā)中經(jīng)常遇到各種低效痛點,比如開發(fā) UI 界面時,開發(fā)、設(shè)計同學走查 UI 基本靠眼,不易于發(fā)現(xiàn)問題;設(shè)計同學想修改一個 UI 元素,除非是原開發(fā)者,其他同學不知道相關(guān)的 UI 類和 UI 布局,定位代碼費時費力;再如出現(xiàn) bug 時無法在 bug 現(xiàn)場獲取數(shù)據(jù)定位問題,debug 依賴電腦聯(lián)調(diào),缺少獨立便捷的 debug 工具。
對此優(yōu)酷開發(fā)了啄幕鳥 iOS 提效工具平臺,在端上整合各種高效 debug 工具,不依賴電腦聯(lián)調(diào),直接獲取 App 運行時數(shù)據(jù),快速定位問題,提高開發(fā)測試效率。
啄幕鳥項目現(xiàn)已開源,歡迎接入,共建共享。
?
二? 啄幕鳥簡介
啄幕鳥,即手機屏幕上的啄木鳥,森林里的啄木鳥抓蟲子,優(yōu)酷的啄幕鳥抓 bug。
啄幕鳥提效工具平臺集合了 UI 檢查、對象查看、方法監(jiān)聽、po 命令執(zhí)行、JSON 抓包等十多個開發(fā)工具,不依賴電腦聯(lián)調(diào),直接獲取運行時數(shù)據(jù),快速定位 bug,簡便易用,零侵入、零依賴、易接入、易擴展。
?啄幕鳥架構(gòu)圖
啄幕鳥界面截圖
?
1? 啄幕鳥架構(gòu)
啄幕鳥使用插件化架構(gòu),每個工具作為插件接入到啄幕鳥基礎(chǔ)服務(wù)當中,各個插件相互獨立,同時支持外部插件注冊、定制等,啄幕鳥還提供了一些通用功能模塊,如系統(tǒng)分享面板、屏幕日志等,方便各插件使用。
?
2? 基礎(chǔ)服務(wù)
基礎(chǔ)服務(wù)包括生命周期管理,插件加載、注冊、運行,資源管理,本地化等基礎(chǔ)能力。
?
3? 公共模塊
啄幕鳥公共模塊包括分享面板、圖文預(yù)覽、屏幕折線圖、屏幕日志四部分,隨著工具開發(fā),越來越多的通用能力會總結(jié)到公共模塊中。
1)分享面板封裝了系統(tǒng)分享功能,方便各個工具導(dǎo)出信息,啄幕鳥中的文本、圖片皆支持分享面板導(dǎo)出。
2)圖文預(yù)覽用以全屏查看文本、圖片。
3)屏幕折線圖方便插件直觀的顯示數(shù)據(jù),啄幕鳥中性能插件使用了屏幕折線圖顯示性能數(shù)據(jù)。
4)屏幕日志模塊方便各插件在 App 內(nèi)顯示日志、接受用戶輸入,屏幕日志界面大小可調(diào),支持日志顯示、用戶輸入、搜索、正則表達式過濾等功能,系統(tǒng)信息工具直接使用了屏幕日志顯示信息:
系統(tǒng)信息插件中直接使用了屏幕日志顯示信息
??
三? 主要工具介紹
1? UI 檢查工具
UI 檢查包含控件拾取和測距條兩個工具,控件拾取會根據(jù)手指在屏幕上的點擊坐標,遞歸遍歷 View 層級,獲取包含觸點坐標的最靠前的 UI 控件,并顯示控件的類名、 frame、字體、圖片 URL 等信息,方便地獲取、導(dǎo)出運行時數(shù)據(jù);測距條工具會在屏幕上添加大小、位置可控的 View 作為測量標尺,作為控件拾取的補充,對于某些不能通過控件拾取查看的大小間距,如行間距等,可以使用測距條測量。
控件拾取、測距條截圖
2? In-App-Debug 工具
iOS 開發(fā)主要使用 LLDB 的斷點、指令等進行 Debug,依賴電腦聯(lián)調(diào),In-App-Debug 即不依賴電腦,使用 App 內(nèi)的 debug 工具獲取運行時數(shù)據(jù),幫助定位問題,啄幕鳥提供了多種查看運行時數(shù)據(jù)的方式:對象查看、方法監(jiān)聽、po 命令和 JSON 抓包,幫助在 bug 現(xiàn)場定位問題,In-App-Debug 工具都利用了 objective-C 的運行時特性,將運行時特性工具化,形成一能力多功能的開發(fā)工具,如方法監(jiān)聽既可以用于定位 bug,也可以監(jiān)聽網(wǎng)絡(luò)方法抓取網(wǎng)絡(luò)數(shù)據(jù),其他工具也都有多種用途,可以極大提高 debug 效率。
1)對象查看
App 中所有的對象通過繼承、代理、屬性等關(guān)系,可以看作一個或多個連通圖。從一個對象開始,可以利用運行時特性獲取連通圖里任一個對象的屬性、成員變量,獲取運行時數(shù)據(jù),以定位問題。雙擊控件拾取的信息區(qū)即可打開對象查看,對象查看會顯示拾取對象的屬性、成員變量列表,點擊對象即可查看它的屬性,層層查找即可查看到每一個相關(guān)的對象,并可以通過命令讀取對象 key-path-value、執(zhí)行 po 命令等。
查看某 UILabel 對象、使用 k 命令獲取圓角值
?
UI 檢查、對象查看 Demo
?
?2)方法監(jiān)聽
對象查看提供了獲取 App 靜態(tài)數(shù)據(jù)的方式,而方法監(jiān)聽提供了獲取動態(tài)數(shù)據(jù)的方式,輸入監(jiān)聽命令即可監(jiān)聽任意 OC 方法的調(diào)用,輸出調(diào)用參數(shù)和返回值,用以查看代碼邏輯是否正常執(zhí)行,關(guān)鍵方法是否調(diào)用,監(jiān)聽網(wǎng)絡(luò)方法以在 App 內(nèi)抓包等。
監(jiān)聽設(shè)置自動息屏方法并顯示日志?
方法監(jiān)聽 Demo
方法監(jiān)聽利用了 OC 的消息轉(zhuǎn)發(fā)機制,通過 hook 監(jiān)聽對象消息轉(zhuǎn)發(fā)的相關(guān)方法,最后可以在 ykwoodpecker_forwardInvocation 方法中收到封裝了被監(jiān)聽方法調(diào)用參數(shù)和返回值的 NSInvocation,即可獲取 target、selector 等參數(shù)數(shù)組,根據(jù)參數(shù)編碼規(guī)則解析相應(yīng)的參數(shù),最后修改 NSInvocation 的 selector 為指向原方法的 ykwoodpecker_selector,即可調(diào)用原方法獲取返回值,輸出日志。
使用方法監(jiān)聽需要輸入類名、方法名、keypath 等參數(shù),故采用了命令行進行交互,擴展性好,配合命令配置,輸入也較方便。命令使用統(tǒng)一格式,<命令名縮寫><空格><命令參數(shù)><空格><命令參數(shù)>,如監(jiān)聽命令 L className methodName,KVC 取值命令 k keyPath,調(diào)用棧查看命令 k callStack,所有命令詳見工程 README。為方便輸入,命令可通過后臺配置,一鍵輸入,命令配置采用如下格式的 JSON,可在啄幕鳥初始化時指定配置 JSON 的獲取地址,推薦在 https://github.com/ZimWoodpecker/WoodpeckerCmdSource ?工程中建立配置,方便命令共享。
后臺命令配置格式
3)po 命令
po 命令是 iOS 開發(fā)中最常用的 debug 命令,po 命令工具會解析輸入字符串,獲取輸入的方法名、參數(shù)等,動態(tài)調(diào)用所輸入命令,并顯示返回信息。
App 中執(zhí)行 po 命令
4)JSON 抓包
使用方法監(jiān)聽抓包略有不便,數(shù)據(jù)量較大時會引起卡頓,因此提供了更方便的 JSON 抓包工具,通過監(jiān)聽 NSJSONSerialization 的 JSON 解析方法實現(xiàn)抓包。
JSON 抓包工具截圖
四? 更多功能
隨著日常使用,啄幕鳥中增加了更多功能:
系統(tǒng)信息:查看系統(tǒng)名稱、版本、屏幕、UA 等信息,支持添加業(yè)務(wù)方信息。
SandBox:查看沙盒文件,導(dǎo)出文件等。
Defaults:查看、新增、刪除 User Defaults。
清除數(shù)據(jù):清除所有沙盒數(shù)據(jù),包括 User Default。
UI 對比:支持將設(shè)計圖導(dǎo)入到 App 中進行對比,并可畫線、標注需修改的地方,方便 UI 走查。
查看圖片資源、Bundle 資源:查看 App 中的圖片資源與 Bundle 目錄內(nèi)容。
Crash:查看本地 crash 日志。
觸點顯示:顯示手指觸控,方面錄屏時顯示觸控操作。
性能插件:查看 CPU、內(nèi)存占用率,幀率,網(wǎng)絡(luò)流量等。
其他業(yè)務(wù)方注冊的插件:環(huán)境切換、埋點、實驗、調(diào)試工具等。
啄幕鳥工具插件截圖
五? 擴展開發(fā)
啄幕鳥使用插件化架構(gòu),新插件擴展方便,部分插件也支持功能擴展。一個類只需實現(xiàn)插件協(xié)議方法即可注冊為插件,可定制插件分組、分組顯示位置、插件名稱、icon、插件顯示位置等,簡單方便,高可定制。控件拾取、系統(tǒng)信息等插件也支持功能擴展,通過監(jiān)聽相關(guān)系統(tǒng)通知可以獲取拾取到的 View 等事件,并顯示自定義信息,具體參見工程 README。
?
六? 快速接入
啄幕鳥推出以來深受歡迎,已成為產(chǎn)品、設(shè)計、開發(fā)、測試日常互懟居家旅行必備之工具,啄幕鳥不依賴優(yōu)酷、阿里或其它第三方庫和數(shù)據(jù),主要功能皆通過系統(tǒng) API 或 hook 方式實現(xiàn),沒有使用 + load / initialize 方法,不開啟啄幕鳥不會執(zhí)行任何代碼,簡單安全,零侵入,零依賴。
啄幕鳥現(xiàn)已開源,是 AIOSO 的子項目之一,支持 iOS 8.0 及以上,阿里巴巴集團內(nèi)外使用pod YKWoodpecker 即可接入。
Get Started:
pod 'YKWoodpecker'一行代碼打開啄幕鳥:
#import "YKWoodpecker.h" // 顯示啄幕鳥入口 [[YKWoodpeckerManager sharedInstance] show];更多介紹詳見工程 README,Github 地址:
https://github.com/alibaba/youku-sdk-tool-woodpecker?
END 來和小伙伴們一起向上生長呀~~~ 掃描下方二維碼,添加小詹微信,可領(lǐng)取千元大禮包并申請加入 Python學習交流群,群內(nèi)僅供學術(shù)交流,日常互動,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,我會盡快通過好友申請哦!(添加人數(shù)較多,請耐心等待)(掃碼回復(fù) 1024? 即可領(lǐng)取IT資料包)總結(jié)
以上是生活随笔為你收集整理的开源 | App 开发神仙工具:帮你抓 Bug的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码也浪漫:用Python放一场烟花秀!
- 下一篇: 同事给我埋了个坑:Insert into