美文网首页
Framework那些事儿

Framework那些事儿

作者: 合欢猪 | 来源:发表于2018-08-15 12:03 被阅读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后面必须要指定具体的文件。

相关文章

  • Framework那些事儿

    一、说明 针对SDK优化和可能遇到的问题做了些记录,持续更新中... 二、瘦身 SDK刚开发完成时包大小是andr...

  • 资料篇

    参考资料 官方文档iOS文字排版(CoreText)那些事儿IOS CoreText.framework --- ...

  • 《汽车销售那些事儿》目录

    汽车销售那些事儿21汽车销售那些事儿20汽车销售那些事儿19汽车销售那些事儿18汽车销售那些事儿17汽车销售那些事...

  • Runtime那些事儿(消息机制)

    Runtime那些事儿(消息机制) Runtime那些事儿(消息机制)

  • iOS 截图的那些事儿

    iOS 截图的那些事儿 iOS 截图的那些事儿

  • MVP那些事儿(1) 用场景说话

    目录 MVP那些事儿(1)……用场景说话 MVP那些事儿(2)……MVC架构初探 MVP那些事儿(3)……在And...

  • 《明朝那些事儿》目录

    《明朝那些事儿》:朱元璋逆袭成为皇帝(1) 《明朝那些事儿》:朱元璋逆袭成皇帝(2) 《明朝那些事儿》:朱元璋逆袭...

  • 原生App切图的那些事儿

    原生App切图的那些事儿 原生App切图的那些事儿

  • 汽车销售那些事儿13

    《汽车销售那些事儿》目录 汽车销售那些事儿14 汽车销售那些事儿12 因为上午的事情,店里进行调整,颜颜也得以按时...

  • 汽车销售那些事儿3

    《汽车销售那些事儿》目录 汽车销售那些事儿4 汽车销售那些事儿2 1 蝉鸣的季节里,空气中充满离别的味道。 校园里...

网友评论

      本文标题:Framework那些事儿

      本文链接:https://www.haomeiwen.com/subject/qejmbftx.html