一键清除 objc 项目中的无用方法

当项目越来越大,引入第三方库越来越多,上架的APP体积也会越来越大,对于用户来说体验必定是不好的。在清理资源,编译选项优化,清理无用类等完成后,能够做而且效果会比较明显的就只有清理无用函数了。现有一种方案是根据Linkmap文件取到objc的所有类方法和实例方法。再用工具逆向可执行文件里引用到的方法名,求个差集列出无用方法。这个方案有些比较麻烦的地方,因为检索出的无用方法没法确定能够直接删除,还需要挨个检索人工判断是否可以删除,这样每次要清理时都需要这样人工排查一遍是非常耗时耗力的。

这样就只有模拟编译过程对代码进行深入分析才能够找出确定能够删除的方法。具体效果可以先试试看,程序代码在:https://github.com/ming1016/SMCheckProject 选择工程目录后程序就开始检索无用方法然后将其注释掉。

首先遍历目录下所有的文件。

然后将注释排除在分析之外,这样做能够有效避免无用的解析。这里可以这样处理。

这里//这种注释是允许换行的,所以使用.*的方式会有问题,因为.是指非空和换行的字符。那么就需要用到[\s\S]这样的方法来包含所有字符,\s是匹配任意的空白符,\S是匹配任意不是空白符的字符,这样的或组合就能够包含全部字符。

接下来就要开始根据标记符号来进行切割分组了,使用Scanner,具体方式如下

由于objc语法中有行分割解析的,所以还要写个行解析的方法

获得这些数据后就可以开始检索定义的方法了。我写了一个类专门用来获得所有定义的方法

这个方法大概的思路就是根据标记符设置不同的状态,然后将获取的信息放入定义的结构中,这个结构我是按照文件作为主体的,文件中定义那些定义方法的列表,然后定义一个方法的结构体,这个结构体里定义一些方法的信息。具体结构如下

有了文件里定义的方法,接下来就是需要找出所有使用过的方法,这样才能够通过差集得到没有用过的方法。获取使用过的方法,我使用了一种时间复杂度较优的方法,关键在于对方法中使用方法的情况做了计数的处理,这样能够最大的减少遍历,达到一次遍历获取所有方法。具体实现如下

比对后获得无用方法后就要开始注释掉他们了。这里用的是逐行分析,使用解析定义方法的方式通过方法结构体里定义的唯一标识符来比对是否到了无用的方法那,然后开始添加注释将其注释掉。实现的方法具体如下:

完整代码在:https://github.com/ming1016/SMCheckProject 这里。基于语法层面的分析是比较有想象的,后面完善这个解析,比如说分析各个文件import的头文件递归来判断哪些类没有使用,通过获取的方法结合获取类里面定义的局部变量和全局变量来分析循环引用,通过获取的类的完整结构还能够将其转成JavaScriptCore能解析的js语法文件。

1 2 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部