import{_ as t,r,o as i,c as A,b as s,d as l,e as n,w as e,a as o}from"./app-BpUB8-Q8.js";const y={},d=s("h1",{id:"从其它-hook-api-迁移",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#从其它-hook-api-迁移","aria-hidden":"true"},"#"),l(" 从其它 Hook API 迁移")],-1),D=s("p",null,[l("此文档可以帮助你快速从你熟悉的 Hook API 迁移至 "),s("code",null,"YukiHookAPI"),l(" 来熟悉对 "),s("code",null,"YukiHookAPI"),l(" 的相关写法。")],-1),B=s("h2",{id:"rovo89-xposed-api",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#rovo89-xposed-api","aria-hidden":"true"},"#"),l(" Rovo89 Xposed API")],-1),C={href:"https://api.xposed.info/",target:"_blank",rel:"noopener noreferrer"},u=s("code",null,"YukiHookAPI",-1),m=o('

迁移 Hook 入口点

XC_LoadPackage.LoadPackageParam 迁移至 PackageParam

YukiHookAPIPackageParam 实现了 lambda 方法体 this 用法,在 encase 方法体内即可全局得到 PackageParam 对象。

API 功能差异对比如下

',4),v=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"encase"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的包名")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," packageName")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的 ApplicationInfo")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," appInfo")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到系统上下文对象")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," systemContext")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到宿主 Application 生命周期")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," appContext")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Hook 指定的 APP")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"loadApp"),s("span",{style:{color:"#ADBAC7"}},"(name "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"com.demo.test"'),s("span",{style:{color:"#ADBAC7"}},") {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Member Hook")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"com.demo.test.TestClass"'),s("span",{style:{color:"#ADBAC7"}},"."),s("span",{style:{color:"#DCBDFB"}},"toClass"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," ."),s("span",{style:{color:"#DCBDFB"}},"resolve"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," ."),s("span",{style:{color:"#DCBDFB"}},"firstMethod"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," name "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"test"')]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"parameters"),s("span",{style:{color:"#ADBAC7"}},"(Boolean::"),s("span",{style:{color:"#DCBDFB"}},"class"),s("span",{style:{color:"#ADBAC7"}},")")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }."),s("span",{style:{color:"#DCBDFB"}},"hook"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"after"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Resources Hook (固定用法)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"resources"),s("span",{style:{color:"#ADBAC7"}},"()."),s("span",{style:{color:"#DCBDFB"}},"hook"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"injectResource"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"conditions"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," name "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"ic_launcher"')]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"mipmap"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceToModuleResource"),s("span",{style:{color:"#ADBAC7"}},"(R.mipmap.ic_launcher)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),b=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"private"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"lateinit"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"var"),s("span",{style:{color:"#ADBAC7"}}," moduleResources: "),s("span",{style:{color:"#F69D50"}},"XModuleResources")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"initZygote"),s("span",{style:{color:"#ADBAC7"}},"(sparam: "),s("span",{style:{color:"#F69D50"}},"IXposedHookZygoteInit"),s("span",{style:{color:"#ADBAC7"}},".StartupParam) {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," moduleResources "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," XModuleResources."),s("span",{style:{color:"#DCBDFB"}},"createInstance"),s("span",{style:{color:"#ADBAC7"}},"(sparam.modulePath, "),s("span",{style:{color:"#6CB6FF"}},"null"),s("span",{style:{color:"#ADBAC7"}},")")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"handleLoadPackage"),s("span",{style:{color:"#ADBAC7"}},"(lpparam: "),s("span",{style:{color:"#F69D50"}},"XC_LoadPackage"),s("span",{style:{color:"#ADBAC7"}},".LoadPackageParam) {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的包名")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," lpparam.packageName")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的 ApplicationInfo")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," lpparam.applicationInfo")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到系统上下文对象")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 在 Rovo89 Xposed API 中没有现成的调用方法,你需要自行反射 ActivityThread 来实现")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到宿主 Application 生命周期")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," AndroidAppHelper."),s("span",{style:{color:"#DCBDFB"}},"currentApplication"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Class Hook")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"if"),s("span",{style:{color:"#ADBAC7"}},"(lpparam.packageName "),s("span",{style:{color:"#F47067"}},"=="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"com.demo.test"'),s("span",{style:{color:"#ADBAC7"}},")")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," XposedHelpers."),s("span",{style:{color:"#DCBDFB"}},"findAndHookMethod"),s("span",{style:{color:"#ADBAC7"}},"(")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"com.demo.test.TestClass"'),s("span",{style:{color:"#ADBAC7"}},", lpparam.classLoader,")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"test"'),s("span",{style:{color:"#ADBAC7"}},", Boolean::"),s("span",{style:{color:"#DCBDFB"}},"class"),s("span",{style:{color:"#ADBAC7"}},".java,")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," object : "),s("span",{style:{color:"#F69D50"}},"XC_MethodHook"),s("span",{style:{color:"#ADBAC7"}},"() {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," )")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"handleInitPackageResources"),s("span",{style:{color:"#ADBAC7"}},"(resparam: "),s("span",{style:{color:"#F69D50"}},"XC_InitPackageResources"),s("span",{style:{color:"#ADBAC7"}},".InitPackageResourcesParam) {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的包名")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," resparam.packageName")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Resources Hook")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," resparam.res."),s("span",{style:{color:"#DCBDFB"}},"setReplacement"),s("span",{style:{color:"#ADBAC7"}},"(")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#96D0FF"}},'"com.demo.test"'),s("span",{style:{color:"#ADBAC7"}},", "),s("span",{style:{color:"#96D0FF"}},'"mipmap"'),s("span",{style:{color:"#ADBAC7"}},","),s("span",{style:{color:"#96D0FF"}},'"ic_launcher"'),s("span",{style:{color:"#ADBAC7"}},",")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," moduleResources."),s("span",{style:{color:"#DCBDFB"}},"fwd"),s("span",{style:{color:"#ADBAC7"}},"(R.mipmap.ic_launcher)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," )")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),F=o('

