按照公司的想法 要开发一款SDK,于是就抽空学习一下静态枯的制作过程.
在IOS中有静态库和动态库的区分,下面我们就来详细介绍一下.
一.静态库和动态库的详细介绍.
我们平时的工程中或多或少都要引入第三方的SDK,至少引用过系统的framework。其实这些SDK和Framework都属于库,库又分为静态库和动态库。我们平时导入的第三方SDK有的事Framework,有的是 .a。到底哪些是动态库,那些是静态库呢。下面我们分别介绍静态库,动态库,Framework和.a以及.tbd的区别。
二.静态库和动态库
首先解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况会用到库:
<1>.某些代码需要提供给别人用,但是不希望别人看到我们的源码,就需要一库的形式进行封装。只暴漏出头文件。
<2>.对于某些不会进行大的改动的代码,比方说很多大公司常用且很少改变的模块都会编译成库。这样做的好处一是可以节省编译时间,二来是对于代码的管理也非常方便。
因为库是已经编译好的二进制文件了,编译的时候只需要link一下,既然提到了link那就有不同的形式了,静态和动态,与之对应的就是静态库和动态库。
1.静态库
平时我们使用到的第三方SDK基本上都是静态库,静态库有几个特点:
<1>在App编译的时候,会拷贝一份编译到目标程序中,相当于将静态库嵌入了,所以得到的App二进制文件会变大.
<2>在使用的时候,需要手动的导入静态库所依赖的其他类库。(比如说某个SDK中使用到了CoreMotion.framework,在使用的时候,需要手动导入.)有的SDK需要Link是几个系统库,只能一个一个的手动加或者使用第三方库管理工具。这也是静态库的一个很大的不方便之处)
<3>导入静态库的应用可以减少对外界的依赖,如果导入的是第三方动态库,动态库找不到的话应用就会崩掉 。
<4>静态库很大的一个优点就是减少耦合性,因为静态库中是不可以包含其他静态库的,使用的时候需要另外导入他的依赖库,最大限度的保证了每一个静态库都是独立的。
2.动态库
这是我们最常用的一类库,使用频率最高的UIKit.framework和Fundation.framework 都属于动态库,所有.dylib和.tbd结尾的都属于动态库,动态库的几个特点:
<1>.平时使用的系统库都放在iOS的系统中,在你打包应用程序的时候这些库不会拷贝到你的程序中,当需要的时候会动态的从iOS系统中加载他们,因为这个原因,动态库也被称为共享库,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码.
<2>.这些库是所有的应用公用的,换一种说法就是节省了应用安装包的体积,这是区别静态库的一个很重要的特点,因为静态库使用一次就拷贝一次,非常的浪费资源.
<3>.动态库在使用的时候不需要再次link依赖库,即导即用。唯一需要注意的就是在导入自己制作的动态库是,需要在Embedded Binaries中导入,不然会报错:image not found。此时这个动态库会跟静态库一样被拷贝到目标程序中进行编译苹果又把这种Framework叫做Embedded Framework
关于动态库要搞清楚一点,我们自己制作的动态库与系统动态库的区别,我们自己制作的动态库引入App项目的时候需要embed进项目,也就是要拷贝到目标程序中,这就有点不像动态库的特性了,苹果这么做也是考虑安全问题吧!
三 Framework .a .dylib/.tbd
1.Framework
Framework的英文意思是框架,主要由Headers,binary文件,.bundle这三个部分组成,除此之外还有info.plist和Modules,后两者主要记录Framework的版本之类的信息,一般都会删掉.
<1>Headers
包含我们在制作Framework的时候暴漏的头文件,所以被暴漏的.h都房子啊这里.
2.binary文件
整个Framework的核心,所有代码都被编译成了这样一个二进制文件,这里需要注意的是添加的依赖库不会被编译进来,用的时候还需要重新link其他依赖库
.bundle文件
资源文件都打包放在这里。在制作Framework的时候不可以把图片直接放在项目中,否则制作好之后图片是一张一张出现在项目中,非常乱。需要新建一个bundle将图片放进去,这里的bundle提供整个SDK的图片资源.需要注意的是图片放进bundle之后,不可以使用[UIImage ImageWIthName:]读取图片,要先找到bundle包在拿图片.
Framework既可以是静态库也可以是动态库,这取决于编译成的Mach-O(就是那个二进制文件)是动态库还是静态库,Framework本质上并不是一个库,它是苹果为了防拜年开发者提供的一种库的打包方式,Framework会将Mach-O文件,头文件,和资源包全都包含起来,不需要你手动整理。我们也可以通过Xcode来制作framework动态库使用。
2 .静态库
这类静态库与framework基本类似,不同的是在打包成.a文件的同时,还需要提供头文件,使用时相较于Framework比较麻烦。.a这样打包不够方便,而Framework编译完成暴漏的文件都已经放好了.
3 .dylib/.tbd 动态库
这类库我们也经常使用,基本上都是系统提供的,一般不自己制作,就算你通过其他的方式制作使用,也可能上不了架的。
四 静态库的制作
<1> .a静态库的制作
(1) 创建项目时,直接选择静态库(.a)
(2)设置需要暴漏的头文件
(3)在模拟器环境下编译(得到模拟器环境下的静态库)
(4)在真机环境下编译(得到真机环境下的静态库)
自己做了一下 感觉挺简单的 但是截图太麻烦 这里贴一下我搜索的资料 看看就很明白了。
<2> Framework的制作
其实 这个也挺简单的 这里我也只贴一下我找的比较简单易懂的资料
五 如果打包包含第三方的framework
看看这里
https://www.jianshu.com/p/68c0f40a3387
https://www.jianshu.com/p/6790fc295f48