本文译自:Guides and Sample Code 的App Thinning (iOS, tvOS, watchOS)
App 瘦身
App Store和操作系统通过将app定制到用户的特定设备中来优化安装, 这种瘦身优化,方便了我们更快地下载app,为我们的设备节省空间,提升了用户体验。
下面我们讲讲app 瘦身的三个部分:切片(Slicing)、bitcode、on-demand resources(按需资源)。
1. 切片 (iOS/tvOS)
为不同的设备产生相对应的app bundle变体(variant)的过程称为切片。变体(variant)只包含目标设备所需要的可执行结构和资源。我们开发并上传app到 iTunes Connect,App Store会基于你所选的应用支持设备来产生相应的变体(variant)。图片资源会根据设备分辨率和设备系列(iPad/ iPhone/iPod)进行切片,GPU资源也会根据设备功能进行分片。例如,对于tvOS应用,iOS和tvOS共享目录下的assets被切片,大的app icons被移除了。当用户安装app时,对应于用户设备的变体(variant)会被下载并安装到设备中。
Xcode在开发模式时可模拟切片,我们可以在本地创建并测试变体(variant)。当你在设备上运行app时,Xcode会自动将app切片。当我们打包时,Xcode会包含app的完整版,但允许我们从打的包中导出变体(variant)。
注意:切片app只支持ios 9.0及更高版本的设备,低版本的设备只能从App Store获取通用app(universal app)
在我们正常开发和发布app的过程中,切片的流程是这样进行的:
1、在Xcode中指定目标设备,在asset目录中提供多种分辨率的图片。
要对资源切片,必须使用asset 目录。
2、在模拟器或真机中编译并运行app。
Xcode会针对当前运行设备编译app的变体(variant),
减少了测试编译时间,并允许本地测试变体(variant)。
3、打包app并为目标设备本地导出变体(variant)。
在目标设备上测试所有变体(variant)以提早发现配置问题。
4、上传app到iTunes Connect。
App Store从上传的app中创建独立的变体(variant),
至于有多少变体,取决于Xcode project中的结构和资源的配置。
5、在iTunes Connect中发布app的预发布版用以测试。
测试者使用TestFlight来安装预发布版的app,
TestFlight会下载相应的变体(variant)到测试者的设备中。
6、在iTunes Connect中发布app。
用户在app支持的设备上安装app,
App Store会将相应的变体(variant)下载到用户设备。
2. Bitcode
Bitcode是编译程序的中间表示形式。我们上传到iTunes Connect的包含bitcode的app将在App Store中进行编译和链接。包含Bitcode将允许Apple在将来重新优化您的app二进制文件,而无需将新版本的app提交到App Store。
默认情况下,Xcode会隐藏在构建时生成的符号(symbols),因此Apple不能读取这些符号。 只有当您将应用程序上传到iTunes Connect时选择包含符号,才能将这些符号发送给Apple。 我们必须包含这些符号,用于收集Apple崩溃报告。
注意:对于iOS app,bitcode是默认的,但也是可选项。对于watchOS和tvOS ,bitcode是必选项。如果你提供bitcode,那么app bundle (project里所有target) 中所有的framework也要包含bitcode。在iTunes Connect发布app后,我们可以下载构建的dSYMs文件。
3. On-Demand Resources (iOS, tvOS)
On-Demand Resources(按需资源)是诸如图像和声音的资源,您可以通过关键字对其进行标记,并按组请求。 App Store将资源托管在Apple服务器上,并为我们管理着资源的下载。 按需资源可以实现更快的下载和更小的应用程序大小,从而提高首次启动体验。 例如,游戏应用程序可以将资源划分为游戏级别,仅在应用程序预期用户将移动到该级别时才请求该级别的资源。 同样,只有当用户购买了相应的内购资源时,才能请求这些资源。
操作系统在不再需要或磁盘空间不足时会清除按需资源。 如果我们导出测试版的app,则必须自己托管按需资源。 请注意,不支持可执行的按需资源。 App Store还会对按需资源进行切片,如上面提到的Slicing(iOS,tvOS)中所述,进一步改善了用户体验。
on-demand resources在用户探索应用程序的功能时会根据需要为其提供资源,这种后台工作机制是透明化的。
如何在app设置按需资源,请参考 On-Demand Resources Guide 和 NSBundleResourceRequest Class Reference 这两篇官方文档,我会在之后的博客中翻译它们。