Objective-C 未引用类检测脚本

18 阅读2分钟

Objective-C 未引用类检测脚本

概述

本脚本用于分析 iOS/macOS 应用程序的二进制文件,检测未被引用的 Objective-C 类,帮助开发者识别潜在的冗余代码。脚本通过解析 Mach-O 文件结构,结合 nmotool 工具,获取类列表及其引用信息,进行多层过滤后输出未使用类的清单。

功能模块

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 文件。

  • 同时输出仅作为其他类成员变量的类,提示用户二次确认。

脚本主流程

  1. 解析命令行参数。

  2. 验证输入路径有效性。

  3. 获取并提取单架构二进制文件。

  4. 通过 otoolnm 获取类列表和引用信息。

  5. 计算未引用类集合。

  6. 依次应用各类过滤规则。

  7. 输出结果文件,提示用户确认。

  8. 清理临时文件。

使用提示

  • 需在 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[结束]


使用实例

详情见github地址


:此脚本适合用于大型 Objective-C 项目,辅助代码瘦身和优化,减少冗余类的存在,提高项目质量。# testUnRefClass

testUnRefClass