3.Xposed API相关介绍
PS:发现网上没有什么好的Xposed API的文档啊,这里都是翻阅很多的出来的 网页总结,如果英语好的,建议直接阅读源码注释!!!
1.例子里用到的姿势点
- IXposedHookLoadPackage接口:App被加载的时候调用,用于App应用的Hook 回调方法是:handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam)
- XC_LoadPackage.LoadPackageParam:包含与正在加载的应用程序的有关信息。
- XposedHelpers.findAndHookMethod(要Hook的类,classLoader,方法名,参数,回调对象) Hook一个方法的时候使用,回调对象**XC_MethodHook()**需重写两个方法beforeHookedMethod(MethodHookParam param):方法调用前执行afterHookedMethod(MethodHookParam param) 方法调用后执行注:可以调用param.setResult()设置方法的返回值!
- MethodHookParam:包含与调用方法有关的信息
比较关注的是这个thisObject,代表调用该方法的对象实例,如果是静态方法 的话,返回一个Null,比如这里调用onCreate()方法的是MainActivity,获得 的自然是MainActivity实例。
接着是获取成员变量,分为私有与非私有变量,非私有直接调用下述方法 即可获得class
Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity"); Field field = c.getField("tv");
如果是私有,则需要先设置访问权限(setAccessible)
Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity"); Field field = c.getDeclaredField("tv"); field.setAccessible(true);
接着调用获得该对象
TextView tv = (TextView) field.get(param.thisObject); tv.setText("贪玩难约");
2.补充姿势点
- IXposedHookZygoteInit:在Zygote启动时调用,用于系统服务的Hook 回调方法initZygote()
- IXposedHookInitPackageResources:在资源布局初始化时会回被执行(inflate方法) 回调方法:handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam)InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)
有了这个XResource对象,就可以拿到布局资源树了,通过重写hookLayout方法,
LayoutInflatedParam,里面这个view就是布局资源树了,你可以拿到遍历,拿到某个 特定控件,然后做一些骚操作。
XposeHelpers提供了一些辅助方法
- callMethod(Object obj,String methodName, Object... args):在APP中调用特定方法; 参数依次是:调用方法的所在类,调用方法名,方法参数
- findClass(String className,ClassLoader classLoader):获取class类实例 参数依次是类名,类加载器
- findMethodExact:通过反射查找类的成员方法(可setAccessible(true)设置非私有)
- findConstructorExact:通过反射查找构造函数(同样可设置可访问下性)
- findAndHookXXX:查找并Hook
- setXxx:通过反射设置对象数据成员的值
- setStaticXxx:通过反射设置静态变量的值
- XposedBridge.log("日志内容"):输入日志和写入到/data/xposed/debug.log Xposed Installer日志那里可以看到!
- 内部类:通过$符号链接内部类
- 只能Hook方法与构造方法,不能Hook接口和抽象方法
4.小结
基础的东西大概就这些,后续觉得有遗漏的回头补,谢谢~