迁移 Hook 方法体

XC_MethodHook.MethodHookParam 迁移至 HookParam

Before/After Hook

YukiHookAPI 同样对 HookParam 实现了 lambda 方法体 this 用法,在 beforeafter 等方法体内即可全局得到 HookParam 对象。

API 功能差异对比如下

',5),k=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"after"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," instance")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的 Class 实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," instanceClass")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到并 cast 当前 Hook 的实例为指定类型 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"instance"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"T"),s("span",{style:{color:"#ADBAC7"}},">()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数数组")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," args")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的第一位 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"args"),s("span",{style:{color:"#ADBAC7"}},"()."),s("span",{style:{color:"#DCBDFB"}},"first"),s("span",{style:{color:"#ADBAC7"}},"()."),s("span",{style:{color:"#DCBDFB"}},"cast"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"T"),s("span",{style:{color:"#ADBAC7"}},">()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的最后一位 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"args"),s("span",{style:{color:"#ADBAC7"}},"()."),s("span",{style:{color:"#DCBDFB"}},"last"),s("span",{style:{color:"#ADBAC7"}},"()."),s("span",{style:{color:"#DCBDFB"}},"cast"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"T"),s("span",{style:{color:"#ADBAC7"}},">()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的任意下标 T,这里用 2 举例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"args"),s("span",{style:{color:"#ADBAC7"}},"(index "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"2"),s("span",{style:{color:"#ADBAC7"}},")."),s("span",{style:{color:"#DCBDFB"}},"cast"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"T"),s("span",{style:{color:"#ADBAC7"}},">()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 设置方法参数的任意下标,这里用 2 举例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"args"),s("span",{style:{color:"#ADBAC7"}},"(index "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"2"),s("span",{style:{color:"#ADBAC7"}},")."),s("span",{style:{color:"#DCBDFB"}},"set"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," result")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到返回值并 cast 为 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"result"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"T"),s("span",{style:{color:"#ADBAC7"}},">()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 修改返回值内容")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 删除返回值内容")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"resultNull"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 获取当前回调方法体范围内的数据存储实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," dataExtra")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 向 Hook APP 抛出异常")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},")."),s("span",{style:{color:"#DCBDFB"}},"throwToApp"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 执行未经 Hook 的原始方法并使用原始方法参数调用,泛型可略")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"callOriginal"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"Any"),s("span",{style:{color:"#ADBAC7"}},"?>()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 执行未经 Hook 的原始方法并自定义方法参数调用,泛型可略")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"invokeOriginal"),s("span",{style:{color:"#ADBAC7"}},"<"),s("span",{style:{color:"#F69D50"}},"Any"),s("span",{style:{color:"#ADBAC7"}},"?>("),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),h=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.thisObject")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到当前 Hook 的 Class 实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.thisObject.javaClass")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到并 cast 当前 Hook 的实例为指定类型 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.thisObject "),s("span",{style:{color:"#F47067"}},"as"),s("span",{style:{color:"#ADBAC7"}}," T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数数组")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.args")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的第一位 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.args["),s("span",{style:{color:"#6CB6FF"}},"0"),s("span",{style:{color:"#ADBAC7"}},"] "),s("span",{style:{color:"#F47067"}},"as"),s("span",{style:{color:"#ADBAC7"}}," T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的最后一位 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.args[param.args.lastIndex] "),s("span",{style:{color:"#F47067"}},"as"),s("span",{style:{color:"#ADBAC7"}}," T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到方法参数的任意下标 T,这里用 2 举例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.args["),s("span",{style:{color:"#6CB6FF"}},"2"),s("span",{style:{color:"#ADBAC7"}},"] "),s("span",{style:{color:"#F47067"}},"as"),s("span",{style:{color:"#ADBAC7"}}," T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 设置方法参数的任意下标,这里用 2 举例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.args["),s("span",{style:{color:"#6CB6FF"}},"2"),s("span",{style:{color:"#ADBAC7"}},"] "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 得到返回值并 cast 为 T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"as"),s("span",{style:{color:"#ADBAC7"}}," T")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 修改返回值内容")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 删除返回值内容")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 获取当前回调方法体范围内的数据存储实例")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.extra")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 向 Hook APP 抛出异常")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.throwable "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},")")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 执行未经 Hook 的原始方法")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," XposedBridge."),s("span",{style:{color:"#DCBDFB"}},"invokeOriginalMethod"),s("span",{style:{color:"#ADBAC7"}},"(param.method, param.thisObject, "),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),_=s("h4",{id:"replace-hook",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#replace-hook","aria-hidden":"true"},"#"),l(" Replace Hook")],-1),g=s("p",null,[s("code",null,"replaceHook"),l(" 方法比较特殊,"),s("code",null,"YukiHookAPI"),l(" 为它做出了多种形式以供选择。")],-1),H=s("blockquote",null,[s("p",null,"API 功能差异对比如下")],-1),f=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 无返回值的方法 void")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"replaceUnit"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 直接在这里实现被替换的逻辑")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 有返回值的方法")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"replaceAny"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 在这里实现被替换的逻辑")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 需要返回方法对应的返回值,无需写 return,只需将参数放到最后一位")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 假设这个方法的返回值是 Int,我们只需要保证最后一位是我们需要的返回值即可")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"0")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 有些方法我们只需替换其返回值,则有如下实现")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 需要注意的是:直接替换返回值的方法传入的参数是固定不变的,若想实现动态替换返回值请使用上面的 replaceAny 方法体")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 替换为你需要的返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"replaceTo"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 替换为 Boolean 类型的返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"replaceToTrue"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 拦截返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#DCBDFB"}},"intercept"),s("span",{style:{color:"#ADBAC7"}},"()")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),P=s("div",{class:"language-kotlin line-numbers-mode","data-ext":"kt"},[s("pre",{class:"shiki github-dark-dimmed",style:{"background-color":"#22272e"},tabindex:"0"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 无返回值的方法 void")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},"): "),s("span",{style:{color:"#F69D50"}},"Any"),s("span",{style:{color:"#ADBAC7"}},"? {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 直接在这里实现被替换的逻辑")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"return"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 有返回值的方法")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},"): "),s("span",{style:{color:"#F69D50"}},"Int"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 在这里实现被替换的逻辑")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// 假设这个方法的返回值是 Int")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"return"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"0")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// 有些方法我们只需替换其返回值,则有如下实现")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 替换为你需要的返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},".."),s("span",{style:{color:"#ADBAC7"}},".")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 替换为 Boolean 类型的返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"true")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// 拦截返回值")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param: "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),l(` `),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),I=o('

