iOS的瘦身主要分为两个方向。一个是苹果帮我做的,一个是自己做的;
一、苹果官方做的的方式
1:App Slicing
把你上传的包重新组合下,会给每个机型生成特定的安装包。它的原理是,
1),只包含当前设备的二进制文件:armv7s的机器不需要arm64的二进制文件。
2),只包含当前文件的图片:视网膜屏就不需要2x图了。
这里要说明一点,有的开发者会只生成arm64下运行代码,以为省去armv7s的大小。实际上这只影响了上传审核包的大小。因为最后苹果会自动重打包。
2:On Demand Resource
按需下载资源,不常用资源可以设置ODR资源,也可以有效减少安装包大小。只要在工程里打开,再配合ORD用法。本质还是从网络侧下载资源。现在谁都有个服务器,把资源放自己服务器上就可以了。我能想到的场景,就是单机App、没有自己服务器的App、耗带宽的音频类大文件。
3:BitCode
当我们把携带 BitCode 的 App 提交到 AppStore 后,苹果会提取出可执行文件中的 BitCode 段,然后针对不同的 CPU 架构编译和链接成不同的可执行文件变体(Variant),不同 CPU 架构的设备会自动选择合适的架构的变体进行下载。而在 BitCode 之前没我们都是把所有需要的 CPU 架构集合打包成一个 Fat Binary,结果就是用户最终下载的安装包之中有很多冗余的 CPU 架构支持代码。

二、通过开发阶段的手段
解压xx.ipa文件,可以看到:

Frameworks:动态库存放路径
Exectutable:可执行文件
Resources:资源文件
包括:Assets.car
    xx.bundle 资源文件
    xx.png 资源文件
    xx.txt 资源文件
    xx.plist 文件
    xx.ttf 字体相关资源文件
    en.lproj  小表情文件
    xx.m3/aac 音频文件
    xx.json 文件
    xx.nib/storyboard  文件

1:动态库
Framework 文件夹存放的是动态库。在 App 启动的时候才会被链接和加载。里面主要有两类库:系统需要的标准库和自己引入的其他依赖库;

减少不必要的其他依赖库

2: 可执行文件
1):自己编写的可执行代码

过删除无用类、无用方法、重复方法等,来达到可执行文件大小的减小。

2):引用的第三方静态库

静态库最终会打包进可执行文件内部,所以如果 App Extension 依赖了三方静态库,同时主工程也引用了相同的静态库的话,最终 App包中可能会包含两份三方静态库的体积。

3:资源文件

1:删除无效的资源文件
2:针对png图片进行压缩,或者转换为webp格式、iconfont字体类型
3:MP3、MP4格式可以压缩为aac格式
4:部分引导图,说明图,背景图等,可以通过下载存储到本地沙盒,在获取
5:也不建议使用nib,storyboard这些可视化编程文件

后记补充:移除Swift标准库

  1. Build Setting -> Always Embed Swift Standard Libraries 设为NO
  2. 打包时环境变量APP_STORE设置为1
    移除armv7架构支持

Build Setting -> Valid Architectures 移除 armv7

最后放一张借用的图片,一览无余
4239822-7addd7eb9135e4d7.png