SDK開發(fā)中的經(jīng)驗(yàn)總結(jié)

做SDK開發(fā)很久了,這里備注下日常開發(fā)中的幾個(gè)常規(guī)項(xiàng)。對(duì)于有經(jīng)驗(yàn)的開發(fā)都來說,這篇文章沒有任何意義。如果你不小心走進(jìn)來了,請(qǐng)出門右轉(zhuǎn),這里就不招待了。

關(guān)于庫

iOS平臺(tái)現(xiàn)在提供兩種形式的SDK庫類型:靜態(tài)庫、動(dòng)態(tài)庫。在實(shí)際使用過程中卻存在三種形式的庫:靜態(tài)庫、動(dòng)態(tài)庫、以動(dòng)態(tài)庫形式存在的靜態(tài)庫。

制式

這個(gè)概念是相對(duì)于終端機(jī)型來說的,每一種型號(hào)的iPhone/iPad都會(huì)對(duì)應(yīng)一種型號(hào)的CPU,而CPU又對(duì)應(yīng)著不幾種arm架構(gòu)。具體來說有armv6/armv7/armv7s/armv64這樣幾種。當(dāng)然armv6/armv7/armv7s的機(jī)型現(xiàn)今市面上已經(jīng)不常見了,armv64是最主流的機(jī)型了。制式在Xcode中對(duì)應(yīng)著一組配置項(xiàng):Architectures。一般來說,開發(fā)者在XCODE中使用其默認(rèn)配置即可,如下圖所示:


Xcode默認(rèn)配置

制式的作用是告訴編譯器以機(jī)型的具體架構(gòu)對(duì)代碼作一定的優(yōu)化,使應(yīng)用在機(jī)器上運(yùn)行的更為流暢。因此可執(zhí)行文件必然包含了所有市面上主流機(jī)型的cpu制式。但這對(duì)于開發(fā)者來說就比較痛苦了,我們平臺(tái)開發(fā)測(cè)試時(shí)只會(huì)用到一種制式,犯不著編譯所有的CPU制式,浪費(fèi)時(shí)間啊。因此xcode提供了上圖中Build Active Architecture Only選項(xiàng),在Debug模式下只編譯一種當(dāng)前測(cè)試機(jī)型的制式,在Release模式下編譯所有配置的制式。

開發(fā)者可以使用lipo命令來查看、合并、提取制式,參考如下:


lipo命令具體使用

這里備注下i386/x86_64是模擬器的制式,因?yàn)檫@里我們的主體是SDK,因此模擬器制式還是需要提供給其它開發(fā)者使用的。

靜態(tài)庫

最常見的SDK庫類型,最終生成的庫文件后綴名為.a類型。靜態(tài)庫實(shí)際上是編譯生成的.o文件的合集,我們可以通過ar/nm命令來提取/查看具體的.o文件信息:


ar提取.o文件

動(dòng)態(tài)庫

庫文件后綴為.framework。蘋果在IOS8開放了動(dòng)態(tài)庫功能,但并不允許開發(fā)者使用其來實(shí)現(xiàn)動(dòng)態(tài)更新的功能。因此該形態(tài)的庫在業(yè)界并沒有得到廣泛的使用。

偽動(dòng)態(tài)庫

該方案實(shí)質(zhì)上是靜態(tài)庫,但它使用了動(dòng)態(tài)庫的文件組織形式。具體點(diǎn)講是這樣的:靜態(tài)庫有一個(gè)缺點(diǎn),整個(gè)SDK提供給開發(fā)者的是一個(gè)文件夾,開發(fā)者需要將文件夾中的.h/.a等代碼文件、.bundle資源文件引用到工程,這樣很容易導(dǎo)致錯(cuò)誤,而動(dòng)態(tài)庫就不存在這個(gè)問題,開發(fā)者可以直接將framework導(dǎo)入工作即可。這樣便有了偽動(dòng)態(tài)庫這個(gè)將二者結(jié)合起來的方案。具體實(shí)現(xiàn)方案這里就不在介紹。

關(guān)于包體大小

相信開發(fā)SDK的程序猿都會(huì)碰到縮小包體大小的需求。私下里我覺得這個(gè)需求不可理喻,但上級(jí)要求、市場(chǎng)上有些商務(wù)同事無腦的宣傳,沒辦法,想辦法達(dá)成吧!
最無腦最簡(jiǎn)單的方法是合并類了,這樣就會(huì)少生成一個(gè).o文件,這樣就能夠減小一個(gè)文件的大小。當(dāng)然這也不太現(xiàn)實(shí),合并太多了,會(huì)導(dǎo)致代碼可讀性變差。
可以修改Xcode的Generate Debug Symbols選項(xiàng),將Release版本的值修改為NO。這樣可以將生成的.a文件的大小縮減1/3左右。

關(guān)于資源文件

SDK開發(fā)一般會(huì)將所有的資源文件打包成一個(gè)bundle文件后和.a/.h文件一同發(fā)布。如果SDK只用到了圖片音樂等資源文件,可以使用文件夾直接改后綴名的方式生成bundle。如果用到nib、storyboard等布局文件,用上面那種方式生成bundle會(huì)導(dǎo)致布局文件找不到。

布局文件必須編譯成nib文件后才能夠使用,因此開發(fā)者可以在workspace創(chuàng)建一個(gè)制作mac平臺(tái)bundle文件的target,在target中引用所有要使用到的資源與布局文件。

使用Bundle文件中圖片資源時(shí)一般會(huì)用到imageWithContentsOfFile接口,該接口要求傳入圖片的完整路徑,因此如果你的圖片帶有@2x/@3x這樣的機(jī)型適配后綴時(shí),請(qǐng)完整的帶上后綴。

關(guān)于打包

SDK的整個(gè)打包流程通常不會(huì)發(fā)生太大的變動(dòng),比較適合自動(dòng)化。Github上也有較多的自動(dòng)打包開源項(xiàng)目,基本原理都是通過xcodebuild命令并依賴于當(dāng)前xcode工程中的target來編譯生成最終文件。

關(guān)于CocoaPods

CocoaPods能夠大幅地減小開發(fā)者接入SDK的學(xué)習(xí)成本,也是如今業(yè)界比較主流的第三方開源方案的集成方案。申請(qǐng)個(gè)代碼托管賬號(hào),放心使用它作為你的SDK發(fā)布方式吧。

關(guān)于前景

現(xiàn)今移動(dòng)開發(fā)受前端擠壓比較嚴(yán)重,尤其是移動(dòng)App開發(fā),從長遠(yuǎn)來看,被前端取代可能近在眼前了。而SDK一般是面對(duì)企業(yè)的服務(wù),一般來說會(huì)較少的涉及到界面,因此相對(duì)來說受到的影響會(huì)比較少一點(diǎn)。但危機(jī)依然存在著,抓緊時(shí)間,提高自己的競(jìng)爭(zhēng)力方為上策。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容