อังกฤษ | 简体中文
WBBlades เป็นชุดเครื่องมือที่ใช้การแยกวิเคราะห์ไฟล์ Mach-O
รวมถึงการตรวจจับด้วยคลิกเดียวสำหรับแอป (รองรับ OC
และ Swift
) การวิเคราะห์ขนาดแพ็คเกจ (รองรับไลบรารีแบบคงที่/ไลบรารีไดนามิกเดียว) การวิเคราะห์ข้อขัดข้องแบบจุดต่อจุด (ตาม บนบันทึกของระบบ รองรับการวิเคราะห์สแต็กข้อขัดข้องของแพลตฟอร์ม Huawei และ Bugly รองรับสถานะที่ลงนามและไม่ได้ลงนาม) การแยกคลาสอัตโนมัติ และความสามารถของ Hook ตามไฟล์ Mach-O โดยหลักๆ แล้วจะใช้การวิเคราะห์โค้ดแอสเซมบลีข้อความ การแยกสถาปัตยกรรม การแยกไฟล์ DYSM การแยกตารางสัญลักษณ์ เทคโนโลยีการวิเคราะห์ไฟล์ขัดข้อง (ips) รองรับการแยกวิเคราะห์เมธอดขนาดใหญ่/วิธีเล็ก และ iOS 15 ข้างต้นเกี่ยวกับการประมวลผล dyld_chained_Fixups เพื่ออำนวยความสะดวกให้ผู้ใช้เข้าใจโครงการ WBBlades ได้อย่างรวดเร็ว เราจึงมีฟีเจอร์ Readme อัจฉริยะที่ใช้ GPT
ชื่อเครื่องมือ | ภาพรวมฟังก์ชัน | เทคโนโลยีที่เกี่ยวข้อง |
---|---|---|
Readme อัจฉริยะ | รูปแบบถามตอบแบบโต้ตอบช่วยให้เข้าใจโครงการ WBBblades และเทคโนโลยีที่เกี่ยวข้องได้อย่างรวดเร็ว | แชทจีพีที |
การตรวจจับด้วยคลิกเดียวสำหรับแอป | การตรวจจับคลาสที่ไร้ประโยชน์ Swift & OC การตรวจจับทรัพยากรที่ไม่มีประโยชน์ และคำแนะนำในการเพิ่มประสิทธิภาพการลดขนาดแพ็คเกจ | การถอดประกอบ, การแยกคำสั่ง __Text, การแยกวิเคราะห์ Mach-O, ตารางสัญลักษณ์และโครงสร้างคลาส Swift ใน Mach-O |
การวิเคราะห์ขนาดบรรจุภัณฑ์ | การตรวจจับขนาดจริงที่ถูกครอบครองโดยไลบรารีแบบคงที่และไดนามิกในไฟล์ .ipa | การลอกสถาปัตยกรรม การวิเคราะห์โครงสร้างห้องสมุดแบบคงที่ |
การวิเคราะห์ความผิดพลาด | ใช้ .app หรือ dYSM เพื่อวิเคราะห์บันทึกข้อขัดข้องของระบบ และสนับสนุนการวิเคราะห์สแต็กข้อขัดข้องบนแพลตฟอร์ม Huawei และ Bugly | การแยกวิเคราะห์ไฟล์ DYSM, การแยกตารางสัญลักษณ์แบบน้ำหนักเบา, การแยกวิเคราะห์ไฟล์ ips, มี/ไม่มีการแยกวิเคราะห์ข้อผิดพลาดของตารางสัญลักษณ์ |
ตะขอคลาส Mach-O | แยกคลาสออกจากไฟล์ Mach-O โดยอัตโนมัติ จากนั้นจึงเชื่อมต่อคลาสเหล่านั้น | dyld_ chained_ Fixups, การเชื่อมโยง, การรีบูต และการแยกวิเคราะห์เมธอดใหญ่/เล็ก |
เวอร์ชันใหม่ใช้การนำชุดเครื่องมือต่างๆ ไปใช้ในรูปแบบภาพที่ครอบคลุม โดยอิงตามการดำเนินการตามบรรทัดคำสั่งดั้งเดิมของเครื่องมือข้างต้น และได้รับการออกแบบสำหรับการปรับปรุงประสิทธิภาพด้านการวิจัยและพัฒนา นอกจากนี้ ในการวิเคราะห์ข้อขัดข้องที่ยาก สำหรับข้อขัดข้องบางข้อที่ไม่สามารถเกิดขึ้นซ้ำได้และไม่สามารถรวบรวมได้ด้วยเครื่องมือทั่วไป (กระบวนการของแอปถูกฆ่าโดยระบบปฏิบัติการโดยตรง) จะมีการวิเคราะห์ข้อขัดข้องแบบจุดต่อจุด
$ git clone https://github.com/wuba/WBBlades.git
$ cd WBBlades
$ pod install
เป้าหมายเลือก "WBBladesCrashApp"
เครื่องมือแสดงภาพ WBBlades แสดงอยู่ด้านล่าง คลิกปุ่มบนพื้นที่ฟังก์ชันด้านซ้าย เลือกเครื่องมือ เช่น Useless Classes Detection,Application Size Analysis ฯลฯ และดำเนินการตามคำแนะนำในเครื่องมือ ผลลัพธ์จะถูกส่งออกไปยังกล่องข้อความ
การแนะนำโดยละเอียดเกี่ยวกับเครื่องมือแสดงภาพ: การแนะนำโดยละเอียดเกี่ยวกับเครื่องมือแสดงภาพ
เป้าหมายเลือก "WBBlades" คอมไพล์และสร้างเครื่องมือบรรทัดคำสั่ง คัดลอกผลิตภัณฑ์ "เบลด" ที่สร้างขึ้นไปที่ /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 ....
- จากการระบุว่ามีการวิเคราะห์เฉพาะโค้ดที่ไม่ได้ใช้ในสแตติกไลบรารีต่อไปนี้ หากไม่มีพารามิเตอร์นี้ ค่าเริ่มต้นคือคลาสทั้งหมดในแอป
การวิเคราะห์ขนาดแอป (วัดขนาดของ .a หรือ .framework โดยตรงหลังการลิงก์)
$ blades -size xxx.a xxx.framework ....
รองรับการป้อนเส้นทางโฟลเดอร์ ไลบรารีแบบคงที่ทั้งหมดภายใต้โฟลเดอร์จะถูกวิเคราะห์
การกู้คืนบันทึกโดยไม่มีไฟล์ dSYM (ในกรณีที่ไฟล์ dSYM หายไป ให้ลองใช้สัญลักษณ์ ObjC
Crash Stack ไม่รองรับ 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() | |
การโทรอย่างรวดเร็วโดยใช้รันไทม์ | objc_getClass("Demo.MyClass") | |
พารามิเตอร์ทั่วไปของ Swift | SomeClass<MyClass>.init() | |
การโทรไดนามิกคลาส Swfit ใน ObjC | NSClassFromString("Demo.MyClass") | |
ประกาศประเภท Swift ในคอนเทนเนอร์ | var array:[MyClass] | |
รวดเร็วหลายรัง | class SomeClass {class MyClass {...} ...} |
รองรับการตรวจจับขนาดที่เชื่อมโยงของไลบรารีแบบคงที่อย่างรวดเร็ว ไม่จำเป็นต้องคอมไพล์และลิงก์ ตัวอย่างเช่น หากคุณต้องการทราบว่าขนาดแอปจะเพิ่มขึ้นเท่าใดเมื่อนำเข้าหรืออัปเดต SDK คุณสามารถใช้ blades -size
เพื่อประมาณขนาด โดยไม่จำเป็นต้องเชื่อมต่อ SDK เพื่อคอมไพล์และลิงก์เพื่อคำนวณได้สำเร็จ
ในกรณีที่ไฟล์ dSYM สูญหาย ให้ลองกู้คืนบันทึกผ่าน blades -symbol
**ตัวอย่างเช่น ในแพ็กเกจแอป ไฟล์ dSYM จะถูกล้างหลังจากช่วงระยะเวลาหนึ่ง แต่ไฟล์แอปจะยังคงอยู่ ในกรณีนี้ คุณสามารถลองใช้เบลดเพื่อแสดงสัญลักษณ์ได้ **ก่อนใช้เครื่องมือ ควรคำนึงถึงบางจุด:
หากแอปของคุณเป็นแพ็กเกจดีบักหรือแพ็กเกจที่ไม่แยกตารางสัญลักษณ์ออก คุณสามารถใช้ dsymutil app -o xx.dSYM
เพื่อแยกตารางสัญลักษณ์ได้ จากนั้นใช้ตารางสัญลักษณ์เพื่อแสดงสัญลักษณ์บันทึก
เครื่องมือนี้รองรับเฉพาะ ObjC เท่านั้น และหลักการของมันคือการกำหนดฟังก์ชันของการขัดข้องโดยการวิเคราะห์ที่อยู่ของวิธี ObjC ใน Mach-O ดังนั้นจึงไม่เหมาะสำหรับ Swfit, C และ C++ นอกจากนี้ เครื่องมือไม่ได้มีอำนาจทุกอย่าง แต่จะใช้เป็นวิธีทางเทคนิคเสริมในกรณีฉุกเฉินเท่านั้น ในสถานการณ์ประจำวัน ขอแนะนำให้ใช้ตารางสัญลักษณ์สำหรับการแสดงสัญลักษณ์บันทึก
เราหวังเป็นอย่างยิ่งว่านักพัฒนาจะสามารถแสดงความคิดเห็นและข้อเสนอแนะอันมีค่า และนักพัฒนาสามารถให้ข้อเสนอแนะเกี่ยวกับข้อเสนอแนะและปัญหาโดยการส่ง PR หรือปัญหา
หากคุณสนใจ WBBlades คุณสามารถเข้าร่วมกลุ่มพัฒนา WBBlades และหารือเกี่ยวกับปัญหาด้านเทคนิคร่วมกัน โปรดเพิ่มบัญชี wechat "zqlong320" หรือสแกนโค้ด QR ด้านล่างเป็นเพื่อนของคุณ จากนั้นเราจะเชิญคุณเข้าร่วมกลุ่ม
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能力。主要利用了__TE XT汇编代码分析、架构提取、符号表剥离、dYSM文件提取、崩溃文件(.ips)解析等技术手段实现,支持big method /small method 解析 以及 iOS 15 ปีที่แล้ว
工具名称 | 功能概述 | 相关技术 |
---|---|---|
智能Readme | 问答式互动,便于快速了解WBBlades项目以及相关技术 | GPT聊วัน |
App一键体检 | Swift/OC无用类检测、无用资源检测、包瘦身优化建议 | 反汇编、__Text指令提取、Mach-O解析、符号表/Swift类在Mach-O中的结构 |
包大分析 | 检测静态库/动态库在.ipa中占用的实际大小 | 架构剥离、静态库结构分析 |
崩溃解析 | 利用.app或者dYSM对系统崩溃日志解析,支持华为和Bugly平台的崩溃堆栈解析 | DYSM文件解析、轻量符号表提取、ips文件解析、มี/无符号表崩溃解析 |
มัคโอ类Hook | 自动提取任意Mach-O中的Class并Hook | dyld_chained_fixups การผูก การรีเบส วิธีการใหญ่/เล็ก 解析 |
新版本在原来基于命令行运行上述工具的基础上,对工具集进行了全เลดี้的可视化实现,เปิด箱即用,专为研发提效而设计。另外,在疑难崩溃解析上,针对一些不易复现、且通用工具无法收集的崩溃(被操作系统直接杀死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}/เบลด /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 通过runtime调用 | objc_getClass("Demo.MyClass") | |
สวิฟท์ 泛型参数 | 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来反馈建议和问题。
ข้อมูลเพิ่มเติม信号"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
คนแคระ地址:https://www.prevanders.net/dwarf.html#releases
GitHub: https://github.com/nygard/class-dump