返回
iOS独立开发的二进制重排实践|新瓶装旧酒
IOS
2023-11-17 04:58:29
近两年二进制重排在启动优化上还是经常被提到的,但自己没有尝试过。继上一次「iOS官方瘦身方案ODR(二):换肤系统改造|践行 On-Demand Resources」后,再次拿自己个人项目小白鼠「梦见星星」练手二进制重排(以下简称ODR)。
### 引子
自从 Apple 在 iOS13 时, 将Xcode编译生成的二进制可执行文件做了一些改变,我们最终获取的ipa包会包含两部分内容:
1. 未加密的Payload,存放app bundle
2. 加密的App Extension Payload,存放app extension bundle
Payload的内容都是经过gzip压缩过的,而App Extension Payload在加密后是比Payload大的,导致最终ipa包会比iOS12大一些。
同时在iOS13之后,苹果推出ODR,来解决这些问题。
### 什么是ODR?
ODR(On-Demand Resource) 顾名思义,就是按需加载资源,可以减少ipa包的大小,优化启动时对内存的需求,提高启动速度。
理论上,动态加载二进制的资源,除了可以带来更快的启动速度外,还可以带来更多的好处:
* 降低内存开销,比如:当你使用 UIImage 时,只加载当前图片需要的资源,并不需要把所有图片都加载到内存中
* 可以让二进制变得更小,更容易下载,尤其是对于较大的应用程序
* 还可以减少内存占用,特别是在设备内存较小的情况下
但实际上,ODR有个很明显的缺点:
* 应用在启动时,需要加载更多的代码和资源,这可能会导致启动速度变慢
### ODR的实现步骤
#### 1. 打开xcode编译设置
打开 Xcode 的编译设置,并在 Build Options 中找到「Enable On-Demand Resources」,勾选该选项。
#### 2. 使用API
在你的代码中,使用新的 API 来加载资源,例如:
```
// 动态加载一个二进制资源
UIImage *image = [UIImage imageNamed:@"myImage" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
```
#### 3. 检查应用程序的符号
使用 Xcode 的符号视图来检查应用程序的符号,确保应用程序没有包含任何未使用的符号。
### ODR的优缺点
**优点:**
* 减少包大小
* 减少内存开销
* 提升启动速度
* 可以更好地控制应用程序加载的资源,提高应用程序的灵活性
**缺点:**
* 应用程序在启动时,需要加载更多的代码和资源,这可能会导致启动速度变慢
* 需要对应用程序进行一些额外的配置,增加了开发难度
* 可能会导致应用程序的二进制文件变得更大
* 可能需要更多的时间来编译应用程序
### ODR使用场景
* 对启动速度要求较高的应用
* 对内存开销要求较高的应用
* 频繁更新应用的应用
* 大型应用程序
### 总结
ODR是一种很有用的技术,可以帮助我们减少应用程序的包大小,减少内存开销,并提升启动速度。但它也有一些缺点,比如:可能会导致应用程序的二进制文件变得更大,并且可能会增加开发难度。因此,在使用ODR时,需要权衡其利弊,以确定它是否适合你的应用程序。