35人参与 • 2026-04-08 • Android
android 5.0 以后,webview 升级需要去 google play 安装 apk,但即使安装了也不一定能正常工作。像华为、amazon 等特殊机型的 webview 的 chromium 版本一般比较低,只能使用它自己的 webview,无法使用 google 的 webview。
h.265 视频播放问题:
版本差异示例:
升级前: - 包名:com.huawei.webview - 版本:14.0.0.331 - useragent 中的 chromium 版本:99.0.4844.88 (< 107,不支持 h.265) 升级后: - 包名:com.google.android.webview - 版本:122.0.6261.64 - useragent 中的 chromium 版本:122.0.6261.64 (支持 h.265)
重要理解:android 5.0 (api 21) 及更高版本,系统必须提供 h.265 (hevc) 解码能力,但这指的是解码能力 (decoder),不区分软解或硬解,且主要针对 mediacodec 等原生接口。
mediacodec 能否成功创建并配置 video/hevc 解码器的测试webviewupgrade 是一个在 android 5.0+ 上实现"免安装升级 webview 内核"的开源库。它允许应用将内置或下载的 webview apk 作为系统 webview 的实现,从而解决部分机型(如华为、amazon)系统 webview chromium 版本过低导致的 h.265/hevc、es6、现代视频能力不可用等问题。
webviewupgrade 通过在运行时 hook webviewupdateservice / packagemanagerservice 的 binder 调用,以 app 内 apk 作为 webview 实现,实现内核的切换和升级。
io.github.jonanorman.android.webviewup:core:0.1.0、io.github.jonanorman.android.webviewup:download-source:0.1.0| webview 包名 | 系统版本 |
|---|---|
| com.google.android.webview | 122.0.6261.64 |
| com.android.webview | 113.0.5672.136 |
| com.huawei.webview | 14.0.0.331 |
| com.android.chrome | 122.0.6261.43 |
| com.amazon.webview.chromium | 118-5993-tv.5993.155.51 |
| 厂商 | 系统版本 |
|---|---|
| 华为 mate30 | 12 |
| 小米10 | 11 |
| vivo nex a | 10 |
| oppo find x5 | 14 |
1. 前置检查:获取当前 webview 包名与版本 ↓ 2. 判断是否需要升级(对比目标版本) ↓ 3. 准备升级源(网络下载/内置/安装包) ↓ 4. 执行升级(必须在 webview 首次初始化之前) ↓ 5. 监听进度与结果 ↓ 6. 验证升级结果(包名/版本/h.265 能力)
webviewupgrade 支持三种升级源:
关键限制:必须在任何 webview 实例化之前完成升级与切换,否则容易出现 unsatisfiedlinkerror: shared library already opened 等链接错误。
推荐位置:在 application.oncreate() 的最早时机执行升级。
| 方案 | 核心思路 | 适配/升级能力 | 优点 | 局限与风险 | 典型场景 |
|---|---|---|---|---|---|
| webviewupgrade(免安装替换内核) | 运行时 hook webviewupdateservice / packagemanagerservice,以 app 内 apk 作为 webview 实现 | 可切换到 com.google.android.webview / com.android.webview / com.huawei.webview 等;实测可把华为机型的 chromium <107 升到 122.0.6261.64,从而支持 h.265 | 不依赖 play/系统商店;对存量设备"即插即用";对 h.265 提升明显 | 需严格在 webview 首次初始化前执行;存在多进程/动态切换未完全支持、签名/abi/so 路径等工程坑;国内部分厂商机型可能受限 | 面向大量存量用户、无法强依赖商店升级、且需快速补齐 hevc/es6/视频能力 |
| 腾讯 x5(tbs) | 接入腾讯浏览服务内核(com.tencent.smtt.sdk.webview),与系统 webview api 相似 | 可独立于系统更新内核;对 h.265 的支持取决于内核版本(免费版常见为 chromium 89,不支持 h.265;部分渠道称可到 chromium 95,需验证) | 兼容性与稳定性好;视频/文件能力增强;接入成本相对低 | 包体增大;内核并非最新;部分站点在 x5 下仍可能加载失败;与系统 webview 存在差异需回归测试 | 面向国内中低端/碎片化机型、希望快速提升兼容与视频能力 |
| crosswalk(已停更) | 将 chromium/blink 直接打进 apk 作为独立内核 | 一次性解决低版本系统兼容问题 | 历史项目中对低版本 android 的 html5/性能有明显提升 | 项目自 2017 年起停更,内核版本停留在 chromium 53;包体显著增加;内存占用高、白屏等问题较多 | 仅建议维护老项目或特定离线场景,不建议新项目采用 |
| geckoview(mozilla) | 使用 gecko 引擎的独立组件(非系统 webview 替代) | 可随 app 独立更新 | 标准支持与隐私特性好;可深度定制 | api 与系统 webview 不同,迁移成本高;包体/内存开销大 | 需要长期稳定维护自有内核、对标准一致性与可定制性要求高的场景 |
| 系统 webview 官方更新 | 通过 google play 或系统更新 android system webview / chrome | 覆盖广、维护成本低 | 官方路径最稳;与系统组件一致 | 国内渠道/厂商机型可能不可用或更新滞后;无法覆盖所有存量设备 | 能依赖商店与系统更新的用户群体,作为首选基线方案 |
目标是快速解决 h.265/hevc 与 es6/现代 web api 的兼容性,且无法保证用户能及时通过商店升级系统 webview:
面向国内大众机型、希望以较小改造成本提升整体兼容与视频能力:
需要长期可控的内核与差异化能力、能接受较大包体与维护成本:
能依赖官方更新通道:
在 build.gradle 中添加:
// 不需要下载 apk 时使用 implementation 'io.github.jonanorman.android.webviewup:core:0.1.0' // 需要下载 apk 使用 implementation 'io.github.jonanorman.android.webviewup:download-source:0.1.0'
upgradedownloadsource upgradesource = new upgradedownloadsource(
context,
url, // webview apk 的下载地址
file // 保存的目标文件
);将 webview apk 放入 assets 目录,使用 upgradeassetsource。
直接指定目标包名(需设备可安装),使用 upgradepackagesource。
// 1. 定义升级信息
upgradeinfo info = new upgradeinfo(
"com.google.android.webview", // 目标包名
"122.0.6261.64", // 目标版本
"https://raw.githubusercontent.com/.../com.google.android.webview_122.0.6261.64_armeabi-v7a.zip", // 下载地址
"网络" // 来源描述
);
// 2. 前置检查:获取当前 webview 包名与版本
string curpkg = webviewupgrade.getsystemwebviewpackagename();
string curversion = webviewupgrade.getsystemwebviewpackageversion();
// 3. 判断是否需要升级
if (curpkg != null && curpkg.equals(info.packagename) &&
versionutils.compareversion(curversion, info.versionname) >= 0) {
// 已满足,无需升级
return;
}
// 4. 创建升级源
upgradesource src = info.toupgradesource(context);
if (src == null) return;
// 5. 执行升级
webviewupgrade.upgrade(src);// 检查状态
if (webviewupgrade.isprocessing()) {
float progress = webviewupgrade.getupgradeprocess();
// 更新进度 ui
}
if (webviewupgrade.iscompleted()) {
// 升级完成,初始化 webview
}
if (webviewupgrade.isfailed()) {
throwable error = webviewupgrade.getupgradeerror();
// 处理错误
}webviewupgrade.setupgradecallback(new upgradecallback() {
@override
public void onupgradeprocess(float percent) {
// 更新进度 ui
}
@override
public void onupgradecomplete() {
// 升级完成,初始化 webview 并加载页面
}
@override
public void onupgradeerror(throwable t) {
// 记录日志/降级策略
}
});# 通过 adb 命令验证 adb shell pm dump com.android.webview | grep version # 或使用 dumpsys dumpsys webviewupdate # 或在代码中验证 string pkgname = webviewupgrade.getsystemwebviewpackagename(); string version = webviewupgrade.getsystemwebviewpackageversion();
在 h5 页面中使用 javascript 检测:
// 方式 1:检测 mediasource 支持
const issupported = mediasource.istypesupported('video/mp4; codecs="hev1.1.6.l93.b0"');
// 方式 2:检测 videodecoder 硬件加速支持(更精确)
const config = {
codec: 'hev1.1.6.l93.b0',
hardwareacceleration: 'prefer-hardware'
};
videodecoder.isconfigsupported(config).then(result => {
if (result.supported) {
// 支持 h.265 硬件解码
}
});时机要求极严
unsatisfiedlinkerror: shared library already opened 等链接错误application.oncreate() 的最早时机执行多进程与动态切换不支持
厂商与签名/abi 约束
packageinfo 需要手动补齐 nativelibrarydir/abi 等字段,处理不当会崩溃成熟度与维护
版本与提供者验证
adb shell pm dump com.android.webview | grep version 或 dumpsys webviewupdate 校验当前包名/版本h.265 能力验证
mediasource.istypesupported('video/mp4; codecs="hev1...")' 与(可选)videodecoder.isconfigsupported({hardwareacceleration:true}) 验证硬解可用性稳定性回归
针对需要快速补齐 h.265/hevc、es6/现代 web api 的兼容性诉求,且无法保证用户通过商店或系统更新 webview/chrome 的场景,webviewupgrade 通常是"收益最高"的兜底方案:
com.google.android.webview 122.0.6261.64)分层策略:
在 android 5.0+ 系统上,只有当设备的 webview 内核版本足够新(如 chromium ≥ 107)、mediasource.istypesupported 和 videodecoder.isconfigsupported({hardwareacceleration:true}) 均返回 true,且系统 mediacodec 能成功创建 hevc 解码器时,才能认为可以流畅地进行 h.265 硬件解码;否则,一律按软解或降级处理。
开始: webview 播放 h.265
↓
api level ≥ 21?
├─ 否 → 结论: 系统不支持, 走软解/降级
└─ 是 → webview 内核版本 ≥ 阈值?
├─ 否 → 结论: 系统不支持, 走软解/降级
└─ 是 → js 探测: mediasource.istypesupported
├─ 返回 false → 结论: 系统不支持, 走软解/降级
└─ 返回 true → 是否支持 webcodecs videodecoder?
├─ 否 → 结论: 走软解 (ffmpeg/内置软解)
└─ 是 → js 探测: videodecoder.isconfigsupported
├─ 返回 false → 结论: 走软解 (ffmpeg/内置软解)
└─ 返回 true → 结论: 支持 h.265 硬件解码 ✅ 流畅播放| 安全风险 | 核心原则 | 实践要点 |
|---|---|---|
| 恶意代码执行 | 最小化攻击面 | 按需启用javascript、文件访问等;移除历史遗留接口。 |
| jsb通信漏洞 | 安全的交互方式 | 禁止addjavascriptinterface,首选addwebmessagelistener进行严格的源(origin)校验。 |
| 数据监听/篡改 | 加密与校验 | 强制使用https,正确校验ssl证书,部署csp。 |
| 资源滥用/崩溃 | 谨慎的生命周期管理 | 独立进程管理webview,及时释放资源。 |
| 代码逆向分析 | 防御性加固 | 使用proguard/r8混淆代码。 |
到此这篇关于android webview版本升级方案对比及注意事项详解的文章就介绍到这了,更多相关android webview版本升级内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论