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

posted @ 2017-09-06 15:38  Qunter  阅读(9717)  评论(0编辑  收藏  举报