Framework那些事儿

2018-08-15  本文已影响136人  合欢猪

一、说明

针对SDK优化和可能遇到的问题做了些记录,持续更新中...

二、瘦身

SDK刚开发完成时包大小是android的好几倍,这样产品就给了瘦身要求,以下方案拿SDK真机包说明,目前大小4.2M

1、设置Generate Debug Symbols 为NO. 可以减少30%左右的体积.所以这个选项很重要

1

符号表,SDK运行的时候会产生很多符号表警告,设置为NO后会关掉这些警告,合理的选择与symbols有关的设置选项,可以缩减app的大小,一定程度上能阻碍与源代码有关的信息被攻击者获得

这一步设置之后,大小变为2.6M

2、设置Optimization Level下的Release模式为:Fastest,Smallest[-Os] .

2

这是Xcode上默认的,意思是开启不增加代码大小的全部优化,并让可执行文件尽可能小

查看Optimization Level对应代码的优化等级

3、删除无用代码,设置Dead Code Stripping为YES,去掉冗余代码

去掉被定义但未被使用的代码

3

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

4

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后面必须要指定具体的文件。

上一篇 下一篇

猜你喜欢

热点阅读