import{_ as l,r as c,o as i,c as t,b as e,d as o,e as n,a}from"./app-BpUB8-Q8.js";const d={},r=a('
迁移至 YukiHookAPI 1.3.x
YukiHookAPI
从 1.3.0
版本开始弃用了自身的反射 API,你可以继续向下阅读以查看有哪些注意事项和新功能。
自身反射 API 弃用
',4),p=e("code",null,"YukiHookAPI",-1),A=e("code",null,"1.3.0",-1),h={href:"https://github.com/HighCapable/KavaRef",target:"_blank",rel:"noopener noreferrer"},u=e("code",null,"YukiHookAPI",-1),v={href:"https://highcapable.github.io/KavaRef/zh-cn/config/migration",target:"_blank",rel:"noopener noreferrer"},y=e("code",null,"KavaRef",-1),k=e("p",null,[e("code",null,"YukiHookAPI"),o(" 目前已经实现了反射 API 的完全解耦合,其内部 API 使用的反射 API 同样迁移至了 "),e("code",null,"KavaRef"),o(",且已经稳定测试通过。")],-1),B=e("p",null,[o("在后期的 "),e("code",null,"2.0.0"),o(" 版本中,自身反射 API 将被完全移除,在此期间,你将有足够的时间来学习和迁移至这套全新的反射 API。")],-1),_=e("h2",{id:"freereflection-弃用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#freereflection-弃用","aria-hidden":"true"},"#"),o(" FreeReflection 弃用")],-1),D=e("code",null,"YukiHookAPI",-1),m=e("code",null,"1.3.0",-1),b={href:"https://github.com/tiann/FreeReflection",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/LSPosed/AndroidHiddenApiBypass",target:"_blank",rel:"noopener noreferrer"},C=a(`在反射系统隐藏 API 时,你不可以像之前那样直接进行反射,而是需要进行一些操作。
YukiHookAPI
内置了 KavaRef
的 第三方 Member 解析器
中的 AndroidHiddenApiBypassResolver
,现在你可以在需要反射系统隐藏 API 的地方这样去使用它。
示例如下
"android.app.ActivityThread".toClass()
.resolve()
// 添加自定义 Member 解析器
.processor(AndroidHiddenApiBypassResolver.get())
.firstMethod {
name = "currentActivityThread"
emptyParameters()
}.invoke()
`,4),g={class:"custom-container warning"},P=e("p",{class:"custom-container-title"},"注意",-1),I=e("code",null,"AndroidHiddenApiBypassResolver",-1),H=e("code",null,"2.0.0",-1),F={href:"https://highcapable.github.io/KavaRef/zh-cn/config/processor-resolvers",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"KavaRef",-1),Y=a(` 方法原始调用
Xposed
提供了 XposedBridge.invokeOriginalMethod
功能,可以调用未经 Hook 的原始方法。
由于自身反射 API 的弃用,method { ... }.get().original().call(...)
的方式将不再可用。
所以,YukiHookAPI
为 KavaRef
添加了扩展功能,现在你依然可以实现这个功能。
YukiHookAPI
提供了以下方法来对接 KavaRef
的原始方法调用。
invokeOriginal(...)
→ invoke(...)
invokeOriginalQuietly(...)
→ invokeQuietly(...)
示例如下
// 假设这就是 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 的相关逻辑。
注册模块 Activity 行为变更
YukiHookAPI
从 1.3.0
版本开始,注册模块 Activity
行为的方式发生了变更。
请阅读 注册模块 Activity 以了解更多信息。
YLog 行为变更
YukiHookAPI
从 1.3.0
版本开始允许 YLog
的 msg
参数传入任意对象,它们都会自动使用 toString()
方法进行转换。
`,16);function R(q,K){const s=c("ExternalLinkIcon");return i(),t("div",null,[r,e("p",null,[p,o(" 从 "),A,o(" 版本开始弃用了自身的反射 API,现在我们推荐所有开发者迁移至全新开发的 "),e("a",h,[o("KavaRef"),n(s)]),o(",我们不再推荐使用 "),u,o(" 自身的反射 API,这些 API 已被标记为弃用。")]),e("p",null,[o("请参考 "),e("a",v,[o("这里"),n(s)]),o(" 的迁移文档,这将跳转到 "),y,o(" 的文档。")]),k,B,_,e("p",null,[D,o(" 从 "),m,o(" 版本开始弃用了 "),e("a",b,[o("FreeReflection"),n(s)]),o(" 并迁移至由 LSPosed 团队维护的 "),e("a",f,[o("AndroidHiddenApiBypass"),n(s)]),o("。")]),C,e("div",g,[P,e("p",null,[I,o(" 是暂定的功能,可能会在 "),H,o(" 版本迁移至单独的模块中,你也可以参考 "),e("a",F,[o("第三方 Member 解析器"),n(s)]),o(" 自己实现一份,这将跳转到 "),x,o(" 的文档。")])]),Y])}const L=l(d,[["render",R],["__file","move-to-api-1-3-x.html.vue"]]);export{L as default};