1.更新完善文档 2.修复暴露的bug
一个用于hook的插件
可以通过指定的语法对方法进行hook
[public|private|protected] [static] [final] [synchronized] returnType classInternalName#methodName(paramType...)
整体包含信息如下
权限修饰符、返回值类型、类全路径名称、方法名称、参数列表
其中权限修饰符可选,返回值类型、类全路径名、方法名称、参数列表必选
针对两种方法进行Hook
- 静态方法
Hook后的方法为static方法并且和原方法具有相同的参数列表(类名和方法名可自行配置) 如:
// before
public class Tester {
public static void testStaticHook() {}
}
// after
public class TesterHooker {
public static void testStaticHook() {
Log.e("TAG", "testStaticHook: ");
}
}
- 成员方法
Hook后的方法变为静态方法,方法参数列表比Hook前多一个成员方法,其余保持不变(类名和方法名可自行配置) 如:
public class Tester {
public void testMemberHook() {}
}
public class TesterHooker {
// 注意member必须是第一个参数,其他参数列表copy原函数
public static void testMemberHook(Tester t) {
Log.e("TAG", "testMemberHook: ");
}
}
需要接入gradle plugin
plugins {
// ......
id("com.plugin.hook")
}
// dsl配置hook项
hook {
// hook static方法
element {
hook = "void com.dev.tuzhiqiang.aop.Tester#testStaticHook()"
target = "void com.dev.tuzhiqiang.aop.TesterHooker#testStaticHook(...)"
}
// hook 成员方法
element {
hook = "void com.dev.tuzhiqiang.aop.Tester#testMemberHook()"
target = "void com.dev.tuzhiqiang.aop.TesterHooker#testMemberHook(...)"
}
}
注:
- element.hook可以必须配置返回值,方法名 & 参数列表。 并依照: 返回值全路径名称 类全路径名#方法名(参数列表) 参数列表只包含类型
如void com.dev.tuzhiqiang.Test#hello(java.lang.String)
- target只需配置返回值类型、类名、方法名,参数列表可选。
插件生效前
public class TestInvoker {
public static void main(String[] args) {
Tester.testStaticHook();
new Tester().testMemberHook();
}
}
生效后
public class TestInvoker {
public TestInvoker() {
}
public static void main(String[] args) {
TesterHooker.testStaticHook();
TesterHooker.testMemberHook(new Tester());
}
}