以前的老文章了,搬到cnblog

更小的安装包意味着更快的下载安装速度,也往往意味着更快的加载运行速度,是优化ios应用的一个重要方面,本文主要参考《减小iOS应用程序的大小》,在实际测试的基础上,给出了优化ios安装包大小的更全面、更具体的建议。

开发者在Xcode里,可以做一个archive(Product->Archive,注意要build realse版),然后在Organizer界面,可以通过Estimate Size来估计大小,本人尝试了一下,这个大小比实际appstore的ipa要稍大;可以创建一个Ad hoc的ipa看看,而这个安装包比实际appstore的ipa稍小,这是因为appstore的ipa做了加密处理,导致压缩率降低。

检查安装包,剔除不需要的资源文件

随着版本的迭代,总会出现一些老版本需要,新版本不再需要的资源,要及时剔除这些文件。当引入第三方库时,可能会同时引入一些资源文件,要确定一下,是否有不需要使用的资源文件,如果有,要删除。建议在发布之前,做一个archive(Product->Archive),看看到底有哪些资源文件被打包了,鉴别不需要的。

可执行文件大小

  • 目标CPU架构
    如果应用需要在多种cpu架构下运行,那么xcode生成的二进制文件会包含对应架构的多个副本,这样可执行文件的大小就会成倍增加。
    arm cpu架构可以标识为armvX (64),X代表一个数字,如果不指定是64位,就是指32位。 一般来说arm架构都是向后兼容的,armv6的代码可以在armv7上运行,32位的代码可以在64位cpu上运行;但是新版本的xocde不支持生成老arm架构的代码。自iphone3GS开始cpu都是armv7的,所谓的armv7s(iphone5s用得是这个)是苹果搞出来的,加了个协处理器,多了一些浮点向量指令。平时在新闻媒体上看到所谓A6,A7处理器其实都是基于armv7架构Context-A家族的具体实现版本。 从新闻来看,iPhone6用的是A8的cpu,还是armv7的。关于arm架构知识可以参考:http://zh.wikipedia.org/wiki/ARM%E6%9E%B6%E6%A7%8B

    因此,现在将目标cpu架构(buidsettings->Architectures)设置为armv7即可。对于一个现有的ios可执行文件,可以通过otool -h [file path]来查看支持哪些cpu架构;当然还有很多其他的命令来查看二进制文件。
  • 编译选项
    将build setting中的Optimization Level设置为Fastest, Smallest [-Os]; 将build setting 中的Strip Debug Symbols During Copy设置为YES(COPY_PHASE_STRIP = YES),这样可以减小编译出二进制文件的尺寸。这里提到的这些设置在Xcode工程中对于Release的配置是默认的,所以只要自己不去瞎折腾就好。

图片资源

  • 从PhotoShop保存的文件默认包含一些“语法数据”,因此存在一定的优化空间:
    imageOptim工具可以很方便地批量优化图片,效果很显著。两个工具用, 加一个基于这两个应用的批处理script https://github.com/JamieMason/ImageOptim-CLI

  • 尽量使用resizable的图片:对于可拉伸的图片,比如圆角按钮的背景,尽量减少原始图片的像素尺寸,和android里面9patch概念一样。 而且经过测试,这种图片的运行时内存效率也更高。
    背景图:尽量与UI设计沟通,使用纯色、瓦片(可无限重复平铺)的形式;

  • 大图片: 对于大图片,如果不是启动图,也没有透明部分,可以试试jpg格式;或者与UI设计沟通一下,是否可以分拆成简单背景加前景小图片来减少总尺寸

  • 不使用图片可以考虑替代方案:纯色; 对于简单的渐变(轴式、放射式),可以考虑用2D绘图代码实现,像引导页这种只显示一次的图,如果可能的话,用这种方式是比较合适的。
    注意:对一个很大的(比如可滚动的)且并长期存在的view,不要用2D绘图,因为这导致系统为这个view创建一个同样尺寸的bitmap,内存消耗是很惊人的:retina的iphone上一张全屏图需要11369604 ~= 4M内存

  • image assets:xcode5引入image asset的概念,方便了对图片的管理,一个好处是添加/删除图片不再修改project文件。如果你的build target是ios7以下的话,没有什么其他的区别;如果是ios7的话,images.xasset会被编译器打包处理成一个二进制文件Asset.car,减少总体图片文件尺寸;从测试的情况看,确实能稍稍减小总体的尺寸,而且还能识别内容重复、名字不同的图片。
    由于这个措施是有益无害的,建议有时间改动的话,将图片加到image asserts里面,而且image asset还能保存resizable信息,减少了在代码里面指定的麻烦。

  • Xcode的pngcrush:Xcode自带一个png处理工具,可以对png进行处理,但是这种处理有可能会减小、也有可能会稍微增大png图片;在我测试的例子里面,一张优化至80k左右的图片打包后变成了100k。苹果的说法是这个处理工具将png转换成ios设备易于加载的形式,可以在xcode的buildsettings->compress png files来设置这个选项。
    从本人测试的情况看,关闭这个选项对加载速度的影响并不明显,同时对最终安装包大小的影响(在完成了其他优化措施的前提下)也不是很大,所以建议还是保持默认的打开就好。
    stack overflow上有个讲这个问题的帖子http://stackoverflow.com/questions/12667066/why-are-png-images-larger-in-the-ios-app-bundle-than-in-my-project/12673061#12673061

