浏览代码

从chrome的安装包升级

JonaNorman 1 年之前
父节点
当前提交
84030a44ce

+ 3 - 1
app/src/main/AndroidManifest.xml

@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
 
-
+    <queries>
+        <package android:name="com.android.chrome" />
+    </queries>
 
     <application
         android:name=".MyApp"

+ 13 - 1
app/src/main/java/com/norman/webviewup/demo/MainActivity.java

@@ -7,6 +7,7 @@ import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
+import android.webkit.WebView;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -18,6 +19,7 @@ import androidx.appcompat.app.AlertDialog;
 import com.norman.webviewup.lib.UpgradeCallback;
 import com.norman.webviewup.lib.WebViewUpgrade;
 import com.norman.webviewup.lib.source.UpgradeAssetSource;
+import com.norman.webviewup.lib.source.UpgradePackageSource;
 import com.norman.webviewup.lib.source.UpgradeSource;
 import com.norman.webviewup.lib.source.download.UpgradeDownloadSource;
 import com.norman.webviewup.lib.util.ProcessUtils;
@@ -65,7 +67,12 @@ public class MainActivity extends Activity implements UpgradeCallback {
                 new UpgradeInfo("com.amazon.webview.chromium",
                         "118-5993-tv.5993.155.51",
                         "com.webview.chromium_118-5993-tv.5993.155.51_armeabi-v7a.apk",
-                        "内置")
+                        "内置"),
+                new UpgradeInfo(
+                        "com.android.chrome",
+                        "122.0.6261.43",
+                        "",
+                        "安装包")
 
 
         ));
@@ -211,6 +218,11 @@ public class MainActivity extends Activity implements UpgradeCallback {
                     upgradeInfo.url,
                     new File(getApplicationContext().getFilesDir(), upgradeInfo.packageName + "/" + upgradeInfo.versionName + ".apk")
             );
+        } else if (upgradeInfo.extraInfo.equals("安装包")) {
+            upgradeSource = new UpgradePackageSource(
+                    getApplicationContext(),
+                    upgradeInfo.packageName
+            );
         }
         return upgradeSource;
     }

+ 0 - 21
app/src/main/java/com/norman/webviewup/demo/WebViewActivity.java

@@ -1,33 +1,12 @@
 package com.norman.webviewup.demo;
 
-import android.Manifest;
-import android.annotation.SuppressLint;
 import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.DownloadManager;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
-import android.os.Environment;
-import android.os.Looper;
-import android.util.Log;
-import android.webkit.CookieManager;
-import android.webkit.URLUtil;
 import android.webkit.WebResourceRequest;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
-import android.webkit.WebViewRenderProcess;
-import android.webkit.WebViewRenderProcessClient;
 import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
-import androidx.core.app.ActivityCompat;
 
 
 public class WebViewActivity extends Activity {

+ 47 - 0
core/src/main/java/com/norman/webviewup/lib/WebViewReplace.java

@@ -91,6 +91,53 @@ public class WebViewReplace {
         }
     }
 
