Android 使用反射改变WebView会导致segfault(致命信号11)

Android 使用反射改变WebView会导致segfault(致命信号11),android,reflection,android-webview,Android,Reflection,Android Webview,我正在Android应用程序中使用反射来改变WebView的行为。通过浏览Android源代码,每个WebView都通过一系列对象拥有一个处理程序,该处理程序告诉本机代码获取资源等 我要做的是用我自己的处理程序替换这个处理程序,它改变它接收的一些消息,然后将消息传递给原始处理程序。具体来说,我需要重写一些URL,以便为代理配置它们 下面是一个虚拟方法来演示这一点: private static boolean relayWebViewHandler( WebView webView ) {

我正在Android应用程序中使用反射来改变WebView的行为。通过浏览Android源代码,每个WebView都通过一系列对象拥有一个处理程序,该处理程序告诉本机代码获取资源等

我要做的是用我自己的处理程序替换这个处理程序,它改变它接收的一些消息,然后将消息传递给原始处理程序。具体来说,我需要重写一些URL,以便为代理配置它们

下面是一个虚拟方法来演示这一点:

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使用的处理程序对象会如何导致这种情况。有人知道或有过这方面的经验吗?本机代码是否无权访问我创建的对象?我是在干预不该干预的事情吗?

“我是在干预不该干预的事情吗?”——当然是的。