1. 程式人生 > >解決iOS第三方SDK與本地靜態庫之間重複的symbols問題

解決iOS第三方SDK與本地靜態庫之間重複的symbols問題

之前發表過一個第三方SDK之間重複symbols的問題,這次其中一個衝突物件換成了本地函式,因為引入的第三方(不用看,高德地圖就是你!)封裝時沒有將其特殊符號封裝起來,導致連結時產生符號重複,如下圖所示:
這裡寫圖片描述

這裡有兩個重複的symbols,分別是_unz_copyright和_zip_copyright,解決方法好明顯不能動本地的連結檔案(動了也沒用,每次編譯還是會自動生成),所以只好從MAMapKit中下手,方法如下:
1.MAMapKit.framework中的MAMapKit拷貝到桌面,然後開啟終端並用指令”cd desktop”切換到桌面,如下圖:

桌面:
這裡寫圖片描述

終端介面:
這裡寫圖片描述

先用lipo -info MAMapKit指令看看MAMapKit有什麼型別的包,操作如下:
這裡寫圖片描述

這是一個fat file,包含型別armv7,i386,x85_64和arm64這4種類型的檔案,再結合本文第一張報錯圖,可以發現重複的只是arm64這個型別的檔案,故只需分離出arm64檔案即可。

使用指令 lipo -thin arm64 MAMapKit -output MAMapKit.arm64可以從MAMapKit中拷貝出型別為arm64的檔案,命名為MAMapKit.arm64,如下圖:
這裡寫圖片描述

桌面可以看到多出來檔案MAMapKit.arm64:
這裡寫圖片描述

用指令nm -j MAMapKit.arm64 | grep zip > symbols

獲取MAMapKit.arm64檔案中以_zip為字首的所有符號,生成符號列表並存於symbols檔案中。( -j 選項控制只輸出符號名),如下圖
這裡寫圖片描述

再看看桌面可以發現多了個symbols檔案
這裡寫圖片描述

開啟如下:
這裡寫圖片描述

又因為本次除了_zip_copyright命令外,還有一個_unz_copyright命令的衝突,故直接在symbols檔案中新增_unz_copyright指令如下圖
這裡寫圖片描述

新增完成後,用指令ar -x MAMapKit.arm64 將MAMapKit.arm64檔案分解成3個檔案如下圖
這裡寫圖片描述

桌面多出來的3個檔案如下:
這裡寫圖片描述

用指令ld -x -r -unexported_symbols_list symbols MAMapKit-arm64-master.o -o MAMapKit-arm64-master.o.strip可將symbols檔案中的符號列表在MAMapKit-xarm64-master.o檔案中刪除掉,並生成一個新的檔案MAMapKit-x86_64-master.o.strip,過程如下圖
這裡寫圖片描述

最後將刪除了重複符號的檔案和原來的另外兩個檔案合併,命令是ar -r MAMapKit.arm64 MAMapKit-arm64-master.o.strip Pods-MAMapKit-dummy.o,在合成之前先將原來的15.8M大小的MAMapKit.arm64移走,步驟如下
這裡寫圖片描述

桌面:
這裡寫圖片描述

可以看到新生成的MAMapKit.arm64大小為15.6M,說明刪除了重複符號後瘦身了些許

最後再將新生成的MAMapKit.arm64替換了原來MAMapKit中arm64型別的檔案,指令為lipo MAMapKit -replace arm64 MAMapKit.arm64 -output MAMapKitTest如下圖:
這裡寫圖片描述

桌面如下:
這裡寫圖片描述
可以看到新生成的MAMapKitTest檔案也比原來的MAMapKit小了0.2M的大小,說明重複部分已刪除。

最後將MAMapKitTest改名為MAMapKit,並替換MAMapKit.framework中的MAMapKit即可引入工程