1.App Thinning: App Slicing, Bitcode, and On Demand Resources
App Thinning: App Slicing, Bitcode, and On Demand Resources是WWDC 2015大会上提出的。因此支持iOS9及以上的项目
App Slicing工作原理:
把App安装包上传到App Store后,Apple分析处理服务会自动对安装包切割为不同的应用变体,用户下载安装包时,系统会根据设备型号下载对应的应用变体。也就是根据目标设备加载asset catalog 中的特定的图片资源(注:只有Assets.xcassets内的图片文件有效,在bundle的中图片是无效的)。(例:iPhone7 plus只加载3x图)。根据目标设备分配所需的加载可执行体系结构。(例: iPhone5(真机32位处理器)加载armv7s架构)。
Bitcode工作原理:
是Xcode编译打包的一种中间码,在包含Bitcode配置的程序被上传到App Store之后,App Store也可以对其进行编译和链接。同时,Bitcode允许苹果后期重新优化程序的二进制执行文件。苹果会根据下载应用的用户手机指令集类型生成该指令集的二进制文件,进行下发下载。
开启Bitcode之后,用户在App Store下载的包体积可以小一些。需要注意的是:开启Bitcode之后,集成的其他第三方库也需要全部支持Bitcode。
On Demand Resources工作原理:
App不是包含整个资源库,可以根据需要下载或删除其中的一部分。通过将代码段标记为ODR,开发人员将能够指定在什么时候需要什么代码。这些部分在需要时会自动从App Store下载,而在不再需要时会删除。
产生的用户体验:
应用程序尺寸较小,因此应用程序下载速度更快,从而改善了首次启动体验。
用户浏览您的应用程序时,可根据需要在后台下载按需资源。
当不再需要按需资源并且磁盘空间不足时,操作系统将清除它们。
2.Bitcode实践及总结
总结:经实践Bitcode确实能减小包体积,主要是减小代码段和数据段大小,总体大概能减小5%左右。但是将项目中每一个三方库都改成支持bitcode是很艰辛的事情。
3.On Demand Resources(ODR)
支持的资源类型:
各种格式音频文件、各种格式图片文件、bundle文件、json文件、plist文件、xib文件、storyboard文件、字体文件等。
不同类型tag来绑定资源,分别为:
1.初始安装tag(Initial install tags):
只有在初始安装tag下载到设备后,app才能启动。这些资源会在下载app时一起下载。这部分资源的大小会包括在App Store中app的安装包大小。如果这些资源从来没有被NSBundleResourceRequest对象获取过,就有可能被清理掉。
2.按顺序预获取tag(Prefetch tag order):
在app安装后会开始下载tag。tag会按照此处指定的顺序来下载。
3.按需下载tag(Dowloaded only on demand):
当app请求一个tag,且tag没有缓存时,才会下载该tag。
大小限制:
每个tag下的资源总计大小不能超过2GB。按需加载资源的总计大小不能超过20GB。一个tag的理想大小是不超过64MB。这能很好地平衡下载速度和本地存储大小,当设备的存储空间不足时可以进行清理。
4.On Demand Resources实践及总结
使用Downloaded Only On Demand Tags通过远程加载资源文件(资源文件是Assets.xcassets中的部分图片文件,项目中一些mp3文件)调试看效果,能减小体积。线上调试上传AppStore,通过testflight下载的版本,但是发现通过苹果服务器下载资源特别慢。
本地打包,使用ODR之前:239.8M
本地打包,使用ODR之后:216M
使用ODR,上传App Store版本:228M
请教了公司其他事业部的老师,他们项目都用了ODR并上线使用了一段时间。做了记录。
- 请教了老师A,他们项目(用了一个模块做的实验,资源比较小就几兆)把ODR上线了一段时间,目前已经把ODR下架,原因:
1)容易引起崩溃。崩溃率大概有千分之五。
2)不能增量更新。 - 请教了老师B,他们的项目把ODR上线了几个月,目前的问题:
1)苹果的cdn不算稳定,有下载失败的概率,关键路径资源建议不用它。
2)版本之间的增量更新用它不好处理。
探索ODR目前的一个总结:
1)苹果cdn不稳定,关键路径资源不建议使用,如必要的Assets.xcassets中资源、必要的音频资源等。
2)如果资源较大,不要使用ODR,通过苹果服务器会比较慢。
3)增量更新有一些问题,很难处理。
4)有奔溃的情况。