概述

RELRO JNI Android 11 WebView无法加载libwebviewchromium.so  第1张

" />        Android WebView 是 Google 提供的一个预安装系统组件,用以支持 Android 应用显示网页内容。

       如果您希望在客户端应用中提供 Web 应用(或只是网页),则可以使用 WebView 执行该操作。WebView 类是 Android 的 View 类的扩展,可让您将网页显示为 Activity 布局的一部分。它不会包含功能全面的网络浏览器的任何功能,例如导航控件或地址栏。WebView 默认只显示网页。

使用 WebView 非常有用的一种常见情形是,您希望在应用中提供可能需要更新的信息,例如最终用户协议或用户指南。在 Android 应用中,您可以创建一个包含 WebView 的 Activity,然后使用它来显示在线托管的文档。

另一种 WebView 可能会有所帮助的情形是,如果您的应用向用户提供始终需要互联网连接才能检索数据的数据(例如电子邮件)。在这种情况下,您可能会发现相比于执行网络请求,然后解析数据并在 Android 布局中呈现数据,在 Android 应用中编译 WebView 以显示包含所有用户数据的网页更加轻松。您可以改为设计一个专为 Android 设备定制的网页,然后在加载该网页的 Android 应用中实现 WebView。 ________________________From Android

    在测试RK3566 Android 11功能的时候,碰到一个奇怪的问题: 第三方浏览器APP调用系统WebView出错了。测试中用的是Via浏览器,问题表现威:白屏,UI卡死操作一会出现ANR。

问题

从logcat中看到的log:

2023-04-23 16:12:46.733 1907-1907 WebViewFactory mark.via I Loading com.android.webview version 83.0.4103.120 (code 410412053)

2023-04-23 16:12:46.735 176-176 HWC2 surfaceflinger E getRequests: invalid layer 0 found on display 0

2023-04-23 16:12:46.742 1907-1907 mark.via mark.via I The ClassLoaderContext is a special shared library.

2023-04-23 16:12:46.744 1907-1907 nativeloader mark.via D classloader namespace configured for unbundled product apk. library_path=/product/app/webview/lib/arm64:/product/app/webview/webview.apk!/lib/arm64-v8a:/product/lib64:/system/product/lib64

2023-04-23 16:12:46.747 1907-1907 webviewc...mloader mark.via E Failed to open relro file /data/misc/shared_relro/libwebviewchromium64.relro: No such file or directory

2023-04-23 16:12:46.747 1907-1907 WebViewL...yLoader mark.via W failed to load with relro file, proceeding without

2023-04-23 16:12:46.775 1907-1907 AndroidRuntime mark.via E FATAL EXCEPTION: main

Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "libwebviewchromium.so" not found

at java.lang.Runtime.loadLibrary0(Runtime.java:1087)

at java.lang.Runtime.loadLibrary0(Runtime.java:1008)

at java.lang.System.loadLibrary(System.java:1664)

at tt.g(chromium-SystemWebView.apk-default-410412053:14)

at tt.i(chromium-SystemWebView.apk-default-410412053:5)

at org.chromium.android_webview.AwBrowserProcess.i(chromium-SystemWebView.apk-default-410412053:9)

at com.android.webview.chromium.WebViewChromiumFactoryProvider.f(chromium-SystemWebView.apk-default-410412053:68)

at com.android.webview.chromium.WebViewChromiumFactoryProvider.(chromium-SystemWebView.apk-default-410412053:12)

at com.android.webview.chromium.WebViewChromiumFactoryProviderForR.(chromium-SystemWebView.apk-default-410412053:1)

at com.android.webview.chromium.WebViewChromiumFactoryProviderForR.create(chromium-SystemWebView.apk-default-410412053:1)

at java.lang.reflect.Method.invoke(Native Method)

at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:266)

at android.webkit.WebSettings.getDefaultUserAgent(WebSettings.java:1355)

at mark.via.o.e.a.b(Unknown Source:221)

at mark.via.l.p3.N1(Unknown Source:36)

at androidx.fragment.app.Fragment.m2(Unknown Source:4)

at androidx.fragment.app.t.f(Unknown Source:271)

at androidx.fragment.app.t.m(Unknown Source:124)

