当向AppStoreConnect上传.ipa时,AppStoreConnect构建过程中,会自动分割当前App,创建特定的变体,以适配不同的设备。当用户从AppStore下载当前App,AppStore会根据当前用户的设备类型,分发针对当前设备的变体的过程,叫做Slicing,原理如下图:
通常情况下iOS系统App内部本地图片使用时同一张图片通常有@1x、@2x、@3x三种格式,我们知道这是为了适配不同的屏幕,但是有一个问题,每一张本地图片都有3张的话,当前设备只能使用一种格式,而另外两两种格式的图片不起任何作用,进而会增大app包的体积,Slicing的出现解决了此问题,不过还需要我们遵循Slicing的规则,即@1x、@2x、@3x格式的图片要同时存在,并且将图片资源存放在.xcassets去管理,不能直接放在Bundle。然而就当前苹果设备来讲@1x的设备基本不存在,所以@2x、@3x是必备的。
此功能可以简单的优化图片资源大小,在适配不同屏幕的前提下,进一步优化了当前App的包体积。
所以:小图片尽量放到Assets.xcassets里面去
注意的是:用Asset管理图片要比直接放在bundle里在加载速度上要快。因为Asset会在编译期做优化,让加载的时候更快,此外在Asset中加载图片是要比Bundle快的,因为'[UIImageimageNamed]'要遍历Bundle才能找到图。加载Asset中图的耗时主要在在第一次张图,因为要建立索引,可以通过把启动的图放到一个小的Asset里来减少这部分耗时。
引申:
Bitcode是一种程序中间码。是纯苹果内部行为,当前app包含Bitcode配置的程序将会在AppStoreConnect上被重新编译和链接,进而对可执行文件做优化。这部分都是在服务端自动完成的。
如果以后Apple新推出了新的CPU架构或者以后LLVM推出了一系列优化,我们就不需要重新为其发布新的安装包了。AppleStore会为我们自动完成这步。
但是开启Bitcode需要注意:
Bitcode开启BuildSettings->EnableBitcode->设置为YES
此功能为苹果内部优化行为,非开发则直接操纵,不过多赘述
翻译为按需加载,顾名思义,就是需要的时候再去加载。指一部分资源(图片资源,压缩包资源等)可以被放置在苹果的服务器上(非开发者主动放置,只需放到项目中,做些处理即可),不随着App的下载而下载,直到用户真正进入到某个页面时或者出发下载事件时才下载这些资源文件。
按需加载支持iOS9.0及以后的app,按需加载资源是默认开启的。你也可以在target的buildsettings中手动更改。
使用介绍:
名词解释
一些过大的图片还可以采用webP的格式进行加载,可以利用SDWebImage/WebP提供的UIImage+WebP分类来进行WebP格式图片的转换:
+(UIImage*)sd_imageWithWebPData:(NSData*)data;实际用法:
optimization选项设置为space可以减少包大小
如果不支持32位以及iOS8,去掉armv7,可执行文件以及库会减小,即本地.ipa也会减小。
可执行文件中的符号是指程序中的所有的变量、类、函数、枚举、变量和地址映射关系,以及一些在调试的时候使用到的用于定位代码在源码中的位置的调试符号,符号和断点定位以及堆栈符号化有很重要的关系。
StripStyle表示的是我们需要去除的符号的类型的选项,其分为三个选择项:
并不是所有的符号都是必须的,比如DebugMap,所以Xcode提供给我们StripLinkedProduct来去除不需要的符号信息(StripStyle中选择的选项相应的符号),去除了符号信息之后我们就只能使用dSYM来进行符号化了,所以需要将DebugInformationFormat修改为DWARFwithdSYMfile。
与StripLinkedProduct类似,但是这个是将那些拷贝进项目包的三方库、资源或者Extension的DebugSymbol去除掉,同样也是使用的strip命令。这个选项没有前置条件,所以我们只需要在Release模式下开启,不然就不能对三方库进行断点调试和符号化了。
Cocoapods管理的动态库(use_framework!)的情况就相对要特殊一点,因为Cocoapods中的的动态库是使用自己实现的脚本Pods-xxx-frameworks.sh来实现拷贝的,所以并不会走Xcode的流程,当然也就不受StripDebugSymbolsDuringCopy的影响。当然Cocoapods是源码管理的,所以只需要将源码Target中的StripLinkedProduct设置为YES即可。3.4.StripSwiftSymbols开启StripSwiftSymbols能帮助我们移除相应Target中的所有的Swift符号,这个选项也是默认打开的。
如下图所示:
将Mach-o可执行文件内的__TEXT的部分代码段安全移动到其他代码段中,避开苹果的加密机制,提高可执行文件的压缩效率,进而让App的下载大小减小。
通俗解释:就是把一些非必要的经过转换之后的代码,乔迁到别的地方,避开苹果对这些非必要的代码再做什么操作,苹果对这些操作会对下载包变大。
iOS可执行文件是Mach-O格式,主要由Header、LoadCommands、Data三部分。
在这个文件夹下找到对应的工程文件名/Build/Products/Debug,进入这个目录下,就可以找到我们的可执行文件了。
打开MachOview文件->Open
Open之后,找到当前项目的.app文件,按照下图寻找,点击Open。
查看当前项目的Mach-O文件,效果如下
将上图中的红框里面的可更改的代码段全部移除值其他代码段中:
重新打包之后把打包的ipa后缀改成zip,再用MachView查看解压之后的Mach-o文件,其内部格式已经发生变更
对项目工程进行Archive之后会生成.xcarchive文件,该文件中包含了App、dsYMS以及其它信息
将xcarchive文件上传到AppStoreConnect后,苹果对App中的可执行文件进行加密等操作,将App压缩成ipa文件(和平时打测试包不一样),才发布到AppStore,加密对可执行文件的大小本身影响很小,但它会严重影响可执行文件的压缩效率,导致压缩后的ipa文件大小增加,也就是下载的包变大,事实上这种加密只针对非越狱手机有用,对越狱手机不起作用。