ToB企服应用市场:ToB评测及商务社交产业平台

标题: Android WebView升级 [打印本页]

作者: 羊蹓狼    时间: 2024-8-27 01:42
标题: Android WebView升级
目次
一、项目配景
1.1 需求
1.2 设备
1.3 办理方案
二、WebViewUpgrade 接入
2.1 支持版本
2.2 接入
2.2.1 导入项目(我使用的是这个)
2.2.2 implementation
2.3 使用
2.4 WebView


一、项目配景

1.1 需求

项目必要使用WebView加载合作方公司的Url(里面功能比力多):
一系列原因导致WebView加载该链接报错,合作方那边因为某些原因,不想改变现有的代码实现等。必要我们自行办理,那就开整呗。
1.2 设备


检察版本号:
  1. adb shell pm dump com.android.webview|grep version
  2.     versionCode=410412053 minSdk=21 targetSdk=30
  3.     versionName=83.0.4103.120
  4.     signatures=PackageSignatures{48d4530 version:3, signatures:[63b96fc5], past signatures:[]}
复制代码
1.3 办理方案

1.腾讯X5内核,还是加载失败,以为是集成错误。特意使用微信打开该链接,也是加载失败。
2.更新安装包,因为内嵌WebView的是com.android.webview。

3.修改framework-res.apk中配置,答应WebView实现选择com.android.google.webview。这种操作不太合适2C,必要root权限,修改系统文件,一不留神就可能产生其他问题。
4.使用 WebViewUpgrade,这个还是比力强大的,对WebView内核进行升级。已办理低版本无法加载url、视频无法播放的问题。
二、WebViewUpgrade 接入

        WebViewUpgrade的创建者碰到的问题:华为机上因为WebView内核的Chromium版本低于107无法播放H265视频的情况,为了办理上述问题可以用JS实现H265播放,但是会比力卡,就想不能让WebView用应用内的APK作为内核。
2.1 支持版本


当然,你也可以找到其他版本下载安装即可。例如 com.android.webview,我觉得113版本太高,那么你可以下载一个95版本的。大概你不想使用com.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

  1. implementation 'io.github.jonanorman.android.webviewup:core:0.1.0'// 不需要下载APK时使用
  2. implementation 'io.github.jonanorman.android.webviewup:download-source:0.1.0'// 需要下载APK使用
复制代码
        如果是低版本,可能会报错。core中 implementation 'androidx.appcompat:appcompat:1.6.1'的版本比力高,必要兼容的SDK版本也比力高。
办理方案:

以上两种方式都可以。
2.3 使用

      设置
  1.     private void setWebView(){
  2.         UpgradeInfo upgradeInfo = new UpgradeInfo(
  3.                 "com.android.webview",
  4.                 "113.0.5672.136",
  5.                 "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.webview_113.0.5672.13_armeabi-v7a.zip",
  6.                 "网络");
  7.         String  systemWebViewPackageName = WebViewUpgrade.getSystemWebViewPackageName();
  8.         if (systemWebViewPackageName != null &&systemWebViewPackageName.equals(upgradeInfo.packageName)
  9.                 && VersionUtils.compareVersion( WebViewUpgrade.getSystemWebViewPackageVersion(),upgradeInfo.versionName) >= 0) {
  10.             //Toast.makeText(getApplicationContext(), "system webView is larger than the one to be upgraded, so there is no need to upgrade", Toast.LENGTH_LONG).show();
  11.             return;
  12.         }
  13.         UpgradeSource upgradeSource = upgradeInfo.toUpgradeSource(RobotApplication.getInstance());
  14.         if (upgradeSource == null) {
  15.             return;
  16.         }
  17.         WebViewUpgrade.upgrade(upgradeSource);
  18.         updateUpgradeWebViewStatus();
  19.     }
  20. }
