动态库

  • 程序运行时由系统按需动态加载到内存,而不是复制,供程序调用。加载一次,多个程序共用,节省内存。
  • 动态库不需要被拷贝到可执行文件中,所以可执行程序的体积会变小。
  • 动态库升级不需要编译整个程序

在iOS上, 展示为.dylib 和 .framework文件

静态库

  • 静态库是在编译时,完整的拷贝至可执行文件中,被多次使用就有多次冗余拷贝。
  • 因为链接时可以看到所有的符号,又因为编译器可以硬编码函数地址,所以调用会快一些。
  • 因为链接时可以看到所有符号,所以比那一起可以优化删除一些没有被引用的符号,减少编译出文件的体积
  • 静态库变化,需要编译整个程序
    在iOS上,展示为.a和.framework

API

编程的接口,编写应用程序时候调用的函数接口。

ABI

应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所需要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。
ABI的作用是为了让编译好的目标代码可以在兼容ABI的系统中无需改动就能运行。

Bundle

iOS上的一个宽泛的概念,苹果使用Bundle代表应用程序,框架,插件和许多其他特定类型的内容。Bundle有明确的目录结构,这个结构根据平台和类型会有所不同。苹果提供了接口来访问Bundle中的资源而不需要了解Bundle的特定结构。

二进制库

.a 文件

二进制静态库,需要配合.h头文件使用

.swiftmodule 文件

因为swift没有头文件,.swiftmodule文件会包含AST等信息,会充当头文件的作用。

.framework 文件

iOS上.framwork文件可能是动态库(系统),也可能是静态库(开发者)。.framework中常常还会有资源文件等。

Swift 制作 .a 静态库

[Xcode] File -> New -> Project...
选择 iOS 的 Static Library




iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_iOS自己创建动态库和静态库如何选择


编译的时候记得修改Scheme,使用Release


iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_ios 重复引用 静态库_02


分别在模拟器和Generic iOS Device上执行后,分别得到两套 .a 文件 和 .swiftmodule


iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_swift_03


因为我们常常需要同时打包 x86 和 arm64 架构,可以用lipo命令将两个.a合并在一起。

lipo -create  -output

可以通过 lipo -info命令来查看.a 文件的信息

然后将两个.swiftmodule文件夹的里的内容合在一起,创建一个新的文件夹将生成的.a和.swiftmodule文件夹放在一起,类似如下的结构:

libStaticLib├── StaticLib.swiftmodule│ ├── arm64-apple-ios.swiftdoc│ ├── arm64-apple-ios.swiftmodule│ ├── arm64.swiftdoc│ ├── arm64.swiftmodule│ ├── x86_64-apple-ios-simulator.swiftdoc│ ├── x86_64-apple-ios-simulator.swiftmodule│ ├── x86_64.swiftdoc│ └── x86_64.swiftmodule└── libStaticLib.a

在Swift程序中使用.a文件

  1. 将制作的文件夹拖入IDE中(这里我们以libStaticLib为例子)
  2. 在Build Phase中,找到Link Binary With Libraries, 增加制作的.a文件(这里是libStaticLib.a)
  3. 还需要修改Build Setting中的Import Paths 为$(PROJECT_DIR)/libStaticLib,这样代码中才可以知道这个模块。

经过上面三步的调整后,就可以在代码中进行调用了

import StaticLib

Swift 制作 .framework库

[Xcode] File -> New -> Project...
选择 iOS 的 Framework


iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_ios 重复引用 静态库_04


需要调整一下Mach-O Type的设置。


iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_ios 重复引用 静态库_05


之后的制作步骤和.a文件类似,就不累述了。
这里多说明一下,制作后的.framework文件结构

├── Headers│ ├── MyFramework-Swift.h│ └── MyFramework.h├── Info.plist├── Modules│ ├── MyFramework.swiftmodule│ │ ├── arm64-apple-ios.swiftdoc│ │ ├── arm64-apple-ios.swiftmodule│ │ ├── arm64.swiftdoc│ │ └── arm64.swiftmodule│ └── module.modulemap├── MyFramework (1)└── _CodeSignature ├── CodeDirectory ├── CodeRequirements ├── CodeRequirements-1 ├── CodeResources └── CodeSignature
  • (1)这里静态库文件

在Swift程序中使用.framework库

将制作好的.framework拖入工程


iOS自己创建动态库和静态库如何选择 ios 动态库依赖静态库_ios 重复引用 静态库_06


然后在程序中直接引入,就可以执行了。

import MyFramework