+
+    public synchronized static void replace(Context context, PackageInfo packageInfo) throws WebViewReplaceException {
+        WebViewUpdateServiceHook updateServiceHook = null;
+        try {
+            if (context == null) {
+                throw new WebViewReplaceException("context is null");
+            }
+            if (packageInfo == null) {
+                throw new WebViewReplaceException("packageInfo is null");
+            }
+
+            if (Looper.myLooper() != Looper.getMainLooper()) {
+                throw new WebViewReplaceException("replace webView only in main thread");
+            }
+
+            updateServiceHook = new WebViewUpdateServiceHook(context, packageInfo.packageName);
+            updateServiceHook.hook();
+            if (SYSTEM_WEB_VIEW_PACKAGE_INFO == null) {
+                SYSTEM_WEB_VIEW_PACKAGE_INFO = loadCurrentWebViewPackageInfo();
+            }
+            checkWebView(context);
+            REPLACE_WEB_VIEW_PACKAGE_INFO = loadCurrentWebViewPackageInfo();
+        } catch (Throwable throwable) {
+            if (throwable instanceof WebViewReplaceException) {
+                throw throwable;
+            } else {
+                String message = throwable.getMessage();
+                if (TextUtils.isEmpty(message)) {
+                    message = "";
+                }
+                throw new WebViewReplaceException(message, throwable);
+            }
+        } finally {
+            try {
+                if (updateServiceHook != null) {
+                    updateServiceHook.restore();
+                }
+            } catch (Throwable throwable) {
+                String message = throwable.getMessage();
+                if (TextUtils.isEmpty(message)) {
+                    message = "";
+                }
+                throw new WebViewReplaceException(message, throwable);
+            }
+        }
+    }
+
     public synchronized static String getSystemWebViewPackageName() {
         if (SYSTEM_WEB_VIEW_PACKAGE_INFO == null) {
             SYSTEM_WEB_VIEW_PACKAGE_INFO = loadCurrentWebViewPackageInfo();

+ 12 - 8
core/src/main/java/com/norman/webviewup/lib/WebViewUpgrade.java

@@ -1,6 +1,7 @@
 package com.norman.webviewup.lib;
 
 
+import com.norman.webviewup.lib.source.UpgradePackageSource;
 import com.norman.webviewup.lib.source.UpgradePathSource;
 import com.norman.webviewup.lib.source.UpgradeSource;
 import com.norman.webviewup.lib.util.HandlerUtils;
@@ -81,18 +82,21 @@ public class WebViewUpgrade {
             UPGRADE_THROWABLE = null;
             UPGRADE_PROCESS = 0;
 
-            if (!(webViewSource instanceof UpgradePathSource)) {
-                return;
-            }
-            UpgradePathSource webViewPathSource = (UpgradePathSource) webViewSource;
-            webViewPathSource.prepare(new UpgradeSource.OnPrepareCallback() {
+            webViewSource.prepare(new UpgradeSource.OnPrepareCallback() {
                 @Override
                 public void onPrepareSuccess(UpgradeSource webViewSource) {
                     HandlerUtils.runInMainThread(() -> {
                         try {
-                            WebViewReplace.replace(webViewSource.getContext(),
-                                    webViewPathSource.getApkPath(),
-                                    webViewPathSource.getLibsPath());
+                            if (webViewSource instanceof UpgradePathSource) {
+                                UpgradePathSource upgradePathSource = (UpgradePathSource) webViewSource;
+                                WebViewReplace.replace(webViewSource.getContext(),
+                                        upgradePathSource.getApkPath(),
+                                        upgradePathSource.getLibsPath());
+                            } else if (webViewSource instanceof UpgradePackageSource) {
+                                UpgradePackageSource upgradePackageSource = (UpgradePackageSource) webViewSource;
+                                WebViewReplace.replace(webViewSource.getContext(),
+                                        upgradePackageSource.getPackageInfo());
+                            }
                             callProcessCallback(1.0f);
                             callCompleteCallback();
                         } catch (WebViewReplaceException e) {

+ 7 - 2
core/src/main/java/com/norman/webviewup/lib/source/UpgradePackageSource.java

@@ -25,10 +25,15 @@ public class UpgradePackageSource extends UpgradeSource {
     @Override
     protected void onPrepare(Object params) {
         try {
-            int flags = params instanceof Integer? (int) params :0;
+            int flags = params instanceof Integer ? (int) params : 0;
             packageInfo = getContext().getPackageManager().getPackageInfo(packageName, flags);
+            if (packageInfo == null) {
+                throw new PackageManager.NameNotFoundException("Package " + packageName + " doesn't exist");
+            }
+            process(1.0f);
+            success();
         } catch (PackageManager.NameNotFoundException e) {
-            throw new RuntimeException(e);
+            error(e);
         }
     }
 }