iOS 安装包瘦身(下篇)

本文详细介绍了如何优化iOS应用的安装包大小,包括清理无用代码如Dead Code Stripping,使用Clang、可执行文件、源码扫描等方式查找并删除无用代码。此外,还探讨了资源瘦身的多种方法,如图片资源的压缩、XCAssets的使用、冗余资源的检测与删除,以及On-Demand Resources、视频/音频资源的远端化等。最后,文章提到了在网易漫画App中的实践效果,并给出了一些最佳实践建议。
摘要由CSDN通过智能技术生成

本文来自网易云社区


作者:饶梦云

2.4. 清理无用代码

2.4.1. Dead Code Stripping

Activating this setting causes the -dead_strip flag to be passed to ld(1) via cc(1) to turn on dead code stripping. Remove functions and data that are unreachable by the entry point or exported symbols

Xcode 默认会开启此选项,C/C++/Swift 等静态语言编译器会在 link 的时候移除未使用的代码,但是对于 Objective-C 等动态语言是无效的。因为 Objective-C 是建立在运行时上面的,底层暴露给编译器的都是 Runtime 源码编译结果,所有的部分应该都是会被判别为有效代码。

2.4.2. 通过扫描查找无用代码

扫描无用代码的基本思路都是查找已经使用的方法/类和所有的类/方法,然后从所有的类/方法当中剔除已经使用的方法/类剩下的基本都是无用的类/方法,但是由于 Objective-C 是动态语言,可以使用字符串来调用类和方法,所以检查结果一般都不是特别准确,需要二次确认。目前市面上的扫描的思路大致可以分为 3 种:

  • 基于 Clang 扫描

  • 基于可执行文件扫描

  • 基于源码扫描

2.4.2.1. 基于 clang 扫描

基本思路是基于 clang AST。追溯到函数的调用层级,记录所有定义的方法/类和所有调用的方法/类,再取差集。具体原理参考 如何使用 Clang Plugin 找到项目中的无用代码,目前只有思路没有现成的工具。

2.4.2.2. 基于可执行文件扫描

Mach-O 文件中的 (__DATA,__objc_classlist) 段表示所有定义的类, (__DATA.__objc_classrefs) 段表示所有引用的类(继承关系是在 __DATA.__objc_superrefs 中);使用的方法和引用的方法也是类似原理。因此我们使用 otool 等命令逆向可执行文件中引用到的类/方法和所有定义的类/方法,然后计算差集。具体参考iOS微信安装包瘦身,目前只有思路没有现成的工具。

2.4.2.3. 基于源码扫描

一般都是对源码文件进行字符串匹配。例如将 A *a、[A xxx]、NSStringFromClass("A")、objc_getClass("A") 等归类为使用的类,@interface A : B 归类为定义的类,然后计算差集。

基于源码扫描 有个已经实现的工具 - fui,但是它的实现原理是查找所有 #import "A" 和所有的文件进行比对,所以结果相对于上面的思路来说可能更不准确。

2.4.2.4. 通过 AppCode 查找无用代码

AppCode 提供了 Inspect Code 来诊断代码,其中含有查找无用代码的功能。

appcode-inspect-code

它可以帮助我们查找出 AppCode 中无用的类、无用的方法甚至是无用的 import ,但是无法扫描通过字符串拼接方式来创建的类和调用的方法,所以说还是上面所说的 基于源码扫描 更加准确和安全。

通过扫描的方式去检查无用代码有个痛点就是 类的方法调用是一种引用关系,以上所说的四种思路都是查找到引用末端的未使用的代码,我们很难通过一次扫描就定位到所有未使用的类,自动化实现起来也较难。举个例子来说,假如 A 是一个未使用到的类,但是 A 引用了 B,所以首次检查结果是 A 未被引用,B 被无用类 A 引用了,我们需要把 A 删除了之后我们才能了解到 B 是否是无用的类。当然如果你重新去实现一个引用树的话就另当别论了。

由于扫描无用类实现起来较为麻烦,并且其检查结果也不是特别准确。所以建议还是让开发者养成一个良好的习惯,在迭代或者重构代码的时候把老的代码删除,不要等到量变引起质变的时候才回头去优化。

2.5. 重构重复代码

重复代码堆积太多,不仅意味着 Bad Code Smell,我们的包大小也会受到影响,我们可以使用 PMD 来检查项目中的重复代码,并且做选择性的重构。

2.6. 补充:Cocoapods 中的优化选项配置

Cocoapods 的 project 文件在每次 pod install 或者 pod update 会重

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值