英语 | 简体中文
WBBlades是一个基于Mach-O
文件解析的工具集,包括app的一键检测(支持OC
和Swift
)、包大小分析(支持单个静态库/动态库)、点对点崩溃分析(基于在系统日志上,支持华为和Bugly平台崩溃堆栈分析,支持签名和未签名状态),基于Mach-O文件的Class自动提取和Hook能力。主要使用__Text汇编代码分析、架构提取、DYSM文件剥离、符号表剥离、崩溃文件(ips)分析技术。支持大方法/小方法解析以及iOS 15以上关于dyld_chained_Fixups的处理。为了方便用户快速了解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能力。主要利用了__TEXT工具代码分析、架构提取、符号表分割、dYSM文件提取、文件崩溃(.ips) )解析等技术手段实现,支持big method /small method 解析 以及 iOS 15 以上关于dyld_chained_fixups 的处理。并且为了让用户更快地了解 WBBlades 项目,我们提供了基于 GPT 的智能Readme 功能。
工具名称 | 功能概述 | 相关技术 |
---|---|---|
智能自述文件 | 问答式互动,首先快速了解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 {...} ...} |
快速检测一个静态库的链接后大小。消耗编译链接。简单说明:如果你想知道一个接入器或支持更新一个SDK就会增加多少包大小,可以用blades -size
来交换下大小,而消耗将SDK接入编译链接成功后进行计算测。
在丢失dSYM文件的情况下,尝试通过blades -symbol
恢复日志。例如某个次文件夹,一段时间后符号表被清除,但保留了app文件,这种情况下可以考虑使用WBBlades进行符号化。在工具中使用前应先注意几点:
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