App Thinning介绍

  iOS9开始,Apple推出了一项新功能称为App Thinning,字面理解就是App瘦身。简单说来就是开发者将整个App包传到App Store,当不同用户设备下载App的时候,App Store通过根据不同设备特性分发经过剪裁的App,从而减少了用户包大小。

  关于App Thinning有三种特性:slicing, bitcode, on-demond resource(ODR)。  

Slicing介绍

Slicing通过将app bundle资源根据不同的设备特性分为不同的版本。对于图片资源,会根据设备(如iphone6 plus需要@3x,iphone 6需要@2x)所需图片分辨率不同分发给对应设备所需对应的图片资源。

例如在6plus中,大屏储存需要3x的图片,所以会分发对应的图片资源。

如何使用Slicing

对于Slicing的使用很简单只需要满足下面几个条件:

  • 当前项目的development target版本 iOS7及以上
  • 图片资源通过asset catalog进行管理
  • 设备版本必须是iOS9以后,确切的是9.0.2以后

Nova-Merchant中对App Slicing的使用

关于Nova-Merchant中对Slicing的使用,首先要对Apple是如何通过asset catalog管理图片进行介绍。

经过调研发现,Apple对与那些通过asset catalog管理的图片在编译后,会在DPScope中生成Asset.car文件,该文件中包含了其管理的图片资源。App Slicing会对不同尺寸设备 编译之后的分发设备所需的@2x和@3x图片。

Nova-Merchant中对图片的使用主要在三个地方,1.Nova-Merchant target中的Images.xcassets.2.Development Pods中的NVImages。3.每个Pods中的Assets文件夹。

通过统计相关图片资源数量如下:

Images.xcassets

Local Pods

Remote Pods

824张

230张

153张

目前对Nova-Merchant中如何使用Slicing有两种方案,并且都进行了调研和测试。

方案1

每个Pod单独建立各自的asset catalog,管理Pod自身的图片资源。这样在编译之后,会将项目中所有的asset catalog编译成一个Assets.car文件。

优点:每个pods单独管理自身的图片资源。

缺点:1.需要更改各个pod的podspec文件中的s.resource。指向该pod所建立的Asset.xcassets。2.不方便本地测试,只能通过发布到testflight测试。 3.需要推动各个pod去完成图片的管理工作。

方案2

仍然通过Nova-Merchant  target中的Images.xcassets来管理整个项目中的图片资源。在pod install完毕后,各个Pod中的图片资源放到Images.xcassets中来统一管理。(具体方法就是将图片拷贝到Images.xcassets中,生成对应图片名字的.imageset文件夹,文件夹下生成Contents.json文件来指定对应的1x,2x,3x版本图片用于分发),同时删除掉这些图片放在原Pods下路径的图片。

优点:各个pod不需要任何工作量

缺点:1.需要在pod install完毕后,删除Target Support Files中Pods-Jovi-resources.sh中对应图片的 install_resource 行。不然编译会报错。2.通过脚本,在pod install完毕后,将NVImages 以及Pods下的图片资源放到Images.xcassets中,并删除指定的shell脚本行数。 脚本运行时间大概为40s左右

通过对方案1,方案2的优缺点分析,最终打算采用方案2的方法来对Nova-Merchant中图片进行管理。

结果展示

通过使用App slicing,编译后发现,不同设备所分发的Asset.car文件中图片确实是如预期所预料的那样

上图所示的是我通过iphon6设备编译后获得的Asset.car文件,我们可以发现只下发了该设备所需的@2x图片而不会下发设备不需要的@3x图片。

由于Nove-Merchant中在Pods中使用的图片量不多,并且大多数为对资源的使用通过s.resouce_bundle的形式,造成类似于MTADXSDK这种pods中的图片不能进行迁移,而目前只作了对于资源的使用通过s.resources的形式才进行图片迁移。所以执行脚本后只有少量的图片进行了迁移,迁移图片数量103张,但尽管如此,还是让安装包从63.9M缩减到了63.6M,安装包减小了0.3M。虽然效果不明显,但是确实有用,而对于主app那边,他们图片多半在NVImages和pods下,所以他们迁移后,app安装包瘦身效果达到了喜人的20%。

下面是执行完脚本后图片存放在JVPodsImages.xcassets下的截图:

图片迁移脚本采用了两个段脚本代码,一个是寻找图片所在的路径,另外一个是将图片拷贝到JVPodsImages.xcassets下,并且删除其对应在pods下路径的图片。

两段脚本解释:

第一段脚本findImagesPath.rb是通过遍历podfile里面的每行内容,找到找到每个pods对应的podspec.json或者podspec文件,然后去以json格式方式读取podspec文件里面的内容, 来获取pods的资源引用方式——是通过s.resources还是通过s.resource_bundle方式,这里所说的资源是指图片,并且只是.png格式的图片。将所有可能包含有图片的路径全部放在一个array中,并返回给第二段脚本的使用。

