问题
- 我的应用程序转到3.x版本后文件大小增加了130-150MB。
- 应用程序在使用了Bitcode以后,文件尺寸变大。
- 我想在iOS以及tvOS上使用Bitcode。
原因
在Unity 5.3.0f1中,我们给iOS项目默认开启了Bitcode支持。这项来自苹果的技术,可以在应用被提交到应用商店之后,对其进行重新优化 。 虽然在提交应用的时候, 需要提供更多额外的应用信息,但这是一项很有用的技术,应该尽量使用它。当应用在应用商店上架时,这些额外的信息将会从您的包里剥离,并不会增加用户最终下载的文件大小。这个技术已经捆绑到tvOS以及watchOS应用上了,因此我们也为iOS应用打开了支持,帮助用户优化他们的应用。当使用Bitcode的时候,您可能会遇到两个问题:
- 由于启用了Bitcode,应用尺寸会超过iOS无线下载时对文件大小的限制, 并且也比tvOS的主要应用包程序大。
- 您希望给iOS以及tvOS应用获取最好的下载大小,以及存储利用率。
解决方案
在修改任何东西之前,首先需要了解苹果的要求是什么以及他们的限制在哪儿。一旦明白了这些限制,就能够优化应用的尺寸。这里可以阅读更多关于IL2CPP构建尺寸优化相关的信息。
Bitcode尺寸
下图中的项目,由一个Unity 5.3.4p1的空项目编译而成,然后在Xcode7.3中,使用分发证书进行存档构建。
在应用打包完成以后,可以通过Archives选项卡下的Window->Organizer菜单,找到打包好的.ipa文件。
然后打开终端,找到生成的.ipa文件,使用以下命令运行应用:
otool -l <your_app_name>.app/<your_app_name>
检查终端输出,然后寻找"segname __LLVM"这样的词条:
cmd LC_SEGMENT
cmdsize 124
segname __LLVM
vmaddr 0x00fac000
vmsize 0x07ce0000
fileoff 15564800
filesize 130940928
“filesize”属性就是Bitcode的文件大小。
注意:如果您为多个系统架构进行构建编译,可能会看到多个这样的segments 。这时需要对他们进行单独辨认 。
空项目例子
项目由一个Unity 5.3.4p1的空项目编译而成,然后在Xcode7.3中,使用分发证书进行存档构建。
- IPA文件大小:159MB(Unity-iPhone.ipa)
提取IPA:
- 18MB BCSymbolMaps(支持Bitcode的符号文件,将不会传递到最终用户)
- 234MB Payload(包含游戏资源,额外文件以及可执行程序,238M)
- 58MB符号(符号文件,不会传递给最终用户)
Payload主要由可执行文件和标准引擎文件组成。虽然资源大概只有5MB,我们把关注点聚焦在可执行文件上。我们可以通过运行两次,然后使用otool来对其进行分析:
- otool -arch armv7 -l <exec_name>
- otool -arch arm64 -l <exec_name>
The segment sizes of the reports are following:
各部分大小报告如下:
- armv7:
- TEXT segment (代码): 7.5 MB
- DATA segment (各种静态代码区域以及il2cpp元数据): 0.3 MB
- LLVM (Bitcode) segment: 111.1 MB (将被苹果服务器剥离,不会传达至最终用户)。
- LINKEDIT (链接动态链接库) segment: 0.9 MB*
- arm64:
- TEXT segment (代码): 8.4 MB
- DATA segment (各种静态代码区域以及il2cpp元数据): 0.5 MB
- LLVM (Bitcode) segment: 110.2 MB (将被苹果服务器剥离,不会传达至最终用户)。
- LINKEDIT (链接动态链接库) segment: 0.8 MB*
armv7平台上无Bitcode的可执行程序尺寸是8.7MB,而对于arm64则是9.7MB。
不包含Bitcode的整个可执行程序:18.4MB
预计的安装尺寸(可执行程序+资产):23.4MB
在没有对应用进行瘦身的条件下预计下载大小:1.25MB(压缩资产)+15.9MB(TEXT segment,因为加密的原因所以没有压缩得很好)+0.5MB(DATA+LINKEDIT,他们压缩得相当好)=17.65MB
*如果您没有使用存档构建而是正常构建并且运行.ipa,LINKEDIT大小会增加5倍。当在设备上核查空项目的安装尺寸时,可以监控到这个情况。在XCode中使用Build and Run产生的通用构建安装包大小是44.5MB。相对的,使用存档构建导出的ipa进行安装的通用构建安装包大小是23.4MB。导出功能可以由上面的图片看到。
当使用存档构建时,Bitcode才会被启用。一旦将应用程序上传到iTunes Connect,就可以查看不同平台的压缩大小,下载大小和安装大小以及通用构建的预期大小。在此阅读更多关于IL2CPP构建尺寸优化的信息。
禁用Bitcode
有时我们需要禁用Bitcode。一些第三方工具还不支持Bitcode,同时您又需要使用这些第三方工具 。了解更多取消支持Bitcode的内容请查看如何取消Bitcode支持。
-
阅读更多关于通过应用瘦身以及IL2CPP优化iOS&tvOS应用
-
了解更多关于取消Bitcode的内容请查看如何取消Bitcode支持章节
-
更多关于Bitcode构建尺寸的信息请在此查看
本文适用于Unity 5.2.0p1及更高,XCode 7及更高,iOS 9.0及更高版本