减少ipa包体积的实践报告

减少ipa包体积的实践报告

  • 前言

从用户的角度来看,并不喜欢内存占用过大的APP,首先如果用户是使用流量下载的,ipa的安装包的大小,会影响到用户是否决定下载此APP,即使顺利选择安装了,因为ipa安装包过大,必然导致下载的时间耗费延长,也可能中途取消安装,就算顺利安装完成,不是每个用户的手机都具有超大内存的配置,在内存不足的时候,体积越大的APP被删除的可能性越大,加上越是庞大的app,随着版本迭代,产生的冗余代码和废弃资源,一定程度上增加了学习和维护的成本。

所以安装包的大小对于产品来说很重要。

 

  • 方案执行前

以独立APP解压后的数据为例(101,210,812 字节(磁盘上的 108.1 MB),ipa实际大小:56,741,732 字节(磁盘上的 56.7 MB)):

  1. 可执行文件,76,895,552 字节(磁盘上的 76.9 MB),即占据ipa安装包的75.97563%(43,109,888.3 字节,43.0781822 MB)
  2. 图片,21,299,483 字节(磁盘上的 27.6 MB),即占据ipa安装包的21.044672%(11,941,111.3 字节,11.932329 MB)
  3. 其他文件,3,015,777 字节(磁盘上的 3.6 MB),即占据ipa安装包的2.979698%(1,690,732.25 字节,1.68948877 MB)

 

 

解压包

Ipa

百分比

总大小

108.1 MB

56.7 MB

--

可执行文件

76.9 MB

43.0781822 MB

75.97563%

图片

27.6 MB

11.932329 MB

21.044672%

其他

3.6 MB

1.68948877 MB

2.979698%

 

    数据化为饼图如下:

 

从上面的数据分析,可以得出结论,ipa安装包的大小,最大占比是由可执行文件垄断的,其次是图片资源,至于其他类型文件是可以忽略不计,结合现实问题,给ipa安装包瘦身,采取的方法由容易到困难,我觉得可以从下面几个方面着手:

  1. 清理无用、重复的图片。
  2. 清除废弃的代码,包括类文件、函数方法。
  3. 对使用中的图片资源,进一步压缩,采用压缩工具,进行有损或者无损压缩,理论上可以有效减少ipa的体积。

 

  • 处理后的效果

1、可执行文件,73,608,704 字节(磁盘上的 73.6 MB),优化后减少3.3 MB,ipa的可执行文件占约40 MB,优化后减少2.8110983 MB

2、图片文件,19,409,138 字节(磁盘上的 24.8 MB),优化后减少2.8 MB,ipa的图片文件占约11.2 MB,优化后减少0.7786528 MB

3、其他文件,23,030,879 字节 (磁盘上的 2.6 MB) ,优化后减少1 MB,ipa的其他文件占约1.6 MB,优化后减少0.1102488 MB

 

独立APP解压后大小(95,048,721 字节(磁盘上的 101 MB)),减少6,162,091 字节(7.1 MB),ipa 大小53,035,471 字节(磁盘上的 53 MB),减少 3,706,261 字节(3.7 MB)

 

结果:

 

解压包减少

最终Ipa减少

ipa优化

可执行文件

3.3 MB

2.8110983 MB

--

图片文件

2.8 MB

0.7786528 MB

--

其他文件

1 MB

0.1102488 MB

--

总大小

7.1 MB

3.7 MB

6.525573%

 

 

  • 相关工具和知识介绍

项目开发会随着时间越长和添加的功能模块越多,引入大量图片和代码等资源。但是在开发中,开发者在删除一些功能的时候,忘记移除相关资源,因为源码和资源是分离的,时间久了,项目中就会存在大量冗余的资源图片。同理,在迭代工作中,也会不断产生大量逻辑代码,但是并不是所有逻辑代码,都是有效的,有小部分是冗余的,或者本来有用的,但在频繁的迭代更新中渐渐失去了实用的价值,而又没有清理干净。

图片资源相对容易查找,具体方法无非是一个个去查找搜索,若Xcode搜索不出来,就意味不再使用,类文件函数方法查找的方法也是一样,但是这样查找的效率太低,而且也很可能出错。

为什么说很可能?因为在代码中,有可能是拼接参数来完成逻辑的,而这种情况是无法通过匹配查找出来的。

于是,我们需要工具:能够快速找出冗余的资源代码文件。

 

可执行文件

     在这里要活用两个工具otool和linkmap

  1. 查找无用的类class。

由于OC的动态性,导致它无论该是否被使用到,编译器都会把所有类class都编译进可执行文件里面。为了找出这些冗余的类,我们采用到了otool工具进行逆工程检查。

Step1:找到全部的类

      otool -v -s __DATA __objc_classlist 可执行文件路径

Step2:找到在使用中的类

      otool -v -s __DATA __objc_classrefs 可执行文件路径

Step3:两个集合相减就是无用的类。

  1. 找无用的函数方法selector。

Step1:找到全部的函数方法

      有两个方法:

      linkMap: LinkMap文件的__TEXT.__text,通过正则表达式([+|-][.+\s(.+)]),我们可以提取当前可执行文件里所有objc类方法和实例方法。

      Otool:

      a:otool -oV 可执行文件路径

     

      b:通过正则(\s*imp 0x\w+ ([+|-]\[.+\s(.+)\]))匹配a内容的每一行,最终的集合就是当前可执行文件里所有objc类方法和实例方法

 

图片

LSUnusedResources

    这是一款查找工程无用图片的工具

 

 

此工具可以把大量在工程中未使用过的图片找出来,但是不保证一定准确,但是如果没有给找出来的图片,基本可以保证是已经使用的,所以还是有很大的参考价值。

 

Gemini 2

是一款文件重工具,可以快速地帮你找出 Mac 中重复的文件内容,并加以清理。

 

ImageOptim

是一款适用于Mac操作系压缩软件。

 

     ImageOptim 绝对是前端开发中必备的一款图片压缩工具,尤其是对PNG, JPEP,GIF类图片的理易如反掌,件直接整合了WinLinux多著名理工具的特色功能,比如有:PNGOUT, AdvPNG,Pngcrush, OptiPNG, JpegOptim, Gifsicle 等等。

 

  • 他山之石
  1. 支持BitCode,BitCode使苹果独有的一种中间码技术方案,因为旧版本的工程在编译打包时为了兼容不同指令集的设备,通常是一刀切的把所有的的指令集都打到一个安装包里面去,因此导致安装包无故增加了体积,所以苹果推出了BitCode这种技术方案,把相同的部分集合起来,组成了中间码,以使不同的指令集皆可运行。
  2. 图片资源采用矢量图pdf文件,pdf文件可以放大缩小,而且体积更小,可以适配各种机型需求。
  3. 图片统一合成为一张大图,采用不同的坐标位置读取图片,仿照手机游戏的资源管理方法。
  4. 不常用资源改为在线下载的方式。

猜你喜欢

转载自blog.csdn.net/harder321/article/details/85244111