欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android怎么使用高版本的Webview

程序员文章站 2022-03-29 20:19:16
    Android怎么使用高版本的Webview前言  最近客户提出一个问题,就是由于Android的内置版本WebView版本过低,用户希望能使用高版本的WebView。这个问题有两种解决办法,第一就是系统将内置WebView版本提供,第二就是客户需要使用什么版本的WebView,自行下载然后固件将客户下载的版本作为默认版本。下面就在Android 5.1和7.1的版本上面分别实施。......

        Android怎么使用高版本的Webview

前言

   最近客户提出一个问题,就是由于Android的内置版本WebView版本过低,用户希望能使用高版本的WebView。这个问题有两种解决办法,第一就是系统将内置WebView版本提高,第二就是客户需要使用什么版本的WebView,自行下载然后固件将客户下载的版本作为默认版本。下面分别介绍在Android 5.1和7.1的版本上面的实施步骤。

Android 5.xx版本实施

   该版本使用客户下载的谷歌WebView作为默认的WebView版本,比较简单,原理就是加载默认WebView的时候判断当前是否有谷歌的WebView,如果有就是用谷歌的。

diff --git a/frameworks/base/core/java/android/webkit/WebViewFactory.java b/frameworks/base/core/java/android/webkit/WebViewFactory.java
old mode 100644
new mode 100755
index 474ef422d0..6f652ae061
--- a/frameworks/base/core/java/android/webkit/WebViewFactory.java
+++ b/frameworks/base/core/java/android/webkit/WebViewFactory.java
@@ -69,6 +69,8 @@ public final class WebViewFactory {
 
 
     private static final boolean DEBUG = false;
 
+       private static final String GOOGLE_WEBVIEW_NAME = "com.google.android.webview";
+
     // Cache the factory both for efficiency, and ensure any one process gets all webviews from the
     // same provider.
     private static WebViewFactoryProvider sProviderInstance;
@@ -77,10 +79,31 @@ public final class WebViewFactory {
     private static PackageInfo sPackageInfo;
 
     public static String getWebViewPackageName() {
+               if(isGoogleWebViewExist()){
+                       return GOOGLE_WEBVIEW_NAME;
+               }
         return AppGlobals.getInitialApplication().getString(
                 com.android.internal.R.string.config_webViewPackageName);
     }
 
+       public static boolean isGoogleWebViewExist(){
+               Application initialApplication = AppGlobals.getInitialApplication();
+               PackageInfo packageInfo;
+               try {
+                       packageInfo = initialApplication.getPackageManager().getPackageInfo(GOOGLE_WEBVIEW_NAME, 0);
+               }catch(Exception e){
+                       packageInfo = null;
+                       Log.e(LOGTAG, "error instantiating provider", e);
+               }
+
+               if(packageInfo == null){
+                       return false;
+               }else{
+                       return true;
+               }
+
+       }
+

Android 7.xx版本实施

   该版本使用客户下载的谷歌WebView作为默认的WebView版本,修改逻辑要比5.xx版本复杂,但是原理是一样的就是加载默认WebView的时候判断当前是否有谷歌的WebView,如果有就是用谷歌的,反之就是用系统默认的版本。

diff --git a/frameworks/base/core/res/res/xml/config_webview_packages.xml b/frameworks/base/core/res/res/xml/config_webview_packages.xml
old mode 100644
new mode 100755
index f062b59a00..5d51f62a0f
--- a/frameworks/base/core/res/res/xml/config_webview_packages.xml
+++ b/frameworks/base/core/res/res/xml/config_webview_packages.xml
@@ -16,6 +16,8 @@
 
 <webviewproviders>
     <!-- The default WebView implementation -->
+    <webviewprovider description="Google WebView" packageName="com.google.android.webview">
+    </webviewprovider>
     <webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">
     </webviewprovider>
 </webviewproviders>
diff --git a/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService.java
old mode 100644
new mode 100755
index 846169cbf9..58bce04a69
--- a/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -85,6 +85,13 @@ public class WebViewUpdateService extends SystemService {
                             }
                             break;
                         case Intent.ACTION_PACKAGE_ADDED:
+                                                       
+                                                       String pkgName = packageNameFromIntent(intent);
+                                                       if(pkgName != null && pkgName.equals("com.google.android.webview")){
+                                                               Slog.i(TAG,"change webview to "+pkgName);
+                                                               mImpl.changeProviderAndSetting(packageNameFromIntent(intent));
+                                                       }
+                                                       
                             mImpl.packageStateChanged(packageNameFromIntent(intent),
                                     (intent.getExtras().getBoolean(Intent.EXTRA_REPLACING)
                                      ? PACKAGE_ADDED_REPLACED : PACKAGE_ADDED), userId);
diff --git a/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService
Impl.java
old mode 100644
new mode 100755
index 2cf17229a5..a390ca9c7e
--- a/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
+++ b/frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
@@ -630,6 +630,11 @@ public class WebViewUpdateServiceImpl {
         if (systemInterface.systemIsDebuggable()) {
             return true;
         }
+
+               if(packageInfo != null && packageInfo.packageName.equals("com.google.android.webview")){
+                       return true;
+               }               
+               
         Signature[] packageSignatures;
         // If no signature is declared, instead check whether the package is included in the
         // system.
(END)

总结

   如上就是在Android 5.xx和7.xx版本上面相关实施的git提交记录,即使用客户下载的谷歌WebView作为默认WebView的功能。当然前提也参见了一些博客,譬如WebView如何加载的,下面放上相关的博客链接。
https://www.jianshu.com/p/dea3743da4aa
https://blog.csdn.net/ansondroider/article/details/88892932
https://www.cnblogs.com/mini-monkey/p/11066346.html

本文地址:https://blog.csdn.net/tkwxty/article/details/103028956