【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适配应用了......