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('
从
XC_LoadPackage.LoadPackageParam
迁移至PackageParam
。
YukiHookAPI
对 PackageParam
实现了 lambda 方法体 this
用法,在 encase
方法体内即可全局得到 PackageParam
对象。
',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('API 功能差异对比如下
从
XC_MethodHook.MethodHookParam
迁移至HookParam
。
YukiHookAPI
同样对 HookParam
实现了 lambda 方法体 this
用法,在 before
、after
等方法体内即可全局得到 HookParam
对象。
',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('API 功能差异对比如下
YukiHookAPI
中提供的反射功能与 XposedHelpers
的反射功能有所不同,这里提供一个误区指引。
XposedHelpers.callMethod
、XposedHelpers.callStaticMethod
等方法自动查找的方法会自动调用所有公开的方法 (包括 super
超类),这是 Java 原生反射的特性, 而 YukiHookAPI
提供的反射方案为先反射查找再调用,而查找过程默认不会自动查找 super
超类的方法。
例如,类 A
继承于 B
, B
中存在公开的方法 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")
YukiHookAPI
是一套全新的 Hook API,与其它 Hook API 存在着本质区别,你可以参考 API 文档 以及 特色功能 来决定一些功能性的迁移和使用。