iOS包体积优化的系列文章,其中包括:
- iOS 包体积优化1 - 总览
- iOS 包体积优化2 - 如何分析ipa包?
- iOS 包体积优化3 - 代码管理
- iOS 包体积优化4 - 资源管理
- iOS 包体积优化5 - 编译优化
- iOS 包体积优化6 - 长期维护
1. 项目说明
本案例项目是一个多年持续迭代的项目,技术点包括: OC,Swift,Flutter,H5。
2. ipa包
将 ipa包,更改后缀为zip,可以解压出来,可以看到包的内容。
注意: 该大小包含所有支持设备的信息,并不是appstore上的包大小。【参考: AppStore 对包大小提供的优化支持 章节说明】
3. ipa包拆解分析
4. 结构
| .app结构 | 作用 | 大小 |
|---|---|---|
| Frameworks | App 自身引入的动态库(三方库,Swift,Flutter) | xx MB |
| Assets.car | Asset Catalog编译产物(图片文件) | xx MB |
| 可执行文件 | 主二进制(MachO 文件),代码文件 | xx MB |
| PlugIns | 【无优化方法】App的扩展(本质是动态的可执行文件),比如:Widget、Push,分享 | 599KB |
| _CodeSignature | 【无优化方法】ipa包签名文件 | 308KB |
| embedded.mobileprovision | 【无优化方法】证书配置文件 | 19KB |
| Base.lproj | 【无优化方法】本地化 | 36KB |
| en.lproj | 【无优化方法】语言文件 | 2KB |
| zh-Hans.lproj | 【无优化方法】语言文件 | 2KB |
| pluto.momd | 【无优化方法】托管对象模型文件 | 22KB |
| 其他内置资源 | 业务需要内置的资源,有一定的优化空间,但是需要改动业务。 |
其他主要内置资源
| 资源类别 | 资源项 | 作用 | 大小 |
|---|---|---|---|
| zip | xx | xx | 11.7MB |
| Bundle | xx | xx | 599KB |
| xx | 2KB | ||
| json文件(47项) | xx | 556KB | |
| xx | 343KB | ||
| 低于20KB的不列举了 | |||
| XIB文件(60个) | |||
| plist文件(24个) | 单个都在3KB以内 | ||
| 字体包 | DIN Alternate Bold | ||
| xx | |||
| PNG图片 | Icon | ||
| LaunchScreen |
5. Framework分析
整个Frameworks文件夹 共计 xx MB,其中
| 分类 | 大小 | 占比 |
|---|---|---|
| Flutter相关 | xx MB | 31.04% |
| 三方库 | xx MB | 29% |
| Swift系统支持文件 | xx MB | 22.3% |
| Swift组件库(代码) | xx MB | 15.7% |
| 其他 | xx MB | 1.96% |
| 共计 | xx MB |
6. ipa包分析总结
经过本轮分析,我们已经对自己的ipa包了如指掌:
- 整个ipa包有多少文件
- 每个文件的用途是什么
- 每个文件的大小是多少
- 每个文件占比是多少
经过分析发现,我的ipa包中, Frameworks,Assets,可执行文件偏大。
Frameworks
- 混编Swift: 因为混编Swift导致导入的系统Swift支持库比较多,但是因为最低适配版本问题,该部分大小需要等到最低支持版本升到iOS12.2才可以释放。【iOS12.2之后,不再需要内置Swift的支持库】
- 混编Flutter:混编Flutter导致包体积增大是必须的。没有办法减少。【可以优化Flutter的打包配置,可以优化一点点】
- 三方库: 使用的三方库分析下来还是比较多的。可以针对三方库的重复性,三方库功能冗余进行优化。
Assets
- 废弃图片删除
- 大图片治理
- 重复图片合并
- 合适图片云端管理。
可执行文件
- 废弃文件治理
- 废弃代码治理
- 编译优化
7. 开始治理
经过本轮ipa的详细分析,我们知道了优化方向。我们就从最基础的优化点开始吧
[iOS 包体积优化3 - 代码管理]