Xposed从入门到弃坑:0x0三、XposedHelpers类解析

感受很久没更新xposed教程了。应该有两个月了,主要是工做太忙,没有时间写博客。这节主要讲解XposedHelpers类的一些用法,对前面内容有遗忘的能够再回过去预习下。
更多精彩内容能够关注个人博客:www.wrbug.com
java

XposedHelpers类是干吗的?

在XposedHelpers类的顶部有一句注释android

/** * Helpers that simplify hooking and calling methods/constructors, getting and settings fields, ... */
public final class XposedHelpers {
}复制代码

大概意思是能够hook活着调用方法/构造函数。获取该类的字段等。这里须要用到反射的姿式。不了解的能够先看看反射相关的。XposedHelpers提供了很是方便的或者这些参数的方法。git

XposedHelpers方法说明

//className 完整类名,classLoader 类加载器(app应用的类加载器)
public static Class<?> findClass(String className, ClassLoader classLoader)

public static Class<?> findClassIfExists(String className, ClassLoader classLoader)复制代码

获取class的方法。其中findclass方法在未找到时抛出异常,findClassIfExists则返回nullgithub

// clazz 经过findClass获取,调用findFieldRecursiveImpl获取
public static Field findField(Class<?> clazz, String fieldName) public static Field findFieldIfExists(Class<?> clazz, String fieldName) private static Field findFieldRecursiveImpl(Class<?> clazz, String fieldName) throws NoSuchFieldException {
        try {
            return clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            while (true) {
                clazz = clazz.getSuperclass();
                if (clazz == null || clazz.equals(Object.class))
                    break;

                try {
                    return clazz.getDeclaredField(fieldName);
                } catch (NoSuchFieldException ignored) {}
            }
            throw e;
        }
    }

public static Field findFirstFieldByExactType(Class<?> clazz, Class<?> type) //获取实例字段的引用 public static Object getObjectField(Object obj, String fieldName)复制代码

获取Field的方法,具体实现是在findFieldRecursiveImpl方法里面获取,外部不能访问,Field是经过getDeclaredField获取,因此只能获取static类型的字段。indFirstFieldByExactType()方法是匹配Field的classType,若是类型同样,则返回该字段,该方法的局限性是只能获取到第一个匹配到的字段,后面相同类型的没法获取vim

public static Method findMethodExact(Class<?> clazz, String methodName, Object... parameterTypes) public static Method findMethodExactIfExists(Class<?> clazz, String methodName, Object... parameterTypes)复制代码

获取Method方法,还有些其余的方法这里省略,也只能获取静态方法数组

public static Constructor<?> findConstructorExact(Class<?> clazz, Object... parameterTypes)

public static Constructor<?> findConstructorExactIfExists(Class<?> clazz, Object... parameterTypes) 

public static Constructor<?> findConstructorBestMatch(Class<?> clazz, Class<?>... parameterTypes)复制代码

获取Constructor方法,其中Object... parameterTypes 是一个Object的可变数组,parameterTypes由Class<?>的可变数组 ,完整类名字符串和XC_MethodHook抽象类 组成。XC_MethodHook为可选参数,而且总在最后一个。XC_MethodHook在这里并没有实际意义,Class<?>[] 为相应的构造函数的类型,经过一个例子简单说明,有一个T类,构造函数有三个参数,能够用如下几种方式获取:app

public class T {
    String str;
    Context mContext;
    View mView;

    public T(String str, Context context, View view) {
        this.str = str;
        mContext = context;
        mView = view;

    }

}

//方式1:
Constructor constructor = XposedHelpers.findConstructorExact(clazz, String.class, Context.class, View.class);

//方式2:
Constructor constructor = XposedHelpers.findConstructorExact(T.class, String.class, "android.content.Context", View.class);

//方式3:(XC_MethodHook无实际意义)
Constructor constructor = XposedHelpers.findConstructorExact(T.class, String.class, "android.content.Context", View.class, new XC_MethodHook() {});复制代码

public static void setXXXField(Object obj, String fieldName, XXX value) public static void setStaticXXXField(Class<?> clazz, String fieldName, XXX value) public static Xxx getXxxField(Object obj, String fieldName) public static Xxx getStaticXxxField(Class<?> clazzj, String fieldName)复制代码

设置或者获取Field的值,obj为实例,则为设置或者获取该成员变量的值ide

public static Object callMethod(Object obj, String methodName, Object... args) public static Object callMethod(Object obj, String methodName, Class<?>[] parameterTypes, Object... args) public static Object callStaticMethod(Class<?> clazz, String methodName, Object... args) public static Object callStaticMethod(Class<?> clazz, String methodName, Class<?>[] parameterTypes, Object... args)复制代码

调用实例/静态Method,返回值为方法返回值函数

public static XC_MethodHook.Unhook findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback) //经过className和classLoader获取Class<?> ,再调用上面的方法 public static XC_MethodHook.Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback)复制代码

Hook方法的一个方法,其中parameterTypesAndCallback和findConstructorExact方法的parameterTypes相似,不过这里可变数组最后一个对象必须为XC_MethodHook对象或者其子类,前面的对象为参数的ClassType或者类字符串,在hook成功后,当调用hook的方法时,会在XC_MethodHook回调this

public abstract class XC_MethodHook extends XCallback {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                //方法调用前的回调
                super.beforeHookedMethod(param);
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                //方法调用后的回调
                super.afterHookedMethod(param);
            }
        }

public abstract class XC_MethodReplacement extends XC_MethodHook{
            @Override
            protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                //带返回值的方法执行时调用
                return null;
            }
        }复制代码

能够经过这两个class进行hook监听。

本节示例

git提交:45c44ab4be96f012e7c4992bfdcc3bc2d3e458d7

git checkout 45c44ab复制代码
相关文章
相关标签/搜索