iOS-SDK開發(fā)

常用命令

  1. file - 用于判斷是動態(tài)庫還是靜態(tài)庫
    動態(tài)庫: 顯示“Mach-O 64-bit dynamically linked shared library arm64”
    靜態(tài)庫: 顯示“current ar archive random library” 或“current ar archive ”场梆。
  2. lipo - 用于查看庫包含的架構信息及合并拆分
lipo -info  /framework路徑/xxx.framework/xxx
lipo -create 庫1 庫2 -output  合并后的fat庫
lipo 待拆分的fat庫 -thin 需拆分框架 -output 新庫

基礎知識

  1. mach-o文件類型
  • Executable:應用的主要二進制
  • Dylib Library:動態(tài)鏈接庫(又稱DSO或DLL)
  • Static Library:靜態(tài)鏈接庫
  • Bundle:不能被鏈接的Dylib延柠,只能在運行時使用dlopen( )加載,可當做macOS的插件
  • Relocatable Object File:可重定向文件類型
  1. 文件類型
    靜態(tài)庫一般是.a文件昭殉,也可能沒有后綴。
    動態(tài)庫一般是.framework文件郁稍,.framework文件其實只是個文件夾烙心,真正的二進制文件在.framework里面。.framework里面的二進制文件也可能是靜態(tài)庫拙已,也有可能是動態(tài)庫。有后綴也可能沒有后綴摧冀。
c語言文件處理過程為:
// 預處理階段倍踪。預處理為.i文件 系宫,所有的預處理器指令都是以井號 # 開頭,只有空格字符可以出現(xiàn)在預處理指令之前建车。
// 例如#define,#import,#include,#ifdef #endif
// OC的#import相對#include來講扩借,優(yōu)勢就是解決了預處理階段的循環(huán)包含的問題。
// A文件#include B文件缤至,同事B文件include A文件潮罪,就會相互展開。#import只會展開一次领斥。
gcc –E hello.c -o hello.i  
// 編譯階段嫉到。編譯為.s匯編語言文件
// 這個階段編譯器主要做詞法分析、語法分析月洛、語義分析等何恶,在檢查無錯誤后后,把代碼翻譯成匯編語言嚼黔。 匯編語言程序导而,即低級機器語言指令
gcc -S hello.i -o hello.s
// 匯編階段。匯編器as 將.s文件 翻譯成機器語言隔崎,打包形成可重定位的目標文件hello.o 中(二進制文本形式)。
gcc -c hello.s -o hello.o
// 鏈接階段韵丑。此階段完成文件中調用的各種函數(shù)的靜態(tài)鏈接和動態(tài)鏈接爵卒,并將它們一起打包合并形成目標文件,即可執(zhí)行文件撵彻。
// 靜態(tài)鏈接:是指把要調用的函數(shù)或者過程拷貝到可執(zhí)行文件中钓株,成為可執(zhí)行文件的一部分。
// 動態(tài)鏈接:所調用的函數(shù)代碼并沒有被拷貝到應用程序的可執(zhí)行文件中去陌僵,而是僅僅在其中加入了所調用函數(shù)的描述信息(往往是一些重定位信息)轴合。
// mac、iOS中的可執(zhí)行文件幾乎都是mach-o文件類型
gcc hello.o -o hello
mach-o文件解析
// Header頭部碗短,包含可以執(zhí)行的CPU架構受葛,比如x86,arm64
// Load commands 加載命令偎谁,包含文件的組織架構和在虛擬內存中的布局方式
// Data总滩,數(shù)據(jù),包含load commands中需要的各個段(segment)的數(shù)據(jù)巡雨,每個Segment的大小都是Page的整數(shù)倍闰渔。
mach-o文件加載過程
// 1. 加載dyld到App進程
// 2. 加載動態(tài)庫(包括所依賴的所有動態(tài)庫)
// 3. Rebase
// 4. Bind
// 5. 初始化Objective C Runtime。
// 6. 其它的初始化代碼
  1. 靜態(tài)庫和動態(tài)庫的區(qū)別
    靜態(tài)庫:鏈接時會被完整的復制到可執(zhí)行文件中铐望,所以如果兩個程序都用了某個靜態(tài)庫冈涧,那么每個二進制可執(zhí)行文件里面其實都含有這份靜態(tài)庫的代碼茂附。
    動態(tài)庫:鏈接時不復制,在程序啟動后用動態(tài)加載督弓,所以理論上動態(tài)庫只用存在一份营曼,好多個程序都可以動態(tài)鏈接到這個動態(tài)庫上面,達到了節(jié)省內存(不是磁盤是內存中只有一份動態(tài)庫)咽筋,還有另外一個好處溶推,由于動態(tài)庫并不綁定到可執(zhí)行程序上,所以我們想升級這個動態(tài)庫就很容易奸攻,windows和linux上面一般插件和模塊機制都是這樣實現(xiàn)的蒜危。
iOS動態(tài)庫:
iOS平臺上規(guī)定不允許存在動態(tài)庫,并且所有的 IPA 都需要經過Apple的私鑰加密后才能用睹耐。
基本你用了動態(tài)庫也會因為簽名不對無法加載辐赞,所以iOS下并不存在真正的動態(tài)庫。
iOS8之前因為 iOS 應用都是運行在沙盒當中硝训,不同的程序之間不能共享代碼响委,并且iOS是單進程的,也就是某一時刻只有一個進程在運行窖梁,那么你寫個共享庫赘风,給誰共享呢。
同時動態(tài)下載代碼又是被蘋果明令禁止的纵刘,沒辦法發(fā)揮出動態(tài)庫的優(yōu)勢邀窃,綜上所以上動態(tài)庫也就沒有存在的必要了。