迁移 XposedHelpers 注意事项

YukiHookAPI 中提供的反射功能与 XposedHelpers 的反射功能有所不同,这里提供一个误区指引。

XposedHelpers.callMethodXposedHelpers.callStaticMethod 等方法自动查找的方法会自动调用所有公开的方法 (包括 super 超类),这是 Java 原生反射的特性, 而 YukiHookAPI 提供的反射方案为先反射查找再调用,而查找过程默认不会自动查找 super 超类的方法。

',3),x={class:"custom-container warning"},T=s("p",{class:"custom-container-title"},"注意",-1),M=s("p",null,[s("code",null,"YukiHookAPI"),l(" 自身的反射 API 在 "),s("code",null,"1.3.0"),l(" 版本已被弃用,以下内容仅作为 "),s("code",null,"1.3.0"),l(" 版本之前的迁移指引,我们会对其进行保留但不会再进行内容的更新。")],-1),R={href:"https://github.com/HighCapable/KavaRef",target:"_blank",rel:"noopener noreferrer"},q=s("code",null,"KavaRef",-1),X=o(`

例如,类 A 继承于 BB 中存在公开的方法 test,而 A 中并不存在。

public class B {
    public void test(String a) {
        // ...
    }
}

public class A extends B {
    // ...
}

此时 XposedHelpers 的用法。

