当前位置: 首页 > news >正文

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:\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
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进行声明:如下
<!-- 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添加进去即可。

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

相关文章:

  • TLS详解
  • 【高性能内存池】page cache 5
  • 数据结构:串 及串的模式匹配(KMP)
  • Cortex-A7和Cortex-M7架构处理器取中断向量全流程分析
  • 单片机串口AT指令操作SIM800、900拨打电话
  • 【QT 开发日志】QT 基础控件详解:按钮、文本框与标签的使用
  • 量化交易backtrader实践(三)_指标与策略篇(1)_指标简介与手工双均线策略
  • C语言课程设计题目六:学生信息管理系统设计
  • OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用
  • Java面试常见问题总结
  • L8打卡学习笔记
  • [数据集][目标检测]猪数据集VOC-2856张
  • 开放式蓝牙耳机哪个品牌更靠谱?5款高性价比开放式耳机推荐
  • RHCS认证-Linux(RHel9)-Ansible
  • 元宇宙的未来趋势:Web3的潜在影响
  • #Java异常处理
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • create-react-app做的留言板
  • HashMap ConcurrentHashMap
  • JS变量作用域
  • SpiderData 2019年2月23日 DApp数据排行榜
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • webpack入门学习手记(二)
  • 初识 beanstalkd
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于字符编码你应该知道的事情
  • 王永庆:技术创新改变教育未来
  • 为什么要用IPython/Jupyter?
  • 线性表及其算法(java实现)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​ubuntu下安装kvm虚拟机
  • # dbt source dbt source freshness命令详解
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define 用法
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)svelte 教程:hello world
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (52)只出现一次的数字III
  • (javaweb)Http协议
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十)T检验-第一部分
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net 7和core版 SignalR
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net framework4与其client profile版本的区别
  • .NET WPF 抖动动画