英語 | 簡體中文
WBBlades是一個基於Mach-O
檔案解析的工具集,包括app的一鍵檢測(支援OC
和Swift
)、套件大小分析(支援單一靜態庫/動態庫)、點對點崩潰分析(基於在系統日誌上,支持華為和Bugly平台崩潰堆疊分析,支援簽章和未簽章狀態),基於Mach-O檔案的Class自動擷取和Hook能力。主要使用__Text彙編程式碼分析、架構擷取、DYSM檔案剝離、符號表剝離、崩潰檔案(ips)分析技術。為了方便使用者快速了解WBBlades項目,我們提供了基於GPT的智慧Readme功能。
工具名稱 | 功能概述 | 相關技術 |
---|---|---|
智慧自述文件 | 互動問答的形式有利於快速了解WBBlades專案及相關技術。 | GPT 聊天 |
App一鍵偵測 | Swift & OC 無用類別偵測、無用資源偵測、套件精簡最佳化建議。 | 反組譯、__Text指令擷取、Mach-O解析、Mach-O中的符號表和Swift類別結構 |
封裝尺寸分析 | 偵測.ipa檔案中靜態和動態庫所佔用的實際大小。 | 架構剝離、靜態函式庫結構分析 |
事故分析 | 使用.app或dYSM分析系統崩潰日誌,支援華為和Bugly平台的崩潰堆疊分析 | DYSM檔案解析,輕量級符號表提取,ips檔案解析,帶/不帶符號表崩潰解析 |
馬赫-O 級鉤子 | 自動從任何 Mach-O 檔案中提取類,然後掛鉤它們。 | dyld_ chained_ Fixups、綁定、rebase 和大/小方法解析 |
新版本在上述工具原有基於命令列的操作基礎上,實現了工具集的全面可視化實現,專為研發效率提升而設計。另外,在疑難崩潰的分析中,對於一些不易重現、一般工具無法收集的崩潰(app進程被操作系統直接殺死),提供了點對點的崩潰分析。
$ git clone https://github.com/wuba/WBBlades.git
$ cd WBBlades
$ pod install
目標選擇“WBBladesCrashApp”。
WBBlades 視覺化工具如下圖所示。點選左側功能區按鈕,選擇無用類別偵測、應用程式大小分析等工具,依照工具中的提示進行操作,結果將輸出到文字方塊;
視覺化工具詳細介紹:視覺化工具詳細介紹
Target選擇“WBBlades”,編譯建置產生命令列工具將產生的產品“blades”複製到/usr/local/bin,如下: sudo cp ${Your_BUILD_DIR}/blades /usr/local/bin
一鍵檢測
$ blades -diagnose xxx.app
一鍵偵測無用類別、無用資源、重複資源等。
未使用的程式碼檢測 ObjC 和 Swift
$ blades -unused xxx.app -from xxx.a xxx.a ....
-from 表示只分析以下靜態庫中未使用的程式碼。如果沒有該參數,則預設為APP中的所有類別。
應用程式大小分析(連結後直接測量.a或.framework的大小)
$ blades -size xxx.a xxx.framework ....
支援輸入資料夾路徑,分析該資料夾下的所有靜態庫。
沒有 dSYM 檔案的日誌復原(在遺失 dSYM 檔案的情況下,嘗試ObjC
崩潰堆疊符號化,不支援Swift
)
$ blades -symbol xxx.app -logPath xxx.ips
描述 | 支援 | 程式碼範例 |
---|---|---|
ObjC類別的靜態調用 | ✅ | [MyClass new] |
ObjC類別的動態調用 | ✅ | NSClassFromString(@"MyClass") |
ObjC 透過字串連接動態調用 | NSClassFromString(@"My" + @"Class") | |
ObjC載入方法 | ✅ | +load{...} |
ObjC & Swift 被繼承 | ✅ | SomClass : MyClass |
ObjC 和 Swift 是屬性 | ✅ | @property (strong,atomic) MyClass *obj; |
Swift 類別直接調用 | ✅ | MyClass.init() |
使用運行時進行 Swift 調用 | ✅ | objc_getClass("Demo.MyClass") |
Swift 通用參數 | ✅ | SomeClass<MyClass>.init() |
ObjC 中的 Swfit 類別動態調用 | ✅ | NSClassFromString("Demo.MyClass") |
容器中的 Swift 類型聲明 | var array:[MyClass] | |
Swift 多重嵌套 | ✅ | class SomeClass {class MyClass {...} ...} |
支援快速檢測靜態庫的連結大小。無需編譯和連結。例如:如果您想知道導入或更新 SDK 後應用程式大小會增加多少,可以使用blades -size
來估算大小,而不需要連接 SDK 編譯連結成功才能計算。
如果遺失 dSYM 文件,請嘗試透過blades -symbol
恢復日誌。 **例如,在應用程式打包中,dSYM檔案在一段時間後被清除,但應用程式檔案被保留。在這種情況下,可以考慮使用刀片進行符號化。 **使用該工具之前,請注意以下幾點:
如果您的應用程式是偵錯套件或不剝離符號表的套件,則可以使用dsymutil app -o xx.dSYM
來提取符號表。然後使用符號表對日誌進行符號化。
該工具僅支援ObjC,其原理是透過分析Mach-O中ObjC方法的位址來確定崩潰的函數。因此,它不適合 Swfit、C 和 C++。另外,工具也不是萬能的,只是作為緊急的補充技術手段。日常情況下,建議使用符號表進行日誌符號化。
我們真誠地希望開發者能夠提供寶貴的意見和建議,開發者可以透過提交 PR 或 Issue 的方式來回饋建議和問題。
如果您對WBBlades感興趣,可以加入WBBlades開發小組,一起討論技術問題。請新增微信「zqlong320」或掃描下方二維碼加為好友,我們將邀請您入群。
GitHub:https://github.com/aquynh/capstone
GitHub:https://github.com/Sunnyyoung/SYFlatButton
GitHub:https://github.com/nygard/class-dump
GitHub:https://github.com/alexrozanski/PXListView
GitHub:https://github.com/steventroughtonsmith/cartool
矮人:https://www.prevanders.net/dwarf.html#releases
簡體中文 |英語
WBBlades是基於Mach-O
檔案解析的工具集,包括App一鍵檢視(支援OC
和Swift
的無用類別偵測)、套件大小分析(支援單一靜態庫/動態庫的套件大小分析)、點對點崩潰解析(基於系統日誌,支援華為和Bugly平台崩潰堆疊解析,支援有符號和無符號狀態)、基於Mach-O的Class自動提取和Hook能力。提取、崩潰文件(.ips)解析等技術手段實現,支持大方法/小方法解析以及iOS 15以上關於dyld_chained_fixups的處理。 。
工具名稱 | 功能概述 | 相關技術 |
---|---|---|
智慧自述文件 | 問答式互動,首先快速了解WBBlades專案以及相關技術 | GPT聊天 |
App一鍵檢查 | Swift/OC無用類別偵測、無用資源偵測、包瘦身最佳化建議 | 反方向、__Text指令擷取、Mach-O解析、符號表/Swift類別在Mach-O中的結構 |
套件大小分析 | 偵測靜態庫/動態庫在.ipa中佔用的實際大小 | 架構拆除、靜態庫結構分析 |
崩潰解析 | 利用.app或dYSM對系統崩潰日誌解析,支援華為和Bugly平台的崩潰日誌解析 | dYSM檔案解析、輕量符號表擷取、ips檔解析、有/無符號表崩潰解析 |
馬赫-O類鉤子 | 自動提取任何Mach-O中的Class並Hook | dyld_chained_fixups 、綁定、rebase、大/小方法解析 |
新版本在原來基於命令列運行上述工具的基礎上,對工具集進行了全面的可視化實現,開箱即用,專門為研發提效而設計。問題、通用工具無法收集崩潰(被串列埠直接殺死App進程場景),提供了基於系統日誌的點對點崩潰解析功能。
$ git clone https://github.com/wuba/WBBlades.git
$ cd WBBlades
$ pod install
目標選擇:WBBladesCrashApp
WBBlades視覺化工具如下圖所示。
視覺化工具詳細介紹: 視覺化工具詳細介紹
目標選擇:WBBlades,編譯運行,產生命令列工具將產生的產物blades拷貝至 /usr/local/bin 下,具體操作如: sudo cp ${Your_BUILD_DIR}/blades /usr/local/bin
一鍵診斷
$ blades -diagnose xxx.app
一鍵偵測無用類別、無用資源、重複資源等
無用程式碼檢測OC
& Swift
$ blades -unused xxx.app -from xxx.a xxx.a ....
-來自識別僅分析以下靜態庫中的無用程式碼,不加此參數預設為APP中全部類
套件大小分析(直接計算.a |.framework連結後的大小)
$ blades -size xxx.a xxx.framework ....
支援輸入一個資料夾路徑,輸入後該文件下所有的靜態庫都會被分析
無符號表符號化(在遺失符號表的情況下,嘗試OC
崩潰堆疊符號化,不支援Swift
)
$ blades -symbol xxx.app -logPath xxx.ips
說明 | 是否支持 | 程式碼範例 |
---|---|---|
OC 類別的靜態調用 | ✅ | [MyClass new] |
OC的動態調用 | ✅ | NSClassFromString(@"MyClass") |
OC字串拼接動態調用 | NSClassFromString(@"My" + @"Class") | |
OC負載方法使用 | ✅ | +load{...} |
OC & Swift 被繼承 | ✅ | SomClass : MyClass |
OC 和 Swift 作為屬性 | ✅ | @property (strong,atomic) MyClass *obj; |
Swift 類別直接調用 | ✅ | MyClass.init() |
Swift 透過運行時調用 | ✅ | objc_getClass("Demo.MyClass") |
Swift 泛型參數 | ✅ | SomeClass<MyClass>.init() |
Swfit 類別在 OC 中動態調用 | ✅ | NSClassFromString("Demo.MyClass") |
Swift 容器中以型別聲明 | var array:[MyClass] | |
史威夫特 | ✅ | class SomeClass {class MyClass {...} ...} |
快速偵測一個靜態函式庫的連結後blades -size
。 SDK接入編譯連結成功後進行計算測。
在遺失dSYM文件的情況下,嘗試通過blades -symbol
恢復日誌。工具中使用前應先註意幾點:
dsymutil app -o xx.dSYM
來提取符號表。我們誠摯地希望開發者提供寶貴的意見和建議,開發者可以透過提交PR或Issue來回饋建議和問題。
歡迎對WBBlades感興趣的小伙伴加入WBBlades開發交流群,一起探討技術問題,請先添加微信號“zqlong320”或掃描下面的二維碼為好友,備註“WBBlades”,我們會邀請您進群。
GitHub網址:https://github.com/aquynh/capstone
GitHub網址:https://github.com/Sunnyyoung/SYFlatButton
GitHub網址:https://github.com/nygard/class-dump
GitHub網址:https://github.com/alexrozanski/PXListView
GitHub網址:https://github.com/steventroughtonsmith/cartool
DWARF網址:https://www.prevanders.net/dwarf.html#releases
GitHub:https://github.com/nygard/class-dump