代码瘦身
App的安装包主要是由资源和可执行文件组成,资源前面已经进行了处理,接下来就是可执行文件的瘦身方法。
对可执行文件进行瘦身就是找到并且删除无用代码的过程。
- 找出方法和类的全集。
- 找出使用过的方法和类。
- 取差集得到无用代码。
- 确认无用代码可删除后,进行删除。
LinkMap结合Mach-O找无用代码
按照图中设置好LinkMap的路径,编译后得到LinkMap文件。
LinkMap文件分成三个部分:Object File、Section 和 Symbols。
- Object File 包含了代码工程的所有文件;
- Section 描述了代码段在生成的 Mach-O 里的偏移位置和大小;
- Symbols 会列出每个方法、类、block,以及它们的大小。
iOS的方法都会通过objc_msgSend来调用,而objc_msgSend 在 Mach-O 文件里是通过 __objc_selrefs 这个 section 来获取 selector 这个参数的。
所以,__objc_selrefs 里的方法一定是被调用了的。__objc_classrefs 里是被调用过的类,__objc_superrefs 是调用过 super 的类。通过 __objc_classrefs 和 __objc_superrefs,我们就可以找出使用过的类和子类。
但是,这种查看方法并不是完美的,还会有些问题。原因在于, Objective-C 是门动态语言,方法调用可以写成在运行时动态调用,这样就无法收集全所有调用的方法和类。所以,我们通过这种方法找出的无用方法和类就只能作为参考,还需要二次确认。
通过AppCode找出无用代码
如果代码量不大的时候,直接使用AppCode分析更加合适。
用 AppCode 做分析的方法很简单,直接在 AppCode 里选择 Code->Inspect Code 就可以进行静态分析。
静态分析完以后,我们可以在 Unused code 里看到所有的无用代码:
- 无用类:Unused class 是无用类,Unused import statement 是无用类引入声明,Unused property 是无用的属性;
- 无用方法:Unused method 是无用的方法,Unused parameter 是无用参数,Unused instance variable 是无用的实例变量,Unused local variable 是无用的局部变量,Unused value 是无用的值;
- 无用宏:Unused macro 是无用的宏。无用全局:Unused global declaration 是无用全局声明。
但是AppCode也有一些静态检查的问题,同样需要人工确认才能够安全删除。