前言
在 Android 項(xiàng)目中踱葛,大家都會(huì)或多或少接觸過 JNI铣猩。一般都是底層同事給出動(dòng)態(tài)庫 (.so) 珊随,然后集成進(jìn)項(xiàng)目中洗贰。本文你將學(xué)到, 靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別, 什么是ABI,以及動(dòng)態(tài)庫的尋找流程
閱讀本文大概需要 2 分鐘
目錄
概念
靜態(tài)庫 & 動(dòng)態(tài)庫
眾所周知嫉晶,Android 是基于 Linux 開發(fā)的系統(tǒng)骑疆,在 Linux 系統(tǒng)中田篇,共有兩種庫 靜態(tài)庫
和動(dòng)態(tài)庫
,區(qū)別如下:
這里做一個(gè)總結(jié)箍铭,對(duì)于靜態(tài)庫來說:
- 優(yōu)是:編譯后的執(zhí)行程序不再需要外部函數(shù)庫的支持泊柬,這是由于靜態(tài)庫的鏈接方式?jīng)Q定的,靜態(tài)庫是將整個(gè)函數(shù)庫的所有數(shù)據(jù)打包整合進(jìn)宿主代碼
- 缺點(diǎn):由于靜態(tài)庫的鏈接方式诈火,因此如果靜態(tài)庫發(fā)生更新兽赁,宿主程序必須重新編譯。
對(duì)于動(dòng)態(tài)庫來說:
- 優(yōu)點(diǎn):動(dòng)態(tài)庫升級(jí)并不影響宿主程序冷守,不需要重新編譯宿主工程刀崖。所以升級(jí)動(dòng)態(tài)庫十分方便。
- 缺點(diǎn):由于動(dòng)態(tài)庫的鏈接方式拍摇,函數(shù)庫并沒有整合進(jìn)入程序蒲跨,因此程序的運(yùn)行環(huán)境必須提供對(duì)應(yīng)的支持庫。
ABI
由于 Android 機(jī)型眾多授翻,不同的廠商的機(jī)型往往使用不同的 CPU 架構(gòu),支持不同的指令集孙咪。CPU 與指令集的對(duì)應(yīng)關(guān)系通過應(yīng)用的二進(jìn)制接口描述堪唐,這個(gè)接口就是 ABI
.
ABI 的需要定義的具體內(nèi)容如下:
- 機(jī)器代碼應(yīng)使用的 CPU 指令集
- 運(yùn)行時(shí)內(nèi)存存儲(chǔ)和加載的字節(jié)順序
- 可執(zhí)行二進(jìn)制文件(例如程序和共享庫)的格式,以及它支持的內(nèi)容類型
- 在代碼與系統(tǒng)之間傳遞數(shù)據(jù)的各種規(guī)范翎蹈。這些規(guī)范包括對(duì)齊限制淮菠,以及系統(tǒng)調(diào)用時(shí)如何使用堆棧和寄存器。
- 運(yùn)行時(shí)可用于機(jī)器函數(shù)代碼的符號(hào)列表 - 通常來自非常具體的庫集
總結(jié)一下 ABI 的作用荤堪,就是在機(jī)器代碼運(yùn)行時(shí)合陵,精確的定義機(jī)器代碼如何與系統(tǒng)交互。因此必須為每個(gè) CPU 架構(gòu)指定 ABI
澄阳。
業(yè)務(wù)流程
上文了解到了 Android 常用的靜態(tài)庫與動(dòng)態(tài)庫的概念及區(qū)別拥知,下面我們來總結(jié)一下 Android 動(dòng)態(tài)庫的加載流程
動(dòng)態(tài)庫(.so)的尋找流程
總結(jié)一下,流程圖如圖所示:
簡(jiǎn)單來說碎赢,就是先去默認(rèn)目錄(nativeLibraryDir
)尋找低剔。若沒找到則去對(duì)應(yīng)系統(tǒng)指定目錄尋找。