.framework是什么?怎么制作? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 談一談自己對(duì)動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的理解。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在項(xiàng)目中如何使用動(dòng)態(tài)framework的APP?使用了動(dòng)態(tài)framework的APP能上架AppStore嗎? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可以通過(guò)framework的方式實(shí)現(xiàn)app的熱修復(fù)嗎?
前言
最近發(fā)現(xiàn)很多人分不清 『.framework && .a 』、『動(dòng)態(tài)庫(kù) && 靜態(tài)庫(kù)』、『.tbd && .dylib』這幾個(gè)東西。甚至, 還有人一直以誤為 framework 就是動(dòng)態(tài)庫(kù)?。¤b于網(wǎng)上許多文章都表述的含糊不清,再加上很多文章都比較老了,所以今天寫(xiě)點(diǎn)東西總結(jié)一下。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?首先,看文章之前,你稍微了解這么幾個(gè)東西:編譯過(guò)程、內(nèi)存分區(qū)。下面開(kāi)始!
理論篇
動(dòng)態(tài)庫(kù)VS.靜態(tài)庫(kù)
首先你得搞清楚,這兩個(gè)東西都是編譯好的二進(jìn)制文件。就是用法不同而已。為什么要分為動(dòng)態(tài)和靜態(tài)兩種庫(kù)呢?先看下圖:


我們可以很清楚的看到: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 對(duì)于靜態(tài)庫(kù)而言,在編譯鏈接的時(shí)候,會(huì)將靜態(tài)庫(kù)的所有文件都添加到目標(biāo)app可執(zhí)行文件中,并在程序運(yùn)行后,靜態(tài)庫(kù)與app可執(zhí)行文件一起被加載到同一塊代碼區(qū)中。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? app可執(zhí)行文件:這個(gè)目標(biāo)app可執(zhí)行文件就是ipa解壓縮后,再顯示的包內(nèi)容里面與app同名的文件。 ? ? ? ? ? ? ? ??
對(duì)于動(dòng)態(tài)庫(kù)而言,在編譯鏈接的時(shí)候,只會(huì)將動(dòng)態(tài)庫(kù)被引用的頭文件添加到目標(biāo)app可執(zhí)行文件,區(qū)別于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)是在程序運(yùn)行的時(shí)候被添加另外一塊內(nèi)存區(qū)域。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?蘋(píng)果的官方文檔中有兩句對(duì)動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的解釋 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- 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. ? ?- **動(dòng)態(tài)庫(kù)**:可以在 **運(yùn)行or啟動(dòng)** 的時(shí)候加載到內(nèi)存中,加載到一塊**獨(dú)立的于 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)庫(kù)**:當(dāng)程序在啟動(dòng)的時(shí)候,會(huì)將 app 的代碼(包括靜態(tài)庫(kù)的代碼)一起在加載到 app 所處的內(nèi)存地址上。相比于**靜態(tài)庫(kù)** 的方案,使用**動(dòng)態(tài)庫(kù)**將花費(fèi)更多的啟動(dòng)時(shí)間和內(nèi)存消耗。還會(huì)增加可執(zhí)行文件的大小。
舉個(gè)例子:假設(shè)UIKit編譯成靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的大小都看成1M,加載到內(nèi)存中花銷(xiāo)1s,現(xiàn)在有app1和app2兩個(gè)app。倘若使用靜態(tài)庫(kù)的方式,那么在app1啟動(dòng)的時(shí)候,需要花銷(xiāo)2s同時(shí)內(nèi)存有2M分配給了app1,同樣的道理 加上app2的啟動(dòng)時(shí)間和內(nèi)存消耗,采用靜態(tài)庫(kù)的方案,一共需要花銷(xiāo)4s啟動(dòng)時(shí)間、4M內(nèi)存大小、4M安裝包大小。那么換成動(dòng)態(tài)庫(kù)的時(shí)候,對(duì)于啟動(dòng)和app1可能花費(fèi)一樣的時(shí)間,但是在啟動(dòng)app2的時(shí)候,不用再加載UIKit動(dòng)態(tài)庫(kù)了。減少了UIKit的重復(fù)使用問(wèn)題,一共花銷(xiāo)3s啟動(dòng)時(shí)間、3M內(nèi)存大小、4M安裝包大小。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?而很多app都會(huì)使用很多相同的庫(kù),如UIKit、CFNetwork等。所以,蘋(píng)果為了加快app啟動(dòng)速度、減少內(nèi)存花銷(xiāo)、減少安裝包體積大小,采用了大量動(dòng)態(tài)庫(kù)的形式來(lái)優(yōu)化系統(tǒng)。dyld的共享緩存: