Skip to content

Repository files navigation

TODO

1.更新完善文档 2.修复暴露的bug

介绍

一个用于hook的插件

可以通过指定的语法对方法进行hook

[public|private|protected] [static] [final] [synchronized] returnType classInternalName#methodName(paramType...)

整体包含信息如下

权限修饰符、返回值类型、类全路径名称、方法名称、参数列表

其中权限修饰符可选,返回值类型、类全路径名、方法名称、参数列表必选

Hook规则

针对两种方法进行Hook

  • 静态方法

Hook后的方法为static方法并且和原方法具有相同的参数列表(类名和方法名可自行配置) 如:

// beforepublicclassTester {
publicstaticvoidtestStaticHook() {}
}
// afterpublicclassTesterHooker {
publicstaticvoidtestStaticHook() {
Log.e("TAG", "testStaticHook: ");
}
}
  • 成员方法

Hook后的方法变为静态方法,方法参数列表比Hook前多一个成员方法,其余保持不变(类名和方法名可自行配置) 如:

publicclassTester {
publicvoidtestMemberHook() {}
}
publicclassTesterHooker {
// 注意member必须是第一个参数,其他参数列表copy原函数publicstaticvoidtestMemberHook(Testert) {
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(...)"
}
}

注:

  1. element.hook可以必须配置返回值,方法名 & 参数列表。 并依照: 返回值全路径名称 类全路径名#方法名(参数列表) 参数列表只包含类型

如void com.dev.tuzhiqiang.Test#hello(java.lang.String)

  1. target只需配置返回值类型、类名、方法名,参数列表可选。

效果呈现

插件生效前

publicclassTestInvoker {
publicstaticvoidmain(String[] args) {
Tester.testStaticHook();
newTester().testMemberHook();
}
}

生效后

publicclassTestInvoker {
publicTestInvoker() {
}
publicstaticvoidmain(String[] args) {
TesterHooker.testStaticHook();
TesterHooker.testMemberHook(newTester());
}
}

About

一个用于hook指定方法的Android aop框架,兼容Transform & TransformAction

Resources

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages