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