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

19 lines
9.8 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 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;">&quot;android.app.ActivityThread&quot;</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;">&quot;currentActivityThread&quot;</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;">&quot;com.example.Test&quot;</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;">&quot;test&quot;</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};