iOS 中的库CocoaPods的两种模式

2021-02-03 17:11:48

参考地址 关于 iOS 中的库

库是什么?

库一般是封装好的代码,便于复用。例如 GitHub 上可以看到的开源库,开箱即用。

下面我们主要说的,是编译成二进制的库。

什么场景使用二进制的库?

  • 保护源代码。日常开发中的各种商业 SDK 就属于此类。只暴露头文件给使用者,而隐藏具体的实现。

  • 加快编译速度。因为是编译完成的二进制,所以编译的时候只需要 Link 一下。

动态库与静态库

根据 Link 的方式,分成了2种库,静态库和动态库。

什么是静态库?

静态库,即静态链接库。不同平台的文件格式如下:

系统静态库文件格式
Windows.lib
Linux.a
MacOS/iOS.a

静态库的特点,在于编译的时候会直接复制到目标程序里。

意味着代码在目标程序中,不会再改变了。如图:

3D044AD0-C6D0-40E4-ABD7-AB07945E6E26

什么是动态库?

动态库,即动态链接库。
不同平台的文件格式如下:

系统动态库文件格式
Windows.dll
Linux.so
MacOS/iOS.dylib

动态库的特点,在于编译的时候,并不会被拷贝到目标程序中。

目标程序中,只会存储指向动态库的引用。程序运行时,动态库才真正被加载。

而同一个动态库,可以被多个程序使用。如图:

91EDA5EA-2038-4B89-9ECB-BAA8DD4D94FE

MacOS/iOS 里的 Framework

Framework 实际上是一个 bundle 或者说特殊形式的文件夹,将库的 二进制文件/头文件/资源文件 打包到一起。

Framework 可以选择创建为动态或者静态。

区别

由于 .a /.dylib 等只能打包库的二进制代码,可以用以下公式区别:

动态库/静态库 + .h + 资源文件 = Framework.

如何制作 Framework?

制作 Framework 已经有很多教程,可以直接谷歌百度查阅,这里就不纠结具体过程了。可以参考这篇文章->静态库和动态库的制作(OC、Swift)

关于动态的 Framework

真正动态的 Framework ,只有苹果自家的 UIKit.Framework,Foundation.Framework 等。

由于 iOS 的沙盒机制,自己创建的 Framework 和系统 Framework 不同,App 中使用的 Framework 运行在沙盒里,而不是系统中。每个 App 都只能用自己对应签名的动态库,做不到多个 App 使用一个动态库。

如果不同的 App 使用了同样的 Framework,还是会有多份的 Framework 被分别签名,打包和加载。

所以,iOS 上的动态库只能是私有的,我们无法将动态库放置在除了自身沙盒以外的地方。

CocoaPods 管理库使用的是哪种形式?

CocoaPods 是 iOS 项目的依赖管理工具,类似于 Android 的 gradle。不过gradle 还能负责构建, CocoaPods 只管理依赖。

CocoaPods 目前分别支持了 Framework 动态库和 .a 静态库 2种方式。

默认使用的是 .a 静态库的方式,主工程依赖 libPods.a,通过脚本,把资源等文件复制到目标目录。

在 Podfile 使用了 use_frameworks! 进行声明,则使用 Framework 动态库的形式.主工程对 Pods 的依赖为 Pods.framework。

由于 Xcode9 之前 Swift 项目不支持静态库,如果为 Swift 项目,就必须采用 user_frameworks! 声明。

关于 Xcode9 以后使用 Swift 静态库的,可以参考下面的文章:

即刻Swift静态库实践

参考

dylib浅析

iOS 静态库,动态库与 Framework

iOS 静态库和动态库的基本介绍和使用

CocoaPods 原理总结


  • 2019-12-17 11:56:05

    ffmpeg concat video and mix audio,ffmpeg简单快速的合并视频

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-17 11:58:55

    FFmpeg文章目录

    seek ffmpeg # How to seek in mp4/mkv/ts/flv ffmpeg # flags &= ~AVSEEK_FLAG_BACKWARD ffmpeg # AVSEEK_FLAG concat ffmpeg # concat 连接两个视频 ffmpeg # -f concat -i mylist.txt ffmpeg # concat详解+音画同步策略 截图

  • 2019-12-18 23:26:00

    FFMPEG命令记录

    ffmpeg,拼接两个音频,剪切音频片段,多个音频混音,剪切一段MP4并转换成gif,改变音量大小,音频淡入淡出,音频格式处理

  • 2019-12-19 00:04:44

    ffmpeg concat video and mix audio

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-19 00:16:30

    android采用FFmpeg实现音频混合与拼接剪切

    接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器、直播平台都基于FFmpeg进行二次开发。本篇文章来总结下采用FFmpeg进行音频处理:音频混合、音频剪切、音频拼接与音频转码。

  • 2019-12-19 15:01:58

    spring boot 在Linux下服务启动报错Unable to find Java

    将 Spring boot 安装为 Linux 服务启动,后输入 service myapp start 报错 Unable to find Java ,但是使用 java -jar myapp.jar 启动成功。不知道为啥引起的,经过百度找到下面这个解决方法和我的情况一样,终于把问题解决