复制代码
这里我使用的是网络下载:

  1.     //更新状态
  2.     private void updateUpgradeWebViewStatus() {
  3.         if (WebViewUpgrade.isProcessing()) {
  4.             LogUtils.e("WebVIewUpgrade","Upgrading...");
  5.         } else if (WebViewUpgrade.isFailed()) {
  6.             LogUtils.e("WebVIewUpgrade","Fail...");
  7.         } else if (WebViewUpgrade.isCompleted()) {
  8.             LogUtils.e("WebVIewUpgrade","complete...");
  9.         }
  10.         int process = (int) (WebViewUpgrade.getUpgradeProcess() * 100);
  11.         LogUtils.e("WebVIewUpgrade","Processing:-----"+process + "%");
  12.         Throwable throwable = WebViewUpgrade.getUpgradeError();
  13.         if (throwable != null) {
  14.             LogUtils.e("WebVIewUpgrade","Throwable.message:" + throwable.getMessage() + "\nstackTrace:" + Log.getStackTraceString(throwable));
  15.         }
  16.     }
  17. public class UpgradeInfo {
  18.     public String title;
  19.     public String url;
  20.     public String packageName;
  21.     public String versionName;
  22.     public String extraInfo;
  23.     public UpgradeInfo(String packageName, String versionName, String url, String extraInfo) {
  24.         this.title = packageName + "\n" + versionName;
  25.         this.extraInfo = !TextUtils.isEmpty(extraInfo) ? extraInfo : "";
  26.         if (!extraInfo.isEmpty()) {
  27.             this.title = this.title + "\n" + extraInfo;
  28.         }
  29.         this.url = url;
  30.         this.packageName = packageName;
  31.         this.versionName = versionName;
  32.     }
  33.     public UpgradeInfo(String packageName, String versionName, String url) {
  34.         this(packageName, versionName, url, "");
  35.     }
  36.     @Nullable
  37.     public UpgradeSource toUpgradeSource(Context context) {
  38.         UpgradeSource upgradeSource = null;
  39.         if (this.extraInfo.equals("网络")) {
  40.             upgradeSource = new UpgradeDownloadSource(
  41.                     context,
  42.                     this.url,
  43.                     new File(context.getFilesDir(), this.packageName + "/" + this.versionName + ".apk")
  44.             );
  45.         } else if (this.extraInfo.equals("内置")) {
  46.             upgradeSource = new UpgradeAssetSource(
  47.                     context,
  48.                     this.url,
  49.                     new File(context.getFilesDir(), this.packageName + "/" + this.versionName + ".apk")
  50.             );
  51.         } else if (this.extraInfo.equals("安装包")) {
  52.             upgradeSource = new UpgradePackageSource(
  53.                     context,
  54.                     this.packageName
  55.             );
  56.         }
  57.         return upgradeSource;
  58.     }
  59.     
复制代码
  1. public class MainActivity extends BaseActivity implements , UpgradeCallback {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setWebView();
  6.     }
  7.     private void setWebView(){
  8.         ......
  9.     }
  10.     //更新中
  11.     @Override
  12.     public void onUpgradeProcess(float percent) {
  13.         updateUpgradeWebViewStatus();
  14.     }
  15.     //更新完成
  16.     @Override
  17.     public void onUpgradeComplete() {
  18.         updateUpgradeWebViewStatus();
  19.     }
  20.     //更新失败
  21.     @Override
  22.     public void onUpgradeError(Throwable throwable) {
  23.         updateUpgradeWebViewStatus();
  24.     }
  25. }
复制代码
  注意:这个代码只管前置,如果无法前置,必要保证,其他地方先不要对WebView进行操作。如果操作了,会导致初始化失败。          可以先试用Demo实验功能是否可用,再集成到自己的项目中。
2.4 WebView

        实行完上面的操作后,你就正常操作WebView即可。上面我只是列举了网上下载的例子(第一次下载,只要文件存在,无需重复下载),还支持内置/安装包的形式,我这是应用包体太大,不得当内置。
        这种方式是可行的,但是也有一些小的前置条件必要注意,如果无法前置会导致使用失败。怎么前置才能做到十拿九稳,就必要根据实际情况来判定了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4