如题,如何应对以上问题,解决方案如下:
在 MainActivity 中的 onCreate 调用以下方法即可
import android.os.Build
/**
*@date 创建时间:2020/5/27
*@name 作者:陆键霏
*@describe 描述:
*/
object WebViewHelper {
const val TAG = "WebViewHelper"
fun hookWebView() {
val sdkInt = Build.VERSION.SDK_INT
try {
val factoryClass =
Class.forName("android.webkit.WebViewFactory")
val field = factoryClass.getDeclaredField("sProviderInstance")
field.isAccessible = true
var sProviderInstance = field.get(null)
if (sProviderInstance != null) {
LogUtils.i(TAG, "sProviderInstance isn't null")
return
}
val getProviderClassMethod = if (sdkInt > 22) {
factoryClass.getDeclaredMethod("getProviderClass")
} else if (sdkInt == 22) {
factoryClass.getDeclaredMethod("getFactoryClass")
} else {
LogUtils.i(TAG, "Don't need to Hook WebView")
return
}
getProviderClassMethod.isAccessible = true
val factoryProviderClass =
getProviderClassMethod.invoke(factoryClass) as Class<*>
val delegateClass =
Class.forName("android.webkit.WebViewDelegate")
val delegateConstructor = delegateClass.getDeclaredConstructor()
delegateConstructor.isAccessible = true
if (sdkInt < 26) { //低于Android O版本
val providerConstructor =
factoryProviderClass.getConstructor(delegateClass)
providerConstructor.isAccessible = true
sProviderInstance =
providerConstructor.newInstance(delegateConstructor.newInstance())
} else {
val chromiumMethodName =
factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD")
chromiumMethodName.isAccessible = true
var chromiumMethodNameStr =
chromiumMethodName.get(null) as String
val staticFactory =
factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass)
if (staticFactory != null) {
sProviderInstance =
staticFactory.invoke(null, delegateConstructor.newInstance())
}
}
field.set("sProviderInstance", sProviderInstance)
LogUtils.i(TAG, "Hook success!")
} catch (e: Throwable) {
LogUtils.e(TAG, "catch $e")
}
}
}