JonaNorman 1 vuosi sitten
vanhempi
commit
6679b25c57

+ 1 - 1
README.md

@@ -27,7 +27,7 @@ WebView内核选择页面如下图所示
 
 # 兼容性
 
-Android的设备五花八门,已测试以下功能和机型,欢迎大家提issue和Merge Request加入到这个项目中来,如果有疑惑,可以加这个群
+Android的设备五花八门,已测试以下功能和机型,欢迎大家提issue和Merge Request加入到这个项目中来,有疑惑可以扫码加群,如果二维码显示过期了,可以搜索微信号JonaNorman加我个人微信拉你进群(请备注WebView升级)
 
 <img src="/preview/chat.jpg" width="300px">
 

+ 1 - 1
app/build.gradle

@@ -13,7 +13,7 @@ android {
         versionName "1.0"
 
         ndk {
-            abiFilters "armeabi-v7a"
+            abiFilters "armeabi-v7a","x86"
 //            abiFilters "arm64-v8a", "armeabi-v7a"
         }
     }

+ 0 - 0
app/libs/x86/empty.so


+ 49 - 25
app/src/main/java/com/norman/webviewup/demo/MainActivity.java

@@ -17,37 +17,59 @@ import androidx.appcompat.app.AlertDialog;
 import com.norman.webviewup.lib.UpgradeCallback;
 import com.norman.webviewup.lib.UpgradeOptions;
 import com.norman.webviewup.lib.WebViewUpgrade;
