首先引一篇博文,主要是根據這篇博文和一些其他的資料最終解決的問題
【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適配應用了......