庫是什麼?
庫一般是封裝好的程式碼,便於複用。例如 GitHub 上可以看到的開源庫,開箱即用。
下面我們主要說的,是編譯成二進位制的庫。
什麼場景使用二進位制的庫?
- 保護原始碼。日常開發中的各種商業 SDK 就屬於此類。只暴露標頭檔案給使用者,而隱藏具體的實現。
- 加快編譯速度。因為是編譯完成的二進位制,所以編譯的時候只需要 Link 一下。
動態庫與靜態庫
根據 Link 的方式,分成了2種庫,靜態庫和動態庫。
什麼是靜態庫?
靜態庫,即靜態連結庫。不同平臺的檔案格式如下:
系統 | 靜態庫檔案格式 |
---|---|
Windows | .lib |
Linux | .a |
MacOS/iOS | .a |
靜態庫的特點,在於編譯的時候會直接複製到目標程式裡。
意味著程式碼在目標程式中,不會再改變了。如圖:
什麼是動態庫?
動態庫,即動態連結庫。
不同平臺的檔案格式如下:
系統 | 動態庫檔案格式 |
---|---|
Windows | .dll |
Linux | .so |
MacOS/iOS | .dylib |
動態庫的特點,在於編譯的時候,並不會被拷貝到目標程式中。
目標程式中,只會儲存指向動態庫的引用。程式執行時,動態庫才真正被載入。
而同一個動態庫,可以被多個程式使用。如圖:
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 靜態庫的,可以參考下面的文章: