Objective-C 未引用类检测脚本
概述
本脚本用于分析 iOS/macOS 应用程序的二进制文件,检测未被引用的 Objective-C 类,帮助开发者识别潜在的冗余代码。脚本通过解析 Mach-O 文件结构,结合 nm
和 otool
工具,获取类列表及其引用信息,进行多层过滤后输出未使用类的清单。
功能模块
1. 输入参数解析
- 使用
getopt
解析命令行参数:
- -p
或 --path
:应用程序或二进制文件路径
- -b
或 --blackListStr
:黑名单(排除的类名前缀列表)
- -w
或 --whiteListStr
:白名单(只包含的类名前缀列表)
-
不允许同时存在黑名单和白名单。
-
校验路径是否存在。
2. 应用路径验证
-
支持
.app
包路径,自动定位主二进制可执行文件。 -
使用
file
命令判断文件类型是否为 Mach-O。
3. 获取二进制架构
-
识别二进制文件的架构类型(如
x86_64
,arm64
等)。 -
多架构时使用
lipo
提取单架构二进制文件。
4. 解析 Mach-O 指针与符号
-
使用
otool
命令提取__objc_classlist
、__objc_classrefs
、__objc_selrefs
段的指针。 -
使用
nm
命令获取符号表中所有 Objective-C 类符号。 -
解析指针对应的类名。
5. 过滤逻辑
-
黑白名单过滤:根据用户提供的黑名单或白名单过滤未引用类。
-
字符串引用过滤:排除通过字符串常量间接引用的类(可选)。
-
父类过滤:若父类有子类被引用,父类视为被引用。
-
load方法过滤:过滤实现了
+load
方法的类,因为它们会被系统自动调用。 -
成员变量递归过滤:检测成员变量引用关系,递归排除被其他类成员变量引用的类。
6. 输出结果
-
输出未引用类列表到
FindUnRefsClass.txt
文件。 -
同时输出仅作为其他类成员变量的类,提示用户二次确认。
脚本主流程
-
解析命令行参数。
-
验证输入路径有效性。
-
获取并提取单架构二进制文件。
-
通过
otool
和nm
获取类列表和引用信息。 -
计算未引用类集合。
-
依次应用各类过滤规则。
-
输出结果文件,提示用户确认。
-
清理临时文件。
使用提示
-
需在 macOS 环境中使用,依赖
nm
,otool
,lipo
等系统工具。 -
需配合
FindAllClassIvars
模块,用于成员变量引用分析。 -
对于只被
alloc/init
方式引用的类,可能存在误判,需人工确认。
脚本流程图
graph TD
A[开始] --> B[解析命令行参数]
B --> C{路径有效?}
C -- 否 --> D[打印错误并退出]
C -- 是 --> E[验证并定位二进制文件]
E --> F[获取二进制架构]
F --> G{多架构?}
G -- 是 --> H[提取单架构二进制]
G -- 否 --> I[使用单架构二进制]
H --> J[获取未引用类指针]
I --> J
J --> K[获取类符号及引用信息]
K --> L[计算未引用类集合]
L --> M[字符串引用过滤]
M --> N[父类过滤]
N --> O[load方法过滤]
O --> P[黑白名单过滤]
P --> Q[成员变量递归过滤]
Q --> R[输出结果文件]
R --> S[清理临时文件]
S --> T[结束]
使用实例
注:此脚本适合用于大型 Objective-C 项目,辅助代码瘦身和优化,减少冗余类的存在,提高项目质量。# testUnRefClass