Android 使用反射改变WebView会导致segfault(致命信号11)
我正在Android应用程序中使用反射来改变WebView的行为。通过浏览Android源代码,每个WebView都通过一系列对象拥有一个处理程序,该处理程序告诉本机代码获取资源等 我要做的是用我自己的处理程序替换这个处理程序,它改变它接收的一些消息,然后将消息传递给原始处理程序。具体来说,我需要重写一些URL,以便为代理配置它们 下面是一个虚拟方法来演示这一点:Android 使用反射改变WebView会导致segfault(致命信号11),android,reflection,android-webview,Android,Reflection,Android Webview,我正在Android应用程序中使用反射来改变WebView的行为。通过浏览Android源代码,每个WebView都通过一系列对象拥有一个处理程序,该处理程序告诉本机代码获取资源等 我要做的是用我自己的处理程序替换这个处理程序,它改变它接收的一些消息,然后将消息传递给原始处理程序。具体来说,我需要重写一些URL,以便为代理配置它们 下面是一个虚拟方法来演示这一点: private static boolean relayWebViewHandler( WebView webView ) {
private static boolean relayWebViewHandler( WebView webView ) {
Log.d(LOG_TAG, "Attempting");
try {
Class classWV = Class.forName( "android.webkit.WebView" );
Field mProviderField = classWV.getDeclaredField( "mProvider" );
Object webViewClassic = getFieldValueSafely( mProviderField, webView );
Class classWVCl = Class.forName( "android.webkit.WebViewClassic" );
Field mWebViewCoreField = classWVCl.getDeclaredField( "mWebViewCore" );
Object webViewCore = getFieldValueSafely( mWebViewCoreField, webViewClassic );
Class classWVCo = Class.forName( "android.webkit.WebViewCore" );
Field mEventHubField = classWVCo.getDeclaredField( "mEventHub" );
Object eventHub = getFieldValueSafely( mEventHubField, webViewCore );
Class classEH = Class.forName( "android.webkit.WebViewCore$EventHub" );
Field mHandlerField = classEH.getDeclaredField( "mHandler" );
final Handler handler = (Handler) getFieldValueSafely( mHandlerField, eventHub );
Handler relayHandler = new Handler() {
@Override
public void handleMessage( Message msg ) {
Log.d( LOG_TAG, "Relayed a message!" );
handler.handleMessage( msg );
}
};
setFieldValueSafely( mHandlerField, eventHub, relayHandler );
} catch (Exception e) {
Log.e( LOG_TAG, "Failed with error: " + e.getMessage() );
return false;
}
Log.d( LOG_TAG, "Successful!" );
return true;
}
private static Object getFieldValueSafely( Field field, Object classInstance ) throws IllegalArgumentException, IllegalAccessException {
boolean oldAccessibleValue = field.isAccessible();
field.setAccessible( true );
Object result = field.get( classInstance );
field.setAccessible( oldAccessibleValue );
return result;
}
private static void setFieldValueSafely( Field field, Object classInstance, Object value ) throws IllegalArgumentException, IllegalAccessException {
boolean oldAccessibleValue = field.isAccessible();
field.setAccessible( true );
field.set( classInstance, value );
field.setAccessible( oldAccessibleValue );
}
当我在4.3模拟器上运行这个程序时,LogCat会显示一些“中继消息!”通知,然后是致命信号11(SIGSEGV)错误,每次都在不同的地址
我知道这意味着segfault,但我不确定替换WebViewCore使用的处理程序对象会如何导致这种情况。有人知道或有过这方面的经验吗?本机代码是否无权访问我创建的对象?我是在干预不该干预的事情吗?“我是在干预不该干预的事情吗?”——当然是的。