iOS-优化ipa包大小

现在的项目是接受别人写的,而且项目时间比较旧。一直不断的开发新功能,造成现在项目体积很大。现在的用户不像14、15年那时候,愿意装各种app,用户现在会考虑是否有必要,是否占内存,app有多大等等一些。所以,缩小ipa的大小就非常有必要了。
首先我们来看下ipa包里面的占用比


截屏2022-12-26 15.02.01.png

从这个图上,我们看到资源和代码占了80%,所以从这两个方面入手,我们收到的效果也是最大的.

优化要从两个方面来处理:

应用的分割

当我们向app store connect上传ipa后,在构建版本的过程中,会自动分割app.这是什么意思呢?就是会专门针对不同设备来选择只适用于当前设备的内容以供设备下载.他主要体现在资源@1x @2x @3x.
其中架构方面开发者不需要去控制,但是对于资源来说要求图片在 Asset Catalog 管理,如果直接放在 Bundle 中,则不会被优化。
所以:尽量将图片等资源交给asset catalog管理

1 资源的优化
1.1图片的压缩

使用第三房工具进行无损压缩图片:
imageOptim:https://imageoptim.com/howto.html
tinypng:https://tinypng.com
利用上述的第三方库我们压缩了项目中的图片,当把图片放入 Asset Catalog 是,图片大小有了明显减小。但比较奇怪的是,打包出来的ipa并没有变小。后来在网上查了才知道,构建 Asset Catalog 的工具 actool 会首先对 Asset Catalog 中的 png 图片进行解码,得到 Bitmap 数据。然后再运用 actool 的编码压缩算法进行编码压缩处理。actool的接收输入没有变化,所以就无法优化 Asset Catalog的大小了。但如果我们效果的文件不在 Asset Catalog中,那就可以优化。是有效果的。

重复图片的清理

删除项目中1x的图片资源
一个项目里肯定会有重复的图片,特别是多人开发的时候。每个人负责一个单独的模块。有新的功能需求时候,都是调用自己模块的资源,不可避免的就造成了图片的重复。
网上都在说LSUnusedResources:
https://github.com/tinymind/LSUnusedResources
对于需要拼接的这种
"icon_%d.png",index]]
图片查找的效果并不好,那就自己手动搞吧。

On-Demand Resource资源云

从ios9开始引入了On Demand Resource功能,我们可以把一部分图片资源放到苹果服务器上,不随着app的下载而下载,知道用户真正进入到某一个页面时才下载这些资源文件。举个例子,我们可以把引导页的图片放到On-Demand Resource上面,在新人进入的时候出现引导页,其他情况都不会用到它。这样就降低了资源体积。

来看下具体的操作
截屏2022-01-14 下午5.10.57.png

xcode默认是开启Resource的。我们只要把资源加入到对应的类型下就可以。
(2).资源加入成功,那我们怎么使用呢。

NSSet *tags = [NSSet setWithObjects: @"New", @"New-1"];
 
// Use the shorter initialization method as all resources are in the main bundle
resourceRequest = [[NSBundleResourceRequest alloc] initWithTags:tags];
// Request access to the tags for this resource request
[resourceRequest beginAccessingResourcesWithCompletionHandler:
                                 ^(NSError * __nullable error)
    {
        // Check if there is an error
        if (error) {
            // There is a problem so update the app state
            self.resourcesLoaded = NO;
 
            // Should also inform the user of the error
 
            return;
        }
 
        // The associated resources are loaded
        self.resourcesAvailable = YES;
    }
];

可以把请求方法封装起来,后期会更方便。

图片资源使用webbp

谷歌开源的格式,Webp 压缩率比较高,同时支持有损和无损两种压缩模式,可以带来更小的图片体积,而且肉眼看不出差异。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 26%的体积,有损压缩后的 WebP 图片相比于等效质量指标的 JPEG 图片减少了 25%~34% 的体积。
但是 WebP 与 JPG 以及 PNG 相对比,在编解码的 CPU 消耗以及解码时间上会差一些,因为编码是用户上传图片时的一次性操作,并且编码过程是在服务器后台进行,对用户的影响不大,对用户影响大的主要是解码过程,会导致图片加载速度慢一些。所以,我们需要根据项目的实际情况在性能和体积上做取舍。
如果从服务器带宽以及流量来看,因为图片的体积变小,所以会减小带宽,降低成本。

