原文地址:http://www.pluto-y.com/wwdc-2015-app-thining-in-xcode/
最近在研究WWDC2015,主要研究一下iOS 9和Xcode 7中的特性,方便之后学习,顺带可以装装逼。最近看了关于压缩App大小的视频,主要看苹果在这方面都做了哪些调整以及一些新的内容。
参考视频:App Thining in Xcode, 英文不错的童鞋或者想看原生资源的童鞋可以去看看。
下面开始讲述一下我学习到的内容。如果不想看理论内容的人可以直接查看程序员所关注的细节。
原理
关于App的内容
一般对于App来说就是分为两个部分
* 可运行代码
* 资源文件等
而其中的根据每个部分所占的比例可分为两种类型的,一种为可运行代码比例比较大的App,另一种为资源文件比例比较大的App。而对于大部分情况来说都是后者比较多,即如图所示:
而对于资源文件来说,可以根据不同的设备类型,不同的内存,不同的编译指令可以进行不同的分配不同的资源,通过对资源文件的分类可以使App在不同的设备上运行的更加流畅与完美。具体的分类条件可以根据下图进行分类:
而根据不同的设备可能会去加载不同的资源文件,如下图的例子:
对于iPad Mini的设备来说(如果添加了不同分类的资源的话),设备自动去加载armv7,1x iPad以及其他跟iPad Mini有关的配置相关的资源文件,从而使App在iPad Mini上运行的更加流畅与完美。
关于缩减的原理
而对于为了优化而言,即对App的资源文件进行优化,对于苹果服务器来说即根据不同的设备类型,让其下载带对应设备所需资源文件的ipa,而与该设备的无关的资源文件则不应让该设备下载,从而减小用户下载的ipa的大小。虽然是为了压缩App的大小,可是为了让不同设备进行不同的资源的加载,所以在上传App的时候还是需要对App所支持的所有设备的资源进行上传,即上传一个包含所有支持设备类型的资源文件的App。而这样的文件可能会特别大,而苹果在新的Xcode以及App Store的服务器上进行了对应的优化,保证每个客户只需下载自己设备类型所需要的资源文件即可。而对于iOS9中,则对于大部分不经常用的资源文件不进行加载,只有在需要用到时才去加载对应的资源文件。
* App Store和Xcode 7部分的优化
例如Apple自带开发的DemoBots
的App,如果需要上传所有的资源文件的App,则该App大小大概为74 MB的大小,而通过App Store的优化后,则每个设备所下载的平均大小在22 MB左右。而其中对于代码部分则是大家都必须下载的部分大约在14 MB左右,而资源文件根据不同设备则下载的内容不同,大概在5~11MB左右,平均大约在8 MB左右。
而如果需要生成一个通用的
Ad hoc
或者Enterprise
的ipa,只需程序员进行简单的配置即可。之后Xcode Server会产生一个Manifest
的Plist文件,而不同设备在下载时都会通过这个Manifest
的Plist文件去找对应设备下载的ipa的具体地址,然后下载对应的ipa。
具体原理如下图:iOS9部分的优化
例如一个游戏的App来说,资源文件大约必须的资源文件以及不经常使用的资源文件,例如一个有等级的资源文件来说,对于一个等级为1的玩家来说,其中关于等级为1的资源文件才是常用的资源文件,而对于等级2以上的资源文件则为不经常使用的文件。而在iOS9中,会对等级为1的资源文件会加载到内存中,而对于等级2以上的资源文件则会在需要使用的时候才进行加载。并且在App长时间没用的情况下,则会将内存中关于这个App的资源文件进行释放,而当App再次启动的时候才会重新加载所需要的资源文件。
程序员所关注的细节
Asset Catalogs中的新内容
- 新的图片特性
关于Asset Catalogs的基础楼主就不进行累述了,对于Xcode 7来说,Asset Catalogs中关于资源文件的分类所依据的特性进行了添加,其中添加了一个根据Memory
和Graphics
进行分类,即资源文件可以根据Memory
和Graphics
进行不同的资源文件的加载。
例如当内存为1G时加载红色的图片,内存为2G时加载蓝色的图片,只需进行一下的配置即可:
对于需要根据不同的内存进行适配只需对内存需要适配的内存进行勾选,并且在左边中对应的1G放上红色的图片,在2G上放上蓝色的图片即可。
* 新的资源文件的类型—–Data Set 和 Sprite Atlas
对于Asset Catalogs中,之前只支持图片类型的资源文件。而在Xcode 7中添加了Data Set
和Sprite Atlas
的类型,即之后的对于除了图片类型的资源文件以外,还可以对其他类型的资源文件根据不同的设备属性进行使用不同的资源文件。而需要添加Data Set
只需通过添加按钮即可,如下图:
当然也可以通过右键来进行添加。
旧文件的导入(未用Asset Catalogs进行管理的文件)
对于之前没有使用Asset Catalogs
进行管理的资源文件来说,在XCode 7中也对这种情况下进行了特殊处理。只需将同一个资源,但根据不同特性(如设备类型、分辨率等)所不同的资源放到一个后缀名为imageset
下目录下,并且在目录下存放一个Contents.json
的文件,并在文件中对该资源属于哪些特性组成的进行详细说明,最后将该文件拉入项目中即可。然后对于其中的每个特性组成的文件名可以不对其进行限制。具体如下图:
而对于该图中各个文件名可以随意取名,只需在Contens.json
中进行指明其文件名即可。
而对于Contents.json
中的文件的格式以及对于其中的都包含哪一些属性行可以根据https://developer.apple.com/library/prerelease/ios/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/ImageSetType.html去查看。
对于新添加的Data Set
的类型同样也有该文件,其参考文档在:https://developer.apple.com/library/prerelease/watchos/documentation/Xcode/Reference/xcode_ref-Asset_Catalog_Format/DataSetType.html去查看。
Xcode的新特性
- 关于Xcode中添加了一个行的Build Settings的参数
Enable Building Only Active Resources
,如下图:
只需将这个参数设置为YES
之后在,在之后编译运行过程中,打包的ipa只会包含跟所运行的设备有关资源文件,如在模拟器上运行,则会打包模拟器所需的资源文件。如此做可以加快打包的速度,从而保证测试效率。
* 关于Xcode的Distribution,即关于Xcode中的Ad hoc
与Enterprise
的打包中,添加了可以根据设备类型进行打包对应的ipa,而打包的ipa中只包含对应设备所需的资源文件。从而可以对测试人员的测试效率进行提高,并且减少测试人员手机中所占的大小。如下图:
* 关于Xcode中产生通用类型的ipa有了新的内容,可以将产生的通用类型的ipa部署到自己的服务器上,并且提供给其他人下载。具体的配置可以参考:http://help.apple.com/deployment/ios/#/apda0e3426d7
对于其中的详情博主也没有测试过,有兴趣的童鞋可以去试试,然后方便的话麻烦发一个结果告诉给博主。博主在此感谢了!
总结
到此关于缩小App的资源的打包和使用教程就到此为止了,关于Apple压缩App的大小对于程序员的开发以及测试人员的测试上的效率肯定都会有大大的提高,毕竟在开发人员或测试人员打包测试的过程可以减少时间。而对于用户来说,特别是对于低配置的设备来说也是福音,在下载App的时候可以减少App所占的物理内存,而对于在运行过程中的内存分配也会更加合理,能保证内存的合理利用性。对此像博主这种屌丝只用16G的设备来说真的是拯救了我们。感谢天,感谢地,感谢Apple压缩程序。