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

XposedHelpers类是干嘛的?

在XposedHelpers类的顶部有一句注释

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

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

XposedHelpers方法说明

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

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


// 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,如果类型一样,则返回该字段,该方法的局限性是只能获取到第一个匹配到的字段,后面相同类型的无法获取

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类,构造函数有三个参数,可以用以下几种方式获取:

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为实例,则为设置或者获取该成员变量的值

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回调

public abstract class XC_MethodHook extends XCallback {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {//方法调用前的回调super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {//方法调用后的回调super.afterHookedMethod(param);}}public abstract class XC_MethodReplacement extends XC_MethodHook{@Overrideprotected Object replaceHookedMethod(MethodHookParam param) throws Throwable {//带返回值的方法执行时调用return null;}}复制代码

可以通过这两个class进行hook监听。

本节示例

git提交:45c44ab4be96f012e7c4992bfdcc3bc2d3e458d7

git checkout 45c44ab复制代码

Xposed从入门到弃坑:0x03、XposedHelpers类解析相关推荐

  1. jzy3D从入门到弃坑_4尝试使用jzy3D1.0画图失败

    jzy3D从入门到弃坑_4 尝试使用jzy3D1.0画图失败 觉得有用的话,欢迎一起讨论相互学习~ 记录一下使用jzy3D1.0失败 究其原因在于 本人才疏学浅,对于JAVA openGL真的是一窍不 ...

  2. jzy3D从入门到弃坑_2使用jzy3D0.9画2D散点图

    jzy3D从入门到弃坑_2 使用jzy3D0.9画2D散点图 觉得有用的话,欢迎一起讨论相互学习~ 在上一节中安装jzy3D 0.9版本并且运行了3D的例子 https://blog.csdn.net ...

  3. jzy3D从入门到弃坑_3使用jzy3D0.9画2D散点图--多条线条

    jzy3D从入门到弃坑_3 使用jzy3D0.9画2D散点图–多条线条 觉得有用的话,欢迎一起讨论相互学习~ 主要思路 将多个线条的二维数组读入Scatter对象 存入到同一个画布中 存入多个Scat ...

  4. Redis 从入门到弃坑

    Redis 从入门到弃坑 简介 摘自:http://www.redis.cn/ Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的 ...

  5. java从入门到弃坑十五天

    1.多线程:A:线程是依赖于进程而存在的,进程是正在执行的程序,线程是进程的执行路径和单元. B:多线程的两种方式:继承thread类或实现runnable接口. exp:1.继承thread类 pu ...

  6. 前端防御从入门到弃坑--CSP变迁

    转载至https://lorexxar.cn/2017/10/25/csp-paper/ 原文是我在内部showcase的时候修改而来的,总结了一些这一年接触CSP的很多感想- 查看全文 http:/ ...

  7. jzy3D安装到弃坑

    jzy3D从入门到弃坑 安装 http://www.jzy3d.org/ 官网 选择DL 选择0.9版使用,而不要使用其他版本 具体原因 高版本不稳定 高版本例子收费 下面实例代码 Easy to u ...

  8. 小奇鸽的-iApp弃坑宝典

    主题:关于时代的反思与弃坑之路 总体构思:从入门到弃坑 首先,我也是突然一时兴起才想学习编程的,觉得程序员很牛*,也是偶然间找到了第一款手机编程软件:AIDE 刚接触的是英文版,看着里面的教程是一脸懵 ...

  9. 为什么要强制弃坑Fastjson而主推Jackson?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:toutiao.com/i681590686818 ...

最新文章

  1. 【126】TensorFlow 使用皮尔逊相关系数找出和标签相关性最大的特征值
  2. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
  3. python核心数据类型_Python核心数据类型-列表
  4. opencv 选择矩形框
  5. pytorch学习笔记 torchnn.ModuleList
  6. Solaris 性能基础
  7. 嵌入式开发板02---点亮LED升级版
  8. 算法提高 陶陶摘苹果(java)
  9. vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解
  10. find命令基本使用一览
  11. 米的换算单位和公式_小学数学公式单位换算总结,请为你的孩子收藏好
  12. SpringBoot Logback配置,SpringBoot日志配置
  13. GPUGraphicsGame tools
  14. 微信飞机大战小游戏制作分享(上集)含素材视频教程
  15. 数据可视化工具软件哪个最好
  16. 计算机导论课程论文标题大全,计算机导论课程论文选题范文 计算机导论课程论文题目怎样定...
  17. 十款最好用的远程桌面工具
  18. 机械视觉外观检测系统软件ALFA
  19. 实变函数—有限覆盖定理的证明
  20. 黑客攻防技术宝典(七)

热门文章

  1. c#中Split分割字符串的几种方法
  2. centos关闭邮件提醒
  3. [译] 关于 HTTP/3 的一些心得
  4. 智慧中国杯算法赛解读 | 精准资助数据探索(一)
  5. 使用Spire.Barcode程序库生成二维码
  6. WINDOWS操作系统中可以允许最大的线程数
  7. 干货 一文看尽 mysql
  8. 从未来所思考到的事情
  9. vuex:弄懂mapState、mapGetters、mapMutations、mapActions
  10. 使用ob_gzhandler函数有3种方法让它对php进行压缩