App包瘦身技术优化

本文主要介绍了App包瘦身的优化步骤,资源部分处理的较多,但像三方库、可执行文件瘦身,涉及较少。

一、成果(ipa包降63M,AppStore降30M~40M,不同机型苹果会做包的切割)

优化前:
iPhone 8 Plus    5.7.6    AppStore:198M    ipa:180.23M
iPhone 11 Pro    5.7.6    AppStore:183M    ipa:180.23M

优化后:
iPhone 8 Plus    5.7.7    AppStore:159M    ipa:117.25M
iPhone 11 Pro    5.7.7    AppStore:152M    ipa:117.25M

二、快速瘦身,主要步骤

1、 删除2x图,我们的项目里面全部用3x图

2、 查找无用的文件,使用三方库:fui(https://github.com/dblock/fui),我们项目只查找了业务文件夹,查询时间1~2小时,将查完后的文件和项目比对,一一手动删除,使用步骤如下:(这一步可以重复做2-3次以上,有些文件删完或许会有新的文件可删)

3、删除无用资源图,使用三方库:LSUnusedResources(https://github.com/tinymind/LSUnusedResources),查完后的图片和项目比对,一一手动删除,使用步骤如下:

image.png

4、无损图片压缩,工具:Optimage(https://xclient.info/s/db75908c-c3cf-1a96-711e-f6fa2eb38bdd.html#versions),3.3.1及以下版本可用,高版本每天只能压缩30张图片。使用如下:
① 检测设置是否正确:默认是无损,且在原路径上直接覆盖替换

Frame Rale Auematio.png

② 直接拖images里面的文件夹进来即可(建议分批压缩,一次太多可能压缩不了)
JaTouch.png

Dptimage.png

5、针对一些大图片,150K以上可再次压缩:https://tinypng.com,优点:还能在压缩50%左右,可多次压缩,缺点:只能一张一张处理。可以从储存空间直接看到资源大小,找到项目的images文件,针对大图单独处理。

储存堂價 支特 服务.png

image.png

6、较大gif压缩:https://gifcompressor.com

7、排查项目内引入的三方库是否可以删除、video资源是否可以被压缩(需要压缩找UED)

8、排查可执行文件,LinkMap(https://github.com/huanxsd/LinkMap),定位较大的文件,看是否可以删除,这一步结合mach-o还能删掉不少重复代码,由于时间问题没细细的排查

image.png
image.png

三、我们App具体实操及结果

1、删除2x图后:
    5.7.7    #7    ipa包178.33M
2、删除290个无用文件后:(因为中间加入OCR识别的SDK增大了2.5M,这一步相当于减少了0.8M,虽然效果甚微,但可以删除更多的图片资源)
    5.7.7    #18    ipa包180.01M
3、删除近600张图片资源后:
    5.7.7    #29    ipa包164.41M
4、无损压缩近2000张图片资源后:
    5.7.7    #40    ipa包150.81M
5、有些gif替换成svga图、gif图压缩、video压缩后
    5.7.7    #61    ipa包140.95M
6、使用tinypng压缩150k以上大图后:
    5.7.7    #66    ipa包123.22M
7、启动图使用LaunchScreen.storyboard,我们项目已经是这种方案,画的UI,也没有启动大图
8、排查项目内引入的三方库,发现都在使用,不能删除
9、检查可执行文件,占用的大小,LinkMap(https://github.com/huanxsd/LinkMap),快速定位占用较大的可执行文件,看了下大文件都是三方库占用较大,也都在使用,没法删除。至于无用代码,这部分牵扯的太多,有些还可能是运行时使用的,就算能删一部分,也效果甚微,未来可以考虑整理项目接口、排查无用业务来处理。
10、配置项排查
① 去除编译指令集:https://www.jianshu.com/p/35c73cfbd153,查了下我们项目Architectures是:armv7、arm64,VALID_ARCHS是:armv7s、arm64,两个取交集,最终编译的ipa包的可执行文件只支持arm64,无需在优化;
② Build Settings->Optimization Level有几个编译优化选项,release版应该选择Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。我们项目已经是如此设置,无需优化;
③ Build Settings->Deployment Postprocessing、Strip Linked Product、Strip Debug Symbols During Copy、Symbols hidden by default四者设置为YES后可以去掉不必要的符号信息,减少可执行文件大小,去除了符号信息之后我们就只能使用dSYM来进行符号化了,所以需要将 Debug Information Format 修改为DWARF with dSYM file。没有效果,但这次也给设置上了;
④ Build Settings->Dead Code Stripping(仅对静态语言有效):删除静态链接的可执行文件中未引用的代码。Debug设置为NO, Release设置为YES可减少可执行文件大小。Xcode默认会开启此选项,C/C++/Swift等静态语言编译器会在 link的时候移除未使用的代码,但是对于Objective-C等动态语言是无效的。因为Objective-C是建立在运行时上面的,底层暴露给编译器的都是Runtime源码编译结果,所有的部分应该都是会被判别为有效代码。我们项目已经是如此设置,无需优化;
⑤ 开启 Pod 库和主工程 Xcode Build Settings 中的 ASSETCATALOG_COMPILER_OPTIMIZATION space 选项。没有效果,但这次也给设置上了;
11、视频业务下线,删除Agora后:
    5.7.7    #81    ipa包119.14M
12、最后找安卓核对业务,发现5.7.7之前有些业务线已经废弃,再次删除一部分资源后:
    5.7.7    #84    ipa包117.25M

你可能感兴趣的:(App包瘦身技术优化)