浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题

本文主要探讨了在Android 9.0中,系统编译apk后,so文件在dlopen时遇到的权限问题。问题源于so文件加载时权限不足,由于Android的安全机制,系统app的so文件需要符合特定的加载路径和白名单。通过分析源码,发现可以利用vendor的白名单文件解决此问题,但在Android 9.0之后此方法失效。最终,通过将so文件复制到指定目录解决了问题。
摘要由CSDN通过智能技术生成

浅谈Android系统编译apk后so文件在dlopen时出现linker权限问题

展开
文章目录
一、概述
二、问题描述
三、具体分析
四、解决方案
在Android 9.0中的解决方案
五、总结
参考
一、概述
由于技术能力有限,本文的部分观点可能描述的并非准确,欢迎指正
1
在早期Android系统源码编译环境中,我们想要编译一个apk需要将java源码,资源文件等同时放在一个工程文件夹中,并且配置好相应的mk文件后再通过mmm命令触发jack工具链进行对工程源码的编译。随着团队的扩大以及各个项目的独立,我们开始尝试将独立项目的apk预置到Android系统源码中,让系统只需要对apk文件进行重新打包即可,无需再将java源码上传到系统中,减小了独立项目和系统之间的关联,让独立项目更加快速的迭代和更独立的发展与管理。

由于apk从系统中独立了出来,与此同时也给apk增加了更多的三方应用库。而在众多的三方库中有不少的三方库都有着自己的so文件。当apk在系统中重新被编译时会对so文件重新打包并放入system/lib目录中,由此引发了so文件内在做dlopen时出现的权限问题。

二、问题描述
在系统中内置一个名为Browser的apk,编译整个Android系统后输入机器中,运行程序发现部分功能丢失,并出现了如下异常:
04-06 12:48:46.004 7821-7821/com.android.browser E/linker: library "/system/app/Browser/lib/arm/libXXwebview.so" ("/system/lib/libXXwebview.so") needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_paths="/system/app/Browser/lib/arm", permitted_paths="/data:/mnt/expand"]
04-06 12:48:46.005 7821-7821/com.android.browser E/cr_LibraryLoader: Unable to load library: qihoowebview
04-06 12:48:46.005 7821-7821/com.android.browser W/System.err: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at com.qihoo.webkit.WebViewFactory.getProvider(WebViewFactory.java:95)
        at com.qihoo.webkit.internal.QhAdapter$QhWebViewInitializationController.getInstance(QhAdapter.java:119)
        at com.qihoo.webkit.internal.QhAdapter.useSyeWebView(QhAdapter.java:311)
        at com.qihoo.webkit.CookieManager.getInstance(CookieManager.java:41)
        at com.meitu.mobile.browser.lib.webkit.g.a(MtCookieManager.java:26)
        at com.android.browser.o.am(BrowserSettings.java:398)
        at com.android.browser.o.an(BrowserSettings.java:408)
        at com.android.browser.o.onSharedPreferenceChanged(BrowserSettings.java:426)
        at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:561)
04-06 12:48:46.006 7821-7821/com.android.browser W/System.err:     at android.app.SharedPreferencesImpl$EditorImpl.-wrap0(Unknown Source:0)
        at android.app.SharedPreferencesImpl$EditorImpl$3.run(SharedPreferencesImpl.java:569)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:171)
        at android.app.ActivityThread.main(ActivityThread.java:6611)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
    Caused by: java.lang.RuntimeException: Cannot load WebView
        at org.chromium.android_webview.AwBrowserProcess.loadLibrary(AwBrowserProcess.java:72)
        at com.qihoo.webview.chromium.WebViewChromiumFactoryProvider.a(WebViewChromiumFactoryProvider.java:307)
        at com.qihoo.webview.chromium.WebViewChromiumFactoryProvider.<init>(WebViewChromiumFactoryProvider.java:226)
     ... 20 more
    Caused by: org.chromium.base.library_loader.ProcessInitException
        at org.chromium.base.library_loader.LibraryLoader.loadAlreadyLocked(LibraryLoader.java:375)
        at org.chromium.base.library_loader.LibraryLoader.loadNowOverrideApplicationContext(LibraryLoader.java:186)
        at org.chromium.android_webview.AwBrowserProcess.loadLibrary(AwBrowserProcess.java:1170)
     ... 22 more
    Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/app/Browser/lib/arm/libXXwebview.so" needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
        at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        at java.lang.System.loadLibrary(System.java:1657)
        at org.chromium.base.library_loader.LibraryLoader.loadAlreadyLocked(LibraryLoader.java:357)
     ... 24 more
04-06 12:48:46.007 7821-7821/com.android.browser E/WebViewFactory: TRACE_TAG_WEBVIEW

如果您有实时的关注Android操作系统的新特新,上面这个异常我们可以在Android N的行为变更中找到其中的缘由:NDK 应用链接至平台库。
但是这个问题非常的奇怪,如果我们是 adb install 的方式,则可以正常的加载 libXXwebview.so 而 adb push 或者系统预置apk的方式则会出现该问题。

三、具体分析
我们查看其中首句的异常log:
library "/system/app/Browser/lib/arm/libXXwebview.so" ("/system/lib/libXXwebview.so") needed or dlopened by "/system/lib/libnativeloader.so" is not accessible for the namespace: [name="classloader-namespace", ld_library_paths="", default_library_pa

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值