删除未引用的类

我使用了fui这个库来检查的未背引用的类。当然也可以使用https://github.com/yan998/FindClassUnRefs

无用方法的排查

结合LinkMap文件的__TEXT.__text,通过正则表达式([+|-][.+\s(.+)]),我们可以提取当前可执行文件里所有objc类方法和实例方法(SelectorsAll)。再使用otool命令otool -v -s __DATA __objc_selrefs逆向__DATA.__objc_selrefs段,提取可执行文件里引用到的方法名(UsedSelectorsAll),我们可以大致分析出SelectorsAll里哪些方法是没有被引用的(SelectorsAll-UsedSelectorsAll)。注意,系统API的Protocol可能被列入无用方法名单里,如UITableViewDelegate的方法,我们只需要对这些Protocol里的方法加入白名单过滤即可。

另外第三方库的无用selector也可以这样扫出来的。

编译选项改进

Xcode支持编译器层面的一些优化选项,通过修改Build Setting的一些相关配置,可以让我们介于更快的编译速度和更小的二进制大小.

去除无用架构

可以在 Build Setting - Excluded Architectures 项设置排除的架构
我想现在没有公司再去适配Iphone5c了吧,所以这儿只要设置arm64就可以了.其他的就可以去掉了

2.去除符号信息

strip style:表示的是我们需要去除的符号的类型选项.分为三个选项
1.All Symbols:去除所有符号,一般是在主工程中开启.
2.Non-Global Symbols: 去除一些非全局的Symbols(保留全局符号,Debug Symbols 同样会被去除)
3.Debug Symbols: 去除调试符号,去除之后将无法断点调试。

所以,主工程选择All Symbols,静、动态库选择Non-Global Symbols。

Strip Linked Product

去除不需要的符号信息之后,我们只能使用dsym来进行符号化.所以,将Deployment Postprocessing设置为 NO,将Strip Linked Product设置为YES,将Release模式的下的Debug Information Format 修改为 DWARF with dSYM file。

Strip Debug Symbols During Copy

与 Strip Linked Product 类似,但是这个是将那些拷贝进项目包的三方库、资源或者 Extension 的 Debug Symbol 去除掉,同样也是使用的 strip 命令。这个选项不受Deployment Postprocessing的控制,所以我们只需要在 Release 模式下开启,不然就不能对三方库进行断点调试和符号化了。

所以,Strip Debug Symbols During Copy在Release 模式下设置为YES,在Debug模式下设置为false。

截屏2022-01-14 下午5.40.45.png

截屏2022-01-14 下午5.42.41.png

可以去除不必要的符号调试
2.Strip Linked Product:DEBUG下设为NO,RELEASE下设为YES(默认设置)
3.可用strip-x[动态库路径]去除不要的符号信息

Framework优化

引入三方Framework时,会包含多个指令集,我们可以手动移除不需要的指令集。对于大多数移动端app,只需要 armv7s和arm64就够了。并不需要x86_64,I386。我们可以使用终端输入lipo -info libopencore-amrnb.a查看静态库的信息。
移除多余的指令。

2.二进制文件的优化
1.4 查找内部使用到的第三方库,一方面可以进行删减代码,用不到的类,直接删除,还有第三方库中的图片资源统统删除掉,如果能够自己手写实现的,那费功夫自己写吧。因为一般第三方的库功能都比较全面,但是在项目中我们仅仅使用它的具体某一个功能的话,在不影响功能性的情况下,是可以对其进行一些删除的,以便缩小项目体积。
1.6 音频

压缩音频,尽可能使用 AAC 或者 MP3 格式,并且使用一个较低的码率。通常 44.1khz 的码率有点浪费,降低一定的码率也不会丢失多少音质。

1.7视频

视频也可以使用类似于音频的处理方法,音视频的压缩可以很大程度的压缩,但是要注意压缩的格式,是不是会增加编解码的负担,这要权衡考虑。

你可能感兴趣的:(iOS-优化ipa包大小)