import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.2bc5d8f3.js";const r={},t=a(`
\u96C6\u6210
YukiHookAPI
\u5230\u4F60\u7684\u9879\u76EE\u4E2D\u3002
Windows 7 \u53CA\u4EE5\u4E0A/macOS 10.14 \u53CA\u4EE5\u4E0A/Linux \u53D1\u884C\u7248(Arch/Debian)
Android Studio 2021.1 \u53CA\u4EE5\u4E0A
IntelliJ IDEA 2021.1 \u53CA\u4EE5\u4E0A
Kotlin 1.7.0 \u53CA\u4EE5\u4E0A
Android Gradle Plugin 7.0 \u53CA\u4EE5\u4E0A
Gradle 7.0 \u53CA\u4EE5\u4E0A
Jvm 11 \u53CA\u4EE5\u4E0A (Since API 1.0.80
)
YukiHookAPI
\u63D0\u4F9B\u4E86\u4E00\u4E2A\u81EA\u52A8\u5316\u6784\u5EFA\u5DE5\u5177\uFF0C\u5B83\u53EF\u4EE5\u5E2E\u52A9\u4F60\u5FEB\u901F\u6784\u5EFA\u4E00\u4E2A\u62E5\u6709 Xposed \u6A21\u5757\u4F9D\u8D56\u7684 Android \u6807\u51C6\u9879\u76EE\u6A21\u677F\uFF0C\u4F7F\u7528\u6784\u5EFA\u597D\u7684\u6A21\u677F\u5373\u53EF\u76F4\u63A5\u5F00\u59CB\u4E0B\u4E00\u6B65\u5DE5\u4F5C\u3002
\u4F60\u53EF\u4EE5 \u70B9\u51FB\u8FD9\u91CC \u8FDB\u884C\u67E5\u770B\u3002
\u82E5\u4F60\u4E0D\u60F3\u4F7F\u7528\u81EA\u52A8\u5316\u6784\u5EFA\u5DE5\u5177\uFF0C\u4F60\u4F9D\u7136\u53EF\u4EE5\u6309\u7167\u4EE5\u4E0B\u65B9\u5F0F\u624B\u52A8\u914D\u7F6E\u9879\u76EE\u4F9D\u8D56\u3002
\u4F7F\u7528 Android Studio
\u6216 IntelliJ IDEA
\u521B\u5EFA\u65B0\u7684 Android \u9879\u76EE\uFF0C\u5E76\u5728 Language
\u4E00\u680F\u9009\u62E9 Kotlin
\u4EE5\u81EA\u52A8\u6DFB\u52A0\u57FA\u7840\u4F9D\u8D56\u3002
\u5728\u4F60\u7684\u9879\u76EE build.gradle
\u4E2D\u6DFB\u52A0\u4F9D\u8D56\u3002
\u793A\u4F8B\u5982\u4E0B
repositories {
google()
mavenCentral()
// \u2757\u82E5\u4F60\u7684 Plugin \u7248\u672C\u8FC7\u4F4E\uFF0C\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u52A1\u5FC5\u6DFB\u52A0\uFF0C\u5176\u5B83\u60C5\u51B5\u53EF\u9009
maven { url "https://dl.bintray.com/kotlin/kotlin-eap" }
// \u2757\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u52A1\u5FC5\u6DFB\u52A0\uFF0C\u5176\u5B83\u60C5\u51B5\u53EF\u9009
maven { url "https://api.xposed.info/" }
// MavenCentral \u6709 2 \u5C0F\u65F6\u7F13\u5B58\uFF0C\u82E5\u65E0\u6CD5\u96C6\u6210\u6700\u65B0\u7248\u672C\u8BF7\u6DFB\u52A0\u6B64\u5730\u5740
maven { url "https://s01.oss.sonatype.org/content/repositories/releases" }
}
\u5728\u4F60\u7684 app build.gradle
\u4E2D\u6DFB\u52A0 plugin
\u3002
\u793A\u4F8B\u5982\u4E0B
plugins {
// \u2757\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u52A1\u5FC5\u6DFB\u52A0\uFF0C\u5176\u5B83\u60C5\u51B5\u53EF\u9009
id 'com.google.devtools.ksp' version '<ksp-version>'
}
\u5728\u4F60\u7684 app build.gradle
\u4E2D\u6DFB\u52A0\u4F9D\u8D56\u3002
\u793A\u4F8B\u5982\u4E0B
dependencies {
// \u57FA\u7840\u4F9D\u8D56
implementation 'com.highcapable.yukihookapi:api:<yuki-version>'
// \u2757\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u52A1\u5FC5\u6DFB\u52A0\uFF0C\u5176\u5B83\u60C5\u51B5\u53EF\u9009
compileOnly 'de.robv.android.xposed:api:82'
// \u2757\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u52A1\u5FC5\u6DFB\u52A0\uFF0C\u5176\u5B83\u60C5\u51B5\u53EF\u9009
ksp 'com.highcapable.yukihookapi:ksp-xposed:<yuki-version>'
}
\u8BF7\u5C06 <yuki-version> \u4FEE\u6539\u4E3A \u8FD9\u91CC \u7684\u6700\u65B0\u7248\u672C\u3002
\u7279\u522B\u6CE8\u610F
YukiHookAPI \u7684 api \u4E0E ksp-xposed \u4F9D\u8D56\u7684\u7248\u672C\u5FC5\u987B\u4E00\u4E00\u5BF9\u5E94\uFF0C\u5426\u5219\u5C06\u4F1A\u9020\u6210\u7248\u672C\u4E0D\u5339\u914D\u9519\u8BEF\u3002
\u5728\u4F60\u7684 app build.gradle
\u4E2D\u4FEE\u6539 Kotlin
\u7684 Jvm \u7248\u672C\u4E3A 11 \u53CA\u4EE5\u4E0A\u3002
\u793A\u4F8B\u5982\u4E0B
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
}
\u6CE8\u610F
\u81EA API 1.0.80 \u7248\u672C\u540E Jvm \u7248\u672C\u9ED8\u8BA4\u4E3A 11\uFF0C\u4E0D\u518D\u652F\u6301 1.8 \u53CA\u4EE5\u4E0B\u7248\u672C\u3002
\u5728\u4F60\u7684 AndroidManifest.xml
\u4E2D\u6DFB\u52A0\u57FA\u7840\u4EE3\u7801\u3002
\u793A\u4F8B\u5982\u4E0B
<!-- \u8BBE\u7F6E\u4E3A Xposed \u6A21\u5757 -->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!-- \u8BBE\u7F6E\u4F60\u7684\u6A21\u5757\u63CF\u8FF0 -->
<meta-data
android:name="xposeddescription"
android:value="\u586B\u5199\u4F60\u7684 Xposed \u6A21\u5757\u63CF\u8FF0" />
<!-- \u6700\u4F4E Xposed \u7248\u672C\u53F7\uFF0C\u82E5\u4F60\u6B63\u5728\u4F7F\u7528 EdXposed/LSPosed\uFF0C\u5EFA\u8BAE\u6700\u4F4E\u4E3A 93 -->
<meta-data
android:name="xposedminversion"
android:value="93" />
<!-- \u53EF\u9009\uFF1A\u914D\u7F6E\u652F\u6301 New XSharedPreferences \u53EF\u65E0\u9700\u8C03\u6574 xposedminversion \u4E3A 93 -->
<meta-data
android:name="xposedsharedprefs"
android:value="true"/>
\u5728\u4F60\u7684\u9879\u76EE\u4E2D\u521B\u5EFA\u4E00\u4E2A Hook \u5165\u53E3\u7C7B\uFF0C\u7EE7\u627F\u4E8E IYukiHookXposedInit
\u5E76\u52A0\u5165\u6CE8\u89E3 @InjectYukiHookWithXposed
\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed
object HookEntry : IYukiHookXposedInit {
override fun onHook() = YukiHookAPI.encase {
// Your code here.
}
}
\u5EFA\u8BAE
\u8BF7\u5728 onInit \u65B9\u6CD5\u4E2D\u914D\u7F6E YukiHookAPI \u5E76\u5C06 isDebug \u6A21\u5F0F\u8BBE\u7F6E\u4E3A\u5982\u4E0B\u5F62\u5F0F\u3002
\u793A\u4F8B\u5982\u4E0B
override fun onInit() = configs {
isDebug = BuildConfig.DEBUG
}
YukiHookAPI \u9ED8\u8BA4\u4F1A\u6253\u5370\u6240\u6709\u7528\u4E8E\u8C03\u8BD5\u7684\u65E5\u5FD7\uFF0C\u82E5\u4F5C\u4E3A\u53D1\u5E03\u7248\u672C\u8BF7\u52A1\u5FC5\u5173\u95ED\u8C03\u8BD5\u529F\u80FD\u9632\u6B62\u5BF9\u7528\u6237\u8BBE\u5907\u9020\u6210\u5927\u91CF\u65E5\u5FD7\u586B\u5145\u3002
\u4F60\u8FD8\u53EF\u4EE5\u5C06\u4F60\u7684\u6A21\u5757 APP \u7684 Application \u7EE7\u627F\u4E8E ModuleApplication \u4EE5\u5B9E\u73B0\u5B8C\u6574\u4F7F\u7528\u4F53\u9A8C\u3002
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 ModuleApplication\u3002
\u7136\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5F00\u59CB\u7F16\u5199 Hook \u4EE3\u7801\u4E86\u3002
\u6709\u5173\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u8BE6\u7EC6\u5185\u5BB9\uFF0C\u4F60\u53EF\u4EE5 \u70B9\u51FB\u8FD9\u91CC \u7EE7\u7EED\u9605\u8BFB\u3002
\u82E5\u4F60\u76EE\u524D\u6B63\u5728\u4F7F\u7528 Xposed API\uFF0C\u4F60\u53EF\u4EE5\u53C2\u8003 \u4ECE Xposed API \u8FC1\u79FB\u3002
\u521B\u5EFA\u4F60\u7684\u81EA\u5B9A\u4E49 Application
\u3002
\u7279\u522B\u6CE8\u610F
\u65E0\u8BBA\u4F7F\u7528\u4EFB\u4F55 Hook Framework\uFF0C\u4F60\u90FD\u9700\u8981\u52A0\u5165\u5176\u5BF9\u63A5\u7684 Xposed \u4F9D\u8D56\u652F\u6301\u3002
\u82E5\u76EE\u6807 Hook Framework \u6CA1\u6709\u96C6\u6210 Xposed API \u4F60\u9700\u8981\u81EA\u884C\u5B9E\u73B0\u5E76\u5BF9\u63A5 XposedBridge\u3002
\u5728 attachBaseContext
\u4E2D\u6DFB\u52A0 YukiHookAPI.encase
\u65B9\u6CD5\u3002
\u793A\u4F8B\u5982\u4E0B
override fun attachBaseContext(base: Context?) {
// \u88C5\u8F7D Hook Framework
//
// Your code here.
//
// \u88C5\u8F7D YukiHookAPI
YukiHookAPI.encase(base) {
// Your code here.
}
super.attachBaseContext(base)
}
\u7136\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5F00\u59CB\u7F16\u5199 Hook \u4EE3\u7801\u4E86\uFF0C\u65B9\u5F0F\u4E0E\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u57FA\u672C\u4E00\u81F4\u3002
\u6709\u5173\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u8BE6\u7EC6\u5185\u5BB9\uFF0C\u4F60\u53EF\u4EE5 \u70B9\u51FB\u8FD9\u91CC \u7EE7\u7EED\u9605\u8BFB\u3002
\u6CE8\u610F
\u4F7F\u7528\u81EA\u5B9A\u4E49\u7684 Hook Framework \u800C\u5E76\u975E\u5B8C\u6574\u7684 Xposed \u6A21\u5757\u65F6\uFF0CYukiHookModulePrefs\u3001YukiHookDataChannel \u4EE5\u53CA Resources Hook \u529F\u80FD\u5C06\u5931\u6548\u3002