1. 什么是類庫?
類庫就是程序代碼的集合,是共享程序的一種特殊方式,主要分為兩種類型:
1.開源 : 公開源代碼.可以看到具體實(shí)現(xiàn)
2.閉源 : 不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到代碼具體實(shí)現(xiàn),也主要分為兩種類型, 即:動(dòng)態(tài)庫和靜態(tài)庫.(.a類庫使用""來導(dǎo)入頭文件,.framework使用<>來導(dǎo)入頭文件)
2. 靜態(tài)庫
1.后綴一般為.a 或者.framework
2.鏈接時(shí),靜態(tài)庫中使用的文件會被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份的冗余拷貝(比如手機(jī)上的兩個(gè)app都使用了友盟SDK的類庫,那么在每個(gè)app下都會完整的導(dǎo)入友盟的SDK的類庫)
3.動(dòng)態(tài)庫
1.后綴為.dylib 或者.framework; iOS9取消了.dylib更新為.tbd代替
2.鏈接時(shí)不會復(fù)制可執(zhí)行文件, 程序運(yùn)行時(shí)從系統(tǒng)動(dòng)態(tài)的加載到內(nèi)存,供程序應(yīng)用,系統(tǒng)只加載一次,多個(gè)程序公用,節(jié)省內(nèi)存
3.UIKit/foundation都是系統(tǒng)的動(dòng)態(tài)庫, 而自己的制作的動(dòng)態(tài)庫就會被拒絕上架(引入非系統(tǒng)的動(dòng)態(tài)庫上架都會被拒),原因就是防止中途可能被攻擊(動(dòng)態(tài)注入攻擊)心剥、蘋果每個(gè)app都有自己的獨(dú)立沙盒空間,若使用了自定義的動(dòng)態(tài)庫,就能實(shí)現(xiàn)的除了應(yīng)用內(nèi)跳轉(zhuǎn)之外(官方允許)的間接通訊了.
4.生成&使用.a靜態(tài)庫
4.1 創(chuàng)建類庫文件,選擇中間的生成.a靜態(tài)庫
項(xiàng)目創(chuàng)建.png
4.2 編譯文件即可生成.a靜態(tài)庫
CreatLib.png
4.3 ShowInFinder后的路徑,在真機(jī)和模擬器都進(jìn)行編譯,得到兩個(gè)文件,即兩個(gè)不同的靜態(tài)庫;文件中的liblibraryDemo.a就是得到靜態(tài)庫,libraryDemo.h就是暴露給外界的.h文件;使用時(shí)直接把Debug-iphoneos或者Debug-iphonesimulator文件直接拖拽到項(xiàng)目中,引入頭文件就可以使用了
Library.png
4.4 自定義類和資源文件需要進(jìn)行公開 : 自定義的類或者資源文件在編譯后沒有添加到公開的.h文件夾中,這時(shí)使用該靜態(tài)庫的程序就會提示找不到文件,這樣的情況下就需要手動(dòng)導(dǎo)入.
未引入自定義的類的.h文件.png
4.5 資源包(同名資源沖突) :
- 若資源文件按照如上的操作添加到類庫中,且項(xiàng)目中和類庫中有同名資源,不管是項(xiàng)目調(diào)用,還是類庫中調(diào)用,都會加載項(xiàng)目中的文件;
- 封裝類庫時(shí),需要將資源文件打包成Bundle進(jìn)行添加,這種方式有效避免同名資源沖突;
- 在類庫的路徑下直接新建文件夾存入資源,改名字為xx.bundle,然后按照4.4的引入方法公開bundle文件,這樣在類庫內(nèi)部或者外部需要使用該資源是就引用"xx.bundle/資源名稱"就可以了.
5. 架構(gòu)合成 (architecture x86_64就叫架構(gòu))
5.1 架構(gòu)
- CPU架構(gòu) -> 設(shè)計(jì)模式
- 主流架構(gòu)分兩種:
2.1 精簡指令集: 一般給移動(dòng)設(shè)備/平臺設(shè)備使用 ARM/IBM(兩家公司)
armv7 iPhone 3GS, iPhone 4, iPhone 4S, iPad , iPad 2等
armv7s iPhone 5, 5C系列, iPad 4 等
arm64(armv8) iPhone 5s及以上, iPad Air, Retina iPad Mini等
2.2 復(fù)雜指令集: 一般給PC Intel/AMD
i386 iPhone 4s,iPhone 5的模擬器
x86_64 iPhone 5s及以上的模擬器
5.2 當(dāng)使用真機(jī)情況下編譯得到的靜態(tài)庫,運(yùn)行在模擬器上,會編譯報(bào)錯(cuò):
5.2.1 Undefined symbols for architecture x86_64錯(cuò)誤
解決方案 : 翻譯過來就是XX架構(gòu)出現(xiàn)沒定義符號,屬于鏈接錯(cuò)誤;出現(xiàn)這個(gè)錯(cuò)誤只有兩種原因:
1.項(xiàng)目中沒有導(dǎo)入該類庫
2.項(xiàng)目運(yùn)行的平臺(架構(gòu))和類庫生成的平臺(架構(gòu))不一致
很明顯上面的錯(cuò)誤原因就是因?yàn)樵谀M器上運(yùn)行了真機(jī)情況下編譯得到的類庫,所以讓我們的類庫支持以上所有架構(gòu),就能解決問題了.
5.2.2 封裝類庫時(shí)如何解決架構(gòu)不一致問題(就是讓類庫支持所有架構(gòu))
- 生成5個(gè)類庫,并說明對應(yīng)架構(gòu)版本
- Xcode7.0之后都采取這個(gè)方法:進(jìn)行架構(gòu)合成(把5個(gè)類庫合成到一個(gè)文件中)
查看類庫包含的架構(gòu):
終端指令 file 類庫文件路徑(Mach-O 64-bit dynamically linked shared library x86_64為動(dòng)態(tài)庫)
終端指令 lipo -info 類庫文件的路徑(直接拖進(jìn)來)
查看類庫的類型:
終端查看庫類型
合成架構(gòu):
- 使用lipo工具進(jìn)行合成: lipo -create 類庫1路徑 類庫2路徑 -output 新類庫路徑
- 使用Xcode來合成類庫 (優(yōu)點(diǎn):沒有對應(yīng)架構(gòu)的設(shè)備也可以生成支持所有架構(gòu)的類庫)
2.1 生成真機(jī)組的架構(gòu)默認(rèn)會缺armv7s 解決辦法:Xcode合并.png2.2 在設(shè)置為NO的情況下模擬器和真機(jī)分別運(yùn)行一下,然后通過lipo工具進(jìn)行合成即可.armv7s補(bǔ)充.png
5.2.3 Invalid bitcode signature錯(cuò)誤
這種錯(cuò)誤的原因很多,需要看一下詳細(xì)信息;在這里發(fā)現(xiàn)是提供的類庫是iphoneOS的且不支持x86_64
1.更換新的類庫
2.刪減有效架構(gòu)
image.png
6. 生成&使用Framework類庫
- 創(chuàng)建類庫的時(shí)候選擇Cocoa Touch Framework即可. dynamicDemo.framework文件下的dynamicDemo文件才是自定義的framework庫
編譯得到framework類庫類庫版本設(shè)置- framework類庫就是個(gè)穿著馬甲的文件夾
- framework中自定義的類也需要公開
自定義類的公開- framework生成的默認(rèn)是動(dòng)態(tài)庫
- framework中的資源bundle(默認(rèn)生成)需要手動(dòng)導(dǎo)入到項(xiàng)目
資源文件公開- 在外界直接調(diào)用framework,運(yùn)行報(bào)錯(cuò)
鏈接錯(cuò)誤截圖解決辦法項(xiàng)目引入framework中的資源文件- framework改為靜態(tài)庫
修改類庫產(chǎn)出物生成的動(dòng)態(tài)庫生成的靜態(tài)庫framework的架構(gòu)合成與.a類庫相同
7. framework和library的關(guān)系
.a靜態(tài)庫是Unix的靜態(tài)庫,可以跨平臺使用
.framework是iOS推出的,本質(zhì)就是將類庫的頭文件&資源文件&類庫文件進(jìn)行了打包
拓展 : Bitcode 應(yīng)用瘦身
- iOS9推出新特性,如果項(xiàng)目使用了Bit-code,則AppStore可以將項(xiàng)目中用到的類庫文件進(jìn)行分離(按照架構(gòu)分離,可以將1個(gè)合成的文件改回5個(gè)文件),當(dāng)手機(jī)要下載某個(gè)APP時(shí),AppStore會根據(jù)手機(jī)的架構(gòu),將對應(yīng)架構(gòu)的類庫放進(jìn)應(yīng)用的執(zhí)行文件供用戶下載,這樣有利于減少類庫占用的空間
- 所有Xcode7開始創(chuàng)建的項(xiàng)目都會有bitcode選項(xiàng),且默認(rèn)為YES
- Bitcode有一個(gè)特點(diǎn): 一旦項(xiàng)目使用了BitCode,則項(xiàng)目中用到的所有類庫也必須要支持Bit-code,如果不支持,編譯不通過(報(bào)錯(cuò)會提示是Bit-code出現(xiàn)問題)
- 如果項(xiàng)目中使用類庫不支持bit-code,且沒有其他替代方案,就只能設(shè)置項(xiàng)目bitcode=NO
以上類庫的使用都是按照個(gè)人的理解整理出來的,如果有什么問題,歡迎大家指正糾錯(cuò),萬分感謝!
.End