【Android N兼容問題】Android N上系統預置應用調用so庫失敗問題的看法


首先引一篇博文,主要是根據這篇博文和一些其他的資料最終解決的問題

【Android N兼容問題】Android N上系統預置應用調用第三方庫初始化失敗

博文中該博主遇到的問題是內置應用調用百度地圖的so庫,結果報錯

他的錯誤信息中有參考意義的主要是這一條

05-22 10:02:17.963 11659 11659 E linker  : library "/data/user/0/com.xxx.xxx.voc/lib/libgnustl_shared.so" ("/system/priv-app/xxx/lib/arm/libgnustl_shared.so") needed or dlopened by "/system/lib/libnativeloader.so" 
is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="", permitted_paths="/data:/mnt/expand"]

以及

Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "/data/user/0/com.xxx.xxx.voc/lib/libgnustl_shared.so" 

這里附上我的log,有參考意義的主要是這一條

A401-01 08:02:10.755  2883  2902 E AndroidRuntime: java.lang.UnsatisfiedLinkError: Error unpacking from JAR: Couldn't find SDK library in JAR.. Attempting to unpack from JAR because of previous error: dlopen failed: library "/system/lib/xxxx.so" needed or dlopened by "/system/lib/xxx.so" is not accessible for the namespace "classloader-namespace"

錯誤信息有一定出入,但其實問題是一樣的

引用博文中給出的解決方案有兩個

其一是將so庫加到/bionic/linker/linker.cpp里的kLibraryGreyList列表中,或許是需要將絕對路徑寫上去或者是其他情況,我的改動沒有作用,由於博主也說的並不明確,所以我決定放棄這種改法

其二是在/system/core/libnativeloader/native_loader.cpp中的static constexpr const char* kWhitelistedDirectories = "/data:/mnt/expand";的/data:/mnt/expand值后添加system/priv-app

在這一步我出現了問題,我和博主同樣添加了system/priv-app但是我沒有應有的效果,這時候回看我自己的log,發現差異的地方是,博主報錯的so庫位置是

/system/priv-app/xxx/lib/arm/xxx.so

而我的so庫位置則是

/system/lib/xxx.so

所以我的修改不應該是system/priv-app而是system/lib

修改后就生效,可以正常調用so庫了

總結

1,遇到這個問題,首先咱們需要注意的是上面log中的

UnsatisfiedLinkError 和 dlopen

這告訴了我們大概是調用so庫失敗造成的問題,然后我們需要注意的是錯誤信息中的so庫地址,博主中的so庫是位於priv-app中的一個和應用同名的文件夾中,我誤以為是需要給priv-app中的該應用以權限調用so庫,但其實這里的意思是告訴系統哪個位置的so庫能夠被動態鏈接

2,思路其實很簡單,按照博主的思路走

安裝和預裝的區別其實和install和push的區別一樣

前者:安裝到data目錄下,該目錄下的so庫被設置成可以被動態鏈接

后者:安裝到system目錄下,該目錄沒有被設置成可以被動態鏈接

於是出現的問題就是預裝之后會報如上面log類似的錯誤,但是手動安裝進去則不會

那么博主所做的其實只是看哪里設置了data目錄可以被動態鏈接,然后在這個地方加上我們so庫的地址,即system/lib或者是其他類似地址,所以回到總結1,我們需要注意自己so庫的具體地址是哪里,添加對應地址才能完成修改

3,其實說心里話,這個問題最好解決的方式是在應用里修改調用so庫的方式,方法已經滿大街都是了,但是作為rom修改的話,我們可能沒辦法或者說比較難讓應用方去做修改,所以只能讓rom適配應用了......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM