以前的老文章了,搬到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. ssm框架之将数据库的数据导入导出为excel文件

    在这里首先我要将自己遇到的各种问题,以及需求记录下来,做一个备忘,便于以后查看: 需求:主要实现两个功能,将oracle数据库里的数据导出为excel,同时需要将excel表格的数据导入到数据库 环境 ...

  2. 【BZOJ2693】jzptab(莫比乌斯反演)

    [BZOJ2693]jzptab(莫比乌斯反演) 题面 讨厌权限题,只能跑到别的OJ上交 和这题是一样的 多组数据 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 前 ...

  3. [BZOJ1000] A+B Problem

    Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 ...

  4. animate 动画滞后执行的解决方案

    jQuery动画: animate 容易出现连续触发.滞后反复执行的现象: 针对 jQuery 中 slideUp.slideDown.animate 等动画运用时出现的滞后反复执行等问题的解决方法有 ...

  5. Servlet 过滤器、拦截器、监听器以及文件上传下载

    在学习之初,总是对过滤器.拦截器.监听器这三个搞不清楚,现在进行一些记录,方便大家交流,也为了提高自身的学习能力! 如果想要了解这三个的作用,首先对servlet流程进行熟悉了解,servlet是客户 ...

  6. python 想搞加密算法吗?快戳这里

    加密算法介绍 一,HASH Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换 ...

  7. 检测flash是否安装及版本号

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. IDEA2017版本打可运行jar包并运行

    一.打JAR包 JAR:From modules with dependencies  将依赖一起打包 一般依赖放在与xx.jar同级的libs文件夹中 敲黑板,下图第一个框是输出jar包的位置,第二 ...

  9. 数据结构之队列c代码实现

    一学期的数据结构,总不能毫无收获吧,因为书上的很多代码并不能实现,我一个编程小白可怎么过呢,难得假期有时间,于是我寻求度娘,从四面八方找了些可以编译通过的源码,这一次是队列,后面我还会逐渐补充,如果有 ...

  10. Hadoop之Secondary NameNode

    NameNode存储文件系统的变化作为log追加在本地的一个文件里:这个文件是edits.当一个NameNode启动时,它从一个映像文件:FsImage,读取HDFS的状态,使用来自edits日志文件 ...