Android 的 so 檔案載入機制

2021-10-09 03:55:40 字數 1231 閱讀 8366

nativelibrarydirectories 表示應用自身存放 so 檔案的目錄位址,影響著 so 檔案的載入流程;

primarycpuabi 表示應用應該執行在哪種 abi 上,如(armeabi-v7a),它影響著應用是執行在 32 位還是 64 位的程序上,進而影響到尋找系統指定的 so 檔案目錄的流程;

以上兩個屬性,在應用安裝結束後,可在 data/system/packages.xml 中檢視;

當呼叫 system 的 loadlibrary() 載入 so 檔案時,流程如下:

先到 nativelibrarydirectories 指向的目錄中尋找,是否存在且可用的 so 檔案,有則直接載入這裡的 so 檔案;

上一步沒找到的話,則根據當前程序如果是 32 位的,那麼依次去 vendor/lib 和 system/lib 目錄中尋找;

同樣,如果當前程序是 64 位的,那麼依次去 vendor/lib64 和 system/lib64 目錄中尋找;

當前應用是執行在 32 位還是 64 位的程序上,取決於系統的 ro.zygote 屬性和應用的 primarycpuabi 屬性值,系統的 ro.zygote 可通過執行 getprop 命令檢視;

如果 ro.zygote 屬性為 zygote64_32,那麼應用啟動時,會先在 ro.product.cpu.abilist64 列表中尋找是否支援 primarycpuabi 屬性,有,則該應用執行在 64 位的程序上;

如果上一步不支援,那麼會在 ro.product.cpu.abilist32 列表中尋找是否支援 primarycpuabi 屬性,有,則該應用執行在 32 位的程序上;

如果 ro.zygote 屬性為 zygote32_64,則上述兩個步驟互換;

如果應用的 primarycpuabi 屬性為空,那麼以 ro.product.cpu.abilist 列表中第乙個 abi 值作為應用的 primarycpuabi;

執行在 64 位的 abi 有:arm64-v8a,mips64,x86_64

執行在 32 位的 abi 有:armeabi-v7a,armeabi,mips,x86

通常支援 arm64-v8a 的 64 位裝置,都會向下相容支援 32 位的 abi 執行;

但應用執行期間,不能混合著使用不同 abi 的 so 檔案;

比如,當應用執行在 64 位程序中時,無法使用 32 位 abi 的 so 檔案,同樣,應用執行在 32 位程序中時,也無法使用 64 位 abi 的 so 檔案;

android載入 so檔案指定核心

對於.so檔案 大家都不陌生,而如何引用,出現了很多方式。這裡做乙個總結,只要你記住了就ok了。首先將你.so檔案目錄考到專案或者modle的libs資料夾下面 如圖 上圖第一步就已經完成了。第二步 下面在你引入.so的modle 或者專案的 build.gradle檔案中新增對libs的引用 到此...

Android裝置如何載入 so檔案以及如何適配

原文 1.android 裝置如何載入.so檔案?不同cpu架構 的android手機載入時會在libs下找自己對應的目錄,從對應的目錄下尋找需要的.so檔案 如果沒有對應的目錄,就會去armeabi下去尋找,如果已經有對應的目錄,但是如果沒有找到對應的.so檔案,也不會去armeabi下去尋找了。...

Android記錄 so檔案載入不出來

error exception couldn t load zbar from loader dalvik.system.pathclassloader 今天遇到個莫名其妙的問題,就是as裡載入不出so檔案,檢查了好幾遍,發現沒有問題呀,這裡簡單記錄下。so檔案載入不出來,或者呼叫出錯,一般有兩個問...