import{_ as s,o as n,c as o,a}from"./app.c86510cc.js";const e={},l=a(`
\u8FD9\u91CC\u4ECB\u7ECD\u4E86
YukiHookAPI
\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u65B9\u6CD5\u3002
\u4F5C\u4E3A Xposed \u6A21\u5757\uFF0C
YukiHookAPI
\u63D0\u4F9B\u4E86\u4E00\u4E2A\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u3002
\u4F60\u9700\u8981\u5728\u4F60\u7684 build.gradle
\u4E2D\u96C6\u6210 com.highcapable.yukihookapi:ksp-xposed
\u4F9D\u8D56\u7684\u6700\u65B0\u7248\u672C\u3002
\u4F60\u53EF\u4EE5\u5BF9
YukiHookAPI
\u5C06\u5982\u4F55\u751F\u6210xposed_init
\u5165\u53E3\u8FDB\u884C\u76F8\u5173\u914D\u7F6E\u3002
annotation class InjectYukiHookWithXposed(
val sourcePath: String,
val modulePackageName: String,
val entryClassName: String,
val isUsingResourcesHook: Boolean
)
@InjectYukiHookWithXposed
\u6CE8\u89E3\u662F\u4E00\u4E2A\u6807\u8BB0\u6A21\u5757 Hook \u5165\u53E3\u7684\u91CD\u8981\u6CE8\u89E3\u3002
\u7279\u522B\u6CE8\u610F
@InjectYukiHookWithXposed \u6CE8\u89E3\u7684 Class \u5FC5\u987B\u5B9E\u73B0 IYukiHookXposedInit \u63A5\u53E3\u3002
\u5728\u4F60\u5F53\u524D\u9879\u76EE\u4E2D\u7684\u6240\u6709 Class \u6807\u8BB0\u4E2D\u53EA\u80FD\u5B58\u5728\u4E00\u6B21\uFF0C\u82E5\u5B58\u5728\u591A\u4E2A\u58F0\u660E\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u4F1A\u5728\u7F16\u8BD1\u65F6\u629B\u51FA\u5F02\u5E38\uFF0C\u4F60\u53EF\u4EE5\u81EA\u5B9A\u4E49\u5176\u76F8\u5173\u53C2\u6570\u3002
sourcePath
\u53C2\u6570\u51B3\u5B9A\u4E86\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u81EA\u52A8\u67E5\u627E\u5E76\u5339\u914D\u4F60\u5F53\u524D\u9879\u76EE\u8DEF\u5F84\u7684\u91CD\u8981\u6807\u8BC6\uFF0C\u6B64\u53C2\u6570\u7684\u5185\u5BB9\u4E3A\u76F8\u5BF9\u8DEF\u5F84\u5339\u914D\uFF0C\u9ED8\u8BA4\u53C2\u6570\u4E3A src/main
\u3002
\u7279\u522B\u6CE8\u610F
\u5982\u679C\u4F60\u7684\u9879\u76EE\u4E0D\u5728 ../src/main.. \u6216\u4F60\u624B\u52A8\u4F7F\u7528 sourceSets \u8BBE\u7F6E\u4E86\u9879\u76EE\u8DEF\u5F84\uFF0C\u4F60\u5C31\u9700\u8981\u624B\u52A8\u8BBE\u7F6E sourcePath \u53C2\u6570\uFF0C\u5426\u5219\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u5C06\u65E0\u6CD5\u8BC6\u522B\u4F60\u7684\u9879\u76EE\u8DEF\u5F84\u5E76\u4F1A\u5728\u7F16\u8BD1\u65F6\u629B\u51FA\u5F02\u5E38\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed(sourcePath = "src/custom")
sourcePath
\u4F7F\u7528\u7684\u6587\u4EF6\u8DEF\u5F84\u5206\u9694\u7B26\u5199\u6CD5\u6839\u636E Windows
\u548C Unix
\u5C06\u81EA\u52A8\u8FDB\u884C\u8BC6\u522B\uFF0C\u4F7F\u7528 /
\u6216 \\
\u5747\u53EF\u3002
modulePackageName
\u662F\u4F60\u5F53\u524D\u9879\u76EE\u7684 applicationId
\uFF0C\u4E5F\u5C31\u662F\u4F60\u7684\u6A21\u5757\u5305\u540D (\u6700\u7EC8\u751F\u6210\u7684\u5E94\u7528\u5305\u540D)\uFF0C\u7559\u7A7A\u6216\u4E0D\u586B\u65F6\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u5C06\u5BF9\u5F53\u524D\u9879\u76EE\u6587\u4EF6\u8FDB\u884C\u5206\u6790\u5E76\u751F\u6210\u3002
\u6CE8\u610F
\u82E5\u4F60\u60F3\u4F7F\u7528\u6A21\u5757\u5305\u540D\u81EA\u52A8\u751F\u6210\uFF0C\u4F60\u9700\u8981\u786E\u4FDD\u4F60\u7684\u9879\u76EE\u547D\u540D\u7A7A\u95F4\u5728 AndroidManifest.xml\u3001build.gradle \u6216 build.gradle.kts \u4E2D\u5B58\u5728\u5982\u4E0B\u4EFB\u610F\u5B9A\u4E49\u65B9\u5F0F\u3002
\u793A\u4F8B\u547D\u540D\u7A7A\u95F4 com.example.demo
\uFF0C\u4EE5\u4E0B\u5B9A\u4E49\u65B9\u5F0F\u4EFB\u9009\u5176\u4E00\u3002
\u4EE5\u4E0B\u5B9A\u4E49\u65B9\u5F0F\u4EC5\u4F9B\u53C2\u8003\uFF0C\u901A\u5E38\u60C5\u51B5\u4E0B\u53EA\u8981\u4F60\u7684\u9879\u76EE\u80FD\u591F\u6B63\u5E38\u751F\u6210 BuildConfig.java
\u6587\u4EF6\uFF0C\u5C31\u4E0D\u9700\u8981\u505A\u989D\u5916\u64CD\u4F5C\u3002
AndroidManifest.xml
\u793A\u4F8B
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo">
build.gradle
\u793A\u4F8B
android {
namespace 'com.example.demo'
}
build.gradle.kts
\u793A\u4F8B
android {
namespace = "com.example.demo"
}
\u82E5\u4F60\u7684\u6A21\u5757\u5305\u540D\u662F\u975E\u5E38\u89C4\u624B\u6BB5\u8FDB\u884C\u81EA\u52A8\u751F\u6210\u7684\uFF0C\u6216\u4F60\u8BA4\u4E3A\u6709\u5FC5\u8981\u624B\u52A8\u5B9A\u4E49\u6A21\u5757\u5305\u540D\uFF0C\u90A3\u4E48\u4F60\u53EF\u4EE5\u76F4\u63A5\u8BBE\u7F6E modulePackageName
\u7684\u53C2\u6570\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed(modulePackageName = "com.example.demo")
\u53EA\u8981\u4F60\u81EA\u5B9A\u4E49\u4E86 modulePackageName
\u7684\u53C2\u6570\uFF0C\u4F60\u5C31\u4F1A\u5728\u7F16\u8BD1\u65F6\u6536\u5230\u8B66\u544A\u3002
\u793A\u4F8B\u5982\u4E0B
You set the customize module package name to "com.example.demo", please check for yourself if it is correct
\u6CE8\u610F
\u624B\u52A8\u5B9A\u4E49\u7684\u6A21\u5757\u5305\u540D\u9664\u4E86\u683C\u5F0F\u4E4B\u5916\uFF0C\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u5C06\u4E0D\u4F1A\u518D\u68C0\u67E5\u6A21\u5757\u5305\u540D\u662F\u5426\u6B63\u786E\uFF0C\u9700\u8981\u4F60\u81EA\u884C\u786E\u8BA4\u5176\u6709\u6548\u6027\u3002
entryClassName
\u51B3\u5B9A\u4E86\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u5982\u4F55\u751F\u6210 xposed_init
\u4E2D\u7684\u5165\u53E3\u7C7B\u540D\uFF0C\u9ED8\u8BA4\u4F1A\u4F7F\u7528\u4F60\u7684\u5165\u53E3\u7C7B\u5305\u540D\u63D2\u5165 _YukiHookXposedInit
\u540E\u7F00\u8FDB\u884C\u751F\u6210\u3002
\u5047\u8BBE\u8FD9\u662F\u4F60\u7684\u5165\u53E3\u7C7B\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed
object HookEntry : IYukiHookXposedInit
Xposed \u5165\u53E3\u7C7B\u5904\u7406\u5982\u4E0B\u3002
\u793A\u4F8B\u5982\u4E0B
class HookEntry_YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
\u7F16\u8BD1\u540E\u7684\u7C7B\u540D\u7ED3\u6784\u5982\u4E0B\u3002
\u793A\u4F8B\u5982\u4E0B
...hook.HookEntry \u2190 \u4F60\u7684\u5165\u53E3\u7C7B
...hook.HookEntry_Impl \u2190 \u81EA\u52A8\u751F\u6210\u7684 Impl \u7C7B
...hook.HookEntry_YukiHookXposedInit \u2190 \u81EA\u52A8\u751F\u6210\u7684 Xposed \u5165\u53E3\u7C7B
\u6211\u4EEC\u73B0\u5728\u5B9A\u4E49\u5165\u53E3\u7C7B\u540D\u79F0\u4E3A HookXposedEntry
\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed(entryClassName = "HookXposedEntry")
object HookEntry : IYukiHookXposedInit
Xposed \u5165\u53E3\u7C7B\u5904\u7406\u5982\u4E0B\u3002
\u793A\u4F8B\u5982\u4E0B
class HookXposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
\u7F16\u8BD1\u540E\u7684\u7C7B\u540D\u7ED3\u6784\u5982\u4E0B\u3002
\u793A\u4F8B\u5982\u4E0B
...hook.HookEntry \u2190 \u4F60\u7684\u5165\u53E3\u7C7B
...hook.HookEntry_Impl \u2190 \u81EA\u52A8\u751F\u6210\u7684 Impl \u7C7B
...hook.HookXposedEntry \u2190 \u81EA\u52A8\u751F\u6210\u7684 Xposed \u5165\u53E3\u7C7B
\u5C0F\u63D0\u793A
\u5165\u53E3\u7C7B\u53EF\u4EE5\u4F7F\u7528 class \u6216 object \u5B9A\u4E49\uFF0C\u4F46\u662F\u5EFA\u8BAE\u4F7F\u7528 object \u5B9A\u4E49\u6765\u4FDD\u8BC1\u6BCF\u4E00\u4E2A\u6CE8\u5165\u7684\u8FDB\u7A0B\u90FD\u662F\u5355\u4F8B\u8FD0\u884C\u3002
\u7279\u522B\u6CE8\u610F
\u4F60\u5B9A\u4E49\u7684 entryClassName \u4E0D\u53EF\u4E0E xposed_init \u4E2D\u7684\u7C7B\u540D\u76F8\u540C\uFF0C\u5426\u5219\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u4F1A\u5728\u7F16\u8BD1\u65F6\u629B\u51FA\u5F02\u5E38\u3002
isUsingResourcesHook
\u51B3\u5B9A\u4E86\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u662F\u5426\u751F\u6210\u9488\u5BF9 Resources Hook \u7684\u76F8\u5173\u4EE3\u7801\uFF0C\u6B64\u529F\u80FD\u9ED8\u8BA4\u662F\u542F\u7528\u7684\u3002
\u542F\u7528\u540E\u751F\u6210\u7684\u5165\u53E3\u7C7B\u5C06\u4E3A\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
// ...
}
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam?) {
// ...
}
override fun handleInitPackageResources(resparam: XC_InitPackageResources.InitPackageResourcesParam?) {
// ...
}
}
\u82E5\u4F60\u5F53\u524D\u7684\u9879\u76EE\u5E76\u4E0D\u9700\u8981\u7528\u5230 Resources Hook\uFF0C\u53EF\u4EE5\u8BBE\u7F6E isUsingResourcesHook = false
\u6765\u5173\u95ED\u81EA\u52A8\u751F\u6210\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed(isUsingResourcesHook = false)
\u5173\u95ED\u540E\u751F\u6210\u7684\u5165\u53E3\u7C7B\u5C06\u4E3A\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage {
override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
// ...
}
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam?) {
// ...
}
}
\u5C0F\u63D0\u793A
\u7531\u4E8E Xposed \u5165\u53E3\u7C7B\u662F\u88AB YukiHookAPI \u52A8\u6001\u751F\u6210\u7684\uFF0C\u5B83\u4F1A\u540C\u65F6\u751F\u6210\u5982\u4E0B\u4E24\u4E2A\u6587\u4EF6\u3002
assets/xposed_init
resources/META-INF/yukihookapi_init
\u5982\u679C\u4F60\u6B63\u5728\u4F7F\u7528 Git \u4EE3\u7801\u63A7\u5236\u7CFB\u7EDF\uFF0C\u4F60\u53EF\u4EE5\u5C06\u8FD9\u4E24\u4E2A\u6587\u4EF6\u6DFB\u52A0\u5230 .gitignore \u6587\u4EF6\u4E2D\u3002
IYukiHookXposedInit
\u63A5\u53E3\u4E3A\u4F60\u7684 Hook \u5165\u53E3\u7C7B\u5FC5\u987B\u5B9E\u73B0\u7684\u63A5\u53E3\uFF0C\u8FD9\u662F\u4F60\u7684\u6A21\u5757\u5F00\u59CB Hook \u7684\u8D77\u70B9\u3002
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 IYukiHookXposedInit\u3002
\u5F53\u4F60\u7684\u6A21\u5757\u88AB Xposed \u88C5\u8F7D\u540E\uFF0ConHook
\u65B9\u6CD5\u5C06\u4F1A\u88AB\u56DE\u8C03\uFF0C\u4F60\u9700\u8981\u5728\u6B64\u65B9\u6CD5\u4E2D\u5F00\u59CB\u4F7F\u7528 YukiHookAPI
\u3002
\u57FA\u672C\u7684\u8C03\u7528\u6D41\u7A0B\u4E3A
_YukiHookXposedInit
\u2192IYukiHookXposedInit.onXposedEvent
\u2192IYukiHookXposedInit.onInit
\u2192IYukiHookXposedInit.onHook
\u8BE6\u60C5\u8BF7\u53C2\u8003 API \u57FA\u672C\u914D\u7F6E\u3002
\u82E5\u4F60\u5F53\u524D\u7684 Xposed \u6A21\u5757\u4F7F\u7528\u4E86\u7B2C\u4E09\u65B9\u7684\u8D44\u6E90\uFF0C\u4F46\u662F\u77ED\u65F6\u95F4\u5185\u53EF\u80FD\u65E0\u6CD5\u8F6C\u79FB\u5B83\u4EEC\uFF0C\u6B64\u65F6\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 onXposedEvent
\u5B9E\u73B0\u76D1\u542C\u539F\u751F Xposed API \u7684\u5168\u90E8\u88C5\u8F7D\u4E8B\u4EF6\u3002
\u793A\u4F8B\u5982\u4E0B
@InjectYukiHookWithXposed
object HookEntry : IYukiHookXposedInit {
override fun onHook() {
// Your code here.
}
override fun onXposedEvent() {
// \u76D1\u542C\u539F\u751F Xposed API \u7684\u88C5\u8F7D\u4E8B\u4EF6
YukiXposedEvent.events {
onInitZygote {
// it \u5BF9\u8C61\u5373 [StartupParam]
}
onHandleLoadPackage {
// it \u5BF9\u8C61\u5373 [LoadPackageParam]
}
onHandleInitPackageResources {
// it \u5BF9\u8C61\u5373 [InitPackageResourcesParam]
}
}
}
}
onXposedEvent
\u4E0E onHook
\u65B9\u6CD5\u5B8C\u5168\u72EC\u7ACB\u5B58\u5728\uFF0C\u4E92\u4E0D\u5F71\u54CD\uFF0C\u4F60\u53EF\u4EE5\u7EE7\u7EED\u5728 onHook
\u65B9\u6CD5\u4E2D\u4F7F\u7528 YukiHookAPI
\u3002
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 IYukiHookXposedInit.onXposedEvent \u65B9\u6CD5\u3002