背景
Android5.0以后WebView升級需要去Google Play安裝APK(圖一),就算安裝了以后也不一定能行,像華為、Amazon等特殊機(jī)型WebView的Chromium版本一般比較低,只能用它自己的WebView無法用Google的WebView(圖二)。
華為機(jī)上WebView內(nèi)核的Chromium版本低于107無法播放H265視頻,為了解決上述問題可以用JS實(shí)現(xiàn)H265播放,但是會比較卡,也可以用騰訊的X5內(nèi)核,但是免費(fèi)版實(shí)際chromium版本是89不支持H265視頻,這個(gè)時(shí)候我就想能不能用App內(nèi)的WebView APK作為內(nèi)核,下圖是升級WebView內(nèi)核的前后效果對比
升級前在華為機(jī)上的系統(tǒng)WebView內(nèi)核包名是com.huawei.webview
,版本是14.0.0.331,UserAgent中的Chromium實(shí)際版本是99.0.4844.88,如下圖所示小于107不支持H265播放
把WebView內(nèi)核的包名、版本、包地址傳到以下代碼升級內(nèi)核成功后就可以播放H265視頻了
WebView內(nèi)核選擇頁面如下圖所示
升級成功后WebView內(nèi)核的包名變成了com.google.android.webview
,UserAgent中的Chromium實(shí)際版本也變成了122.0.6261.64
項(xiàng)目地址:WebViewUpgrade,這個(gè)項(xiàng)目是為了解決WebView碎片化而產(chǎn)生,當(dāng)前處于測試階段,如果你覺得有所收獲,給這個(gè)庫點(diǎn)個(gè)贊吧,你的鼓勵(lì)是我前進(jìn)最大的動力,
兼容性
Android的設(shè)備五花八門,已測試以下功能和機(jī)型
功能特性
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 |
原理介紹
其實(shí)原理很簡單,從上圖中可以看到WebView初始化的時(shí)候會根據(jù)WebViewProviderResponse(WebViewUpdateService調(diào)用waitForAndGetProvider
)和PackageInfo(PacakgeManagerService調(diào)用getPackageInfo
)生成WebViewFactoryProivder,也就是說只要hook這兩個(gè)方法就行,替換WebViewUpdateService和PacakgeManagerService的調(diào)用很簡單,其實(shí)就是替換Binder的本地接口調(diào)用,網(wǎng)上方案很多就不展開了,如果不清楚的可以直接看代碼。
替換waitForAndGetProvider
值得注意的是WebViewProviderResponse對象的packageInfo查詢時(shí)flags要設(shè)置成GET_SHARED_LIBRARY_FILES|GET_SIGNATURES|GET_META_DATA,后續(xù)代碼中會用這些數(shù)據(jù),不然會崩潰。
替換getPackageInfo
值得注意的是
- 用
getPackageArchiveInfo
查詢未安裝Apk的PackageInfo - 有些APK加上GET_SIGNATURES查詢PackageInfo會找不到
-
getPackageArchiveInfo
查詢出來的PackageInfo不存在nativeLibraryDir,需要手動賦值 - nativeLibraryDir傳入的so路徑需要運(yùn)行時(shí)處理器指令集的ABI一樣,不然會崩潰
- 部分手機(jī)的
packageInfo.applicationInfo.sourceDir
不存在,需要手動賦值
有兩個(gè)功能還沒實(shí)現(xiàn),希望有了解的朋友能提交代碼解決這兩個(gè)問題。
-
運(yùn)行時(shí)動態(tài)切換WebView內(nèi)核,現(xiàn)在只能在WebView未初始化之前替換,原因是因?yàn)闀?bào)錯(cuò)
UnsatisfiedLinkError: Shared library "/system/lib64/libwebviewchromium_plat_support.so" already opened by ClassLoader
,WebView內(nèi)核中會調(diào)用System.loadLibrary加載libwebviewchromium_plat_support.so,而系統(tǒng)限制同一個(gè)so只能被一個(gè)classLoader加載。文章來源:http://www.zghlxwxcb.cn/news/detail-843872.html -
不支持多進(jìn)程功能,如果把WebViewUpdateService的isMultiProcessEnabled設(shè)為true,會報(bào)錯(cuò)
java.lang.RuntimeException: Illegal meta data value: the child service doesn't exist
, 就算把這個(gè)錯(cuò)誤解決了,也無法用Process.startWebView
手動啟動WebViewZygote進(jìn)程文章來源地址http://www.zghlxwxcb.cn/news/detail-843872.html
到了這里,關(guān)于Android免安裝升級系統(tǒng)WebView內(nèi)核探索的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!