下面介绍了 iOS 优化 ipa 安装包大小的几种方法。
一、配置编译选项 Genetate Debug Symbols 设置为 NO
当 Generate Debug Symbols 设置为 NO 的时候,在 Xcode 中设置的断点不会中断,同样生成的 ipa 安装包也会小一些。
![](https://img.haomeiwen.com/i6359639/e2b7cc4c70fd9506.png)
二、Asset Catalog Compiler - Options Optimization
Build Setting > Asset Catalog Compiler - Options
![](https://img.haomeiwen.com/i6359639/b2f513d23ff4007b.png)
在Optimization优化设置项有三个选项,不指定、time和Space。Optimization nothing是Xcode默认的设置。
与预想的不同,在选择Optimization time时,编译时长并没有得到优化。
但在Optimization space时,编译耗时基本没有波动,但编译生成的app大小有不小程度的优化。
三、适当舍弃架构 armv7
因为 armv7 用于支持 4s 和 3gs ,4s 是 2011 年 11 月正式上线,虽然还有小部分人在使用,如果是是追求包体大小的完全可以舍弃了。
四、Deployment Postprocessing和Strip Linked Product
Xcode中Strip Linked Product 的默认设置为YES,但是Deployment Postprocessing的默认设置为NO。在Deployment Postprocessing 是Deployment的总开关,所以在打开这个选项之前 Strip Linked Product是不起作用的。注:当Strip Linked Product设为YES的时候,运行app,断点不会中断,在程序中打印[NSThread callStackSymbols]也无法看到类名和方法名。而在程序崩溃时,函数调用栈中也无法看到类名和方法名。
![](https://img.haomeiwen.com/i6359639/2c21f40b20381459.png)
五、清理未被使用的图片资源
(1)开源工具:LSUnusedResources
![](https://img.haomeiwen.com/i6359639/5a5fcde5acc9a93e.png)
-
将工程目录路径拷贝到Folder或通过Browse浏览文件目录;
-
在Resource指定要查找的资源类型;(经过本人测试,发现该工具在未指定Resource类型时所查找出来的资源不是很准确,列举出 的资源事实上是正在使用的,所以我在测试时指定查找了png类型的文件。)
-
单击Search以查阅结果。
注:为了避免对资源的误删操作,建议在该工具输出结果后对结果中的资源名复制并在Xcode的全局查找中进行校验。
下载安装:LSUnusedResources.app.zip
Github地址:LSUnusedResources
(2)通过终端 执行 shell 命令
a. 第一步建立.sh 文件 如 unusedImage.sh
vim unusedImage.sh
#!/bin/sh
PROJ=`find . -name '*.xib' -o -name '*.[mh]'`
for png in `find . -name '*.png'`
do
name=`basename $png`
if ! grep -qhs "$name" "$PROJ"; then
echo "$png is not referenced"
fi
done
b. 进入你要查找的工程目录下执行 这段 shell 脚本
sh unusedImage.sh
六、清理未使用的文档资源
文档资源的优化
文档资源主要是排查:
是否有不必要的文档资源,如果过期的旧版本所需要的文档资源 清理即可。
优化文档资源大小,主要是优化精简文档内容。
七、二进制包优化
二进制包是由各种代码文件,静态库 动态库 经过编译后生成的可执行文件。
这里推荐一个归类工具:https://github.com/huanxsd/LinkMap,使用方法很详细,结果类似如图:
![](https://img.haomeiwen.com/i6359639/8fd1244f65ff146a.png)
八、优化 第三方库
查找内部使用到的第三方库,一方面可以进行删减代码,用不到的类,直接删除,还有第三方库中的图片资源统统删除掉,如果能够自己手写实现的,那费功夫自己写吧
九、其他的资源相关:
图片
压缩图片 不重要的图片可适当采用 8bit PNG图片
-
什么是矢量图 矢量图是由计算机的算法产生的,可以无限放大或缩小,不会有任何损失,通常由矢量软件制作。
-
什么是位图 位图是由一个一个的小色块组成,放大后会看到那些小色块,同一面积内小色块越多,分辨率就越高。
-
矢量图的优缺点 可以无限放大或缩小,不会影响图像素质,文件体积较小,编辑灵活。缺点是表达的色彩层次不清,整体观感效果不如位图
-
位图的优缺点 不能放太大,减少文件分辨率后会影响图片质量,图片战胜空间较大,优点是能很细腻地表达图片的效果,图片表达效果非常好
-
什么情况下用位图,什么情况下用矢量图 一些对图片要求高的用位图,例如照片。其他的尽量用矢量图。例如文字、表格、卡通图片等
去掉无用的图片
-
用代码绘制简单的纯色图片 用Sketch和PaintCode快速得到绘制代码
-
如果不需要使用透明,可以用jpeg代替PNG。jpeg减少了些效率但更加小。需权衡性能,大小。
-
对32位的图片,尽肯能的使用高压缩率,使用PS的“Save For Web”功能,可以有效的减小JPEG和PNG图片的尺寸。 默认情况下,在build时,PNG图像就被pngcrush压缩。
音频
- 压缩音频,尽可能使用AAC或者MP3格式,并且使用一个较低的码率。通常44.1khz的码率有点浪费,降低一定的码率也不会丢失多少音质
视频
- 视频也可以使用类似于音频的处理方法,音视频的压缩可以很大程度的压缩,但是要注意压缩的格式,是不是会增加编解码的负担,这要权衡考虑。
Assets
- 检查bundle中的无用文件,不要打包到app或者静态库中。可以点击文件,在右侧的file inspector里面的target membership中取消勾选;或者在build phase里面的Copy Bundle Resources中去掉。
确定 dead code(代码被定义但从未被调用)被剥离,build setting 里 DEAD_CODE_STRIPPING = YES(新版本xcode默认是YES)。 去掉冗余的代码,即使一点冗余代码,编译后体积也是很可观的。
网友评论