mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
130 lines
90 KiB
JavaScript
130 lines
90 KiB
JavaScript
import{_ as s,o as a,c as o,a as e}from"./app-BpUB8-Q8.js";const n={},l=e(`<div class="custom-container warning"><p class="custom-container-title">注意</p><p>由于维护成本,<code>YukiHookAPI</code> 从 <code>1.3.0</code> 版本开始将不再会对此文档进行更新且在 <code>2.0.0</code> 版本切换为 Dokka 插件自动生成的 API 文档。</p></div><h1 id="packageparam-class" tabindex="-1"><a class="header-anchor" href="#packageparam-class" aria-hidden="true">#</a> PackageParam <span class="symbol">- class</span></h1><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">open</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">internal</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">constructor</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">internal</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">var</span><span style="color:#ADBAC7;"> wrapper: </span><span style="color:#F69D50;">PackageParamWrapper</span><span style="color:#ADBAC7;">?)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>装载 Hook 的目标 APP 入口对象实现类。</p></blockquote><h2 id="appclassloader-field" tabindex="-1"><a class="header-anchor" href="#appclassloader-field" aria-hidden="true">#</a> appClassLoader <span class="symbol">- field</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">var</span><span style="color:#ADBAC7;"> appClassLoader:ClassLoader?</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.1.5</code> <code>修改</code></p><p>可以动态修改此变量的值</p><p><code>v1.2.0</code> <code>修改</code></p><p>加入可空类型 (空安全)</p><p><strong>功能描述</strong></p><blockquote><p>获取、设置当前 Hook APP 的 <code>ClassLoader</code>。</p></blockquote><p>你可以在这里手动设置当前 Hook APP 的 <code>ClassLoader</code>,默认情况下会自动获取。</p><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>如果设置了错误或无效的 <strong>ClassLoader</strong> 会造成功能异常,请谨慎操作。</p></div><h2 id="appinfo-field" tabindex="-1"><a class="header-anchor" href="#appinfo-field" aria-hidden="true">#</a> appInfo <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> appInfo: </span><span style="color:#F69D50;">ApplicationInfo</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的 <code>ApplicationInfo</code>。</p></blockquote><h2 id="appuserid-field" tabindex="-1"><a class="header-anchor" href="#appuserid-field" aria-hidden="true">#</a> appUserId <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> appUserId: </span><span style="color:#F69D50;">Int</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的用户 ID。</p></blockquote><p>机主为 <code>0</code>,应用双开 (分身) 或工作资料因系统环境不同 ID 也各不相同。</p><h2 id="appcontext-field" tabindex="-1"><a class="header-anchor" href="#appcontext-field" aria-hidden="true">#</a> appContext <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> appContext: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">?</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.72</code> <code>新增</code></p><p><code>v1.1.0</code> <code>修改</code></p><p>加入可空类型 (空安全)</p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的 <code>Application</code>。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>首次装载可能是空的,请延迟一段时间再获取或使用 <strong>onAppLifecycle</strong> 监听来完成。</p></div><h2 id="appresources-field" tabindex="-1"><a class="header-anchor" href="#appresources-field" aria-hidden="true">#</a> appResources <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> appResources:Resources?</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><code>v1.1.0</code> <code>修改</code></p><p>加入可空类型 (空安全)</p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的 Resources。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>你只能在 <strong>HookResources.hook</strong> 方法体内或 <strong>appContext</strong> 装载完毕时进行调用。</p></div><h2 id="systemcontext-field" tabindex="-1"><a class="header-anchor" href="#systemcontext-field" aria-hidden="true">#</a> systemContext <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> systemContext: </span><span style="color:#F69D50;">Context</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前系统框架的 <code>Context</code>。</p></blockquote><h2 id="processname-field" tabindex="-1"><a class="header-anchor" href="#processname-field" aria-hidden="true">#</a> processName <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> processName: </span><span style="color:#F69D50;">String</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的进程名称。</p></blockquote><h2 id="packagename-field" tabindex="-1"><a class="header-anchor" href="#packagename-field" aria-hidden="true">#</a> packageName <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> packageName: </span><span style="color:#F69D50;">String</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的包名。</p></blockquote><h2 id="isfirstapplication-field" tabindex="-1"><a class="header-anchor" href="#isfirstapplication-field" aria-hidden="true">#</a> isFirstApplication <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> isFirstApplication: </span><span style="color:#F69D50;">Boolean</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 是否为第一个 <code>Application</code>。</p></blockquote><h2 id="mainprocessname-field" tabindex="-1"><a class="header-anchor" href="#mainprocessname-field" aria-hidden="true">#</a> mainProcessName <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> mainProcessName: </span><span style="color:#F69D50;">String</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.70</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Hook APP 的主进程名称。</p></blockquote><p>其对应的就是 <code>packageName</code>。</p><h2 id="moduleappfilepath-field" tabindex="-1"><a class="header-anchor" href="#moduleappfilepath-field" aria-hidden="true">#</a> moduleAppFilePath <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> moduleAppFilePath: </span><span style="color:#F69D50;">String</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Xposed 模块自身 APK 文件路径。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>作为 Hook API 装载时无法使用,会获取到空字符串。</p></div><h2 id="moduleappresources-field" tabindex="-1"><a class="header-anchor" href="#moduleappresources-field" aria-hidden="true">#</a> moduleAppResources <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> moduleAppResources: </span><span style="color:#F69D50;">YukiModuleResources</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取当前 Xposed 模块自身 <code>Resources</code>。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>作为 Hook API 或不支持的 Hook Framework 装载时无法使用,会抛出异常。</p></div><h2 id="prefs-field" tabindex="-1"><a class="header-anchor" href="#prefs-field" aria-hidden="true">#</a> prefs <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> prefs: </span><span style="color:#F69D50;">YukiHookPrefsBridge</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>创建 <code>YukiHookPrefsBridge</code> 对象。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>作为 Hook API 装载时无法使用,会抛出异常。</p></div><h2 id="prefs-method" tabindex="-1"><a class="header-anchor" href="#prefs-method" aria-hidden="true">#</a> prefs <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">prefs</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiHookPrefsBridge</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.0.80</code> <code>修改</code></p><p>将方法体进行 inline</p><p><strong>功能描述</strong></p><blockquote><p>创建 <code>YukiHookPrefsBridge</code> 对象。</p></blockquote><p>你可以通过 <code>name</code> 来自定义 Sp 存储的名称。</p><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>作为 Hook API 装载时无法使用,会抛出异常。</p></div><h2 id="datachannel-field" tabindex="-1"><a class="header-anchor" href="#datachannel-field" aria-hidden="true">#</a> dataChannel <span class="symbol">- field</span></h2><div class="language-kotlin" 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;"> dataChannel: </span><span style="color:#F69D50;">YukiHookDataChannel</span><span style="color:#ADBAC7;">.NameSpace</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获取 <code>YukiHookDataChannel</code> 对象。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>作为 Hook API 装载时无法使用,会抛出异常。</p></div><h2 id="resources-method" tabindex="-1"><a class="header-anchor" href="#resources-method" aria-hidden="true">#</a> resources <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">resources</span><span style="color:#ADBAC7;">(): </span><span style="color:#F69D50;">HookResources</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>获得当前 Hook APP 的 <code>YukiResources</code> 对象。</p></blockquote><p>请调用 <code>HookResources.hook</code> 方法开始 Hook。</p><h2 id="refreshmoduleappresources-method" tabindex="-1"><a class="header-anchor" href="#refreshmoduleappresources-method" aria-hidden="true">#</a> refreshModuleAppResources <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">refreshModuleAppResources</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.87</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>刷新当前 Xposed 模块自身 <code>Resources</code>。</p></blockquote><h2 id="onapplifecycle-method" tabindex="-1"><a class="header-anchor" href="#onapplifecycle-method" aria-hidden="true">#</a> onAppLifecycle <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onAppLifecycle</span><span style="color:#ADBAC7;">(isOnFailureThrowToApp: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">AppLifecycle</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><code>v1.1.5</code> <code>修改</code></p><p>新增 <code>isOnFailureThrowToApp</code> 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主</p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 生命周期装载事件。</p></blockquote><div class="custom-container warning"><p class="custom-container-title">注意</p><p>在 <strong>loadZygote</strong> 中不会被装载,仅会在 <strong>loadSystem</strong>、<strong>loadApp</strong> 中装载。</p><p>作为 Hook API 装载时请使用原生的 <strong>Application</strong> 实现生命周期监听。</p></div><h2 id="loadapp-method" tabindex="-1"><a class="header-anchor" href="#loadapp-method" aria-hidden="true">#</a> loadApp <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, </span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(isExcludeSelf: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(isExcludeSelf: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(isExcludeSelf: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, </span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.0.80</code> <code>修改</code></p><p>将方法体进行 inline</p><p><code>v1.1.4</code> <code>修改</code></p><p>新增两个方法,可以同时装载多个 APP 与子 Hooker</p><p><code>v1.1.5</code> <code>修改</code></p><p>新增三个方法,可以使用参数 <code>isExcludeSelf</code> 排除模块自身</p><p><strong>功能描述</strong></p><blockquote><p>装载并 Hook 指定、全部包名的 APP。</p></blockquote><p><code>name</code> 为 APP 的包名,后方的两个参数一个可作为 <strong>lambda</strong> 方法体使用,一个可以直接装载子 Hooker。</p><p>装载并 Hook 指定、全部包名的 APP。</p><p>若要装载 APP Zygote 事件,请使用 <code>loadZygote</code>。</p><p>若要 Hook 系统框架,请使用 <code>loadSystem</code>。</p><p><strong>功能示例</strong></p><p>你可以使用 <code>loadApp</code> 的 <strong>lambda</strong> 方法体形式或直接装载一个 Hooker。</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:#768390;">// 使用 lambda</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">"com.example.test"</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// 使用 Hooker</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(name </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">"com.example.test"</span><span style="color:#ADBAC7;">, CustomHooker)</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></div><p>若不指定 <code>name</code> 参数,则此方法体默认会过滤当前系统中全部可被 Hook 的 APP。</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:#768390;">// 使用 lambda</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// 使用 Hooker</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(hooker </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> CustomHooker)</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></div><p>若要在全部可被 Hook 的 APP 中过滤掉模块自身,你只需加入 <code>isExcludeSelf = true</code>。</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:#768390;">// 使用 lambda</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(isExcludeSelf </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// 使用 Hooker</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(isExcludeSelf </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span><span style="color:#ADBAC7;">, hooker </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> CustomHooker)</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></div><p>若想要同时装载多个需要 Hook 的 APP,可以直接使用如下方式。</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:#768390;">// 同时装载多个需要 Hook 的 APP</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.test"</span><span style="color:#ADBAC7;">, </span><span style="color:#96D0FF;">"com.example.next"</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</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></div><p>若想要同时装载多个子 Hooker,可以直接使用如下方式,但此时只能指定一个需要 Hook 的 APP。</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:#768390;">// 同时装载多个子 Hooker</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">loadApp</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.test"</span><span style="color:#ADBAC7;">, CustomHooker1, CustomHooker2)</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><h2 id="loadzygote-method" tabindex="-1"><a class="header-anchor" href="#loadzygote-method" aria-hidden="true">#</a> loadZygote <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadZygote</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadZygote</span><span style="color:#ADBAC7;">(hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadZygote</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><code>v1.1.4</code> <code>修改</code></p><p>新增一个方法,可以同时装载多个子 Hooker</p><p><strong>功能描述</strong></p><blockquote><p>装载 APP Zygote 事件。</p></blockquote><p>方法中的两个参数一个可作为 <strong>lambda</strong> 方法体使用,一个可以直接装载子 Hooker。</p><h2 id="loadsystem-method" tabindex="-1"><a class="header-anchor" href="#loadsystem-method" aria-hidden="true">#</a> loadSystem <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadSystem</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadSystem</span><span style="color:#ADBAC7;">(hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadSystem</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.82</code> <code>新增</code></p><p><code>v1.1.4</code> <code>修改</code></p><p>新增一个方法,可以同时装载多个子 Hooker</p><p><strong>功能描述</strong></p><blockquote><p>装载并 Hook 系统框架。</p></blockquote><p>方法中的两个参数一个可作为 <strong>lambda</strong> 方法体使用,一个可以直接装载子 Hooker。</p><h2 id="withprocess-method" tabindex="-1"><a class="header-anchor" href="#withprocess-method" aria-hidden="true">#</a> withProcess <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">withProcess</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">PackageParam</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">withProcess</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">withProcess</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">withProcess</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, </span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.70</code> <code>新增</code></p><p><code>v1.1.4</code> <code>修改</code></p><p>新增两个方法,可以同时装载多个进程与子 Hooker</p><p><strong>功能描述</strong></p><blockquote><p>装载并 Hook APP 的指定进程。</p></blockquote><p><code>name</code> 为 APP 的进程名称,后方的两个参数一个可作为 <strong>lambda</strong> 方法体使用,一个可以直接装载子 Hooker。</p><h2 id="loadhooker-method" tabindex="-1"><a class="header-anchor" href="#loadhooker-method" aria-hidden="true">#</a> loadHooker <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">loadHooker</span><span style="color:#ADBAC7;">(hooker: </span><span style="color:#F69D50;">YukiBaseHooker</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><strong>功能描述</strong></p><blockquote><p>装载 Hook 子类。</p></blockquote><p>你可以填入 <code>hooker</code> 在 Hooker 中继续装载 Hooker。</p><h2 id="searchclass-method" tabindex="-1"><a class="header-anchor" href="#searchclass-method" aria-hidden="true">#</a> searchClass <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">searchClass</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, async: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">ClassConditions</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">DexClassFinder</span><span style="color:#ADBAC7;">.Result</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>通过 <code>appClassLoader</code> 按指定条件查找并得到当前 Hook APP <strong>Dex</strong> 中的 <code>Class</code>。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>此方法在 <strong>Class</strong> 数量过多及查找条件复杂时会非常耗时。</p><p>建议启用 <strong>async</strong> 或设置 <strong>name</strong> 参数,<strong>name</strong> 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。</p><p>此功能尚在实验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。</p></div><h2 class="deprecated">String+VariousClass.clazz - i-ext-field</h2><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.1.0</code> <code>作废</code></p><p>请迁移到 <code>toClass(...)</code> 方法</p><h2 class="deprecated">String.hasClass - i-ext-field</h2><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.1.0</code> <code>作废</code></p><p>请迁移到 <code>hasClass(...)</code> 方法</p><h2 id="string-variousclass-toclass-i-ext-method" tabindex="-1"><a class="header-anchor" href="#string-variousclass-toclass-i-ext-method" aria-hidden="true">#</a> String+VariousClass.toClass <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><*></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> <</span><span style="color:#F69D50;">reified</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">> </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><</span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">VariousClass</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><*></span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><code>v1.1.5</code> <code>修改</code></p><p>新增泛型返回值 <code>Class<T></code> 方法</p><p>新增 <code>initialize</code> 参数</p><p><strong>功能描述</strong></p><blockquote><p>通过字符串类名、<code>VariousClass</code> 转换为 <code>loader</code> 中的实体类。</p></blockquote><p>默认使用当前 <code>appClassLoader</code> 装载目标 <code>Class</code>。</p><p><strong>功能示例</strong></p><p>你可以轻松地将 <code>String</code> 类型的 <code>Class</code> 包名转为 <code>Class</code> 实例。</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;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</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></div><p>你还可以向 <code>loader</code> 参数传入你自定义的 <code>ClassLoader</code>。</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:#F47067;">val</span><span style="color:#ADBAC7;"> customClassLoader: </span><span style="color:#F69D50;">ClassLoader</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 style="color:#768390;">// 假设这个就是你的 ClassLoader</span></span>
|
||
<span class="line"><span style="color:#96D0FF;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(customClassLoader)</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>Class</code> 的目标类型。</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:#768390;">// 指定的 DemoClass 必须存在或为可访问的 stub</span></span>
|
||
<span class="line"><span style="color:#96D0FF;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;"><</span><span style="color:#F69D50;">DemoClass</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>Class</code> 时是否自动执行其默认的静态方法块,默认情况下不会执行。</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:#768390;">// 获取并执行 DemoClass 默认的静态方法块</span></span>
|
||
<span class="line"><span style="color:#96D0FF;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(initialize </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</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>默认的静态方法块在 Java 中使用如下方式定义。</p><blockquote><p>示例如下</p></blockquote><div class="language-java" 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;">DemoClass</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">static</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>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">public</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">DemoClass</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></code></pre></div><p>你还可以创建一个 <code>VariousClass</code>,并转换为实体类。</p><p><code>VariousClass</code> 会枚举所有设置的 <code>Class</code> 并最终获得第一个存在的 <code>Class</code>。</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:#DCBDFB;">VariousClass</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.demo.DemoClass1"</span><span style="color:#ADBAC7;">, </span><span style="color:#96D0FF;">"com.example.demo.DemoClass2"</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">toClass</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></div><p>同样地,你还可以向 <code>loader</code> 参数传入你自定义的 <code>ClassLoader</code>。</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:#F47067;">val</span><span style="color:#ADBAC7;"> customClassLoader: </span><span style="color:#F69D50;">ClassLoader</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 style="color:#768390;">// 假设这个就是你的 ClassLoader</span></span>
|
||
<span class="line"><span style="color:#DCBDFB;">VariousClass</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.demo.DemoClass1"</span><span style="color:#ADBAC7;">, </span><span style="color:#96D0FF;">"com.example.demo.DemoClass2"</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">toClass</span><span style="color:#ADBAC7;">(customClassLoader)</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><h2 id="string-variousclass-toclassornull-i-ext-method" tabindex="-1"><a class="header-anchor" href="#string-variousclass-toclassornull-i-ext-method" aria-hidden="true">#</a> String+VariousClass.toClassOrNull <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClassOrNull</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><*>?</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> <</span><span style="color:#F69D50;">reified</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">> </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClassOrNull</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><</span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">>?</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">VariousClass</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toClassOrNull</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">Class</span><span style="color:#ADBAC7;"><*>?</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><code>v1.1.5</code> <code>修改</code></p><p>新增泛型返回值 <code>Class<T></code> 方法</p><p>新增 <code>initialize</code> 参数</p><p><strong>功能描述</strong></p><blockquote><p>通过字符串类名、<code>VariousClass</code> 转换为 <code>loader</code> 中的实体类。</p></blockquote><p>默认使用当前 <code>appClassLoader</code> 装载目标 <code>Class</code>。</p><p>找不到 <code>Class</code> 会返回 <code>null</code>,不会抛出异常。</p><p><strong>功能示例</strong></p><p>用法请参考 <a href="#string-variousclass-toclass-i-ext-method">String+VariousClass.toClass</a> 方法。</p><h2 id="lazyclass-method" tabindex="-1"><a class="header-anchor" href="#lazyclass-method" aria-hidden="true">#</a> lazyClass <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazyClass</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.NonNull</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Any</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> <</span><span style="color:#F69D50;">reified</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">> </span><span style="color:#DCBDFB;">lazyClass</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.NonNull</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">T</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazyClass</span><span style="color:#ADBAC7;">(variousClass: </span><span style="color:#F69D50;">VariousClass</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.NonNull</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Any</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.2.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>懒装载 <code>Class</code>。</p></blockquote><h2 id="lazyclassornull-method" tabindex="-1"><a class="header-anchor" href="#lazyclassornull-method" aria-hidden="true">#</a> lazyClassOrNull <span class="symbol">- method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazyClassOrNull</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.Nullable</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Any</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> <</span><span style="color:#F69D50;">reified</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">T</span><span style="color:#ADBAC7;">> </span><span style="color:#DCBDFB;">lazyClassOrNull</span><span style="color:#ADBAC7;">(name: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.Nullable</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">T</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazyClassOrNull</span><span style="color:#ADBAC7;">(variousClass: </span><span style="color:#F69D50;">VariousClass</span><span style="color:#ADBAC7;">, initialize: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, loader: </span><span style="color:#F69D50;">ClassLoaderInitializer</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LazyClass</span><span style="color:#ADBAC7;">.Nullable</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Any</span><span style="color:#F47067;">></span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.2.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>懒装载 <code>Class</code>。</p></blockquote><h2 id="string-hasclass-i-ext-method" tabindex="-1"><a class="header-anchor" href="#string-hasclass-i-ext-method" aria-hidden="true">#</a> String.hasClass <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hasClass</span><span style="color:#ADBAC7;">(loader: </span><span style="color:#F69D50;">ClassLoader</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">Boolean</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.1.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>通过字符串类名查找是否存在。</p></blockquote><p>默认使用当前 <code>appClassLoader</code> 装载目标 <code>Class</code>。</p><p><strong>功能示例</strong></p><p>你可以轻松的使用此方法判断字符串中的类是否存在。</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:#F47067;">if</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hasClass</span><span style="color:#ADBAC7;">()) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</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></div><p>你还可以自定义其中的 <code>loader</code> 参数,默认为 <code>appClassLoader</code>。</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:#F47067;">val</span><span style="color:#ADBAC7;"> customClassLoader: </span><span style="color:#F69D50;">ClassLoader</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 style="color:#768390;">// 假设这个就是你的 ClassLoader</span></span>
|
||
<span class="line"><span style="color:#F47067;">if</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.example.demo.DemoClass"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hasClass</span><span style="color:#ADBAC7;">(customClassLoader)) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</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></div><h2 class="deprecated">findClass - method</h2><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.0.1</code> <code>修改</code></p><p>移除了 <s><code>findClass(various: VariousClass)</code></s> 方法</p><p><code>v1.1.0</code> <code>修改</code></p><p>新增 <code>loader</code> 参数</p><p><code>v1.2.0</code> <code>作废</code></p><p>请直接使用 <code>String.toClass(...)</code> 或 <code>VariousClass(...)</code></p><h2 id="class-variousclass-hookclass-hook-i-ext-method" tabindex="-1"><a class="header-anchor" href="#class-variousclass-hookclass-hook-i-ext-method" aria-hidden="true">#</a> Class+VariousClass+HookClass.hook <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">Class</span><span style="color:#F47067;"><*></span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(isForceUseAbsolute: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.Result</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">VariousClass</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.Result</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">HookClass</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.Result</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0</code> <code>添加</code></p><p><code>v1.0.1</code> <code>修改</code></p><p>新增 <code>VariousClass</code> 的直接调用 <code>hook</code> 方法</p><p><code>v1.0.2</code> <code>修改</code></p><p>新增 <code>String</code> 的直接调用 <code>hook</code> 方法</p><p><code>v1.0.3</code> <code>修改</code></p><p>新增 <code>YukiMemberHookCreator.Result</code> 返回值</p><p><code>v1.0.70</code> <code>修改</code></p><p>新增 <code>isUseAppClassLoader</code> 参数</p><p><code>v1.0.80</code> <code>修改</code></p><p>将方法体进行 inline</p><p><code>v1.1.0</code> <code>修改</code></p><p>移除了 <s><code>isUseAppClassLoader</code></s> 参数</p><p>添加了 <code>isForceUseAbsolute</code> 参数到 <code>Class.hook</code> 方法</p><p><code>v1.2.0</code> <code>修改</code></p><p>作废了 <s><code>String.hook</code></s> 方法</p><p><strong>功能描述</strong></p><blockquote><p>Hook 方法、构造方法。</p></blockquote><h2 id="member-basefinder-baseresult-hook-i-ext-method" tabindex="-1"><a class="header-anchor" href="#member-basefinder-baseresult-hook-i-ext-method" aria-hidden="true">#</a> Member+BaseFinder.BaseResult.hook <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">Member</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">Member</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.Result</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">BaseFinder</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">BaseResult</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">BaseFinder</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">BaseResult</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.Result</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.2.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>直接 Hook 方法、构造方法。</p></blockquote><div class="custom-container warning"><p class="custom-container-title">注意</p><p>此功能尚在实验阶段,在 <strong>1.x.x</strong> 版本将暂定于此,在 <strong>2.0.0</strong> 版本将完全合并到新 API。</p></div><h2 id="array-member-list-member-basefinder-baseresult-hookall-i-ext-method" tabindex="-1"><a class="header-anchor" href="#array-member-list-member-basefinder-baseresult-hookall-i-ext-method" aria-hidden="true">#</a> Array<Member>+List<Member>+BaseFinder.BaseResult.hookAll <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">Array</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Member</span><span style="color:#F47067;">></span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">Array</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Member</span><span style="color:#F47067;">></span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.Result</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">List</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Member</span><span style="color:#F47067;">></span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">List</span><span style="color:#F47067;"><</span><span style="color:#ADBAC7;">Member</span><span style="color:#F47067;">></span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.Result</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">BaseFinder</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">BaseResult</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">BaseFinder</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">BaseResult</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hookAll</span><span style="color:#ADBAC7;">(priority: </span><span style="color:#F69D50;">YukiHookPriority</span><span style="color:#ADBAC7;">, initiate: </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit): </span><span style="color:#F69D50;">YukiMemberHookCreator</span><span style="color:#ADBAC7;">.MemberHookCreator.Result</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.2.0</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>直接 Hook 方法、构造方法 (批量)。</p></blockquote><div class="custom-container warning"><p class="custom-container-title">注意</p><p>此功能尚在实验阶段,在 <strong>1.x.x</strong> 版本将暂定于此,在 <strong>2.0.0</strong> 版本将完全合并到新 API。</p></div><h2 id="hookresources-hook-i-ext-method" tabindex="-1"><a class="header-anchor" href="#hookresources-hook-i-ext-method" aria-hidden="true">#</a> HookResources.hook <span class="symbol">- i-ext-method</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inline</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">HookResources</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">YukiResourcesHookCreator</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.80</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>Hook APP 的 Resources。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>此功能将不再默认启用,如需启用,请手动设置 <strong>InjectYukiHookWithXposed.isUsingResourcesHook</strong>。</p></div><p><strong>功能示例</strong></p><p>Resources Hook 为固定用法,获取 <code>resources</code> 对象,然后调用 <code>hook</code> 方法开始 Hook。</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:#DCBDFB;">resources</span><span style="color:#ADBAC7;">().</span><span style="color:#DCBDFB;">hook</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</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></div><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>这是固定用法,为了防止发生问题,你不可手动实现任何 <strong>HookResources</strong> 实例执行 <strong>hook</strong> 调用。</p></div><p>将 Resources 的 Hook 设置为这样是为了与 <code>String.toClass(...).hook</code> 做到统一,使得调用起来逻辑不会混乱。</p><h2 id="applifecycle-class" tabindex="-1"><a class="header-anchor" href="#applifecycle-class" aria-hidden="true">#</a> AppLifecycle <span class="symbol">- class</span></h2><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">inner</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">AppLifecycle</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">internal</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">constructor</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">private</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> isOnFailureThrowToApp: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><code>v1.1.5</code> <code>修改</code></p><p>新增 <code>isOnFailureThrowToApp</code> 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主</p><p><strong>功能描述</strong></p><blockquote><p>当前 Hook APP 的生命周期实例处理类。</p></blockquote><h3 id="attachbasecontext-method" tabindex="-1"><a class="header-anchor" href="#attachbasecontext-method" aria-hidden="true">#</a> attachBaseContext <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">attachBaseContext</span><span style="color:#ADBAC7;">(result: (</span><span style="color:#F69D50;">baseContext</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">hasCalledSuper</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Boolean</span><span style="color:#ADBAC7;">) -> </span><span style="color:#F69D50;">Unit</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.attachBaseContext</code>。</p></blockquote><h3 id="oncreate-method" tabindex="-1"><a class="header-anchor" href="#oncreate-method" aria-hidden="true">#</a> onCreate <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.onCreate</code>。</p></blockquote><h3 id="onterminate-method" tabindex="-1"><a class="header-anchor" href="#onterminate-method" aria-hidden="true">#</a> onTerminate <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onTerminate</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.onTerminate</code>。</p></blockquote><h3 id="onlowmemory-method" tabindex="-1"><a class="header-anchor" href="#onlowmemory-method" aria-hidden="true">#</a> onLowMemory <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onLowMemory</span><span style="color:#ADBAC7;">(initiate: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">.() </span><span style="color:#F47067;">-></span><span style="color:#ADBAC7;"> Unit)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.onLowMemory</code>。</p></blockquote><h3 id="ontrimmemory-method" tabindex="-1"><a class="header-anchor" href="#ontrimmemory-method" aria-hidden="true">#</a> onTrimMemory <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onTrimMemory</span><span style="color:#ADBAC7;">(result: (</span><span style="color:#F69D50;">self</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">level</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Int</span><span style="color:#ADBAC7;">) -> </span><span style="color:#F69D50;">Unit</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.onTrimMemory</code>。</p></blockquote><h3 id="onconfigurationchanged-method" tabindex="-1"><a class="header-anchor" href="#onconfigurationchanged-method" aria-hidden="true">#</a> onConfigurationChanged <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onConfigurationChanged</span><span style="color:#ADBAC7;">(result: (</span><span style="color:#F69D50;">self</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Application</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">config</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Configuration</span><span style="color:#ADBAC7;">) -> </span><span style="color:#F69D50;">Unit</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><strong>功能描述</strong></p><blockquote><p>监听当前 Hook APP 装载 <code>Application.onConfigurationChanged</code>。</p></blockquote><h3 id="registerreceiver-method" tabindex="-1"><a class="header-anchor" href="#registerreceiver-method" aria-hidden="true">#</a> registerReceiver <span class="symbol">- method</span></h3><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">registerReceiver</span><span style="color:#ADBAC7;">(</span><span style="color:#F47067;">vararg</span><span style="color:#ADBAC7;"> action: </span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">, result: (</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">intent</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Intent</span><span style="color:#ADBAC7;">) -> </span><span style="color:#F69D50;">Unit</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><div class="language-kotlin" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">registerReceiver</span><span style="color:#ADBAC7;">(filter: </span><span style="color:#F69D50;">IntentFilter</span><span style="color:#ADBAC7;">, result: (</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">intent</span><span style="color:#ADBAC7;">: </span><span style="color:#F69D50;">Intent</span><span style="color:#ADBAC7;">) -> </span><span style="color:#F69D50;">Unit</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre></div><p><strong>变更记录</strong></p><p><code>v1.0.88</code> <code>新增</code></p><p><code>v1.1.8</code> <code>修改</code></p><p>新增直接使用 <code>IntentFilter</code> 注册系统广播监听</p><p><strong>功能描述</strong></p><blockquote><p>注册系统广播监听。</p></blockquote>`,437),p=[l];function c(t,r){return a(),o("div",null,p)}const i=s(n,[["render",c],["__file","PackageParam.html.vue"]]);export{i as default};
|