关于Android8.0系统应用无法使用webview


  public static void hookWebView() {
    int sdkInt = Build.VERSION.SDK_INT;
    try {
      Class factoryClass = Class.forName("android.webkit.WebViewFactory");
      Field field = factoryClass.getDeclaredField("sProviderInstance");
      field.setAccessible(true);
      Object sProviderInstance = field.get(null);
      if (sProviderInstance != null) {
        LogMgr.i(TAG, "sProviderInstance isn't null");
        return;
      }

      Method getProviderClassMethod;
      if (sdkInt > 22) {
        getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
      } else if (sdkInt == 22) {
        getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
      } else {
        LogMgr.i(TAG, "Don't need to Hook WebView");
        return;
      }
      getProviderClassMethod.setAccessible(true);
      Class factoryProviderClass = (Class) getProviderClassMethod.invoke(factoryClass);
      Class delegateClass = Class.forName("android.webkit.WebViewDelegate");
      Constructor delegateConstructor = delegateClass.getDeclaredConstructor();
      delegateConstructor.setAccessible(true);
      if (sdkInt < 26) {  //低于Android O版本
        Constructor providerConstructor = factoryProviderClass.getConstructor(delegateClass);
        if (providerConstructor != null) {
          providerConstructor.setAccessible(true);
          sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());
        }
      } else {
        Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");
        chromiumMethodName.setAccessible(true);
        String chromiumMethodNameStr = (String) chromiumMethodName.get(null);
        if (chromiumMethodNameStr == null) {
          chromiumMethodNameStr = "create";
        }
        Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);
        if (staticFactory != null) {
          sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());
        }
      }

      if (sProviderInstance != null) {
        field.set("sProviderInstance", sProviderInstance);
        LogMgr.i(TAG, "Hook success!");
      } else {
        LogMgr.i(TAG, "Hook failed!");
      }
    } catch (Throwable e) {
      LogMgr.w(TAG, e.getMessage());
    }
  }

找到一个可用方法,特此记录一下。

原文链接:https://www.cnblogs.com/68xi/p/11206543.html

你可能感兴趣的:(android)