關於 iOS 中的庫

ZenonHuang發表於2019-03-04

庫是什麼?

庫一般是封裝好的程式碼,便於複用。例如 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 原理總結

如何打造一個讓人愉快的框架

相關文章