iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身

静态库和动态库

静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库和动态库的存在的形式

静态库:以.a 和 .framework为文件后缀名。
动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名,系统提供的framework都是动态库。

理解:.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式

静态库和动态库的区别

静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;

共同点:

静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息。

本篇文章主要讲Framework开发的过程和一些细节

  1. 新建工程


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第1张图片
    image.png
  2. 修改Mach-O Type 选中Static Library (静态库)


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第2张图片
    image.png
  3. 修改构建版本为所有版本,否则只会构建当前选中的设备架构


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第3张图片
    image.png
  4. 新建TestView

@interface YMTestView : UIView
- (void)changeBackgroundColor:(nonnull UIColor *)bgColor;
@end

@implementation YMTestView
- (void)changeBackgroundColor:(nonnull UIColor *)bgColor {
    self.backgroundColor = bgColor;
}
@end
  1. 将header中需要暴露的头文件由project拖至public


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第4张图片
    image.png

    将所有暴露的头文件导入到自动生成的YMSDK.h文件中方便使用。

  2. 设置最低支持版本


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第5张图片
    image.png
  3. 编译Framework
    Edit scheme可修改编译Debug版本或者Release版本


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第6张图片
    image.png

    编译生成的Framework在Products文件夹中,Show In Finder查看


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第7张图片
    image.png
  4. 将编译生成的Framework拖入demo中验证


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第8张图片
    image.png

使用拖拽方式,有一个很大的缺点就是不能进行代码调试,这里推荐一个方法

iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第9张图片
image.png

Add Files to Target, 选择打包Framework项目的.xcodeproj文件 (注意!添加之后需关闭项目,重新打开)


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第10张图片
image.png

接下来,在demo的build phases中添加对应的Frameworks


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第11张图片
image.png

如此在运行demo时即可调试Framework项目代码。

需要注意的是,要把info.plist文件中的Excutable file删除,否则上传App Store 会失败。

关于bundle

  • 创建bundle工程


    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第12张图片
    image.png

修改Base SDK ,默认是MacOS, 改为iOS


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第13张图片
image.png

修改COMBINE_HIDPI_IMAGES 为NO,否则图片格式为TIFF


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第14张图片
image.png

接下来添加资源文件,一定要选择copy


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第15张图片
image.png

编译生成的bundle文件在products文件夹中,show finder查看
在demo中导入bundle,使用bundle中资源时需要注意,此时的bundle已经不是mainBundle了,需要获取我们创建的bundle,使用图片,Xib和Storyboard都应通过此法获取


iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第16张图片
image.png

快速创建bundle方式

新建一个文件夹,将需要的资源拖入文件夹,将文件夹重命名为****.bundle,回车确认添加扩展名即可。

将bundle一起打包进Framework

将创建好的bundle拖入framework项目中,并添加target

iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第17张图片
image.png

在使用Framework的demo中使用时需要注意,需要添加copy files
iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第18张图片
image.png

iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第19张图片
image.png

使用时获取bundle方式
iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第20张图片
image.png

iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第21张图片
结果验证

为了方便使用,我们可以将获取Bundle添加宏定义或者添加个分类方法。
值得注意的是,当我们打包的Framework中有使用其它Framework或.a静态库是,需要将静态库拷贝到项目,但是不需要添加到Target(否则会报重复文件错误),编译通过即可;而使用我们的Framework时,需要手动导入依赖的静态库到Target,否则会报找不到文件错误。

Framework瘦身方式

  1. release模式下设置Generate Debug Symbols 为NO,debug模式设置为YES,大约可以减少30%的体积。这个指标是为了进行代码调试,如果为NO,debug模式将不能进行断点调试。若想具体了解,点击传送门 https://www.jianshu.com/p/11710e7ab661

    iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身_第22张图片
    image.png

  2. 删除无用代码,设置Dead Code Stripping为YES,去掉冗余代码即代码被定义但未被使用。

  3. 删除不必的指令集,为了缩小包的体积,可删除armsv7s,因为指令集是向下兼容的,所以设置了armv7是可以在armv7s的设备上运行的,但是执行效率上会有所降低,想详细了解 Architectures,点击跳转 https://www.jianshu.com/p/c76aa6f4a81a

你可能感兴趣的:(iOS 静态库Framework开发(包含静态库,bundle使用)以及Framework瘦身)