Inglês | 简体中文
WBBlades é um conjunto de ferramentas baseado na análise de arquivos Mach-O
, incluindo detecção de aplicativo com um clique (suporta OC
e Swift
), análise de tamanho de pacote (suporta uma única biblioteca estática/biblioteca dinâmica), análise de falhas ponto a ponto (baseada em nos logs do sistema, suporta análise de pilha de falhas da plataforma Huawei e Bugly, suporta estados assinados e não assinados), extração automática de classe e capacidade de Hook baseada em arquivo Mach-O. Ele usa principalmente análise de código assembly __Text, extração de arquitetura, remoção de arquivo DYSM, remoção de tabela de símbolos, tecnologia de análise de arquivo de falha (ips). Suporta análise de método grande/método pequeno e iOS 15 acima sobre processamento dyld_chained_Fixups. Para facilitar aos usuários a compreensão rápida do projeto WBBlades, fornecemos um recurso Leiame inteligente baseado em GPT.
Nome da ferramenta | Visão geral da função | Tecnologias Relacionadas |
---|---|---|
Leia-me inteligente | O formato interativo de perguntas e respostas facilita uma compreensão rápida do projeto WBBlades e das tecnologias relacionadas. | Bate-papo GPT |
Detecção com um clique para aplicativo | Detecção de classes inúteis em Swift e OC, detecção de recursos inúteis e sugestões de otimização de redução de pacote. | Desmontagem, extração de instruções __Text, análise Mach-O, tabela de símbolos e estrutura de classes Swift em Mach-O |
Análise do tamanho do pacote | Detectando o tamanho real ocupado por bibliotecas estáticas e dinâmicas no arquivo .ipa. | Remoção de arquitetura, análise de estrutura de biblioteca estática |
Análise de falhas | Use .app ou dYSM para analisar logs de falhas do sistema e oferecer suporte à análise de pilha de falhas nas plataformas Huawei e Bugly | Análise de arquivo DYSM, extração leve de tabela de símbolos, análise de arquivo ips, análise de falha de tabela de símbolos com/sem |
Gancho Classe Mach-O | Extraia classes automaticamente de qualquer arquivo Mach-O e conecte-as. | dyld_ chained_ Correções, vinculação, rebase e análise de método grande/pequeno |
A nova versão implementa uma implementação visual abrangente do conjunto de ferramentas com base na operação original baseada em linha de comando das ferramentas acima e foi projetada para melhorar a eficiência de P&D. Além disso, na análise de falhas difíceis, para algumas falhas que não são fáceis de reproduzir e não podem ser coletadas por ferramentas gerais (o processo do aplicativo é eliminado diretamente pelo sistema operacional), é fornecida uma análise de falhas ponto a ponto.
$ git clone https://github.com/wuba/WBBlades.git
$ cd WBBlades
$ pod install
O destino seleciona "WBBladesCrashApp".
A ferramenta de visualização WBBlades é mostrada abaixo. Clique no botão na área de função esquerda, selecione uma ferramenta como Detecção de Classes Inúteis, Análise de Tamanho de Aplicativo, etc., e opere de acordo com os prompts da ferramenta, e o resultado será exibido na caixa de texto;
Introdução detalhada à ferramenta de visualização: Introdução detalhada à ferramenta de visualização
Target seleciona "WBBlades",Compile e construa para gerar ferramentas de linha de comando Copie os "blades" do produto gerado para /usr/local/bin,como segue: sudo cp ${Your_BUILD_DIR}/blades /usr/local/bin
Detecção com um clique
$ blades -diagnose xxx.app
Detecção com um clique de classes inúteis, recursos inúteis e recursos duplicados e assim por diante.
Detecção de código não utilizado ObjC e Swift
$ blades -unused xxx.app -from xxx.a xxx.a ....
-from indicando que apenas o código não utilizado nas seguintes bibliotecas estáticas é analisado. Sem esse parâmetro o padrão são todas as classes do APP.
Análise de tamanho do aplicativo (meça diretamente o tamanho de .a ou .framework após a vinculação)
$ blades -size xxx.a xxx.framework ....
Ao inserir um caminho de pasta, todas as bibliotecas estáticas na pasta serão analisadas.
Recuperação de log sem arquivo dSYM (no caso de arquivo dSYM ausente, tente a simbolização da pilha de falhas ObjC
, Swift
não é compatível)
$ blades -symbol xxx.app -logPath xxx.ips
Descrição | Apoiar | Exemplo de código |
---|---|---|
Chamada estática das classes ObjC | ✅ | [MyClass new] |
Chamada dinâmica de classes ObjC | ✅ | NSClassFromString(@"MyClass") |
Chamada dinâmica ObjC por meio de concatenação de strings | NSClassFromString(@"My" + @"Class") | |
Método de carregamento ObjC | ✅ | +load{...} |
ObjC e Swift sendo herdados | ✅ | SomClass : MyClass |
ObjC e Swift sendo propriedades | ✅ | @property (strong,atomic) MyClass *obj; |
Chamada direta de classe Swift | ✅ | MyClass.init() |
Chamada rápida usando tempo de execução | ✅ | objc_getClass("Demo.MyClass") |
Parâmetros genéricos do Swift | ✅ | SomeClass<MyClass>.init() |
Chamada dinâmica de classe Swfit em ObjC | ✅ | NSClassFromString("Demo.MyClass") |
Declaração de tipo Swift no contêiner | var array:[MyClass] | |
Aninhamento múltiplo rápido | ✅ | class SomeClass {class MyClass {...} ...} |
Suporta detecção rápida do tamanho vinculado de uma biblioteca estática. Não há necessidade de compilar e vincular. Por exemplo: se quiser saber quanto o tamanho do aplicativo aumentará quando um SDK for importado ou atualizado, você pode usar blades -size
para estimar o tamanho , sem a necessidade de conectar o SDK para compilar e vincular com sucesso para calcular.
No caso de perda do arquivo dSYM, tente restaurar o log via blades -symbol
. **Por exemplo, em um pacote de aplicativo, o arquivo dSYM é limpo após um período de tempo, mas o arquivo do aplicativo é retido. Neste caso, você pode considerar o uso de lâminas para simbolização. **Antes de utilizar a ferramenta preste atenção em alguns pontos:
Se seu aplicativo for um pacote de depuração ou um pacote que não remove a tabela de símbolos, você poderá usar dsymutil app -o xx.dSYM
para extrair a tabela de símbolos. Em seguida, use a tabela de símbolos para simbolizar o log.
Esta ferramenta suporta apenas ObjC, e seu princípio é determinar a função do travamento analisando o endereço do método ObjC no Mach-O. Portanto, não é adequado para Swfit, C e C++. Além disso, as ferramentas não são onipotentes e são utilizadas apenas como meios técnicos suplementares de emergência. Em situações cotidianas, recomenda-se a utilização de tabelas de símbolos para simbolização de log.
Esperamos sinceramente que os desenvolvedores possam fornecer comentários e sugestões valiosos, e que os desenvolvedores possam fornecer feedback sobre sugestões e problemas enviando PR ou problema.
Se você estiver interessado em WBBlades, você pode ingressar no grupo de desenvolvimento WBBlades e discutir questões técnicas juntos. Por favor, adicione a conta wechat "zqlong320" ou escaneie o código QR abaixo como seu amigo e então iremos convidá-lo para participar do grupo.
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
ANÃO: https://www.prevanders.net/dwarf.html#releases
简体中文 | Inglês
WBBlades是基于Mach-O
文件解析的工具集,包括App一键体检(支持OC
和Swift
的无用类检测) 、包大小分析(支持单个静态库/动态库的包大小分析)、点对点崩溃解析(基于系统日志,支持华为和Bugly平台崩溃堆栈解析,支持有符号和无符号状态)、基于Mach-O的Class自动提取和Hook能力。主要利用了__TE XT汇编代码分析、架构提取、符号表剥离、dYSM文件提取、崩溃文件(.ips)解析等技术手段实现,支持big método /método pequeno 解析 以及 iOS 15以上关于dyld_chained_fixups的处理。并且为了便于用户更快了解WBBlades项目,我们提供了基于GPT的智能Readme功能。
工具名称 | 功能概述 | 相关技术 |
---|---|---|
Leiame | 问答式互动, 便于快速了解WBBlades项目以及相关技术 | GPT |
App一键体检 | Swift/OC无用类检测、无用资源检测、包瘦身优化建议 | 反汇编、__Text指令提取、Mach-O解析、符号表/Swift类在Mach-O中的结构 |
包大小分析 | 检测静态库/动态库在.ipa中占用的实际大小 | 架构剥离、静态库结构分析 |
崩溃解析 | 利用.app或者dYSM对系统崩溃日志解析,支持华为和Bugly平台的崩溃堆栈解析 | dYSM文件解析、轻量符号表提取、ips文件解析、有/无符号表崩溃解析 |
Mach-O类Hook | 自动提取任意Mach-O中的Class并Hook | dyld_chained_fixups 、binding、rebase、método grande/pequeno解析 |
新版本在原来基于命令行运行上述工具的基础上,对工具集进行了全面的可视化实现,开箱即用,专为研发提效而设计。另外,在疑难崩溃解析上,针对一些不易复现、且通用工具无法收集的崩溃(被操作系统直接杀死App进程场景),提供了基于系统日志的点对点崩溃解析功能。
$ git clone https://github.com/wuba/WBBlades.git
$ cd WBBlades
$ pod install
alvo: WBBladesCrashApp
WBBlades可视化工具如下图所示。点击左侧功能区按钮,点击进入无用类检测、包大小检测等工具,根据工具内的提示进行操作即可,具体的数据会输出到文本框中;
可视化工具详细介绍: 可视化工具详细介绍
target选择:WBBlades,编译运行,生成命令行工具 将生成的产物blades 拷贝至 /usr/local/bin 下,具体操作如: sudo cp ${Seu_BUILD_DIR}/blades /usr/local/bin
一键诊断
$ blades -diagnose xxx.app
一键检测无用类、无用资源、重复资源等
无用代码检测OC
& Swift
$ blades -unused xxx.app -from xxx.a xxx.a ....
-de 标识只分析以下静态库中的无用代码,不加此参数默认为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") | |
Carga OC方法使用 | ✅ | +load{...} |
OC & Swift 被继承 | ✅ | SomClass : MyClass |
OC & Swift 作为属性 | ✅ | @property (strong,atomic) MyClass *obj; |
Swift 类直接调用 | ✅ | MyClass.init() |
Swift para executar o tempo de execução | ✅ | objc_getClass("Demo.MyClass") |
Swift 泛型参数 | ✅ | SomeClass<MyClass>.init() |
SWIT 类在OC中动态调用 | ✅ | NSClassFromString("Demo.MyClass") |
Swift 容器中作为类型声明 | var array:[MyClass] | |
Swift | ✅ | 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