但是后來iOS8之后假哎,iOS有了App Extesion特性瞬捕,而且Swift也誕生了。
由于iOS主App需要和Extension共享代碼舵抹,Swift語言機制也需要動態(tài)庫肪虎,于是蘋果后來提出了Embedded Framework。
這種動態(tài)庫允許APP和APP Extension共享代碼惧蛹,但是這份動態(tài)庫的生命被限定在一個APP進程內扇救。簡單點可以理解為被閹割的動態(tài)庫。

但是這種動態(tài)庫(Embedded Framework) 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別香嗓。
傳統(tǒng)的動態(tài)庫是給多個進程用的爵政,而這里的動態(tài)庫(Embedded Framework)是給單個進程里面多個可執(zhí)行文件用的。
系統(tǒng)的 Framework 不需要拷貝到目標程序中陶缺,我們自己做出來的 動態(tài)庫(Embedded Framework) 哪怕是動態(tài)的钾挟,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的)。
所以蘋果沒有直接把這種Embedded Framework稱作動態(tài)庫而是叫Embedded Framework饱岸。

iOS中的Embedded Framework可以理解為獨立的沒有main函數(shù)的可執(zhí)行文件掺出。
  1. Cocoapods的做法
    use_frameworks!選項:在使用CocoaPods的時候在Podfile里加入use_frameworks! 徽千,那么你在編譯的時候就會默認幫你生成動態(tài)庫,我們能看到每個源碼Pod都會在Pods工程下面生成一個對應的動態(tài)庫Framework的target汤锨,我們能在這個target的Build Settings -> Mach-O Type看到默認設置是Dynamic Library双抽。也就是會生成一個動態(tài)Framework,我們能在Products下面看到每一個Pod對應生成的動態(tài)庫闲礼。
    對于swift寫的庫牍汹,想通過cocoapods引入工程,必須加入use_frameworks! 選項柬泽。因為 Swift 是不支持靜態(tài)庫的慎菲。造成這個問題的原因主要是 Swift 的運行庫沒有被包含在 iOS 系統(tǒng)中,而是會打包進 App 中(這也是造成 Swift App 體積大的原因)锨并,靜態(tài)庫會導致最終的目標程序中包含重復的運行庫露该。
    打包進工程的動態(tài)庫,可在 ipa 文件解壓后的 Frameworks 文件夾下看到第煮。

參考:
編譯入門
深入理解iOS App的啟動過程
iOS動態(tài)庫解幼、靜態(tài)庫及使用場景、方式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末包警,一起剝皮案震驚了整個濱河市撵摆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌害晦,老刑警劉巖特铝,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篱瞎,居然都是意外死亡,警方通過查閱死者的電腦和手機痒芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門俐筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人严衬,你說我怎么就攤上這事澄者。” “怎么了请琳?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵粱挡,是天一觀的道長。 經常有香客問我俄精,道長询筏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任竖慧,我火速辦了婚禮嫌套,結果婚禮上逆屡,老公的妹妹穿的比我還像新娘。我一直安慰自己踱讨,他們只是感情好魏蔗,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痹筛,像睡著了一般莺治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帚稠,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天谣旁,我揣著相機與錄音,去河邊找鬼翁锡。 笑死蔓挖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的馆衔。 我是一名探鬼主播瘟判,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼角溃!你這毒婦竟也來了拷获?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤减细,失蹤者是張志新(化名)和其女友劉穎匆瓜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體未蝌,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驮吱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了萧吠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片左冬。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纸型,靈堂內的尸體忽然破棺而出拇砰,到底是詐尸還是另有隱情,我是刑警寧澤狰腌,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布除破,位于F島的核電站,受9級特大地震影響琼腔,放射性物質發(fā)生泄漏瑰枫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一丹莲、第九天 我趴在偏房一處隱蔽的房頂上張望躁垛。 院中可真熱鬧剖毯,春花似錦、人聲如沸教馆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土铺。三九已至胶滋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悲敷,已是汗流浹背究恤。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留后德,地道東北人部宿。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像瓢湃,于是被迫代替她去往敵國和親理张。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 說在SDK開發(fā)之前的話: iOS SDK開發(fā)就是為某一個應用場景绵患、或領域雾叭、或需求,提供一個已實現(xiàn)的落蝙、封裝好的织狐、可供...
    小匠人Alan閱讀 775評論 0 1
  • 本文目標:掌握封裝及開發(fā)SDK的全部技巧 文章比較長,建議分模塊閱讀 內容提要:不同場景下如何封裝及開發(fā)SDK ....
    Yochi閱讀 17,806評論 12 88
  • 一筏勒、庫的分類: 1. 開源庫 -》 公開代碼移迫,能看到具體是怎么實現(xiàn)的,如:SDWebImage/AFNetwork...
    YJExpand閱讀 3,092評論 0 10
  • 這篇文章主要記錄我自開始SDK開發(fā)以來的經驗總結以及所遇到的坑, 從17年3月份開始, 作為一個從未做過SDK開發(fā)...
    superLee閱讀 1,154評論 2 3
  • 都說今天是女神節(jié),女王節(jié)病瞳,看看朋友圈揽咕,祝福鮮花美食悲酷,都在曬曬曬套菜,讓人垂涎欲滴! 我不知道设易,有多少人逗柴,能在今天做成女...
    記搏閱讀 369評論 12 14