Android WebView 在 WebViewDelegate.getPackageId 处导致 RuntimeException

Gab*_*iel 5 android

我的 MainActivity 的布局 xml 中有一个 WebView,setWebViewClient(new WebViewClient())然后loadUrl(...)在 onCreate 中。

大多数情况下,应用程序运行良好并且 Web 内容显示正确。

但在某些情况下,打开应用程序会导致崩溃。我注意到当应用程序使用 AlarmManager 安排 PendingIntent 广播时会发生这种情况,这会触发一个通知,其 contentIntent 是一个设置为启动 MainActivity 的 PendingIntent.getActivity 。但只有当用户同时从活动应用程序堆栈中删除该应用程序时才会发生这种情况(通知可见,尚未单击,如果应用程序已清除则堆栈。那么,应用程序进程可能已停止?)。

之间似乎没有其他系统修改(特别是没有应用程序/系统更新,没有使用用户配置文件或 Chrome 应用程序。)

堆栈跟踪:

java.lang.RuntimeException: 
  at android.webkit.WebViewDelegate.getPackageId (WebViewDelegate.java:164)
  at yj.a (PG:16)
  at xH.run (PG:14)
  at java.lang.Thread.run (Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

在 Android 7.0 到 9 中出现。此外,当我将目标 SDK 升级到 28 时,似乎也开始出现这种情况。

我没有明确使用 a WebViewDelegate。它必须是内部系统代码(因此是混淆的)。

通过阅读AOSP的源代码,似乎WebView无法检索到它所属的包——但为什么有时只是!?

任何帮助表示赞赏!谢谢。

n3d*_*3dx 0

查看文档,您可以看到当找不到包时会抛出错误。检查您的语法、包名称,然后重试。

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/webkit/WebViewDelegate.java(第164行)

 /**
     * Returns the package id of the given {@code packageName}.
     */
    public int getPackageId(Resources resources, String packageName) {
        SparseArray<String> packageIdentifiers =
                resources.getAssets().getAssignedPackageIdentifiers();
        for (int i = 0; i < packageIdentifiers.size(); i++) {
            final String name = packageIdentifiers.valueAt(i);
            if (packageName.equals(name)) {
                return packageIdentifiers.keyAt(i);
            }
        }
        throw new RuntimeException("Package not found: " + packageName);
    }
Run Code Online (Sandbox Code Playgroud)