如何减小ios安装包大小
以前的老文章了,搬到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安装包大小的更多相关文章
- iOS安装包瘦身的那些事儿
在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...
- iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明
iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...
- iOS - ipa安装包大小优化
在App Store上显示的下载大小和实际下载下来的大小,我们通过下表做一个对比: iPhone型号 系统 AppStore 显示大小 下载到设备大小 iPhone6 10.2.1 91.5MB 88 ...
- 减少iOS应用程序安装包大小
安装包优化大小方法: <资源优化> 1.去除无用资源 通过几次项目的升级后,项目中会出现一些没有用到的图片.这些图片在我们导入到项目中后,之后项目升级过程后并没有再次用到. 那这些图片我们 ...
- iOS 安装包瘦身 (上篇)
本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...
- iOS 安装包瘦身(下篇)
本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...
- 在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤
Xamarin 配置手册和离线包下载 http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安装 ...
- 微信android混淆打包减少安装包大小
首先,感谢微信android团队的分享 微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了 ...
- [转发]在Visual Studio 2010/2012/2013/2015上使用C#开发Android/IOS安装包和操作步骤
官方学习文档:http://developer.xamarin.com/guides/android/getting_started/ 官方学习例子:http://developer.xamarin. ...
随机推荐
- R语言学习 第七篇:列表
列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型.列表项可以是列表类型,因 ...
- MyISAM和InnoDB索引实现区别
首先来讲MyISAM: MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是 ...
- SonarQube和Maven的集成
1.1. SonarQube简介 SonarQube是一款免费用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量通过插件形式,可以支持包括java,C#,C/C++,PL/S ...
- jsp学习笔记之:内置对象
application对象: 设置一个名为name,值为val的应用内共享的数据 <% application.setAttribute("name",val); %> ...
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
- MySQ备份常见问题
1.备份的时候出现2002报错,找不到/tmp/mysql.sock,这个文件 [root@centos199 backup]# mysqldump -uroot -ppassword cz-offi ...
- Python 2.7版本与3.6的不同
初学python,暂时就记一点. 1.print 2.7:print "123" #正常 3.6:print "123" #报错,正常应该是print在输出任何 ...
- Android 开发使用第三方库出现Crash时处理方案汇总
一.Glide混淆脚本没加导致的Crash 现象描述: 使用Glide开发的时候在debug版本一直没事,但是realease版本各种Crash,报错信息如下: java.lang.IllegalAr ...
- 第二周Python讲课内容--日记
1.初识模块:sys.os 标准模块库存放在lib文件夹里 三方库模块一般存放在packages文件夹里 模块调用方法:import sys/os sys模块: sys.path 打印环境变量 sys ...
- WPF介绍
WPF 为Windows Presentation Foundation的首字母缩写 ,中文译为“Windows呈现基础”.WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上 ...