第二段脚本merge_images.rb是将第一段脚本寻找图片路径的地址集合进行遍历,遍历该路径下的每个文件下,找到所有的.png格式图片的路径并存放在一个array中,然后将这个路径进行图片拷贝到指定的JVPodsImages.xcassets 下totalImages包下,并生成json文件,与此同时删除掉pods下相应的图片和Target Support Files中Pods-Jovi-resources.sh中对应图片的 install_resource 行。

如何使用到jenkins打包中:

由于我们项目中的Podfile文件里面的pods有些是本地localPods下的,有些是远程dianping pods库,所以执行脚本来分为两次,第一次执行本地Pods图片迁移,第二次执行远程图片迁移。执行命令:

ruby merge_images.rb local 和ruby merge_images.rb remote,这两行命令为了jenkins打包方便已加入到pods_install.shell脚本中。

最后,为了方便开发本地不必执行图片迁移脚本,而保持原来的执行pod_install脚本习惯。现在添加新的pod_install shell脚本,叫new_pod_install.sh,这个脚本只是用来我们开发人员在本地更新pods库时执行,不会影响现有的jenkins打包。执行命令行:sh new_pod_install.sh [clean] ,clean参数和以前一样是可选的。

后续有个问题是关于podspec文件中的引用资源方式为s.resource_bundle方式如何将图片进行迁移,将继续作为app sining方向。

AppThinning之AppSlicing相关推荐

  1. iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)

    1.iOS打包错误 iOS打包报错:The operation couldn't be completed. (AppThinning.StubError error 1.) 操作流程:archive ...

  2. iOS9 App Thinning(应用瘦身)功能介绍

    iOS9 发布后,产生了一个使 App Thinning 无法正常运行的 bug.在iOS9.0.2 版本中,这个 bug 已经被修复,App Thinning 已经可以正常使用.当你从应用商店(Ap ...

  3. iOS9 App Thinning(应用瘦身)功能介绍 1

    iOS9 发布后,产生了一个使 App Thinning 无法正常运行的 bug.在iOS9.0.2 版本中,这个 bug 已经被修复,App Thinning 已经可以正常使用.当你从应用商店(Ap ...

  4. 竞品技术三瞥安装包的大小

    1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是使用4G流量包月了,于是在下载了10个App后,不但耗尽了流量,还按照0.3元/兆的价格扣了七八十元话费.后来我 ...

  5. [绍棠] bitcode问题

    libraries for bitcode must be generated from Xcode Archive or Install build forARM7 解决办法 开发语言:OC 场景: ...

  6. iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入、3D Touch、iPad 多任务加强、应用瘦身、应用传输安全、Swift 加强

    iOS 新特性分列式 之 iOS 9.x - 主要内容:苹果笔 API 引入.3D Touch.iPad 多任务加强.应用瘦身.应用传输安全.Swift 加强 太阳火神的美丽人生 (http://bl ...

最新文章

  1. python哨兵循环_Python通用循环的构造方法实例分析
  2. UA MATH566 统计理论 证明UMVUE的方法
  3. TF之LiR:基于tensorflow实现手写数字图片识别准确率
  4. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
  5. 图Graph--拓扑排序(Topological Sorting)
  6. Imbalanced class problem(ROC, Confusion Matrix)
  7. (2)FPGA面试题竞争与冒险
  8. promise A+ 原理
  9. 论文赏析[TACL19]生成模型还在用自左向右的顺序?这篇论文教你如何自动推测最佳生成顺序
  10. 04.electron-(使用remove模块及安全策略)
  11. 【解决方案】PDF文字复制后乱码
  12. HTML插入Flash的全兼容完美解决方案-SWFObject
  13. 交流电压电流采样基础知识
  14. 云安全|云原生安全概述
  15. Android:证书生成
  16. Android 打开网页之CustomTabs
  17. python terminal模块_python 终端模拟模块 pexpect
  18. 简单5招教你拍摄雪景个人写真?
  19. Linux中的source 命令
  20. 金九银十!字节跳动三轮面试惨败,总结面试经验,下次再战!

热门文章

  1. 基于Node.js+Electron+CPP(DLL)的Windows桌面应用程序(自助终端)开发简介
  2. akuna capital oa
  3. 【Quant】80+面试,5个offer,Quant大神总结分享各家quant面试题
  4. 云服务器重装系统步骤,腾讯云服务器如何更换操作系统?更换系统镜像重装系统方法...
  5. Word上下标快捷键
  6. PM、PO、PO、PMO、PMP的区别和介绍
  7. 【Endnote】如何在参考文献前加编号 (1.2.3.等 或 [1] [2] [3]等)
  8. react引入antd报错找不到antd/dist/antd.css Module not found: Error: Can‘t resolve ‘antd/dist/antd.css‘ in
  9. 区块链符号理论:符号方案和符号系统
  10. Android自定义控件入门到精通--Interpolation插值器