droidplugin中如果插件中用webview loadurl是asserts文件会读取失败,按道理droidplugin 算是默认处理资源问题,因为创建的context apk路径默认指向插件的apk所在的问题,但webview是不行的,但我看droidplugin代码时候有一个WebViewFactoryProviderHook 这类,貌似是解决assert的问题的,然后像别的类,installhook 之后插件webview就可以读取了(默认没有任何调用),但我不知道为什么那么写就可以,我顺着loadurl 这个方法看代码,无法推出解决方法由来,估计360是分析整个webview加载的顺序推出来的。
我分析代码得出另外的解决webview的办法,同时可以增加webview操作,通过动态代理webviewProvider,然后对应的处理就可以做到了,直接贴简单的代码。
protected void afterInvoke(Object receiver, Method method, Object[] args, final Object invokeResult) throws Throwable {
if (mWebView != null) {
Class clazz = invokeResult.getClass();
List<Class<?>> interfaces = Utils.getAllInterfaces(clazz);
Class[] ifs = interfaces != null && interfaces.size() > 0 ? interfaces.toArray(new Class[interfaces.size()]) : new Class[0];
//fixWebViewAsset(mWebView.getContext());
final Object newObj = MyProxy.newProxyInstance(clazz.getClassLoader(), ifs, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
android.util.Log.d(TAG, "invoke: " + method);
if(method.getName().contains("loadUrl")){
String url = (String)args[0];
if(url.contains("file:")){
args[0] = "http://m.360.com/";
}
}
Object invoke = method.invoke(invokeResult, args);
//fixWebViewAsset(mWebView.getContext());
return invoke;
}
});
// final Object newObj = MyProxy.newProxyInstance(clazz.getClassLoader(), ifs, new WebViewProviderHook(null));
setFakedResult(newObj);
}
360那种解决办法,没有对自己的宿主进程做过滤,如果宿主也用webview会导致问题,建议判断是否插件,如果插件才进行修正