一、iOS(安装)包
ipa全称为iPhone Application Archive,这里指的包在iOS其实就是安装包,直观展示就是xxx.ipa文件
二、iOS包内容
要对其优化,就要知道包里面都有什么,知道了有什么,针对不同类型的文件,做不同的处理,从而达到一定的优化。
安装包内容如下:
-
_CodeSignature
文件夹:ipa
包签名文件的存放文件夹 -
Assets.car
:Assets.xcassts
在编译过程中生成的最终展示文件,默认里面存放各种分辨率图片(测试项目未使用) -
embedded.mobileprovision
:证书配置文件 -
Info.plist
:项目配置表 -
Plugins
:App
创建的扩展,比如Widget
、Push
和Share
等 -
.Iproj
:App
所支持的语言文件 -
exec
文件:可执行文件,例如widgetExtension
-
图片资源:
.png,.jpg,.webp,.gif
-
其它资源文件
-
.xml,.json
-
.plist
:项目中使用资源的.plist
文件 -
.bundle
:Mac OS
下的资源包集合 -
.conf
:相关的配置文件 -
.cer
,.der
,.p12
:钥匙串文件 -
.wav
:音频文件 -
.js
,.html
-
.nib
:Xcode
自带的数据文件,包含一个窗口程序和应用程序委托对象 -
.sqlite
:数据库文件 -
.txt
:文本文件 -
.mom
:Xcode
创建的数据模型文件
-
三、优化策略
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 检查出来的无用代码,还需要人工二次确认才能够安全删除掉。
网友评论