字符串数据

字符串如果直接嵌在代码里面,就被编译成为可执行文件的数据段的一个部分;这种情况下那么相当于内存的映像,没有什么可压缩的空间。字符串如果做成localizable.string的形式,就会形成一个单独的文本文件,可以被编译器很大地压缩,而且通过运行测试,这种形式占用的内存也稍微小一点。
从优化的实际效果来看,这一点对安装包的大小影响倒不是很大;但相对于把数据资源嵌在可执行文件里面,这种方式总归是比较好的做法,以后维护起来也比较方便。

动态下载资源

如果资源不是运行必须的,可以考虑不放在安装包里面,改为动态下载, 比如字体、图片、配置数据等。

减少升级包的大小

当从App Store升级应用时,不会下载所有的文件,只会下载需要更新的文件,这个过程对用户和开发者都是透明的;因此,如果尽量少修改文件,避免修改大文件,将修改隔离成一个小文件能够显著减少升级所需要下载的安装包尺寸。要不是安装文件特别大的话,还没有必要在这上面下功夫。

参考资料:
https://developer.apple.com/library/ios/qa/qa1795/_index.html#//apple_ref/doc/uid/DTS40014195-CH1-MEASURE
http://beyondvincent.com/blog/2014/03/24/reducing-the-size-of-my-app/
http://stackoverflow.com/questions/12667066/why-are-png-images-larger-in-the-ios-app-bundle-than-in-my-project/12673061#12673061
http://jishu.zol.com.cn/140415.html
http://zh.wikipedia.org/wiki/ARM%E6%9E%B6%E6%A7%8B

如何减小ios安装包大小的更多相关文章

  1. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  2. iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明

    iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...

  3. iOS - ipa安装包大小优化

    在App Store上显示的下载大小和实际下载下来的大小,我们通过下表做一个对比: iPhone型号 系统 AppStore 显示大小 下载到设备大小 iPhone6 10.2.1 91.5MB 88 ...

  4. 减少iOS应用程序安装包大小

    安装包优化大小方法: <资源优化> 1.去除无用资源 通过几次项目的升级后,项目中会出现一些没有用到的图片.这些图片在我们导入到项目中后,之后项目升级过程后并没有再次用到. 那这些图片我们 ...

  5. iOS 安装包瘦身 (上篇)

    本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...

  6. iOS 安装包瘦身(下篇)

    本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...

  7. 在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤

    Xamarin 配置手册和离线包下载 http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安装 ...

  8. 微信android混淆打包减少安装包大小

    首先,感谢微信android团队的分享 微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了 ...

  9. [转发]在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤

    官方学习文档:http://developer.xamarin.com/guides/android/getting_started/ 官方学习例子:http://developer.xamarin. ...

随机推荐

  1. Linux之磁盘与文件系统管理

    磁盘及文件系统管理详解 [参考文献:马哥视频] 原文:http://blog.csdn.net/u013008795/article/details/51150075 目前市场上主流的磁盘是机械式硬盘 ...

  2. android小程序之幸运菜谱

    android小程序之幸运菜谱 前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷) 一开始得 ...

  3. Jmeter_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  4. [BZOJ3110][ZJOI2013]K大数查询(整体二分)

    BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...

  5. gulp详细入门

    gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试.检查.合并.压缩.格式化.浏览器自 ...

  6. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...

  7. spring之事务

    1.编程式事务 2.声明式事务:aop

  8. Genymotion模拟器的安装及常见问题解决方法

    Genymotion是很好用很快的一款Android模拟器. 我们使用的时候下载一个免费版的就足够用了. 官网下载地址:http://www.genymotion.net/ 不过这个软件下载之前必须注 ...

  9. 使用guava实现找回密码的tokenCache以及LRU算法

    源码包的简单说明: com.google.common.annotations:普通注解类型. com.google.common.base:基本工具类库和接口. com.google.common. ...

  10. mvvm,如何解析一个指令表达式?

    如何解析一个指令表达式? v-model="msg==='abc'?'1':a" 完美的解决方案 1,with(vm){ return new Function('vm',exp) ...