一、说明
针对SDK优化和可能遇到的问题做了些记录,持续更新中...
二、瘦身
SDK刚开发完成时包大小是android的好几倍,这样产品就给了瘦身要求,以下方案拿SDK真机包说明,目前大小4.2M
1、设置Generate Debug Symbols 为NO. 可以减少30%左右的体积.所以这个选项很重要
![](https://img.haomeiwen.com/i9793312/7163ada75e82b792.png)
符号表,SDK运行的时候会产生很多符号表警告,设置为NO后会关掉这些警告,合理的选择与symbols有关的设置选项,可以缩减app的大小,一定程度上能阻碍与源代码有关的信息被攻击者获得
这一步设置之后,大小变为2.6M
2、设置Optimization Level下的Release模式为:Fastest,Smallest[-Os] .
![](https://img.haomeiwen.com/i9793312/8b2e94aa6eaba63e.png)
这是Xcode上默认的,意思是开启不增加代码大小的全部优化,并让可执行文件尽可能小
3、删除无用代码,设置Dead Code Stripping为YES,去掉冗余代码
去掉被定义但未被使用的代码
![](https://img.haomeiwen.com/i9793312/15cadcf968f61855.png)
4、删除不必要的指令集
工程中支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa/framework包会变大。
对于iOS来说指令集有这四种:armv6、armv7、armv7s、arm64,分别对应不同的iOS设备:
armv6:iPhone、iPhone 3G、iPod 1G、iPod 2G
armv7:iPhone 3GS、iPhone 4、iPod 3G、iPod 4G、iPod 5G、iPad、iPad 2、iPad 3、iPad mini
armv7s:iPhone 5、iPhone 5C、iPad 4
arm64:iPhone 5S、iPhone 6、iPhone 6P、iPad Air、retina iPad mini
因为产品要求SDK只支持64位CPU即可,所以此处只设置为arm64(iPhone5s以前版本都是32为CPU,以后包括5s都是64位CPU),这样设置之后,SDK大小变为1.6M
![](https://img.haomeiwen.com/i9793312/85819c4c4456a2c2.png)
5、删除framework中无用mach-o
网上下载了个machOView文件浏览器,但一执行就崩溃,有人说是arm64问题,但我没找到具体原因,所以这一步没进行测试,有兴趣的同学可以自行试试,点击查看链接
6、其他
- 相关文件瘦身,比如压缩图片大小,推荐图片瘦身链接
- 代码瘦身、比如放弃集成AFNetworking,自定义网络请求相关方法
三、可能遇到的问题
1、framework中使用了 Category 的问题
framework中使用了 Category 的时候,调用app出现 "selector not recognized" ,解决方法是 在调用的app的 Build Settings --> Linking-> Other Linker Flags 中加上 -ObjC 或者-all_load
2、framework中针对支持系统最低版本问题
在PROJECT->Deployment Target->iOS Deployment Target选择你需要支持的最低系统。但这有一个问题,工程默认编译设置的是Dynamic Framework,这种编译只支持iOS8+,如果目标版本设置为iOS8以前版本,则在运行时会出现:warning: embedded dylibs/frameworks only run on iOS 8 or later警告。再者动态库加载苹果只允许他自己使用,所以此处需要将Dynamic Framework更换为Static Library静态模式。设置路径为Build Settings->Linking->Mach-O Type->Static Library
3、framework不支持bitcode问题
在TAGETS的Build setting中搜索Other C Flags,添加命令“-fembed-bitcode”。在APP中进行相同设置。如果不进行以上操作。别人在集成你的framework时可以编译,亦可以真机测试。唯独在打包时会发出警告并打包失败。警告为framework不支持bitcode!
4、真机调试崩溃问题
a- 首先检查framework是否包含真机包,用模拟器运行出来的版本只支持模拟器,用真机运行出来的则只支持真机,如果需要同时支持两者,则需要将两者的二进制文件合并生成一个新的SDK包,可用lipo命令进行合并处理。
lipo -create 目标1绝对路径 目标2绝对路径 -output 新目标绝对路径,输出后将新目标替换其中任何一个并将其所在sdk导出即可
b- 检查framework是否包含当前系统运行框架,目前iOS支持的框架有armv6、arms7、armv7s、armv64(上述有记载),每种框架支持的手机型号都不相同,一一核对
5、Other Linker Flags设置问题
常用的有三个:-ObjC、-force_load、all_load
Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。
本来这样就可以解决问题了,不过在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件。
网友评论