Android?WebView版本升級方案對比及注意事項詳解
問題背景
WebView 版本差異帶來的問題
Android 5.0 以后,WebView 升級需要去 Google Play 安裝 APK,但即使安裝了也不一定能正常工作。像華為、Amazon 等特殊機(jī)型的 WebView 的 Chromium 版本一般比較低,只能使用它自己的 WebView,無法使用 Google 的 WebView。
典型問題場景
H.265 視頻播放問題:
- 華為部分機(jī)型(如 Mate30)的系統(tǒng) WebView (Chromium 99) 不支持 H.265
- 升級到 Google WebView (Chromium 122) 后即可支持
- WebView 能否用 H.265 硬解,取決于其底層的 Chromium 內(nèi)核,而非 Android 系統(tǒng)本身
版本差異示例:
升級前: - 包名: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 系統(tǒng)對 H.265 的支持要求
重要理解:Android 5.0 (API 21) 及更高版本,系統(tǒng)必須提供 H.265 (HEVC) 解碼能力,但這指的是解碼能力 (Decoder),不區(qū)分軟解或硬解,且主要針對 MediaCodec 等原生接口。
- 強制解碼能力:從 Android 5.0 開始,系統(tǒng)解碼器需支持 HEVC Main Profile
- 軟解與硬解:規(guī)范只要求"有解碼器",并未強制要求必須是硬件解碼
- 兼容性測試 (CTS):Android 的兼容性測試套件會包含對
MediaCodec能否成功創(chuàng)建并配置video/hevc解碼器的測試
WebViewUpgrade 項目介紹
項目概述
WebViewUpgrade 是一個在 Android 5.0+ 上實現(xiàn)"免安裝升級 WebView 內(nèi)核"的開源庫。它允許應(yīng)用將內(nèi)置或下載的 WebView APK 作為系統(tǒng) WebView 的實現(xiàn),從而解決部分機(jī)型(如華為、Amazon)系統(tǒng) WebView Chromium 版本過低導(dǎo)致的 H.265/HEVC、ES6、現(xiàn)代視頻能力不可用等問題。
核心原理
WebViewUpgrade 通過在運行時 Hook WebViewUpdateService / PackageManagerService 的 Binder 調(diào)用,以 App 內(nèi) APK 作為 WebView 實現(xiàn),實現(xiàn)內(nèi)核的切換和升級。
GitHub 倉庫
- 官方倉庫:https://github.com/JonaNorman/WebViewUpgrade
- 鏡像倉庫(便于國內(nèi)訪問):https://github.com/ak-ing/WebViewUpgrade
- 已發(fā)布版本:
io.github.jonanorman.android.webviewup:core:0.1.0、io.github.jonanorman.android.webviewup:download-source:0.1.0
支持的內(nèi)核版本
| WebView 包名 | 系統(tǒng)版本 |
|---|---|
| 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 |
已測試機(jī)型
| 廠商 | 系統(tǒng)版本 |
|---|---|
| 華為 Mate30 | 12 |
| 小米10 | 11 |
| VIVO NEX A | 10 |
| OPPO FIND X5 | 14 |
待開發(fā)功能
- 多進(jìn)程支持
- 動態(tài)切換
升級方法詳解
升級流程
1. 前置檢查:獲取當(dāng)前 WebView 包名與版本 ↓ 2. 判斷是否需要升級(對比目標(biāo)版本) ↓ 3. 準(zhǔn)備升級源(網(wǎng)絡(luò)下載/內(nèi)置/安裝包) ↓ 4. 執(zhí)行升級(必須在 WebView 首次初始化之前) ↓ 5. 監(jiān)聽進(jìn)度與結(jié)果 ↓ 6. 驗證升級結(jié)果(包名/版本/H.265 能力)
升級源類型
WebViewUpgrade 支持三種升級源:
- 下載源 (DownloadSource):從網(wǎng)絡(luò)下載 WebView APK
- 內(nèi)置源 (AssetSource):從應(yīng)用的 assets 目錄加載 APK
- 安裝包源 (PackageSource):直接指定目標(biāo)包名(需設(shè)備可安裝)
升級時機(jī)要求
關(guān)鍵限制:必須在任何 WebView 實例化之前完成升級與切換,否則容易出現(xiàn) UnsatisfiedLinkError: Shared library already opened 等鏈接錯誤。
推薦位置:在 Application.onCreate() 的最早時機(jī)執(zhí)行升級。
替代方案對比
方案對比表
| 方案 | 核心思路 | 適配/升級能力 | 優(yōu)點 | 局限與風(fēng)險 | 典型場景 |
|---|---|---|---|---|---|
| WebViewUpgrade(免安裝替換內(nèi)核) | 運行時 Hook WebViewUpdateService / PackageManagerService,以 App 內(nèi) APK 作為 WebView 實現(xiàn) | 可切換到 com.google.android.webview / com.android.webview / com.huawei.webview 等;實測可把華為機(jī)型的 Chromium <107 升到 122.0.6261.64,從而支持 H.265 | 不依賴 Play/系統(tǒng)商店;對存量設(shè)備"即插即用";對 H.265 提升明顯 | 需嚴(yán)格在 WebView 首次初始化前執(zhí)行;存在多進(jìn)程/動態(tài)切換未完全支持、簽名/ABI/so 路徑等工程坑;國內(nèi)部分廠商機(jī)型可能受限 | 面向大量存量用戶、無法強依賴商店升級、且需快速補齊 HEVC/ES6/視頻能力 |
| 騰訊 X5(TBS) | 接入騰訊瀏覽服務(wù)內(nèi)核(com.tencent.smtt.sdk.WebView),與系統(tǒng) WebView API 相似 | 可獨立于系統(tǒng)更新內(nèi)核;對 H.265 的支持取決于內(nèi)核版本(免費版常見為 Chromium 89,不支持 H.265;部分渠道稱可到 Chromium 95,需驗證) | 兼容性與穩(wěn)定性好;視頻/文件能力增強;接入成本相對低 | 包體增大;內(nèi)核并非最新;部分站點在 X5 下仍可能加載失敗;與系統(tǒng) WebView 存在差異需回歸測試 | 面向國內(nèi)中低端/碎片化機(jī)型、希望快速提升兼容與視頻能力 |
| Crosswalk(已停更) | 將 Chromium/Blink 直接打進(jìn) APK 作為獨立內(nèi)核 | 一次性解決低版本系統(tǒng)兼容問題 | 歷史項目中對低版本 Android 的 HTML5/性能有明顯提升 | 項目自 2017 年起停更,內(nèi)核版本停留在 Chromium 53;包體顯著增加;內(nèi)存占用高、白屏等問題較多 | 僅建議維護(hù)老項目或特定離線場景,不建議新項目采用 |
| GeckoView(Mozilla) | 使用 Gecko 引擎的獨立組件(非系統(tǒng) WebView 替代) | 可隨 App 獨立更新 | 標(biāo)準(zhǔn)支持與隱私特性好;可深度定制 | API 與系統(tǒng) WebView 不同,遷移成本高;包體/內(nèi)存開銷大 | 需要長期穩(wěn)定維護(hù)自有內(nèi)核、對標(biāo)準(zhǔn)一致性與可定制性要求高的場景 |
| 系統(tǒng) WebView 官方更新 | 通過 Google Play 或系統(tǒng)更新 Android System WebView / Chrome | 覆蓋廣、維護(hù)成本低 | 官方路徑最穩(wěn);與系統(tǒng)組件一致 | 國內(nèi)渠道/廠商機(jī)型可能不可用或更新滯后;無法覆蓋所有存量設(shè)備 | 能依賴商店與系統(tǒng)更新的用戶群體,作為首選基線方案 |
選型建議
目標(biāo)是快速解決 H.265/HEVC 與 ES6/現(xiàn)代 Web API 的兼容性,且無法保證用戶能及時通過商店升級系統(tǒng) WebView:
- 優(yōu)先嘗試 WebViewUpgrade,在 Application 最早時機(jī)執(zhí)行升級,并在升級完成后再初始化 WebView
- 對華為等機(jī)型重點驗證 Chromium ≥107 的硬解能力與實際播放功耗
面向國內(nèi)大眾機(jī)型、希望以較小改造成本提升整體兼容與視頻能力:
- 采用 騰訊 X5 作為兜底或并行方案
- 上線前對目標(biāo)站點與視頻規(guī)格做回歸,確認(rèn) X5 內(nèi)核版本與 H.265 支持情況(免費版常見為 Chromium 89,不支持 H.265)
需要長期可控的內(nèi)核與差異化能力、能接受較大包體與維護(hù)成本:
- 考慮 GeckoView 自研內(nèi)核路線
- 若只是補齊老舊系統(tǒng)兼容,不建議新項目使用已停更的 Crosswalk
能依賴官方更新通道:
- 將 系統(tǒng) WebView/Chrome 更新 作為基線策略
- 結(jié)合應(yīng)用內(nèi)特性探測與降級(H.264/軟解/提示)形成完整兼容方案
接入與使用步驟
1. 添加依賴
在 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'
2. 準(zhǔn)備內(nèi)核包與來源
方式 A:下載源
UpgradeDownloadSource upgradeSource = new UpgradeDownloadSource(
context,
url, // WebView APK 的下載地址
file // 保存的目標(biāo)文件
);方式 B:內(nèi)置源
將 WebView APK 放入 assets 目錄,使用 UpgradeAssetSource。
方式 C:安裝包源
直接指定目標(biāo)包名(需設(shè)備可安裝),使用 UpgradePackageSource。
3. 執(zhí)行升級(務(wù)必在任何 WebView 實例化之前)
完整示例代碼
// 1. 定義升級信息
UpgradeInfo info = new UpgradeInfo(
"com.google.android.webview", // 目標(biāo)包名
"122.0.6261.64", // 目標(biāo)版本
"https://raw.githubusercontent.com/.../com.google.android.webview_122.0.6261.64_armeabi-v7a.zip", // 下載地址
"網(wǎng)絡(luò)" // 來源描述
);
// 2. 前置檢查:獲取當(dāng)前 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. 創(chuàng)建升級源
UpgradeSource src = info.toUpgradeSource(context);
if (src == null) return;
// 5. 執(zhí)行升級
WebViewUpgrade.upgrade(src);4. 監(jiān)聽進(jìn)度與結(jié)果
方式 A:輪詢方式
// 檢查狀態(tài)
if (WebViewUpgrade.isProcessing()) {
float progress = WebViewUpgrade.getUpgradeProcess();
// 更新進(jìn)度 UI
}
if (WebViewUpgrade.isCompleted()) {
// 升級完成,初始化 WebView
}
if (WebViewUpgrade.isFailed()) {
Throwable error = WebViewUpgrade.getUpgradeError();
// 處理錯誤
}方式 B:回調(diào)方式
WebViewUpgrade.setUpgradeCallback(new UpgradeCallback() {
@Override
public void onUpgradeProcess(float percent) {
// 更新進(jìn)度 UI
}
@Override
public void onUpgradeComplete() {
// 升級完成,初始化 WebView 并加載頁面
}
@Override
public void onUpgradeError(Throwable t) {
// 記錄日志/降級策略
}
});5. 驗證結(jié)果
驗證包名和版本
# 通過 adb 命令驗證 adb shell pm dump com.android.webview | grep version # 或使用 dumpsys dumpsys webviewupdate # 或在代碼中驗證 String pkgName = WebViewUpgrade.getSystemWebViewPackageName(); String version = WebViewUpgrade.getSystemWebViewPackageVersion();
驗證 H.265 能力
在 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 硬件解碼
}
});注意事項與限制
關(guān)鍵限制
時機(jī)要求極嚴(yán)
- 必須在任何 WebView 實例化之前完成升級
- 否則易出現(xiàn)
UnsatisfiedLinkError: Shared library already opened等鏈接錯誤 - 推薦在
Application.onCreate()的最早時機(jī)執(zhí)行
多進(jìn)程與動態(tài)切換不支持
- 當(dāng)前實現(xiàn)不支持運行時動態(tài)切換
- 啟用多進(jìn)程相關(guān)能力會報錯
- 項目路線圖包含"Multi-process / Dynamic Switching",但尚未完成
廠商與簽名/ABI 約束
- 部分廠商機(jī)型對 WebView 提供者選擇/更新有定制或限制
- 覆蓋安裝時可能因簽名不一致失敗
- 未安裝 APK 的
PackageInfo需要手動補齊nativeLibraryDir/ABI等字段,處理不當(dāng)會崩潰
成熟度與維護(hù)
- 項目仍處于測試階段,雖有持續(xù)提交,但 API 與穩(wěn)定性仍需長期回歸與監(jiān)控
上線前驗證清單
版本與提供者驗證
- 使用
adb shell pm dump com.android.webview | grep version或dumpsys webviewupdate校驗當(dāng)前包名/版本
- 使用
H.265 能力驗證
- H5 側(cè)用
MediaSource.isTypeSupported('video/mp4; codecs="hev1...")'與(可選)VideoDecoder.isConfigSupported({hardwareAcceleration:true})驗證硬解可用性
- H5 側(cè)用
穩(wěn)定性回歸
- 覆蓋首次安裝/升級后首次啟動/多機(jī)型/多進(jìn)程場景
- 監(jiān)控崩潰/ANR/so 加載等指標(biāo)
合規(guī)與風(fēng)控
- 替換系統(tǒng)組件行為在少數(shù)機(jī)型/系統(tǒng)上可能受限
- 建議灰度發(fā)布、完備回滾與異常監(jiān)控
- 避免影響核心業(yè)務(wù)穩(wěn)定性
總結(jié)與建議
核心結(jié)論
針對需要快速補齊 H.265/HEVC、ES6/現(xiàn)代 Web API 的兼容性訴求,且無法保證用戶通過商店或系統(tǒng)更新 WebView/Chrome 的場景,WebViewUpgrade 通常是"收益最高"的兜底方案:
- 它能在運行時把內(nèi)核切到更高版本(如
com.google.android.webview 122.0.6261.64) - 在華為/亞馬遜等機(jī)型上實測可解決低版本 Chromium 無法硬解 H.265 的問題
- 但它屬于"非官方、侵入式"方案,存在時機(jī)與多進(jìn)程限制,需充分評估后再上線
更穩(wěn)妥的落地策略
分層策略:
- 優(yōu)先引導(dǎo)用戶通過官方渠道更新 Android System WebView/Chrome
- 對無法更新的存量設(shè)備,再啟用 WebViewUpgrade 作為兜底
- 對國內(nèi)碎片化機(jī)型,可并行評估騰訊 X5 作為備選(注意其免費版常見 Chromium 89,對 H.265 支持需驗證)
判斷邏輯總結(jié)
在 Android 5.0+ 系統(tǒng)上,只有當(dāng)設(shè)備的 WebView 內(nèi)核版本足夠新(如 Chromium ≥ 107)、MediaSource.isTypeSupported 和 VideoDecoder.isConfigSupported({hardwareAcceleration:true}) 均返回 true,且系統(tǒng) MediaCodec 能成功創(chuàng)建 HEVC 解碼器時,才能認(rèn)為可以流暢地進(jìn)行 H.265 硬件解碼;否則,一律按軟解或降級處理。
流程圖
開始: WebView 播放 H.265
↓
API Level ≥ 21?
├─ 否 → 結(jié)論: 系統(tǒng)不支持, 走軟解/降級
└─ 是 → WebView 內(nèi)核版本 ≥ 閾值?
├─ 否 → 結(jié)論: 系統(tǒng)不支持, 走軟解/降級
└─ 是 → JS 探測: MediaSource.isTypeSupported
├─ 返回 false → 結(jié)論: 系統(tǒng)不支持, 走軟解/降級
└─ 返回 true → 是否支持 WebCodecs VideoDecoder?
├─ 否 → 結(jié)論: 走軟解 (FFmpeg/內(nèi)置軟解)
└─ 是 → JS 探測: VideoDecoder.isConfigSupported
├─ 返回 false → 結(jié)論: 走軟解 (FFmpeg/內(nèi)置軟解)
└─ 返回 true → 結(jié)論: 支持 H.265 硬件解碼 ? 流暢播放WebView安全加固核心原則
| 安全風(fēng)險 | 核心原則 | 實踐要點 |
|---|---|---|
| 惡意代碼執(zhí)行 | 最小化攻擊面 | 按需啟用JavaScript、文件訪問等;移除歷史遺留接口。 |
| JSB通信漏洞 | 安全的交互方式 | 禁止addJavascriptInterface,首選addWebMessageListener進(jìn)行嚴(yán)格的源(Origin)校驗。 |
| 數(shù)據(jù)監(jiān)聽/篡改 | 加密與校驗 | 強制使用HTTPS,正確校驗SSL證書,部署CSP。 |
| 資源濫用/崩潰 | 謹(jǐn)慎的生命周期管理 | 獨立進(jìn)程管理WebView,及時釋放資源。 |
| 代碼逆向分析 | 防御性加固 | 使用ProGuard/R8混淆代碼。 |
總結(jié)
到此這篇關(guān)于Android WebView版本升級方案對比及注意事項詳解的文章就介紹到這了,更多相關(guān)Android WebView版本升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android App中讀取XML與JSON格式數(shù)據(jù)的基本方法示例
這篇文章主要介紹了Android App中讀取XML與JSON格式數(shù)據(jù)的基本方法示例,Android中自帶的JSONObject非常好用,需要的朋友可以參考下2016-03-03
Android系統(tǒng)設(shè)置中的清除數(shù)據(jù)會清除哪些數(shù)據(jù)?
這篇文章主要介紹了Android系統(tǒng)設(shè)置中的清除數(shù)據(jù)會清除哪些數(shù)據(jù)?本文對比了清除前和清除后的數(shù)據(jù)情況,從而得出到底清除了哪些數(shù)據(jù),需要的朋友可以參考下2015-01-01
Flutter禁止手機(jī)橫屏的簡單實現(xiàn)方法
app默認(rèn)是可以橫屏的,如果需要禁止橫屏話可以參考這篇文章,本文主要給大家介紹了關(guān)于Flutter禁止手機(jī)橫屏的簡單實現(xiàn)方法,需要的朋友可以參考下2021-07-07
Android調(diào)用系統(tǒng)圖片裁剪限定尺寸及7.0照相問題的解決方法
這篇文章主要介紹了Android調(diào)用系統(tǒng)圖片裁剪限定尺寸,及7.0照相問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android訪問php取回json數(shù)據(jù)實例
Android訪問php取回json數(shù)據(jù),實現(xiàn)代碼如下,遇到訪問網(wǎng)絡(luò)的權(quán)限不足在AndroidManifest.xml中,需要進(jìn)行如下配置2013-06-06
Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Android復(fù)選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復(fù)選框CheckBox與開關(guān)按鈕Switch及單選按鈕RadioButton使用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09

