今天在海外SDK的開發(fā)中陵叽,遇到Google登錄SDK與Google分析SDK有沖突的問題,于是才有了本篇文章的出現(xiàn)。當(dāng)我們使用別人提供的SDK進(jìn)行開發(fā)時,時常會遇到兩個靜態(tài)庫有相同類而發(fā)生沖突的問題芙代。如果我們自己能夠通過技術(shù)解決這個問題,那當(dāng)然是最好的盖彭。
問題分析:iOS中并不是像Android中存在命名空間這一說法纹烹,命名空間的存在是為了防止不同人編寫類庫發(fā)送命名沖突而設(shè)計的页滚。因此,iOS中在兩個靜態(tài)庫中铺呵,如果存在相同的類裹驰,則會發(fā)生沖突的問題。
例如:
First.framework
FirstViewController.o
SecodeViewController.o
ThirdViewController.o
FourViewController.o
Secode.framework
FourViewController.o
FiveViewController.o
SixViewController.o
SevenViewController.o
當(dāng)這兩個靜態(tài)庫的framework放在同一個工程下時片挂,則會出現(xiàn)沖突的問題幻林。
解決思路:
1.修改其中一個framework中的沖突類名;
2.刪除其中一個framework中的沖突類音念;
下面簡單操作一下刪除First.framework中的沖突類(FourViewController.o)沪饺,靈感來自Google登錄與分析SDK的沖突
前提:前提是被"瘦身"的framework必須是一個"胖"的framework。所謂瘦身就是刪除其中的部分內(nèi)容闷愤,所謂胖也就是該framework支持多位CPU架構(gòu)整葡。(armv7 i386 x86_64 arm64)
0.打開終端,進(jìn)入First.framework目錄
$ cd xxxx/First.framework
1.查看First.framework支持的架構(gòu)
$ lipo -info First
如圖:
2.獲得“瘦”的.a文件
$ lipo -thin armv7 First -output armv7.a
$ lipo -thin i386 First -output i386.a
$ lipo -thin x86_64 First -output x86_64.a
$ lipo -thin arm64 First -output arm64.a
如圖:
3.將不同的架構(gòu)移動到不同的文件夾下(自行創(chuàng)建文件夾)
如圖:
4.進(jìn)入對應(yīng)文件夾并從瘦文件中提取對象文件(*.o)
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
如圖:
5.刪除沖突的對象文件(.o文件)與對應(yīng)的.a文件
6.將對應(yīng)文件夾中的內(nèi)容合并成新的瘦文件
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
如圖:
7.將瘦文件合并成一個胖文件
將上面生成的四個 -new.a文件放到一個新的文件夾中,進(jìn)入該文件夾讥脐,執(zhí)行以下命令得到一個First胖文件遭居,替換工程中First.framework中的First文件即可。
$ cd new
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output First
如圖:
至此旬渠,framework的靜態(tài)庫瘦身到此結(jié)束俱萍。
對于.a靜態(tài)庫的瘦身在于如何將.a靜態(tài)庫文件生成多個架構(gòu)的.a文件。
假設(shè)存在First.a靜態(tài)庫文件
lipo -thin i386 First.a -output First.i386.a
lipo -thin x86_64 First.a -output First.x86_64.a
lipo -thin armv7 First.a -output First.armv7.a
lipo -thin arm64 First.a -output First.arm64.a
其他步驟與framework類似告丢。