Xposed 执行方法时传递的参数是抽象类怎么办?

1,556 阅读1分钟

如果是接口的话好说,我们直接用Proxy动态代理就行,但如果是一个抽象类,就不行了。 笔者在玩XposedVirtual的时候刚好有这个需求,就专门研究了一下。

这里只讲思路,不会上太多代码。

首先linkedin有个开源项目,叫dexmaker,基于dexmaker可以动态生成抽象类的子类,只要把抽象方法再实现一下就行。

抽象方法实现起来异常困难,于是想到先实现一个空的方法,然后用dexmaker提供的ProxyBuilder类代理这个子类。 大致代码是这样的:

public static Object makeProxyObject(Class<?> superClass, ClassLoader classLoader, InvocationHandler handler) {
        Class subClass = makeSubClass(superClass, classLoader);
        try {
            return ProxyBuilder.forClass(subClass).handler(handler).dexCache(dir).build();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

其中superClass是使用dexmaker生成的子类class。

遇到的问题:

在由于生成的是继承hook类的,所以按dexmaker官方demo代码是找不到抽象类的,提示class not found

为了解决这个问题,试了很多方法,最后得到的结论就是用hook环境的classloader为ComposeClassLoader,反射出里面的变量mAppClassLoader。这个classloader实际上是DexBaseClassloader.

通过一些插件化的知识,我们可以把生成的子类的dex文件路径,塞到DexBaseClassloader里面,这样用hook环境下的classloader就可以把我们的类加载出来了。再用ProxyBuilder生成代理类即可。

关于如何动态把dex文件塞到已有dexBaseClassLoader,请看这里

主要是看里面makeDexElements方法的上下文调用。