欧美+在线播放,蜜臀av在线,久久久99久久久国产自输拍,免费 黄 色 人成 视频 在 线,免费+国产+国产精品

 
您的位置:首頁 >  新聞中心 > 行業(yè)動態(tài)
  行業(yè)動態(tài)
 

干貨 | 資深程序猿教你如何縮短開發(fā)周期

來源:原創(chuàng)    時間:2017-04-13    瀏覽:0 次

關鍵詞:(¬_¬)程序猿  縮短開發(fā)周期

 
 

一,問題引入

在當下的開發(fā)中,應用的功能做的越來越復雜,工程也越來越大,所以為了盡可能縮短開發(fā)周期,不可避免的會用到許多第三方庫,隨之而來的也會遇到好 多問題。比如,程序調用函數(shù) funa,funa 函數(shù)從在于兩個庫 liba.a,libb.a 中,并且程序執(zhí)行需要連接這兩個庫,那么程序執(zhí)行時是調用 liba.a 中 funa 還是調用的 libb.a 中的 funa 呢?

其實這個取決于鏈接時的順序,比如先鏈接的 liba.a,這個時候通過 liba.a 的導出符號表就可以找到 funa 在 liba.a 中定義,并加入符號表中;鏈接 libb.a 的時候發(fā)現(xiàn)符號表已經存在 funa,就不會再次更新符號表,所以調用的始終是 liba.a 中的 funa 函數(shù)。

這里的調用嚴重的依賴于鏈接庫加載的順序,很大程度上會導致混亂。作為 SDK 的提供者,我們尤其要避免這點。

正常我們使用的庫中包含了好多符號信息,如圖 1 所示:

圖1

這些符號信息有以下幾個弊端:

1、增大了庫的體積;

2、隱蔽性較差;

3、容易帶來沖突。 

在開發(fā)過程中第三點帶來的問題尤其嚴重,特別是當我們提供的 SDK 用到第三方庫的時候(因為使用我們 SDK 的客戶也有可能用到跟我們一樣的第三方庫)。

二,解決辦法

 
 

1、對第三方庫處理

下面繼續(xù)以 x264(下文以 libx264.a 帶過)為例說明如何編譯第三方的庫。 沒有隱藏符號的第三方庫如“圖 1”所示,函數(shù)前面會帶有 external 的標示。

在最終對外發(fā)布的 SDK 中_x264_predict_16x16_dc_c 還是打著 external 的標簽, 及對外可見。

如圖 2 所示:

圖2

隱藏符號后,在 libx264.a 中,原先打上 external 標簽的函數(shù),會以 private external 標識。

如圖 3 所示:

那么如何才能得到我們想要的、打上 private external 標簽的庫呢,有兩種方 法可以做到。

1)對每個函數(shù)加屬性 __attribute__((visibility(“hidden”))) void funa_hidden() {

printf(“hidden symbol ”); }

void funa_visible() {

printf(“exported symbol”); }

這樣做的好處是可以根據(jù)需要對每個函數(shù)做定制處理。但若我們用到的三方 庫代碼量大,這種方法就是費時費力了。

2)編譯庫時統(tǒng)一處理

利用 gcc 的擴展屬性,編譯庫時加上-fvisibility=hidden。 a) 靜態(tài)庫

gcc –static –o libtest.a –fvisibility=hidden –c test.c

b) 動態(tài)庫

gcc –dynamic –o libtest.so –fvisility=hidden –c test.c

其中 dynamic 為 clang 的寫法,大部分 gcc 寫法為 shared。

上邊兩種方法只處理了 c/c++,因為語法問題,匯編需要做特殊里,但也是 在函數(shù)頭加屬性,但它的屬性寫法為.private_extern。

.macro function name, export=0, .macro endfunc

ELF .size ame, . - ame FUNC .endfunc

.purgem endfunc .endm

.text

.align lign .if export

.global EXTERN_ASM ame

ELF .type EXTERN_ASM ame, %function FUNC .func EXTERN_ASM ame EXTERN_ASM ame:

.private_extern

EXTERN_ASM ame

.else

ELF .type

FUNC .func ame:

.endif .endm

ame, %function ame

因為需要處理的匯編文件較少,所以對匯編采用了直接編輯源文件的方法。 其實個人覺得也應該能在編譯時做統(tǒng)一處理,有興趣的可以自己找一下方法。

 

2、對 xcode工程的處理

對 xcode 工程處理相對直觀、簡單了許多。只需在工程的設置里做如下處理。

.1) 打開工程設置,跳轉到 build setting 頁面;

.2) 搜索 hidden;

.3) 將 Symbols Hidden by Default 設置 Yes;

圖4

其實通過觀察編譯的過程可以發(fā)現(xiàn),通過上述設置,蘋果最終將其轉化為步驟 1 的命令進行編譯。編譯的結果也是在庫里加了 private external 而已。

 

3、符號剝離

最后一步,也是最關鍵的一步,就是真正將步驟 1 或步驟 2 中打上 private external 標簽的函數(shù)做最終的處理,把它們從要發(fā)布的庫里剝離。

1) 首先設置 prelink

在 target 的 build setting 里搜索 prelink,將 Perform Single-Object Prelink 置為

Yes,然后把該工程需要的庫都直接拖到 Prelink libraries 中。

如圖 5 所示:

圖5

將 Deployment Postprocessing 置為 Yes。

如圖 6 所示:

圖6

2) 設置 post process

將 Strip Style 設置為 Non-Global Symbols。

如圖 7 所示:

圖7

到目前為止,所有的設置都已經完成,接下來編譯。有興趣的同學可以觀察一下編譯的過程,會發(fā)現(xiàn)通過設置 prelink,xcode 會將庫里所有的目標文件根據(jù) 你支持的 architecture 分類打包,如 libxxx-armv7-master.o/libxxx-arm64-master.o, 最后一步執(zhí)行 Strip 命令將所有需要隱藏的符號剝離。