.framework是什么?怎么制作? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 談一談自己對動態(tài)庫和靜態(tài)庫的理解袋毙。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在項目中如何使用動態(tài)framework的APP?使用了動態(tài)framework的APP能上架AppStore嗎? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可以通過framework的方式實現(xiàn)app的熱修復(fù)嗎?
前言
最近發(fā)現(xiàn)很多人分不清 『.framework && .a 』、『動態(tài)庫 && 靜態(tài)庫』搂擦、『.tbd && .dylib』這幾個東西。甚至, 還有人一直以誤為 framework 就是動態(tài)庫Q罟铡祈餐!鑒于網(wǎng)上許多文章都表述的含糊不清,再加上很多文章都比較老了哄陶,所以今天寫點東西總結(jié)一下帆阳。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?首先,看文章之前屋吨,你稍微了解這么幾個東西:編譯過程蜒谤、內(nèi)存分區(qū)。下面開始至扰!
理論篇
動態(tài)庫VS.靜態(tài)庫
首先你得搞清楚,這兩個東西都是編譯好的二進制文件鳍徽。就是用法不同而已。為什么要分為動態(tài)和靜態(tài)兩種庫呢?先看下圖:
我們可以很清楚的看到: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 對于靜態(tài)庫而言,在編譯鏈接的時候,會將靜態(tài)庫的所有文件都添加到目標(biāo)app可執(zhí)行文件中,并在程序運行后,靜態(tài)庫與app可執(zhí)行文件一起被加載到同一塊代碼區(qū)中敢课。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? app可執(zhí)行文件:這個目標(biāo)app可執(zhí)行文件就是ipa解壓縮后,再顯示的包內(nèi)容里面與app同名的文件阶祭。 ? ? ? ? ? ? ? ??
對于動態(tài)庫而言,在編譯鏈接的時候,只會將動態(tài)庫被引用的頭文件添加到目標(biāo)app可執(zhí)行文件,區(qū)別于靜態(tài)庫,動態(tài)庫是在程序運行的時候被添加另外一塊內(nèi)存區(qū)域。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?蘋果的官方文檔中有兩句對動態(tài)庫和靜態(tài)庫的解釋 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- A better approach is for an app to load code into its address space when it’s actually needed, either at launch time or at runtime. The type ofl ibrary that provides this flexibility is called dynamic library. ? ?- **動態(tài)庫**:可以在 **運行or啟動** 的時候加載到內(nèi)存中直秆,加載到一塊**獨立的于 app ** 的內(nèi)存地址中
-When an app is launched, the app’s code—which includes the code of the static libraries it was linked with—is loaded into the app’s address space.Applications with large executables suffer from slow launch times and large memory footprints ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- **靜態(tài)庫**:當(dāng)程序在啟動的時候濒募,會將 app 的代碼(包括靜態(tài)庫的代碼)一起在加載到 app 所處的內(nèi)存地址上。相比于**靜態(tài)庫** 的方案圾结,使用**動態(tài)庫**將花費更多的啟動時間和內(nèi)存消耗萨咳。還會增加可執(zhí)行文件的大小。
舉個例子:假設(shè)UIKit編譯成靜態(tài)庫和動態(tài)庫的大小都看成1M,加載到內(nèi)存中花銷1s,現(xiàn)在有app1和app2兩個app疫稿。倘若使用靜態(tài)庫的方式,那么在app1啟動的時候,需要花銷2s同時內(nèi)存有2M分配給了app1,同樣的道理 加上app2的啟動時間和內(nèi)存消耗,采用靜態(tài)庫的方案,一共需要花銷4s啟動時間培他、4M內(nèi)存大小、4M安裝包大小遗座。那么換成動態(tài)庫的時候,對于啟動和app1可能花費一樣的時間,但是在啟動app2的時候,不用再加載UIKit動態(tài)庫了舀凛。減少了UIKit的重復(fù)使用問題,一共花銷3s啟動時間、3M內(nèi)存大小途蒋、4M安裝包大小猛遍。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?而很多app都會使用很多相同的庫,如UIKit、CFNetwork等号坡。所以,蘋果為了加快app啟動速度懊烤、減少內(nèi)存花銷、減少安裝包體積大小,采用了大量動態(tài)庫的形式來優(yōu)化系統(tǒng)宽堆。dyld的共享緩存: