问题:pid小于10000的进程不能加载js
抓取log查看打印:
01-01 00:05:29.069 8664 8664 E AndroidRuntime: Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:235)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.getFactory(WebView.java:2424)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.ensureProviderCreated(WebView.java:2419)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.<init>(WebView.java:421)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.<init>(WebView.java:348)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.<init>(WebView.java:331)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at android.webkit.WebView.<init>(WebView.java:318)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.tencent.smtt.sdk.WebView$a.<init>(Unknown Source:2)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.tencent.smtt.sdk.WebView.<init>(Unknown Source:485)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.tencent.smtt.sdk.WebView.<init>(Unknown Source:6)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.tencent.smtt.sdk.WebView.<init>(Unknown Source:1)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.tencent.smtt.sdk.WebView.<init>(Unknown Source:1)
01-01 00:05:29.069 8664 8664 E AndroidRuntime: at com.github.lzyzsd.jsbridge.BridgeWebView.<init>(BridgeWebView.java:45)
解决方法:
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) {
Log.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 {
Log.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);
Log.i(TAG,"Hook success!");
} else {
Log.i(TAG,"Hook failed!");
}
} catch (Throwable e) {
Log.w(TAG,e);
}
}
```