前言
在 Android 專案中,大家都會或多或少接觸過 JNI。一般都是底層同事給出動態庫 (.so) ,然後整合進專案中。本文你將學到, 靜態庫與動態庫的區別, 什麼是ABI,以及動態庫的尋找流程
閱讀本文大概需要 2 分鐘
目錄
概念
靜態庫 & 動態庫
眾所周知,Android 是基於 Linux 開發的系統,在 Linux 系統中,共有兩種庫 靜態庫
和動態庫
,區別如下:
這裡做一個總結,對於靜態庫來說:
- 優是:編譯後的執行程式不再需要外部函式庫的支援,這是由於靜態庫的連結方式決定的,靜態庫是將整個函式庫的所有資料打包整合進宿主程式碼
- 缺點:由於靜態庫的連結方式,因此如果靜態庫發生更新,宿主程式必須重新編譯。
對於動態庫來說:
- 優點:動態庫升級並不影響宿主程式,不需要重新編譯宿主工程。所以升級動態庫十分方便。
- 缺點:由於動態庫的連結方式,函式庫並沒有整合進入程式,因此程式的執行環境必須提供對應的支援庫。
ABI
由於 Android 機型眾多,不同的廠商的機型往往使用不同的 CPU 架構,支援不同的指令集。CPU 與指令集的對應關係通過應用的二進位制介面描述,這個介面就是 ABI
.
ABI 的需要定義的具體內容如下:
- 機器程式碼應使用的 CPU 指令集
- 執行時記憶體儲存和載入的位元組順序
- 可執行二進位制檔案(例如程式和共享庫)的格式,以及它支援的內容型別
- 在程式碼與系統之間傳遞資料的各種規範。這些規範包括對齊限制,以及系統呼叫時如何使用堆疊和暫存器。
- 執行時可用於機器函式程式碼的符號列表 - 通常來自非常具體的庫集
總結一下 ABI 的作用,就是在機器程式碼執行時,精確的定義機器程式碼如何與系統互動。因此必須為每個 CPU 架構指定 ABI
。
業務流程
上文了解到了 Android 常用的靜態庫與動態庫的概念及區別,下面我們來總結一下 Android 動態庫的載入流程
動態庫(.so)的尋找流程
總結一下,流程圖如圖所示:
簡單來說,就是先去預設目錄(nativeLibraryDir
)尋找。若沒找到則去對應系統指定目錄尋找。