Files
YukiHookAPI/assets/move-to-new-api.html-DwX5LqED.js
github-actions[bot] aac9e42e84 Deploy to GitHub pages
2025-08-02 18:17:09 +00:00

209 lines
50 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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('<h3 id="迁移-hook-入口点" tabindex="-1"><a class="header-anchor" href="#迁移-hook-入口点" aria-hidden="true">#</a> 迁移 Hook 入口点</h3><blockquote><p>从 <code>XC_LoadPackage.LoadPackageParam</code> 迁移至 <code>PackageParam</code>。</p></blockquote><p><code>YukiHookAPI</code> 对 <code>PackageParam</code> 实现了 <strong>lambda</strong> 方法体 <code>this</code> 用法,在 <code>encase</code> 方法体内即可全局得到 <code>PackageParam</code> 对象。</p><blockquote><p>API 功能差异对比如下</p></blockquote>',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('<h3 id="迁移-hook-方法体" tabindex="-1"><a class="header-anchor" href="#迁移-hook-方法体" aria-hidden="true">#</a> 迁移 Hook 方法体</h3><blockquote><p>从 <code>XC_MethodHook.MethodHookParam</code> 迁移至 <code>HookParam</code>。</p></blockquote><h4 id="before-after-hook" tabindex="-1"><a class="header-anchor" href="#before-after-hook" aria-hidden="true">#</a> Before/After Hook</h4><p><code>YukiHookAPI</code> 同样对 <code>HookParam</code> 实现了 <strong>lambda</strong> 方法体 <code>this</code> 用法,在 <code>before</code>、<code>after</code> 等方法体内即可全局得到 <code>HookParam</code> 对象。</p><blockquote><p>API 功能差异对比如下</p></blockquote>',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('<h3 id="迁移-xposedhelpers-注意事项" tabindex="-1"><a class="header-anchor" href="#迁移-xposedhelpers-注意事项" aria-hidden="true">#</a> 迁移 XposedHelpers 注意事项</h3><p><code>YukiHookAPI</code> 中提供的反射功能与 <code>XposedHelpers</code> 的反射功能有所不同,这里提供一个误区指引。</p><p><code>XposedHelpers.callMethod</code>、<code>XposedHelpers.callStaticMethod</code> 等方法自动查找的方法会自动调用所有公开的方法 (包括 <code>super</code> 超类),这是 Java 原生反射的特性, 而 <code>YukiHookAPI</code> 提供的反射方案为先反射查找再调用,而查找过程默认不会自动查找 <code>super</code> 超类的方法。</p>',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(`<p>例如,类 <code>A</code> 继承于 <code>B</code> <code>B</code> 中存在公开的方法 <code>test</code>,而 <code>A</code> 中并不存在。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">public</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">B</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">public</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">void</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">test</span><span style="color:#ADBAC7;">(String </span><span style="color:#F69D50;">a</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// ...</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F47067;">public</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">A</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">extends</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">B</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// ...</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此时 <code>XposedHelpers</code> 的用法。</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> instance: </span><span style="color:#F69D50;">A</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">..</span><span style="color:#ADBAC7;">.</span></span>
<span class="line"><span style="color:#ADBAC7;">XposedHelpers.</span><span style="color:#DCBDFB;">callMethod</span><span style="color:#ADBAC7;">(instance, </span><span style="color:#96D0FF;">&quot;test&quot;</span><span style="color:#ADBAC7;">, </span><span style="color:#96D0FF;">&quot;some string&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div></div></div><p><code>YukiHookAPI</code> 的用法。</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> instance: </span><span style="color:#F69D50;">A</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">..</span><span style="color:#ADBAC7;">.</span></span>
<span class="line"><span style="color:#ADBAC7;">instance.</span><span style="color:#DCBDFB;">current</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">method</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 请注意,这里需要添加此查找条件以确保其会查找超类的方法</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">superClass</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;">}.</span><span style="color:#DCBDFB;">call</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;some string&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#768390;">// 或者直接调用 superClass() 方法</span></span>
<span class="line"><span style="color:#ADBAC7;">instance.</span><span style="color:#DCBDFB;">current</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">superClass</span><span style="color:#ADBAC7;">()?.</span><span style="color:#DCBDFB;">method</span><span style="color:#ADBAC7;"> {</span></span>
<span class="line"><span style="color:#ADBAC7;"> name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test&quot;</span></span>
<span class="line"><span style="color:#ADBAC7;">}?.</span><span style="color:#DCBDFB;">call</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">&quot;some string&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="迁移更多有关-hook-api-的功能" tabindex="-1"><a class="header-anchor" href="#迁移更多有关-hook-api-的功能" aria-hidden="true">#</a> 迁移更多有关 Hook API 的功能</h2><p><code>YukiHookAPI</code> 是一套全新的 Hook API与其它 Hook API 存在着本质区别,你可以参考 <a href="../api/home">API 文档</a> 以及 <a href="../api/special-features/reflection">特色功能</a> 来决定一些功能性的迁移和使用。</p>`,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};