+import com.norman.webviewup.lib.util.ProcessUtils;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 public class MainActivity extends Activity implements UpgradeCallback {
 
-    private static final List<UpgradeInfo> UPGRADE_PACKAGE_LIST = Arrays.asList(
-            new UpgradeInfo(
-                    "com.google.android.webview",
-                    "122.0.6261.64",
-                    "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.google.android.webview_122.0.6261.64_armeabi-v7a.zip"),
-            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"),
-            new UpgradeInfo(
-                    "com.huawei.webview",
-                    "14.0.0.331",
-                    "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.huawei.webview_14.0.0.331_arm64-v8a_armeabi-v7a.zip"),
-            new UpgradeInfo(
-                    "com.android.chrome",
-                    "122.0.6261.43",
-                    "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.chrome_122.0.6261.64_armeabi-v7a.zip"),
 
-            new UpgradeInfo("com.amazon.webview.chromium",
-                    "118-5993-tv.5993.155.51",
-                    "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.amazon.webview.chromium_118-5993-tv.5993.155.51_armeabi-v7a.zip")
+    private static final Map<String,List<UpgradeInfo>> UPGRADE_PACKAGE_MAP = new HashMap<>();
+    static {
+        UPGRADE_PACKAGE_MAP.put("arm",Arrays.asList(
+                new UpgradeInfo(
+                        "com.google.android.webview",
+                        "122.0.6261.64",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.google.android.webview_122.0.6261.64_armeabi-v7a.zip"),
+                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"),
+                new UpgradeInfo(
+                        "com.huawei.webview",
+                        "14.0.0.331",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.huawei.webview_14.0.0.331_arm64-v8a_armeabi-v7a.zip"),
+                new UpgradeInfo(
+                        "com.android.chrome",
+                        "122.0.6261.43",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.chrome_122.0.6261.64_armeabi-v7a.zip"),
+
+                new UpgradeInfo("com.amazon.webview.chromium",
+                        "118-5993-tv.5993.155.51",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.amazon.webview.chromium_118-5993-tv.5993.155.51_armeabi-v7a.zip")
+
+
+        ));
+
+        UPGRADE_PACKAGE_MAP.put("arm64",Arrays.asList(
+                new UpgradeInfo(
+                        "com.huawei.webview",
+                        "14.0.0.331",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.huawei.webview_14.0.0.331_arm64-v8a_armeabi-v7a.zip")
+        ));
+
+        UPGRADE_PACKAGE_MAP.put("x86",Arrays.asList(
+                new UpgradeInfo(
+                        "com.google.android.webview",
+                        "122.0.6261.64",
+                        "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.google.android.webview_122.0.6261.64_x86.zip")
+        ));
 
-
-    );
+    }
 
 
     ProgressBar progressBar;
@@ -115,6 +137,7 @@ public class MainActivity extends Activity implements UpgradeCallback {
     @Override
     public void onUpgradeError(Throwable throwable) {
         Toast.makeText(getApplicationContext(), "webView upgrade fail", Toast.LENGTH_SHORT).show();
+        Log.v("MainActivity","message:" + throwable.getMessage() + "\nstackTrace:" + Log.getStackTraceString(throwable));
         updateUpgradeWebViewStatus();
     }
 
@@ -122,10 +145,11 @@ public class MainActivity extends Activity implements UpgradeCallback {
 
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.setTitle("Choose WebView");
+        List<UpgradeInfo> upgradeInfoList = UPGRADE_PACKAGE_MAP.get(ProcessUtils.getCurrentInstruction());
 
-        String[] items = new String[UPGRADE_PACKAGE_LIST.size()];
+        String[] items = new String[upgradeInfoList.size()];
         for (int i = 0; i < items.length; i++) {
-            items[i] = UPGRADE_PACKAGE_LIST.get(i).title;
+            items[i] = upgradeInfoList.get(i).title;
         }
         builder.setItems(items, new DialogInterface.OnClickListener() {
             @Override
@@ -135,7 +159,7 @@ public class MainActivity extends Activity implements UpgradeCallback {
                 } else if (WebViewUpgrade.isCompleted()) {
                     Toast.makeText(getApplicationContext(), "webView is already upgrade success,not support dynamic switch", Toast.LENGTH_LONG).show();
                 } else {
-                    UpgradeInfo upgradeInfo = UPGRADE_PACKAGE_LIST.get(which);
+                    UpgradeInfo upgradeInfo = upgradeInfoList.get(which);
                     selectUpgradeInfo = upgradeInfo;
                     UpgradeOptions upgradeOptions = new UpgradeOptions
                             .Builder(getApplicationContext(),

+ 9 - 0
app/src/main/java/com/norman/webviewup/lib/hook/PackageManagerHook.java

@@ -17,6 +17,7 @@ import androidx.annotation.NonNull;
 import com.norman.webviewup.lib.reflect.RuntimeAccess;
 import com.norman.webviewup.lib.service.binder.BinderHook;
 import com.norman.webviewup.lib.service.interfaces.IActivityThread;
+import com.norman.webviewup.lib.service.interfaces.IApplicationInfo;
 import com.norman.webviewup.lib.service.interfaces.IContextImpl;
 import com.norman.webviewup.lib.service.interfaces.IPackageManager;
 import com.norman.webviewup.lib.service.interfaces.IServiceManager;
@@ -81,11 +82,13 @@ public class PackageManagerHook extends BinderHook {
                 String[] supportBitAbis = is64Bit ? Build.SUPPORTED_64_BIT_ABIS : Build.SUPPORTED_32_BIT_ABIS;
                 Arrays.sort(supportBitAbis, Collections.reverseOrder());
                 File nativeLibraryDir = null;
+                String cpuAbi= null;
                 for (String supportBitAbi : supportBitAbis) {
                     File file = new File(soPath + "/" + supportBitAbi);
                     File[] childFile = file.listFiles();
                     if (childFile != null && childFile.length > 0) {
                         nativeLibraryDir = file;
+                        cpuAbi = supportBitAbi;
                         break;
                     }
                 }
@@ -93,6 +96,12 @@ public class PackageManagerHook extends BinderHook {
                     throw new NullPointerException("unable to find supported abis "
                             + Arrays.toString(supportBitAbis)
                             + " in apk " + apkPath);
+                }
+                try {
+                    IApplicationInfo iApplicationInfo = RuntimeAccess.objectAccess(IApplicationInfo.class,packageInfo.applicationInfo);
+                    iApplicationInfo.setPrimaryCpuAbi(cpuAbi);
+                }catch (Throwable ignore){
+
                 }
                 packageInfo.applicationInfo.nativeLibraryDir = nativeLibraryDir.getAbsolutePath();
                 if (TextUtils.isEmpty(packageInfo.applicationInfo.sourceDir)) {

+ 10 - 0
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IApplicationInfo.java

@@ -0,0 +1,10 @@
+package com.norman.webviewup.lib.service.interfaces;
+
+import com.norman.webviewup.lib.reflect.annotation.ClassName;
+import com.norman.webviewup.lib.reflect.annotation.Field;
+
+@ClassName("android.content.pm.ApplicationInfo")
+public interface IApplicationInfo {
+    @Field("primaryCpuAbi")
+    void setPrimaryCpuAbi(String cpuAbi);
+}

+ 4 - 1
app/src/main/java/com/norman/webviewup/lib/service/interfaces/IVMRuntime.java

@@ -6,11 +6,14 @@ import com.norman.webviewup.lib.reflect.annotation.Method;
 
 @ClassName("dalvik.system.VMRuntime")
 public interface IVMRuntime {
-    @Method(value = "getRuntime", type = Field.STATIC)
+    @Method(value = "getRuntime", type = Method.STATIC)
     Object getRuntime();
 
     @Method(value = "is64Bit")
     boolean is64Bit();
 
+    @Method(value = "getCurrentInstructionSet",type = Method.STATIC)
+    String getCurrentInstructionSet();
+
 
 }

+ 32 - 0
app/src/main/java/com/norman/webviewup/lib/util/ProcessUtils.java

@@ -6,8 +6,13 @@ import android.os.Process;
 import com.norman.webviewup.lib.reflect.RuntimeAccess;
 import com.norman.webviewup.lib.service.interfaces.IVMRuntime;
 
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
 public class ProcessUtils {
 
+    private static String currentInstructionSet = null;
+
     public static boolean is64Bit() {
         boolean process64bit = false;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -23,4 +28,31 @@ public class ProcessUtils {
         }
         return process64bit;
     }
+
+    public static String getCurrentInstruction() {
+        if (currentInstructionSet != null) {
+            return currentInstructionSet;
+        }
+        try {
+            IVMRuntime ivmRuntime = RuntimeAccess.staticAccess(IVMRuntime.class);
+            currentInstructionSet = ivmRuntime.getCurrentInstructionSet();
+        } catch (Throwable throwable) {
+            String[] abiSearchArr = new String[]{"mips64", "mips", "x86_64", "x86", "arm64-v8a", "armeabi-v7a", "armeabi"};
+            for (String search : abiSearchArr) {
+                int result = Arrays.binarySearch(Build.SUPPORTED_ABIS, search);
+                if (result >= 0) {
+                    if (search.equals("armeabi") || search.equals("armeabi-v7a")) {
+                        currentInstructionSet = "arm";
+                    } else if (search.equals("arm64-v8a")) {
+                        currentInstructionSet = "arm64";
+                    } else {
+                        currentInstructionSet = search;
+                    }
+                    break;
+                }
+            }
+
+        }
+        return currentInstructionSet;
+    }
 }

BIN
preview/chat.jpg