Failed to load WebView provider: No WebView installed

1、问题

复制代码
	使用webview加载网页,在应用运行时,报了如下错误:

android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed

2、分析

复制代码
	通过查看项目的修改记录,确实安装了WebView。打开cmd,执行adb shell "pm list packages | grep webview"该命令,可以看到安装的webview的包名。如图:
c 复制代码
C:\Users\ABC1314>adb shell "pm list packages | grep webview"
package:com.google.android.webview

3、解决

复制代码
系统是通过SystemImpl.java获取config_webview_packages.xml文件中定义的WebView
路径:frameworks/base/services/core/java/com/android/server/webkit/SystemImpl.java
java 复制代码
private SystemImpl() {
        int numFallbackPackages = 0;
        int numAvailableByDefaultPackages = 0;
        XmlResourceParser parser = null;
        List<WebViewProviderInfo> webViewProviders = new ArrayList<WebViewProviderInfo>();
        try {
            parser = AppGlobals.getInitialApplication().getResources().getXml(
                    com.android.internal.R.xml.config_webview_packages);
            XmlUtils.beginDocument(parser, TAG_START);
            while(true) {
                XmlUtils.nextElement(parser);
                String element = parser.getName();
                if (element == null) {
                    break;
                }
                if (element.equals(TAG_WEBVIEW_PROVIDER)) {
                    String packageName = parser.getAttributeValue(null, TAG_PACKAGE_NAME);
                    if (packageName == null) {
                        throw new AndroidRuntimeException(
                                "WebView provider in framework resources missing package name");
                    }
                    String description = parser.getAttributeValue(null, TAG_DESCRIPTION);
                    if (description == null) {
                        throw new AndroidRuntimeException(
                                "WebView provider in framework resources missing description");
                    }
                    boolean availableByDefault = "true".equals(
                            parser.getAttributeValue(null, TAG_AVAILABILITY));
                    boolean isFallback = "true".equals(
                            parser.getAttributeValue(null, TAG_FALLBACK));
                    WebViewProviderInfo currentProvider = new WebViewProviderInfo(
                            packageName, description, availableByDefault, isFallback,
                            readSignatures(parser));
                    if (currentProvider.isFallback) {
                        numFallbackPackages++;
                        if (!currentProvider.availableByDefault) {
                            throw new AndroidRuntimeException(
                                    "Each WebView fallback package must be available by default.");
                        }
                        if (numFallbackPackages > 1) {
                            throw new AndroidRuntimeException(
                                    "There can be at most one WebView fallback package.");
                        }
                    }
                    if (currentProvider.availableByDefault) {
                        numAvailableByDefaultPackages++;
                    }
                    webViewProviders.add(currentProvider);
                }
                else {
                    Log.e(TAG, "Found an element that is not a WebView provider");
                }
            }
        } catch (XmlPullParserException | IOException e) {
            throw new AndroidRuntimeException("Error when parsing WebView config " + e);
        } finally {
            if (parser != null) parser.close();
        }
        if (numAvailableByDefaultPackages == 0) {
            throw new AndroidRuntimeException("There must be at least one WebView package "
                    + "that is available by default");
        }
        mWebViewProviderPackages =
                webViewProviders.toArray(new WebViewProviderInfo[webViewProviders.size()]);
    }
复制代码
查看frameworks/base/core/res/res/xml/config_webview_packages.xml文件中对使用的webview进行声明:如下
java 复制代码
<!-- The default WebView implementation -->
    <webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">
    </webviewprovider>

可以看到,在该文件中声明的webview的包名是:com.android.webview,而我们通过adb命令看到系统安装的webview包名是com.google.android.webview,二者不同,导致了无法找到webview.

只需要在该xml文件中,将我们安装的webview添加进去即可。

java 复制代码
<webviewproviders>
	<webviewprovider description="Google WebView" packageName="com.google.android.webview" availableByDefault="true">
    </webviewprovider>
	
	<webviewprovider description="Trichromelibrary" packageName="com.google.android.trichromelibrary" availableByDefault="true">
    </webviewprovider>
	
	
    <!-- The default WebView implementation -->
    <webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">
    </webviewprovider>
</webviewproviders>
相关推荐
Vect__40 分钟前
MySQL的数据类型和约束
android·数据库·mysql
ChoSeitaku1 小时前
5.MySQL表的约束|空属性|默认值|列描述|主键|自增长|唯一键|外键
android·数据库·mysql
茅盾体2 小时前
React Native
android·react native·react.js
是Yu欸2 小时前
SGLang 推理服务基础性能评测
android·数据库·大模型·github·昇腾·sglang·qwen3
小菜同学爱学习3 小时前
突破瓶颈!MySQL高级优化与企业级实战场景详解
android·数据库·mysql
casual_clover3 小时前
【Android】创建带参数的 Fragment
android·带参数的fragment
da_caoyuan3 小时前
Android callbackFlow 使用场景详解
android
常利兵3 小时前
安卓启动页Logo适配秘籍:告别“奇形怪状”的展示
android·java·开发语言
帅次4 小时前
Android 性能优化专题面试稿
android·面试·性能优化
pengyu4 小时前
【Kotlin 协程修仙录 · 筑基境 · 初阶】 | 根本大法:结构化并发的父子约束与取消传播
android·kotlin