at androidx.fragment.app.FragmentManager.a0(Unknown Source:230)

at androidx.fragment.app.FragmentManager.c1(Unknown Source:91)

at androidx.fragment.app.FragmentManager.X(Unknown Source:21)

at androidx.fragment.app.FragmentManager.P(Unknown Source:38)

at androidx.fragment.app.FragmentManager.u(Unknown Source:11)

at androidx.fragment.app.k.c(Unknown Source:4)

at androidx.fragment.app.g.onStart(Unknown Source:20)

at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1435)

at android.app.Activity.performStart(Activity.java:8046)

at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3457)

at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)

at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)

at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)

at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)

at android.os.Handler.dispatchMessage(Handler.java:106)

at android.os.Looper.loop(Looper.java:223)

at android.app.ActivityThread.main(ActivityThread.java:7664)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) ```

分析LOG前需要先了解一下RELRO参考Android WebView加载Chromium动态库的过程分析

#mermaid-svg-sFsSaR4F19SlW5jN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sFsSaR4F19SlW5jN .error-icon{fill:#552222;}#mermaid-svg-sFsSaR4F19SlW5jN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sFsSaR4F19SlW5jN .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-sFsSaR4F19SlW5jN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sFsSaR4F19SlW5jN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sFsSaR4F19SlW5jN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sFsSaR4F19SlW5jN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sFsSaR4F19SlW5jN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sFsSaR4F19SlW5jN .marker.cross{stroke:#333333;}#mermaid-svg-sFsSaR4F19SlW5jN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sFsSaR4F19SlW5jN .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sFsSaR4F19SlW5jN text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-sFsSaR4F19SlW5jN .actor-line{stroke:grey;}#mermaid-svg-sFsSaR4F19SlW5jN .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-sFsSaR4F19SlW5jN .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-sFsSaR4F19SlW5jN #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-sFsSaR4F19SlW5jN .sequenceNumber{fill:white;}#mermaid-svg-sFsSaR4F19SlW5jN #sequencenumber{fill:#333;}#mermaid-svg-sFsSaR4F19SlW5jN #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-sFsSaR4F19SlW5jN .messageText{fill:#333;stroke:#333;}#mermaid-svg-sFsSaR4F19SlW5jN .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sFsSaR4F19SlW5jN .labelText,#mermaid-svg-sFsSaR4F19SlW5jN .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-sFsSaR4F19SlW5jN .loopText,#mermaid-svg-sFsSaR4F19SlW5jN .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-sFsSaR4F19SlW5jN .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-sFsSaR4F19SlW5jN .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-sFsSaR4F19SlW5jN .noteText,#mermaid-svg-sFsSaR4F19SlW5jN .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-sFsSaR4F19SlW5jN .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sFsSaR4F19SlW5jN .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sFsSaR4F19SlW5jN .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-sFsSaR4F19SlW5jN .actorPopupMenu{position:absolute;}#mermaid-svg-sFsSaR4F19SlW5jN .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-sFsSaR4F19SlW5jN .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-sFsSaR4F19SlW5jN .actor-man circle,#mermaid-svg-sFsSaR4F19SlW5jN line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-sFsSaR4F19SlW5jN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

WebViewFactory

WebViewLibraryLoader

LocalServices

ActivityManagerInternal

RelroFileCreator

loader.cpp

onWebViewProviderChanged

createRelros

createRelroFile

getService

startIsolatedProcess

main

nativeCreateRelroFile

CreateRelroFile

DoCreateRelroFile

WebViewFactory

WebViewLibraryLoader

LocalServices

ActivityManagerInternal

RelroFileCreator

loader.cpp

frameworks/base/core/java/android/webkit/WebViewLibraryLoader.java

private static class RelroFileCreator {

// Called in an unprivileged child process to create the relro file.

public static void main(String[] args) {

boolean result = false;

boolean is64Bit = VMRuntime.getRuntime().is64Bit();

try {

if (args.length != 2 || args[0] == null || args[1] == null) {

Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args));

return;

}

String packageName = args[0];

String libraryFileName = args[1];

Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), package: "

+ packageName + " library: " + libraryFileName);

if (!sAddressSpaceReserved) {

Log.e(LOGTAG, "can't create relro file; address space not reserved");

return;

}

LoadedApk apk = ActivityThread.currentActivityThread().getPackageInfo(

packageName,

null,

Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);

result = nativeCreateRelroFile(libraryFileName,

is64Bit ? CHROMIUM_WEBVIEW_NATIVE_RELRO_64 :

CHROMIUM_WEBVIEW_NATIVE_RELRO_32,

apk.getClassLoader());

if (result && DEBUG) Log.v(LOGTAG, "created relro file");

} finally {

// We must do our best to always notify the update service, even if something fails.

try {

WebViewFactory.getUpdateServiceUnchecked().notifyRelroCreationCompleted();

} catch (RemoteException e) {

Log.e(LOGTAG, "error notifying update service", e);

}

if (!result) Log.e(LOGTAG, "failed to create relro file");

// Must explicitly exit or else this process will just sit around after we return.

System.exit(0);

}

}

}

frameworks/base/native/webview/loader/loader.cpp

ALOGE("Failed to open relro file %s: %s", relro, strerror(errno));

jboolean DoCreateRelroFile(JNIEnv* env, const char* lib, const char* relro,

if (handle == NULL) {

ALOGE("Failed to load library %s: %s", lib, dlerror());

unlink(relro_tmp);

return JNI_FALSE;

}

}

Failed to load library libwebviewchromium.so: dlopen failed: library "libwebviewchromium.so" not found

Failed to open relro file /data/misc/shared_relro/libwebviewchromium64.relro: No such file or directory

art/libnativeloader/library_namespaces.cpp

ALOGD("classloader namespace configured for unbundled %s apk. library_path=%s",

//对应LOG

//classloader namespace configured for unbundled product apk. library_path=/product/app/webview/lib/arm64:/product/app/webview/webview.apk!/lib/arm64-v8a:/product/lib64:/system/product/lib64

基本定位到webview的库加载问题后,排除第三方APP问题, 重启看下webview的相关log:

2023-04-24 11:06:15.580 446-472 SystemConfig system_process I Reading permissions from /system/etc/permissions/android.software.webview.xml

2023-04-24 11:06:17.733 446-446 SystemServerTiming system_process I StartWebViewUpdateService

2023-04-24 11:06:17.733 446-446 SystemSe...Manager system_process I Starting com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:17.736 446-446 SystemServerTiming system_process D StartWebViewUpdateService took to complete: 2ms

2023-04-24 11:06:19.625 446-446 SystemServerTiming system_process I OnBootPhase_480_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:19.625 446-446 SystemServerTiming system_process D OnBootPhase_480_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:19.667 446-446 SystemServerTiming system_process I OnBootPhase_500_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:19.667 446-446 SystemServerTiming system_process D OnBootPhase_500_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:20.023 446-446 SystemServerTiming system_process I OnBootPhase_520_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:20.023 446-446 SystemServerTiming system_process D OnBootPhase_520_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:20.161 446-446 SystemServerTiming system_process I OnBootPhase_550_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:20.161 446-446 SystemServerTiming system_process D OnBootPhase_550_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:20.540 446-511 SystemSe...ngAsync system_process I InitThreadPoolExec:WebViewFactoryPreparation

2023-04-24 11:06:20.540 446-511 SystemSe...eadPool system_process D Started executing WebViewFactoryPreparation

2023-04-24 11:06:20.540 446-511 SystemServer system_process I WebViewFactoryPreparation

2023-04-24 11:06:20.540 446-511 SystemSe...ngAsync system_process I WebViewFactoryPreparation

2023-04-24 11:06:20.556 446-511 SystemSe...ngAsync system_process D WebViewFactoryPreparation took to complete: 16ms

2023-04-24 11:06:20.556 446-511 SystemSe...eadPool system_process D Finished executing WebViewFactoryPreparation

2023-04-24 11:06:20.556 446-511 SystemSe...ngAsync system_process D InitThreadPoolExec:WebViewFactoryPreparation took to complete: 17ms

2023-04-24 11:06:20.694 446-475 ActivityManager system_process I Start proc 678:WebViewLoader-armeabi-v7a/1037 [android.webkit.WebViewLibraryLoader$RelroFileCreator] for null

2023-04-24 11:06:20.768 446-475 ActivityManager system_process I Start proc 692:WebViewLoader-arm64-v8a/1037 [android.webkit.WebViewLibraryLoader$RelroFileCreator] for null

2023-04-24 11:06:20.780 678-678 WebViewL...yLoader pid-678 V RelroFileCreator (64bit = false), package: com.android.webview library: libwebviewchromium.so

2023-04-24 11:06:20.792 692-692 WebViewL...yLoader pid-692 V RelroFileCreator (64bit = true), package: com.android.webview library: libwebviewchromium.so

2023-04-24 11:06:20.809 446-446 SystemServerTiming system_process I OnBootPhase_600_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:20.809 446-446 SystemServerTiming system_process D OnBootPhase_600_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:20.837 692-692 WebViewLoader- pid-692 I The ClassLoaderContext is a special shared library.

2023-04-24 11:06:20.837 678-678 WebViewLoader- pid-678 I The ClassLoaderContext is a special shared library.

2023-04-24 11:06:20.839 692-692 nativeloader pid-692 D classloader namespace configured for unbundled product apk. library_path=/product/app/webview/lib/arm64:/product/app/webview/webview.apk!/lib/arm64-v8a:/product/lib64:/system/product/lib64

2023-04-24 11:06:20.839 678-678 nativeloader pid-678 D classloader namespace configured for unbundled product apk. library_path=/product/app/webview/lib/arm:/product/app/webview/webview.apk!/lib/armeabi-v7a:/product/lib:/system/product/lib

2023-04-24 11:06:20.857 678-678 webviewc...mloader pid-678 E Failed to load library libwebviewchromium.so: dlopen failed: library "libwebviewchromium.so" not found

2023-04-24 11:06:20.863 692-692 webviewc...mloader pid-692 E Failed to load library libwebviewchromium.so: dlopen failed: library "libwebviewchromium.so" not found

2023-04-24 11:06:20.871 678-678 WebViewL...yLoader pid-678 E failed to create relro file

2023-04-24 11:06:20.874 692-692 WebViewL...yLoader pid-692 E failed to create relro file

2023-04-24 11:06:20.881 692-692 WebViewLoader- pid-692 I System.exit called, status: 0

2023-04-24 11:06:20.886 678-678 WebViewLoader- pid-678 I System.exit called, status: 0

2023-04-24 11:06:20.915 758-758 WebViewZygoteInit pid-758 I Starting WebViewZygoteInit

2023-04-24 11:06:20.922 446-504 ActivityManager system_process I Process WebViewLoader-armeabi-v7a (pid 678) has died: psvc PER

2023-04-24 11:06:20.952 758-758 WebViewZygoteInit pid-758 I Beginning application preload for com.android.webview

2023-04-24 11:06:20.958 446-728 ActivityManager system_process I Process WebViewLoader-arm64-v8a (pid 692) has died: psvc PER

2023-04-24 11:06:20.962 758-758 webview_zygote pid-758 I The ClassLoaderContext is a special shared library.

2023-04-24 11:06:20.964 758-758 nativeloader pid-758 D classloader namespace configured for unbundled product apk. library_path=/product/app/webview/lib/arm:/product/app/webview/webview.apk!/lib/armeabi-v7a:/product/lib:/system/product/lib

2023-04-24 11:06:20.968 758-758 webviewc...mloader pid-758 E Failed to open relro file /data/misc/shared_relro/libwebviewchromium32.relro: No such file or directory

2023-04-24 11:06:20.968 758-758 WebViewL...yLoader pid-758 W failed to load with relro file, proceeding without

2023-04-24 11:06:21.004 758-758 WebViewZygoteInit pid-758 E Exception while preloading package

java.lang.reflect.InvocationTargetException

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.WebViewZygoteInit$WebViewZygoteConnection.doPreload(WebViewZygoteInit.java:126)

at com.android.internal.os.WebViewZygoteInit$WebViewZygoteConnection.handlePreloadApp(WebViewZygoteInit.java:79)

at com.android.internal.os.ZygoteConnection.processOneCommand(ZygoteConnection.java:181)

at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:546)

at com.android.internal.os.ChildZygoteInit.runZygoteServer(ChildZygoteInit.java:125)

at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:147)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "libwebviewchromium.so" not found

at java.lang.Runtime.loadLibrary0(Runtime.java:1087)

at java.lang.Runtime.loadLibrary0(Runtime.java:1008)

at java.lang.System.loadLibrary(System.java:1664)

at com.android.webview.chromium.WebViewChromiumFactoryProvider.preloadInZygote(chromium-SystemWebView.apk-default-410412053:3)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.WebViewZygoteInit$WebViewZygoteConnection.doPreload(WebViewZygoteInit.java:126)

at com.android.internal.os.WebViewZygoteInit$WebViewZygoteConnection.handlePreloadApp(WebViewZygoteInit.java:79)

at com.android.internal.os.ZygoteConnection.processOneCommand(ZygoteConnection.java:181)

at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:546)

at com.android.internal.os.ChildZygoteInit.runZygoteServer(ChildZygoteInit.java:125)

at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:147)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

2023-04-24 11:06:21.004 758-758 WebViewZygoteInit pid-758 I Application preload done

2023-04-24 11:06:21.006 446-446 SystemServerTiming system_process I ssm.onStartUser-0_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:21.006 446-446 SystemServerTiming system_process D ssm.onStartUser-0_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:21.031 446-446 StorageM...Service system_process V Package com.android.webview does not have legacy storage

2023-04-24 11:06:24.986 446-468 Activity...rTiming system_process I OnBootPhase_1000_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:24.986 446-468 Activity...rTiming system_process D OnBootPhase_1000_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:26.235 446-474 SystemSe...ngAsync system_process I ssm.onUnlockingUser-0_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:26.235 446-474 SystemSe...ngAsync system_process D ssm.onUnlockingUser-0_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

2023-04-24 11:06:26.366 446-474 SystemSe...ngAsync system_process I ssm.onUnlockedUser-0_com.android.server.webkit.WebViewUpdateService

2023-04-24 11:06:26.366 446-474 SystemSe...ngAsync system_process D ssm.onUnlockedUser-0_com.android.server.webkit.WebViewUpdateService took to complete: 0ms

基本与第三方APP没什么关系, webview的lib库是在开机就加载的.

bionic/linker/linker.cpp 根据经验,先到linker打打LOG

static int open_library_in_zipfile(ZipArchiveCache* zip_archive_cache,

const char* const input_path,

off64_t* file_offset, std::string* realpath) {

std::string normalized_path;

if (!normalize_path(input_path, &normalized_path)) {

PRINT("open_library_in_zipfile err normallized path");

return -1;

}

const char* const path = normalized_path.c_str();

TRACE("Trying zip file open from path \"%s\" -> normalized \"%s\"", input_path, path);

// Treat an '!/' separator inside a path as the separator between the name

// of the zip file on disk and the subdirectory to search within it.

// For example, if path is "foo.zip!/bar/bas/x.so", then we search for

// "bar/bas/x.so" within "foo.zip".

const char* const separator = strstr(path, kZipFileSeparator);

if (separator == nullptr) {

PRINT("open_library_in_zipfile err no separator");

return -1;

}

char buf[512];

if (strlcpy(buf, path, sizeof(buf)) >= sizeof(buf)) {

PRINT("Warning: ignoring very long library path: %s", path);

return -1;

}

buf[separator - path] = '\0';

const char* zip_path = buf;

const char* file_path = &buf[separator - path + 2];

int fd = TEMP_FAILURE_RETRY(open(zip_path, O_RDONLY | O_CLOEXEC));

if (fd == -1) {

PRINT("open_library_in_zipfile err 0");

return -1;

}

PRINT("open_library_in_zipfile zip_path=%s", zip_path);

ZipArchiveHandle handle;

if (!zip_archive_cache->get_or_open(zip_path, &handle)) {

// invalid zip-file (?)

close(fd);

PRINT("open_library_in_zipfile err 1");

return -1;

}

ZipEntry entry;

if (FindEntry(handle, file_path, &entry) != 0) {

// Entry was not found.

close(fd);

PRINT("open_library_in_zipfile err 2");

return -1;

}

// Check if it is properly stored

if (entry.method != kCompressStored || (entry.offset % PAGE_SIZE) != 0) {

close(fd);

PRINT("open_library_in_zipfile err 3, %d, %d", entry.method != kCompressStored, (entry.offset % PAGE_SIZE) != 0);

return -1;

}

*file_offset = entry.offset;

if (realpath_fd(fd, realpath)) {

*realpath += separator;

} else {

if (!is_first_stage_init()) {

PRINT("warning: unable to get realpath for the library \"%s\". Will use given path.",

normalized_path.c_str());

}

*realpath = normalized_path;

}

return fd;

}

linker mark.via load_library(ns=(default), task=/product/app/webview/oat/arm64/webview.odex, flags=0x2, search_linked_namespaces=0): calling open_library with realpath=

linker mark.via open_library name=/product/app/webview/oat/arm64/webview.odex, ns=(default)

linker mark.via load_library taskName=libwebviewchromium.so

linker mark.via load_library(ns=vendor-classloader-namespace, task=libwebviewchromium.so, flags=0x2, search_linked_namespaces=1): calling open_library with realpath=

linker mark.via open_library name=libwebviewchromium.so, ns=vendor-classloader-namespace

linker mark.via open_library_in_zipfile zip_path=/product/app/webview/webview.apk

linker mark.via open_library_in_zipfile err 3, 1, 1

linker mark.via open_library_at_path /product/app/webview/webview.apk!/lib/arm64-v8a/libwebviewchromium.so FAILED

linker mark.via open_library_at_path /product/lib64/libwebviewchromium.so FAILED

linker mark.via open_library_at_path /product/lib64/libwebviewchromium.so FAILED

error 3 表明,这两个条件都有问题:entry.method != kCompressStored || (entry.offset % PAGE_SIZE) != 0 看文件:

rk3568_a11$ tree out/target/product/rk3566_r/product/app/webview/

out/target/product/rk3566_r/product/app/webview/

├── oat

│ ├── arm

│ │ ├── webview.odex

│ │ └── webview.vdex

│ └── arm64

│ ├── webview.odex

│ └── webview.vdex

└── webview.apk

//Failed

linker pid-664 load_library taskName=libwebviewchromium.so

linker pid-664 load_library(ns=vendor-classloader-namespace, task=libwebviewchromium.so, flags=0x0, search_linked_namespaces=1): calling open_library with realpath=

linker pid-664 open_library name=libwebviewchromium.so, ns=vendor-classloader-namespace

linker pid-664 open_library_in_zipfile zip_path=/product/app/webview/webview.apk

linker pid-664 open_library_in_zipfile err 3, 1, 1

linker pid-664 open_library_at_path /product/app/webview/webview.apk!/lib/armeabi-v7a/libwebviewchromium.so FAILED

//Success

linker pid-822 load_library taskName=libwebviewchromium.so

linker pid-822 load_library(ns=vendor-classloader-namespace, task=libwebviewchromium.so, flags=0x0, search_linked_namespaces=1): calling open_library with realpath=

linker pid-822 open_library name=libwebviewchromium.so, ns=vendor-classloader-namespace

linker pid-822 open_library_in_zipfile zip_path=/product/app/webview/webview.apk

linker pid-822 open_library_at_path /product/app/webview/webview.apk!/lib/armeabi-v7a/libwebviewchromium.so SUCCESS

解决

   非逻辑问题,怀疑webview文件的问题,尝试替换掉webview试试,从另一套代码中拷贝出编译好的webview, PUSH到主板中,问题神奇地消失了。

最终发现是改了编译配置导致生成的webview.apk文件不一致导致(APK的优化对齐相关)。

在修正了文件问题后,对应目录的RELRO存在相应的文件。

rk3566:/ # ll /data/misc/shared_relro/

total 5332

-r--r--r-- 1 shared_relro shared_relro 1892352 2023-04-24 15:53 libwebviewchromium32.relro

-r--r--r-- 1 shared_relro shared_relro 3563520 2023-04-24 15:53 libwebviewchromium64.relro

参考

Shared Libraries on Android Shared Libraries on Android Android WebView加载Chromium动态库的过程分析 Android系统安全 — 2.0-移动终端栈溢出的保护机制设置 在 WebView 中编译 Web 应用

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: