Android免安装升级系统WebView内核探索

背景

Android5.0以后WebView升级需要去Google Play安装APK(图一),就算安装了以后也不一定能行,像华为、Amazon等特殊机型WebView的Chromium版本一般比较低,只能用它自己的WebView无法用Google的WebView(图二)。

在这里插入图片描述

在这里插入图片描述

华为机上WebView内核的Chromium版本低于107无法播放H265视频,为了解决上述问题可以用JS实现H265播放,但是会比较卡,也可以用腾讯的X5内核,但是免费版实际chromium版本是89不支持H265视频,这个时候我就想能不能用App内的WebView APK作为内核,下图是升级WebView内核的前后效果对比

preview.gif

升级前在华为机上的系统WebView内核包名是com.huawei.webview,版本是14.0.0.331,UserAgent中的Chromium实际版本是99.0.4844.88,如下图所示小于107不支持H265播放

在这里插入图片描述

把WebView内核的包名、版本、包地址传到以下代码升级内核成功后就可以播放H265视频了

在这里插入图片描述

WebView内核选择页面如下图所示

在这里插入图片描述

升级成功后WebView内核的包名变成了com.google.android.webview,UserAgent中的Chromium实际版本也变成了122.0.6261.64

在这里插入图片描述

项目地址:WebViewUpgrade,这个项目是为了解决WebView碎片化而产生,当前处于测试阶段,如果你觉得有所收获,给这个库点个赞吧,你的鼓励是我前进最大的动力,

兼容性

Android的设备五花八门,已测试以下功能和机型

功能特性

WebView包名系统版本
com.google.android.webview122.0.6261.64
com.android.webview113.0.5672.136
com.huawei.webview14.0.0.331
com.android.chrome122.0.6261.43
com.amazon.webview.chromium118-5993-tv.5993.155.51

机型

厂商系统版本
华为Mate3012
小米1011
VIVO NEX A10
OPPO FIND X514

原理介绍

WebView初始化.png

其实原理很简单,从上图中可以看到WebView初始化的时候会根据WebViewProviderResponse(WebViewUpdateService调用waitForAndGetProvider)和PackageInfo(PacakgeManagerService调用getPackageInfo)生成WebViewFactoryProivder,也就是说只要hook这两个方法就行,替换WebViewUpdateService和PacakgeManagerService的调用很简单,其实就是替换Binder的本地接口调用,网上方案很多就不展开了,如果不清楚的可以直接看代码

替换waitForAndGetProvider值得注意的是WebViewProviderResponse对象的packageInfo查询时flags要设置成GET_SHARED_LIBRARY_FILES|GET_SIGNATURES|GET_META_DATA,后续代码中会用这些数据,不然会崩溃。
image.png

替换getPackageInfo值得注意的是

  1. getPackageArchiveInfo查询未安装Apk的PackageInfo
  2. 有些APK加上GET_SIGNATURES查询PackageInfo会找不到
  3. getPackageArchiveInfo查询出来的PackageInfo不存在nativeLibraryDir,需要手动赋值
  4. nativeLibraryDir传入的so路径需要运行时处理器指令集的ABI一样,不然会崩溃
  5. 部分手机的packageInfo.applicationInfo.sourceDir不存在,需要手动赋值

image.png

有两个功能还没实现,希望有了解的朋友能提交代码解决这两个问题。

  1. 运行时动态切换WebView内核,现在只能在WebView未初始化之前替换,原因是因为会报错UnsatisfiedLinkError: Shared library "/system/lib64/libwebviewchromium_plat_support.so" already opened by ClassLoader,WebView内核中会调用System.loadLibrary加载libwebviewchromium_plat_support.so,而系统限制同一个so只能被一个classLoader加载。

  2. 不支持多进程功能,如果把WebViewUpdateService的isMultiProcessEnabled设为true,会报错java.lang.RuntimeException: Illegal meta data value: the child service doesn't exist, 就算把这个错误解决了,也无法用Process.startWebView手动启动WebViewZygote进程

  • 26
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android 一键升级 WebView 内核是指在 Android 系统中,通过一键操作来完成 WebView 内核升级过程。在 Android 平台上,WebView是一个内置的浏览器组件,用于显示网页内容。WebView 的核心引擎是基于谷歌的开源项目 Chromium 开发的,因此随着时间的推移,谷歌会不断更新和改进 WebView内核。 为了安全性和性能的考虑,升级 WebView 内核变得非常重要。随着新的安全漏洞和性能改进的不断出现,保持 WebView 内核始终为最新版本可以增强用户的浏览体验,并提供更好的安全性。 为了简化用户的操作,开发者们创建了一键升级 WebView 内核的解决方案。这些解决方案通常是一个应用程序或库,可以检测设备上的 WebView 内核版本,然后下载并安装最新版本的内核。 一键升级 WebView 内核通常包括以下步骤: 1. 检测设备上的当前 WebView 版本。 2. 从服务器上获取最新的 WebView 内核版本。 3. 下载最新的 WebView 内核。 4. 安装新的 WebView 内核。 5. 更新相关配置和设置。 通过简化这些步骤,用户只需点击一个按钮或执行一次操作,便可以完成整个升级过程,而不需要手动下载和安装 WebView 内核。 一键升级 WebView 内核使得开发者可以更容易地为用户提供 WebView 的最新版本和安全性保障。同时,用户也能够享受到更好的浏览体验和更高的安全级别。因此,对于开发和使用 Android 应用程序的用户来说,一键升级 WebView 内核是非常有价值的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值