5.3 KiB
API 基本配置
这里介绍了
YukiHookAPI
的基本配置方法。
功能配置
无论是 作为 Xposed 模块使用 还是 作为 Hook API 使用,你都可以在 API 装载之前或装载过程中对
YukiHookAPI
进行配置。
configs 方法
fun configs(initiate: Configs.() -> Unit)
configs
方法对 Configs
类实现了一个 lambda
方法体,你可以轻松地调用它进行配置。
你可以 点击这里 查看有关用法的说明和示例。
Hooker 配置
一个 Xposed 模块或 Hook API 最重要的地方就是 Hooker 的创建与使用,
YukiHookAPI
提供了两种使用方法。
通过 Lambda 创建
这种方案是最简单的,如果你的模块功能不多,代码数量不大,不需要进行分类处理,推荐使用这种方式进行创建。
encase 方法
fun encase(initiate: PackageParam.() -> Unit)
encase
方法是 Hook 一切生命的开始,在一个模块或一个 Hook 过程中,encase
方法只能作用一次,用于创建 Hooker。
PackageParam
为宿主(目标 APP)的重要实例对象,通过 PackageParam
来实现对当前 Hook 作用对象的全部 Hook 操作。
你可以 点击这里 了解其中的详细用法。
encase
方法可以在 onHook
方法中使用两种方案创建。
示例代码 1
YukiHookAPI.encase {
loadApp(name = "com.example.demo") {
findClass(name = "$packageName.DemoClass").hook {
// Your code here.
}
}
}
示例代码 2
encase {
loadApp(name = "com.example.demo") {
findClass(name = "$packageName.DemoClass").hook {
// Your code here.
}
}
}
在 encase
方法中进行你的 Hook 操作。
通过自定义 Hooker 创建
这种方案更加适用于大型项目,例如需要对 Hooker 进行分类或对 Hook 的作用对象进行分类。
encase 方法
fun encase(vararg hooker: YukiBaseHooker)
同样为 encase
方法,这里的方法可变数组参数 hooker
为创建入口提供了一个对象,你可以将所有继承于 YukiBaseHooker
的 Hooker 一次性进行装载。
YukiBaseHooker 用法
YukiBaseHooker
继承于 PackageParam
,你需要将你的子 Hooker 继承于 YukiBaseHooker
。
若要了解更多可 点击这里 进行查看。
示例如下
class CustomHooker : YukiBaseHooker() {
override fun onHook() {
// Your code here.
}
}
!> 你无需再在继承于 YukiBaseHooker
的 onHook
方法中重新调用 encase
,这是错误的,你应该直接开始编写你的 Hook 代码。
示例如下
class CustomHooker : YukiBaseHooker() {
override fun onHook() {
loadApp(name = "com.example.demo1") {
findClass(name = "$packageName.DemoClass").hook {
// Your code here.
}
}
loadApp(name = "com.example.demo2") {
findClass(name = "$packageName.CustomClass").hook {
// Your code here.
}
}
}
}
作为子 Hooker 使用,你还可以在外部调用 loadApp
方法,然后在内部直接开始 Hook。
示例如下
class HookEntryClass : YukiHookXposedInitProxy {
override fun onHook() = encase {
loadApp(name = "com.example.demo", ChildCustomHooker())
}
}
class ChildCustomHooker : YukiBaseHooker() {
override fun onHook() {
findClass(name = "$packageName.DemoClass").hook {
// Your code here.
}
}
}
你可以使用 loadHooker
方法在子 Hooker 中多层装载另一个 Hooker,请按照你的喜好进行即可。
示例如下
class FirstHooker : YukiBaseHooker() {
override fun onHook() {
findClass(name = "$packageName.DemoClass").hook {
// Your code here.
}
loadHooker(SecondHooker())
loadHooker(ThirdHooker())
}
}
搭建完全部 Hooker 后,你就可以在你的 HookEntryClass
入口类中的 onHook
方法中装载你的 Hooker 了。
示例如下
class HookEntryClass : YukiHookXposedInitProxy {
override fun onHook() =
YukiHookAPI.encase(FirstHooker(), SecondHooker(), ThirdHooker() ...)
}
当然,我们同样可以对其进行简写。
示例如下
class HookEntryClass : YukiHookXposedInitProxy {
override fun onHook() = encase(FirstHooker(), SecondHooker(), ThirdHooker() ...)
}
作为 Hook API 使用需要注意的地方
若你作为 Hook API 使用,那么你只需要在入口处对 encase
方法进行区分。
!> encase
方法对作为 Hook API 使用提供了两个完全一样的方法,但是比前两者仅多出一个参数 baseContext
。
方法 1
fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
方法 2
fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
此处的 baseContext
只需填入你在 attachBaseContext
处得到的 Context
即可,其它用法与上述内容完全一致。
!> 切勿以 Xposed 方式使用 encase
方法而漏掉 baseContext
参数,否则你的 Hook 将完全不工作。