val instance: A = ...
XposedHelpers.callMethod(instance, "test", "some string")

YukiHookAPI 的用法。

val instance: A = ...
instance.current().method {
    name = "test"
    // 请注意,这里需要添加此查找条件以确保其会查找超类的方法
    superClass()
}.call("some string")
// 或者直接调用 superClass() 方法
instance.current().superClass()?.method {
    name = "test"
}?.call("some string")

迁移更多有关 Hook API 的功能

YukiHookAPI 是一套全新的 Hook API,与其它 Hook API 存在着本质区别,你可以参考 API 文档 以及 特色功能 来决定一些功能性的迁移和使用。

`,8);function Y(j,w){const p=r("ExternalLinkIcon"),a=r("CodeGroupItem"),c=r("CodeGroup");return i(),A("div",null,[d,D,B,s("blockquote",null,[s("p",null,[l("若你熟悉 "),s("a",C,[l("Rovo89 Xposed API"),n(p)]),l(",你可以参考下方的相同点将自己的 API 快速迁移至 "),u,l("。")])]),m,n(c,null,{default:e(()=>[n(a,{title:"Yuki Hook API"},{default:e(()=>[v]),_:1}),n(a,{title:"Rovo89 Xposed API"},{default:e(()=>[b]),_:1})]),_:1}),F,n(c,null,{default:e(()=>[n(a,{title:"Yuki Hook API"},{default:e(()=>[k]),_:1}),n(a,{title:"Rovo89 Xposed API"},{default:e(()=>[h]),_:1})]),_:1}),_,g,H,n(c,null,{default:e(()=>[n(a,{title:"Yuki Hook API"},{default:e(()=>[f]),_:1}),n(a,{title:"Rovo89 Xposed API"},{default:e(()=>[P]),_:1})]),_:1}),I,s("div",x,[T,M,s("p",null,[l("你可以迁移至 "),s("a",R,[l("KavaRef"),n(p)]),l(","),q,l(" 同样适用此特性。")])]),X])}const L=t(y,[["render",Y],["__file","move-to-new-api.html.vue"]]);export{L as default};