iOS包大小优化

一、iOS(安装)包

ipa全称为iPhone Application Archive,这里指的包在iOS其实就是安装包,直观展示就是xxx.ipa文件

二、iOS包内容

要对其优化,就要知道包里面都有什么,知道了有什么,针对不同类型的文件,做不同的处理,从而达到一定的优化。

安装包内容如下:

  • _CodeSignature文件夹:ipa包签名文件的存放文件夹

  • Assets.carAssets.xcassts在编译过程中生成的最终展示文件,默认里面存放各种分辨率图片(测试项目未使用)

  • embedded.mobileprovision:证书配置文件

  • Info.plist:项目配置表

  • PluginsApp创建的扩展,比如WidgetPushShare

  • .IprojApp所支持的语言文件

  • exec文件:可执行文件,例如widgetExtension

  • 图片资源:.png,.jpg,.webp,.gif

  • 其它资源文件

    • .xml,.json

    • .plist:项目中使用资源的.plist文件

    • .bundleMac OS下的资源包集合

    • .conf:相关的配置文件

    • .cer.der.p12:钥匙串文件

    • .wav:音频文件

    • .js.html

    • .nibXcode自带的数据文件,包含一个窗口程序和应用程序委托对象

    • .sqlite:数据库文件

    • .txt:文本文件

    • .momXcode创建的数据模型文件

三、优化策略

Xcode编译优

armv6: iPhone, iPhone 3G, iPod 1G/2G
armv7: iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
armv7s: iPhone 5, iPhone 5c, iPad 4
arm64: iPhone X,iPhone 8(Plus),iPhone 7(Plus),iPhone 6(Plus),iPhone 6s(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)
arm64e: XS/XS Max/XR/ iPhone 11, iPhone 11 pro,iPhone 11 Pro Max,iPhone SE (2nd generation),iPhone 12 mini,iPhone 12,iPhone 12 Pro,iPhone 12 Pro Max,Phone 13 mini,Phone 13,iPhone 13 Pro,iPhone 13 Pro Max
x86_64: 模拟器64位处理器
i386: 模拟器32位处理器

Excluded Architectures中设置Release模式下 Any iOS SDK -> armv7
设置了之后,Release下把armv7的指令集排除在外。选中target会发现默认设置了 Any iOS Simulator SDK -> arm64,意思是模拟器的时候排除arm64指令集。(Xcode14以后,官方不兼容arm7s和armv7,应该不需要再设置了)

资源文件优化

1、删除无用图片资源
使用开源项目LSUnusedResources(https://github.com/tinymind/LSUnusedResources),可以根据项目实际情况定义查找文件的正则表达式。
使用建议:
勾选 Ignore similar name ,避免扫描出图片组。
在删除前在项目中进行二次全局搜索确认,是否确实没有使用。

2、图片资源压缩
将png图片格式转化为WebP,使用工具iSpart
使用工具ImageOptim或者TinyPng压缩图片

使用建议:
由于WebP 在 CPU 消耗和解码时间上会比 PNG 高两倍。所以,我们有时候还需要在性能和体积上做取舍。建议是,如果图片大小超过了 100KB,你可以考虑使用 WebP;而小于 100KB 时,你可以使用工具进行图片压缩。这两个工具的压缩率没有 WebP 那么高,不会改变图片压缩方式,所以解析时对性能损耗也不会增加。

3、代码瘦身
工程量不是很大的话,直接使用 AppCode 来做分析,那些代码量达到百万行的团队,则会自己通过 Clang 静态分析来开发工具,去检查无用的方法和类。

使用AppCode进行无用代码删除有一些注意点:
-JSONModel 里定义了未使用的协议会被判定为无用协议;
-如果子类使用了父类的方法,父类的这个方法不会被认为使用了;
-通过点的方式使用属性,该属性会被认为没有使用;
-使用 performSelector 方式调用的方法也检查不出来,比如 self performSelector:@selector(arrivalRefreshTime);
-运行时声明类的情况检查不出来。比如通过 NSClassFromString 方式调用的类会被查出为没有使用的类,比如 layerClass = NSClassFromString(@“SMFloatLayer”)。还有以[[self class] accessToken] 这样不指定类名的方式使用的类,会被认为该类没有被使用。像 UITableView 的自定义的 Cell 使用 registerClass,这样的情况也会认为这个 Cell 没有被使用。

基于以上种种原因,使用 AppCode 检查出来的无用代码,还需要人工二次确认才能够安全删除掉。

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