Android?WebView升級詳細操作指南
一、項目背景
1.1 需求
項目需要使用WebView加載合作方公司的Url(里面功能比較多):
使用了ES6(ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經(jīng)在 2015 年 6 月正式發(fā)布了(所以也被叫作ES2015))
JavaScript 使用的函數(shù),要求 chrome 最低版本是85。
一系列原因?qū)е耊ebView加載該鏈接報錯,合作方那邊因為某些原因,不想改變現(xiàn)有的代碼實現(xiàn)等。需要我們自行解決,那就開整唄。
1.2 設(shè)備
Android 8.1, WebView 版本 60.xxxx.xxxx.xx(好吧,忘記版本了,頁面打不開))
Android 8.1, WebView 版本 61.0.3163.98(頁面打不開)
Android 11, WebView 版本 83.0.4103.120(視頻無法播放,廠商給的答復是不支持,具體原因沒說)
查看版本號:
可以進入設(shè)置-開發(fā)者模式-Webview實現(xiàn)可以看到 Webview 內(nèi)核版本號。
adb 命令: adb shell pm dump com.android.webview|grep version
adb shell pm dump com.android.webview|grep version
versionCode=410412053 minSdk=21 targetSdk=30
versionName=83.0.4103.120
signatures=PackageSignatures{48d4530 version:3, signatures:[63b96fc5], past signatures:[]}1.3 解決方案
1.騰訊X5內(nèi)核,還是加載失敗,以為是集成錯誤。特意使用微信打開該鏈接,也是加載失敗。
2.更新安裝包,因為內(nèi)嵌WebView的是com.android.webview。
2.1 下載了包名為 95.0.4638.50-463805003_minAPI21版本的包,進行覆蓋安裝->報錯,提示簽名文件不一致。
2.2 下載com.android.google.weview_95.0.4638.74_APKPure,安裝成功了,加載還是報錯。而且在WebView實現(xiàn)->不可選擇com.android.google.webview。
3.修改framework-res.apk中配置,允許WebView實現(xiàn)選擇com.android.google.webview。這種操作不太合適2C,需要root權(quán)限,修改系統(tǒng)文件,一不留神就可能產(chǎn)生其他問題。
4.使用 WebViewUpgrade,這個還是比較強大的,對WebView內(nèi)核進行升級。已解決低版本無法加載url、視頻無法播放的問題。
二、WebViewUpgrade 接入
WebViewUpgrade的創(chuàng)建者遇到的問題:華為機上因為WebView內(nèi)核的Chromium版本低于107無法播放H265視頻的情況,為了解決上述問題可以用JS實現(xiàn)H265播放,但是會比較卡,就想不能讓WebView用應(yīng)用內(nèi)的APK作為內(nèi)核。
2.1 支持版本
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
當然,你也可以找到其他版本下載安裝即可。例如 com.android.webview,我覺得113版本太高,那么你可以下載一個95版本的?;蛘吣悴幌胧褂胏om.android.webview 改用 com.google.android.webview也是可以的。
2.2 接入
2.2.1 導入項目(我使用的是這個)
將Demo的core和download-source模塊直接導入到自己項目,修改core中 implementation 'androidx.appcompat:appcompat:1.6.1'的版本。
2.2.2 implementation
implementation 'io.github.jonanorman.android.webviewup:core:0.1.0'// 不需要下載APK時使用 implementation 'io.github.jonanorman.android.webviewup:download-source:0.1.0'// 需要下載APK使用
如果是低版本,可能會報錯。core中 implementation 'androidx.appcompat:appcompat:1.6.1'的版本比較高,需要兼容的SDK版本也比較高。
解決方案:
1.提高項目 SDK 版本。
2.使用exclude。
以上兩種方式都可以。
2.3 使用
設(shè)置
private void setWebView(){
UpgradeInfo upgradeInfo = new UpgradeInfo(
"com.android.webview",
"113.0.5672.136",
"https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.webview_113.0.5672.13_armeabi-v7a.zip",
"網(wǎng)絡(luò)");
String systemWebViewPackageName = WebViewUpgrade.getSystemWebViewPackageName();
if (systemWebViewPackageName != null &&systemWebViewPackageName.equals(upgradeInfo.packageName)
&& VersionUtils.compareVersion( WebViewUpgrade.getSystemWebViewPackageVersion(),upgradeInfo.versionName) >= 0) {
//Toast.makeText(getApplicationContext(), "system webView is larger than the one to be upgraded, so there is no need to upgrade", Toast.LENGTH_LONG).show();
return;
}
UpgradeSource upgradeSource = upgradeInfo.toUpgradeSource(RobotApplication.getInstance());
if (upgradeSource == null) {
return;
}
WebViewUpgrade.upgrade(upgradeSource);
updateUpgradeWebViewStatus();
}
}這里我使用的是網(wǎng)絡(luò)下載:
包名:com.android.webview;
版本號:113.0.5672.136
下載內(nèi)核地址:https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.webview_113.0.5672.13_armeabi-v7a.zip
//更新狀態(tài)
private void updateUpgradeWebViewStatus() {
if (WebViewUpgrade.isProcessing()) {
LogUtils.e("WebVIewUpgrade","Upgrading...");
} else if (WebViewUpgrade.isFailed()) {
LogUtils.e("WebVIewUpgrade","Fail...");
} else if (WebViewUpgrade.isCompleted()) {
LogUtils.e("WebVIewUpgrade","complete...");
}
int process = (int) (WebViewUpgrade.getUpgradeProcess() * 100);
LogUtils.e("WebVIewUpgrade","Processing:-----"+process + "%");
Throwable throwable = WebViewUpgrade.getUpgradeError();
if (throwable != null) {
LogUtils.e("WebVIewUpgrade","Throwable.message:" + throwable.getMessage() + "\nstackTrace:" + Log.getStackTraceString(throwable));
}
}
public class UpgradeInfo {
public String title;
public String url;
public String packageName;
public String versionName;
public String extraInfo;
public UpgradeInfo(String packageName, String versionName, String url, String extraInfo) {
this.title = packageName + "\n" + versionName;
this.extraInfo = !TextUtils.isEmpty(extraInfo) ? extraInfo : "";
if (!extraInfo.isEmpty()) {
this.title = this.title + "\n" + extraInfo;
}
this.url = url;
this.packageName = packageName;
this.versionName = versionName;
}
public UpgradeInfo(String packageName, String versionName, String url) {
this(packageName, versionName, url, "");
}
@Nullable
public UpgradeSource toUpgradeSource(Context context) {
UpgradeSource upgradeSource = null;
if (this.extraInfo.equals("網(wǎng)絡(luò)")) {
upgradeSource = new UpgradeDownloadSource(
context,
this.url,
new File(context.getFilesDir(), this.packageName + "/" + this.versionName + ".apk")
);
} else if (this.extraInfo.equals("內(nèi)置")) {
upgradeSource = new UpgradeAssetSource(
context,
this.url,
new File(context.getFilesDir(), this.packageName + "/" + this.versionName + ".apk")
);
} else if (this.extraInfo.equals("安裝包")) {
upgradeSource = new UpgradePackageSource(
context,
this.packageName
);
}
return upgradeSource;
}
public class MainActivity extends BaseActivity implements , UpgradeCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setWebView();
}
private void setWebView(){
......
}
//更新中
@Override
public void onUpgradeProcess(float percent) {
updateUpgradeWebViewStatus();
}
//更新完成
@Override
public void onUpgradeComplete() {
updateUpgradeWebViewStatus();
}
//更新失敗
@Override
public void onUpgradeError(Throwable throwable) {
updateUpgradeWebViewStatus();
}
}
注意:這個代碼盡量前置,如果無法前置,需要保證,其他地方先不要對WebView進行操作。如果操作了,會導致初始化失敗。
可以先試用Demo嘗試功能是否可用,再集成到自己的項目中。
2.4 WebView
執(zhí)行完上面的操作后,你就正常操作WebView即可。上面我只是列舉了網(wǎng)上下載的例子(第一次下載,只要文件存在,無需重復下載),還支持內(nèi)置/安裝包的形式,我這是應(yīng)用包體太大,不適合內(nèi)置。
這種方式是可行的,但是也有一些小的前置條件需要注意,如果無法前置會導致使用失敗。怎么前置才能做到萬無一失,就需要根據(jù)實際情況來判斷了。
總結(jié)
到此這篇關(guān)于Android WebView升級的文章就介紹到這了,更多相關(guān)Android WebView升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程開發(fā)之Spinner控件用法實例分析
這篇文章主要介紹了Android編程開發(fā)之Spinner控件用法,結(jié)合實例形式較為詳細的分析了下拉列表Spinner的具體使用技巧,需要的朋友可以參考下2015-12-12
android Tween Animation屬性設(shè)置方法實例
在Android開發(fā)中,Animation是用來給控件制作效果的,本文介紹二種實現(xiàn)方法2013-11-11
Android WebView支持input file啟用相機/選取照片功能
這篇文章主要介紹了Android-WebView支持input file啟用相機/選取照片功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
Android編程開發(fā)之打開文件的Intent及使用方法
這篇文章主要介紹了Android編程開發(fā)之打開文件的Intent及使用方法,已實例形式分析了Android打開文件Intent的相關(guān)布局及功能實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗
這篇文章主要為大家詳細介紹了android實現(xiàn)可自由移動、監(jiān)聽點擊事件的懸浮窗,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12

