mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
82 lines
3.4 KiB
Markdown
82 lines
3.4 KiB
Markdown
# 迁移到 YukiHookAPI 1.3.x
|
||
|
||
`YukiHookAPI` 从 `1.3.0` 版本开始弃用了自身的反射 API,你可以继续向下阅读以查看有哪些注意事项和新功能。
|
||
|
||
::: warning
|
||
|
||
如果你正在使用 `1.2.x` 及之前版本的 `YukiHookAPI`,建议先阅读 [迁移到 YukiHookAPI 1.2.x](move-to-api-1-2-x) 而不是此文档。
|
||
|
||
:::
|
||
|
||
## 自身反射 API 弃用
|
||
|
||
`YukiHookAPI` 从 `1.3.0` 版本开始弃用了自身的反射 API,现在我们推荐所有开发者迁移到全新开发的
|
||
[KavaRef](https://github.com/HighCapable/KavaRef),我们不再推荐使用 `YukiHookAPI` 自身的反射 API,这些 API 已被标记为弃用。
|
||
|
||
请参考 [这里](https://highcapable.github.io/KavaRef/zh-cn/config/migration) 的迁移文档,这将跳转到 `KavaRef` 的文档。
|
||
|
||
`YukiHookAPI` 目前已经实现了反射 API 的完全解耦合,其内部 API 使用的反射 API 同样迁移到了 `KavaRef`,且已经稳定测试通过。
|
||
|
||
在后期的 `2.0.0` 版本中,自身反射 API 将被完全移除,在此期间,你将有足够的时间来学习和迁移到这套全新的反射 API。
|
||
|
||
## FreeReflection 弃用
|
||
|
||
`YukiHookAPI` 从 `1.3.0` 版本开始弃用了 [FreeReflection](https://github.com/tiann/FreeReflection) 并迁移到由 LSPosed 团队维护的
|
||
[AndroidHiddenApiBypass](https://github.com/LSPosed/AndroidHiddenApiBypass)。
|
||
|
||
在反射系统隐藏 API 时,你不可以像之前那样直接进行反射,而是需要进行一些操作。
|
||
|
||
`YukiHookAPI` 内置了 `KavaRef` 的 `第三方 Member 解析器` 中的 `AndroidHiddenApiBypassResolver`,现在你可以在需要反射系统隐藏 API 的地方这样去使用它。
|
||
|
||
> 示例如下
|
||
|
||
```kotlin
|
||
"android.app.ActivityThread".toClass()
|
||
.resolve()
|
||
// 添加自定义 Member 解析器
|
||
.processor(AndroidHiddenApiBypassResolver.get())
|
||
.firstMethod {
|
||
name = "currentActivityThread"
|
||
emptyParameters()
|
||
}.invoke()
|
||
```
|
||
|
||
::: warning
|
||
|
||
`AndroidHiddenApiBypassResolver` 是暂定的功能,可能会在 `2.0.0` 版本迁移到单独的模块中,你也可以参考
|
||
[第三方 Member 解析器](https://highcapable.github.io/KavaRef/zh-cn/config/processor-resolvers) 自己实现一份,这将跳转到 `KavaRef` 的文档。
|
||
|
||
:::
|
||
|
||
## 方法原始调用
|
||
|
||
`Xposed` 提供了 `XposedBridge.invokeOriginalMethod` 功能,可以调用未经 Hook 的原始方法。
|
||
|
||
由于自身反射 API 的弃用,`method { ... }.get().original().call(...)` 的方式将不再可用。
|
||
|
||
所以,`YukiHookAPI` 为 `KavaRef` 添加了扩展功能,现在你依然可以实现这个功能。
|
||
|
||
`YukiHookAPI` 提供了以下方法来对接 `KavaRef` 的原始方法调用。
|
||
|
||
- `invokeOriginal(...)` → `invoke(...)`
|
||
- `invokeOriginalQuietly(...)` → `invokeQuietly(...)`
|
||
|
||
> 示例如下
|
||
|
||
```kotlin
|
||
// 假设这就是 Test 类的实例
|
||
val instance: Any
|
||
// 使用 KavaRef 的方法原始调用
|
||
"com.example.Test".toClass()
|
||
.resolve()
|
||
.firstMethod {
|
||
name = "test"
|
||
emptyParameters()
|
||
}.of(instance).invokeOriginal()
|
||
```
|
||
|
||
## 重复 Hook 限制弃用
|
||
|
||
`YukiHookAPI` 从 `1.3.0` 版本开始弃用了重复 Hook 的限制,现在,`YukiHookAPI` 不再限制重复 Hook 同一个方法,你可以在同一个方法上多次 Hook。
|
||
|
||
`YukiHookAPI` 同时弃用了 `hook { ... }` 的 `onAlreadyHooked` 方法,现在此方法将无作用且不会被回调,如有需要,请手动处理重复 Hook 的相关逻辑。 |