浅谈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