安卓so包常見報錯問題

ChampionDragon發表於2020-10-19

一./lib/arm64, /system/lib64, /vendor/lib64]]] couldn't find "libAndroidIDCard.so

我沒有在libs資料夾下面建立類似“arm64-v8a”這個資料夾,因為整合所按照的官方SDK中並沒有給出相應的so包。

原因分析

新建專案中會多了幾個資料夾,我想這就是問題的所在,根據查詢順序,64位處理器會優先查詢arm64-v8a,裡面如果沒有相應的so檔案就會報錯。apk包在安裝的時候,系統會把包中與自己的abi對應的lib目錄中的so庫檔案拷貝到system分割槽中,32位機器中只有一個目錄/system/lib,64位機器中有兩個目錄/system/lib和/system/lib64,app啟動進行連結時,64位機器中會先到/system/lib64目錄中去找,如果沒有找到再到/system/lib目錄中去找。如果你把32位的so庫拷貝到了lib64目錄中,會導致連結失敗,同樣,64位的so庫被拷貝到lib目錄中也會導致失敗,所以so庫要和目錄一一對應。

如果我們的工程的so庫目錄中沒有arm64目錄,預設情況下,Android Studio會在apk中自動建立一個空的arm64-v8a資料夾,並根據一些規則把某些so庫(具體是怎樣的規則,我也不知道)拷貝到這個目錄中,這樣就導致,在64位機器上在lib64目錄下找到的so庫並不是正確的so庫檔案,從而出現了上面的錯誤

解決辦法
解決辦法就是阻止Android Studio自動的生成arm64-v8a目錄,我們自己寫指令碼把對應的so庫檔案拷貝到build對應的目錄下

 ndk {
            abiFilters "armeabi"
        }

切記:在Module(注意不是Library)的build.gradle檔案中新增如下內容

這句話的意思就是指定ndk需要相容的架構,把除了armeabi以外的相容包都過濾掉。

二.is 32-bit instead of 64-bit動態庫錯誤分析

針對第三方應用,在它安裝的時候,安裝包管理器會檢查該應用是否使用native libraries,如果使用本地庫檔案的話,則會根據相應的架構abi來選擇是32bit還是64bit。

針對系統應用來說,它的庫檔案存放在/system/lib,所以無法確定該應用是否依賴其他應用在system/lib下的庫檔案。因此安裝包管理器,無法確定系統應用使用哪種架構abi,故在64bit模式下執行。

當你安裝應用到系統時,系統會從lib目錄下的(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips64, mips)資料夾中查詢本地庫檔案,不同的架構載入不同的資料夾下的庫檔案。例如64bit的架構從arm64-v8a、x86_64、mips64這些目錄中載入。如果你的arm64-v8a資料夾下剛好有這個需要使用到的庫檔案,則不會從其他資料夾如armeabi載入該庫檔案。此時就會出現32bit庫檔案和64bit庫檔案混合使用的情況,但是32bit的庫檔案不能和64bit的庫檔案不能混合使用。因此,有一種解決辦法是過濾掉64bit的庫檔案,全部使用32bit的庫檔案。在Android studio配置檔案build.gradle(Module APP)中配置如下:

相關文章