diff --git a/docs/404.html b/docs/404.html index 76fca13ff..83e7170e4 100644 --- a/docs/404.html +++ b/docs/404.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Yuki Hook API - + Yuki Hook API + -

404

Looks like we've got some broken links.
Take me home
- +

404

That's a Four-Oh-Four.
Take me home
+ diff --git a/docs/assets/404.html.4241c760.js b/docs/assets/404.html.035cddf5.js similarity index 63% rename from docs/assets/404.html.4241c760.js rename to docs/assets/404.html.035cddf5.js index 9f0f54774..99ce65320 100644 --- a/docs/assets/404.html.4241c760.js +++ b/docs/assets/404.html.035cddf5.js @@ -1 +1 @@ -import{_ as e,o as c,c as t}from"./app.99fcdd51.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; +import{_ as e,o as c,c as t}from"./app.6074a838.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; diff --git a/docs/assets/BaseFinder.html.ad905538.js b/docs/assets/BaseFinder.html.0c6ca85f.js similarity index 99% rename from docs/assets/BaseFinder.html.ad905538.js rename to docs/assets/BaseFinder.html.0c6ca85f.js index 67f6ab84a..761f8ce8b 100644 --- a/docs/assets/BaseFinder.html.ad905538.js +++ b/docs/assets/BaseFinder.html.0c6ca85f.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as n,a as o}from"./app.99fcdd51.js";const a={},l=o(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

BaseFinder - class

abstract class BaseFinder
+import{_ as s,o as e,c as n,a as o}from"./app.6074a838.js";const a={},l=o(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

BaseFinder - class

abstract class BaseFinder
 

Change Records

v1.0.70 added

v1.1.0 modified

\u5206\u79BB\u539F\u59CB\u547D\u540D BaseFinder \u4E2D\u7684\u90E8\u5206\u65B9\u6CD5\u4E0E\u53C2\u6570\u5230 MemberBaseFinder

Function Illustrate

\u8FD9\u662F Class \u4E0E Member \u67E5\u627E\u7C7B\u529F\u80FD\u7684\u57FA\u672C\u7C7B\u5B9E\u73B0\u3002

BaseFinder.IndexTypeCondition - class

inner class IndexTypeCondition internal constructor(private val type: IndexConfigType)
 

Change Records

v1.0.70 added

Function Illustrate

\u5B57\u8282\u7801\u4E0B\u6807\u7B5B\u9009\u5B9E\u73B0\u7C7B\u3002

index - method

fun index(num: Int)
 

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E\u4E0B\u6807\u3002

\u82E5 index \u5C0F\u4E8E\u96F6\u5219\u4E3A\u5012\u5E8F\uFF0C\u6B64\u65F6\u53EF\u4EE5\u4F7F\u7528 IndexTypeConditionSort.reverse \u65B9\u6CD5\u5B9E\u73B0\u3002

\u53EF\u4F7F\u7528 IndexTypeConditionSort.first \u548C IndexTypeConditionSort.last \u8BBE\u7F6E\u9996\u4F4D\u548C\u672B\u4F4D\u7B5B\u9009\u6761\u4EF6\u3002

index - method

fun index(): IndexTypeConditionSort
diff --git a/docs/assets/BaseFinder.html.e92b3674.js b/docs/assets/BaseFinder.html.232eb7e2.js
similarity index 99%
rename from docs/assets/BaseFinder.html.e92b3674.js
rename to docs/assets/BaseFinder.html.232eb7e2.js
index fee08718e..7fded7a69 100644
--- a/docs/assets/BaseFinder.html.e92b3674.js
+++ b/docs/assets/BaseFinder.html.232eb7e2.js
@@ -1,4 +1,4 @@
-import{_ as s,o as e,c as o,a as n}from"./app.99fcdd51.js";const a={},p=n(`

BaseFinder - class

abstract class BaseFinder
+import{_ as s,o as e,c as o,a as n}from"./app.6074a838.js";const a={},p=n(`

BaseFinder - class

abstract class BaseFinder
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u5206\u79BB\u539F\u59CB\u547D\u540D BaseFinder \u4E2D\u7684\u90E8\u5206\u65B9\u6CD5\u4E0E\u53C2\u6570\u5230 MemberBaseFinder

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F Class \u4E0E Member \u67E5\u627E\u7C7B\u529F\u80FD\u7684\u57FA\u672C\u7C7B\u5B9E\u73B0\u3002

BaseFinder.IndexTypeCondition - class

inner class IndexTypeCondition internal constructor(private val type: IndexConfigType)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5B57\u8282\u7801\u4E0B\u6807\u7B5B\u9009\u5B9E\u73B0\u7C7B\u3002

index - method

fun index(num: Int)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u4E0B\u6807\u3002

\u82E5 index \u5C0F\u4E8E\u96F6\u5219\u4E3A\u5012\u5E8F\uFF0C\u6B64\u65F6\u53EF\u4EE5\u4F7F\u7528 IndexTypeConditionSort.reverse \u65B9\u6CD5\u5B9E\u73B0\u3002

\u53EF\u4F7F\u7528 IndexTypeConditionSort.first \u548C IndexTypeConditionSort.last \u8BBE\u7F6E\u9996\u4F4D\u548C\u672B\u4F4D\u7B5B\u9009\u6761\u4EF6\u3002

index - method

fun index(): IndexTypeConditionSort
diff --git a/docs/assets/ChannelData.html.f8f818f6.js b/docs/assets/ChannelData.html.1981f416.js
similarity index 73%
rename from docs/assets/ChannelData.html.f8f818f6.js
rename to docs/assets/ChannelData.html.1981f416.js
index 1d8b9160b..8cf1fc7cb 100644
--- a/docs/assets/ChannelData.html.f8f818f6.js
+++ b/docs/assets/ChannelData.html.1981f416.js
@@ -1 +1 @@
-const a=JSON.parse('{"key":"v-2f64a2d4","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html","title":"ChannelData - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"}');export{a as data};
+const a=JSON.parse('{"key":"v-2f64a2d4","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html","title":"ChannelData - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672837223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"}');export{a as data};
diff --git a/docs/assets/ChannelData.html.194718a1.js b/docs/assets/ChannelData.html.5ca343ea.js
similarity index 73%
rename from docs/assets/ChannelData.html.194718a1.js
rename to docs/assets/ChannelData.html.5ca343ea.js
index 8fa38613e..066bd4e96 100644
--- a/docs/assets/ChannelData.html.194718a1.js
+++ b/docs/assets/ChannelData.html.5ca343ea.js
@@ -1 +1 @@
-const a=JSON.parse('{"key":"v-493d37f6","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html","title":"ChannelData - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"}');export{a as data};
+const a=JSON.parse('{"key":"v-493d37f6","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html","title":"ChannelData - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672837223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"}');export{a as data};
diff --git a/docs/assets/ChannelData.html.35215702.js b/docs/assets/ChannelData.html.7a20315f.js
similarity index 87%
rename from docs/assets/ChannelData.html.35215702.js
rename to docs/assets/ChannelData.html.7a20315f.js
index dbde76f8e..e7a4c8378 100644
--- a/docs/assets/ChannelData.html.35215702.js
+++ b/docs/assets/ChannelData.html.7a20315f.js
@@ -1,5 +1,5 @@
-import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const e={},o=l(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ChannelData - class

data class ChannelData<T>(var key: String, var value: T?)
-

Change Records

v1.0.88 added

Function Illustrate

\u6570\u636E\u901A\u8BAF\u6865\u952E\u503C\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

Function Example

\u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u53D1\u9001\u7684\u952E\u503C\u6570\u636E\u3002

The following example

object DataConst {
+import{_ as s,o as a,c as n,a as l}from"./app.6074a838.js";const e={},o=l(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ChannelData - class

data class ChannelData<T>(var key: String, var value: T?) : Serializable
+

Change Records

v1.0.88 added

v1.1.5 modified

\u5B9E\u73B0\u4E86 Serializable \u63A5\u53E3

Function Illustrate

\u6570\u636E\u901A\u8BAF\u6865\u952E\u503C\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

Function Example

\u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u53D1\u9001\u7684\u952E\u503C\u6570\u636E\u3002

The following example

object DataConst {
 
     val TEST_KV_DATA_1 = ChannelData("test_data_1", "defalut value")
     val TEST_KV_DATA_2 = ChannelData("test_data_2", 0)
@@ -20,4 +20,4 @@ import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const e={},o=l(`
dataChannel.wait(DataConst.TEST_KV_DATA_2, value = 2) { value -> // Your code here. } -
`,20),p=[o];function t(c,r){return a(),n("div",null,p)}const d=s(e,[["render",t],["__file","ChannelData.html.vue"]]);export{d as default}; +
`,22),p=[o];function c(t,r){return a(),n("div",null,p)}const d=s(e,[["render",c],["__file","ChannelData.html.vue"]]);export{d as default}; diff --git a/docs/assets/ChannelData.html.2e6c6569.js b/docs/assets/ChannelData.html.f5bfa9f6.js similarity index 86% rename from docs/assets/ChannelData.html.2e6c6569.js rename to docs/assets/ChannelData.html.f5bfa9f6.js index 9017af660..eca63a071 100644 --- a/docs/assets/ChannelData.html.2e6c6569.js +++ b/docs/assets/ChannelData.html.f5bfa9f6.js @@ -1,5 +1,5 @@ -import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const e={},o=l(`

ChannelData - class

data class ChannelData<T>(var key: String, var value: T?)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0.88 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6570\u636E\u901A\u8BAF\u6865\u952E\u503C\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

\u529F\u80FD\u793A\u4F8B

\u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u53D1\u9001\u7684\u952E\u503C\u6570\u636E\u3002

\u793A\u4F8B\u5982\u4E0B

object DataConst {
+import{_ as s,o as a,c as n,a as l}from"./app.6074a838.js";const e={},o=l(`

ChannelData - class

data class ChannelData<T>(var key: String, var value: T?) : Serializable
+

\u53D8\u66F4\u8BB0\u5F55

v1.0.88 \u65B0\u589E

v1.1.5 \u4FEE\u6539

\u5B9E\u73B0\u4E86 Serializable \u63A5\u53E3

\u529F\u80FD\u63CF\u8FF0

\u6570\u636E\u901A\u8BAF\u6865\u952E\u503C\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

\u529F\u80FD\u793A\u4F8B

\u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u53D1\u9001\u7684\u952E\u503C\u6570\u636E\u3002

\u793A\u4F8B\u5982\u4E0B

object DataConst {
 
     val TEST_KV_DATA_1 = ChannelData("test_data_1", "defalut value")
     val TEST_KV_DATA_2 = ChannelData("test_data_2", 0)
@@ -20,4 +20,4 @@ import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const e={},o=l(`

dataChannel.wait(DataConst.TEST_KV_DATA_2, value = 2) { value -> // Your code here. } -

`,19),p=[o];function c(t,r){return a(),n("div",null,p)}const A=s(e,[["render",c],["__file","ChannelData.html.vue"]]);export{A as default}; +
`,21),p=[o];function c(t,r){return a(),n("div",null,p)}const d=s(e,[["render",c],["__file","ChannelData.html.vue"]]);export{d as default}; diff --git a/docs/assets/ChannelPriority.html.4033abe5.js b/docs/assets/ChannelPriority.html.4033abe5.js new file mode 100644 index 000000000..9d6aad425 --- /dev/null +++ b/docs/assets/ChannelPriority.html.4033abe5.js @@ -0,0 +1,2 @@ +import{_ as s,o as a,c as o,a as n}from"./app.6074a838.js";const e={},l=n(`

ChannelPriority - class

class ChannelPriority(private val conditions: () -> Boolean)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6570\u636E\u901A\u8BAF\u6865\u54CD\u5E94\u4F18\u5148\u7EA7\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

`,7),c=[l];function t(p,r){return a(),o("div",null,c)}const d=s(e,[["render",t],["__file","ChannelPriority.html.vue"]]);export{d as default}; diff --git a/docs/assets/ChannelPriority.html.60b90501.js b/docs/assets/ChannelPriority.html.60b90501.js new file mode 100644 index 000000000..bedab1d68 --- /dev/null +++ b/docs/assets/ChannelPriority.html.60b90501.js @@ -0,0 +1,2 @@ +import{_ as s,o as n,c as o,a}from"./app.6074a838.js";const e={},t=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ChannelPriority - class

class ChannelPriority(private val conditions: () -> Boolean)
+

Change Records

v1.1.5 added

Function Illustrate

\u6570\u636E\u901A\u8BAF\u6865\u54CD\u5E94\u4F18\u5148\u7EA7\u6784\u9020\u7C7B\u3002

\u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookDataChannel \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

`,8),l=[t];function c(r,p){return n(),o("div",null,l)}const d=s(e,[["render",c],["__file","ChannelPriority.html.vue"]]);export{d as default}; diff --git a/docs/assets/ChannelPriority.html.7d2ec81d.js b/docs/assets/ChannelPriority.html.7d2ec81d.js new file mode 100644 index 000000000..686d340b5 --- /dev/null +++ b/docs/assets/ChannelPriority.html.7d2ec81d.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-87027140","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html","title":"ChannelPriority - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672749669000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.md"}');export{e as data}; diff --git a/docs/assets/ChannelPriority.html.b460c4bc.js b/docs/assets/ChannelPriority.html.b460c4bc.js new file mode 100644 index 000000000..1d9186813 --- /dev/null +++ b/docs/assets/ChannelPriority.html.b460c4bc.js @@ -0,0 +1 @@ +const a=JSON.parse('{"key":"v-b57870de","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html","title":"ChannelPriority - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672749669000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.md"}');export{a as data}; diff --git a/docs/assets/ComponentTypeFactory.html.0c913ae3.js b/docs/assets/ComponentTypeFactory.html.207f9222.js similarity index 95% rename from docs/assets/ComponentTypeFactory.html.0c913ae3.js rename to docs/assets/ComponentTypeFactory.html.207f9222.js index 394d23662..510c8d444 100644 --- a/docs/assets/ComponentTypeFactory.html.0c913ae3.js +++ b/docs/assets/ComponentTypeFactory.html.207f9222.js @@ -1 +1 @@ -import{_ as n,r as a,o as c,c as s,b as e,d as r,a as i,e as o}from"./app.99fcdd51.js";const p={},l=i('

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ComponentTypeFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173\u7EC4\u4EF6\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',6),d=o("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=o("\u70B9\u51FB\u8FD9\u91CC"),m=o(" \u8FDB\u884C\u67E5\u770B\u3002");function u(k,f){const t=a("ExternalLinkIcon");return c(),s("div",null,[l,e("p",null,[d,e("a",h,[_,r(t)]),m])])}const g=n(p,[["render",u],["__file","ComponentTypeFactory.html.vue"]]);export{g as default}; +import{_ as n,r as a,o as c,c as s,b as e,d as r,a as i,e as o}from"./app.6074a838.js";const p={},l=i('

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ComponentTypeFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173\u7EC4\u4EF6\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',6),d=o("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=o("\u70B9\u51FB\u8FD9\u91CC"),m=o(" \u8FDB\u884C\u67E5\u770B\u3002");function u(k,f){const t=a("ExternalLinkIcon");return c(),s("div",null,[l,e("p",null,[d,e("a",h,[_,r(t)]),m])])}const g=n(p,[["render",u],["__file","ComponentTypeFactory.html.vue"]]);export{g as default}; diff --git a/docs/assets/ComponentTypeFactory.html.7e04a8b3.js b/docs/assets/ComponentTypeFactory.html.8429e98e.js similarity index 94% rename from docs/assets/ComponentTypeFactory.html.7e04a8b3.js rename to docs/assets/ComponentTypeFactory.html.8429e98e.js index 0ffc8447d..cdfd98ac5 100644 --- a/docs/assets/ComponentTypeFactory.html.7e04a8b3.js +++ b/docs/assets/ComponentTypeFactory.html.8429e98e.js @@ -1 +1 @@ -import{_ as n,r as c,o as a,c as r,b as e,d as s,a as p,e as o}from"./app.99fcdd51.js";const d={},i=p('

ComponentTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173\u7EC4\u4EF6\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',5),l=o("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=o("\u70B9\u51FB\u8FD9\u91CC"),k=o(" \u8FDB\u884C\u67E5\u770B\u3002");function m(y,f){const t=c("ExternalLinkIcon");return a(),r("div",null,[i,e("p",null,[l,e("a",_,[h,s(t)]),k])])}const b=n(d,[["render",m],["__file","ComponentTypeFactory.html.vue"]]);export{b as default}; +import{_ as n,r as c,o as a,c as r,b as e,d as s,a as p,e as o}from"./app.6074a838.js";const d={},i=p('

ComponentTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173\u7EC4\u4EF6\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',5),l=o("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=o("\u70B9\u51FB\u8FD9\u91CC"),k=o(" \u8FDB\u884C\u67E5\u770B\u3002");function m(y,f){const t=c("ExternalLinkIcon");return a(),r("div",null,[i,e("p",null,[l,e("a",_,[h,s(t)]),k])])}const b=n(d,[["render",m],["__file","ComponentTypeFactory.html.vue"]]);export{b as default}; diff --git a/docs/assets/ConstructorFinder.html.0c13dc47.js b/docs/assets/ConstructorFinder.html.0c13dc47.js deleted file mode 100644 index 2f28cba1b..000000000 --- a/docs/assets/ConstructorFinder.html.0c13dc47.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-a71937aa","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html","title":"ConstructorFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method","link":"#onnosuchconstructor-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method-1","link":"#onnosuchconstructor-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"}');export{e as data}; diff --git a/docs/assets/ConstructorFinder.html.73258725.js b/docs/assets/ConstructorFinder.html.33aa3dfc.js similarity index 95% rename from docs/assets/ConstructorFinder.html.73258725.js rename to docs/assets/ConstructorFinder.html.33aa3dfc.js index 5db6a942a..404619693 100644 --- a/docs/assets/ConstructorFinder.html.73258725.js +++ b/docs/assets/ConstructorFinder.html.33aa3dfc.js @@ -1,9 +1,10 @@ -import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

ConstructorFinder - class

class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
+import{_ as s,o as n,c as o,a}from"./app.6074a838.js";const e={},l=a(`

ConstructorFinder - class

class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.2 \u4FEE\u6539

\u5408\u5E76\u5230 BaseFinder

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 MemberBaseFinder

\u529F\u80FD\u63CF\u8FF0

Constructor \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Constructor \u6216\u4E00\u7EC4 Constructor\u3002

paramCount - field

var paramCount: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

v1.0.80 \u4FEE\u6539

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 ModifierConditions

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\uFF0C\u9ED8\u8BA4\u6A21\u7CCA\u67E5\u627E\u5E76\u53D6\u7B2C\u4E00\u4E2A\u5339\u914D\u7684 Constructor\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

emptyParam - method

fun emptyParam(): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.75 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any): IndexTypeCondition
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

param - method

fun param(conditions: ObjectsConditions): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(numRange: IntRange): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(conditions: CountConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
@@ -84,4 +85,4 @@ import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5FFD\u7565\u5F02\u5E38\u5E76\u505C\u6B62\u6253\u5370\u4EFB\u4F55\u9519\u8BEF\u65E5\u5FD7\u3002

\u82E5 isNotIgnoredHookingFailure \u4E3A false \u5219\u81EA\u52A8\u5FFD\u7565\u3002

\u6CE8\u610F

\u6B64\u65F6\u82E5\u8981\u76D1\u542C\u5F02\u5E38\u7ED3\u679C\uFF0C\u4F60\u9700\u8981\u624B\u52A8\u5B9E\u73B0 onNoSuchConstructor \u65B9\u6CD5\u3002

ignoredError - method

\u53D8\u66F4\u8BB0\u5F55

v1.0.3 \u65B0\u589E

v1.1.0 \u4F5C\u5E9F

\u8BF7\u8F6C\u79FB\u5230\u65B0\u65B9\u6CD5 ignored()

Instance - class

inner class Instance internal constructor(private val constructor: Constructor<*>?)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.2 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u65B0\u589E constructor \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

Constructor \u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

call - method

fun call(vararg param: Any?): Any?
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.2 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B\uFF0C\u4E0D\u6307\u5B9A\u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

newInstance - method

fun <T> newInstance(vararg param: Any?): T?
-

\u53D8\u66F4\u8BB0\u5F55

v1.0.2 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B \uFF0C\u6307\u5B9A T \u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

`,287),p=[l];function c(t,r){return n(),o("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorFinder.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.0.2 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B \uFF0C\u6307\u5B9A T \u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

`,294),p=[l];function c(t,r){return n(),o("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/ConstructorFinder.html.5d3a6cdd.js b/docs/assets/ConstructorFinder.html.5d3a6cdd.js new file mode 100644 index 000000000..ae325ca40 --- /dev/null +++ b/docs/assets/ConstructorFinder.html.5d3a6cdd.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-a71937aa","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html","title":"ConstructorFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method","link":"#onnosuchconstructor-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method-1","link":"#onnosuchconstructor-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"}');export{e as data}; diff --git a/docs/assets/ConstructorFinder.html.7de4f560.js b/docs/assets/ConstructorFinder.html.7de4f560.js deleted file mode 100644 index 6d28dc6c5..000000000 --- a/docs/assets/ConstructorFinder.html.7de4f560.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-1e2cbc9c","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html","title":"ConstructorFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method","link":"#onnosuchconstructor-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method-1","link":"#onnosuchconstructor-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"}');export{e as data}; diff --git a/docs/assets/ConstructorFinder.html.bd11174d.js b/docs/assets/ConstructorFinder.html.bd11174d.js new file mode 100644 index 000000000..e4888fa43 --- /dev/null +++ b/docs/assets/ConstructorFinder.html.bd11174d.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-1e2cbc9c","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html","title":"ConstructorFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method","link":"#onnosuchconstructor-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchConstructor - method","slug":"onnosuchconstructor-method-1","link":"#onnosuchconstructor-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"}');export{e as data}; diff --git a/docs/assets/ConstructorFinder.html.2c738cf8.js b/docs/assets/ConstructorFinder.html.fec261d1.js similarity index 95% rename from docs/assets/ConstructorFinder.html.2c738cf8.js rename to docs/assets/ConstructorFinder.html.fec261d1.js index 50995ad7c..f0ef58ff0 100644 --- a/docs/assets/ConstructorFinder.html.2c738cf8.js +++ b/docs/assets/ConstructorFinder.html.fec261d1.js @@ -1,9 +1,10 @@ -import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ConstructorFinder - class

class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
+import{_ as s,o as n,c as o,a}from"./app.6074a838.js";const e={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ConstructorFinder - class

class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
 

Change Records

v1.0 first

v1.0.2 modified

\u5408\u5E76\u5230 BaseFinder

v1.1.0 modified

\u5408\u5E76\u5230 MemberBaseFinder

Function Illustrate

Constructor \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Constructor \u6216\u4E00\u7EC4 Constructor\u3002

paramCount - field

var paramCount: Int
 

Change Records

v1.0.67 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
 

Change Records

v1.0.67 added

v1.0.80 modified

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

v1.1.0 modified

\u5408\u5E76\u5230 ModifierConditions

Function Illustrate

\u8BBE\u7F6E Constructor \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\uFF0C\u9ED8\u8BA4\u6A21\u7CCA\u67E5\u627E\u5E76\u53D6\u7B2C\u4E00\u4E2A\u5339\u914D\u7684 Constructor\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

emptyParam - method

fun emptyParam(): IndexTypeCondition
 

Change Records

v1.0.75 added

Function Illustrate

\u8BBE\u7F6E Constructor \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any): IndexTypeCondition
-

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
+

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

param - method

fun param(conditions: ObjectsConditions): IndexTypeCondition
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u6761\u4EF6\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
 

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(numRange: IntRange): IndexTypeCondition
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(conditions: CountConditions): IndexTypeCondition
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
@@ -84,4 +85,4 @@ import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

Change Records

v1.1.0 added

Function Illustrate

\u5FFD\u7565\u5F02\u5E38\u5E76\u505C\u6B62\u6253\u5370\u4EFB\u4F55\u9519\u8BEF\u65E5\u5FD7\u3002

\u82E5 isNotIgnoredHookingFailure \u4E3A false \u5219\u81EA\u52A8\u5FFD\u7565\u3002

Notice

\u6B64\u65F6\u82E5\u8981\u76D1\u542C\u5F02\u5E38\u7ED3\u679C\uFF0C\u4F60\u9700\u8981\u624B\u52A8\u5B9E\u73B0 onNoSuchConstructor \u65B9\u6CD5\u3002

ignoredError - method

Change Records

v1.0.3 added

v1.1.0 deprecated

\u8BF7\u8F6C\u79FB\u5230\u65B0\u65B9\u6CD5 ignored()

Instance - class

inner class Instance internal constructor(private val constructor: Constructor<*>?)
 

Change Records

v1.0.2 added

v1.1.0 modified

\u65B0\u589E constructor \u53C2\u6570

Function Illustrate

Constructor \u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

call - method

fun call(vararg param: Any?): Any?
 

Change Records

v1.0.2 added

Function Illustrate

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B\uFF0C\u4E0D\u6307\u5B9A\u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

newInstance - method

fun <T> newInstance(vararg param: Any?): T?
-

Change Records

v1.0.2 added

Function Illustrate

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B \uFF0C\u6307\u5B9A T \u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

`,288),p=[l];function c(t,r){return n(),o("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorFinder.html.vue"]]);export{i as default}; +

Change Records

v1.0.2 added

Function Illustrate

\u6267\u884C Constructor \u521B\u5EFA\u76EE\u6807\u5B9E\u4F8B \uFF0C\u6307\u5B9A T \u76EE\u6807\u5B9E\u4F8B\u7C7B\u578B\u3002

`,295),p=[l];function c(t,r){return n(),o("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/ConstructorRules.html.8f57ac81.js b/docs/assets/ConstructorRules.html.2117de16.js similarity index 77% rename from docs/assets/ConstructorRules.html.8f57ac81.js rename to docs/assets/ConstructorRules.html.2117de16.js index 9aed5bf89..0e155e73b 100644 --- a/docs/assets/ConstructorRules.html.8f57ac81.js +++ b/docs/assets/ConstructorRules.html.2117de16.js @@ -1,8 +1,9 @@ -import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},p=n(`

ConstructorRules - class

class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
+import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},p=n(`

ConstructorRules - class

class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

Constructor \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

paramCount - field

var paramCount: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

emptyParam - method

fun emptyParam()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

paramCount - method

fun paramCount(numRange: IntRange)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

param - method

fun param(conditions: ObjectsConditions)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

paramCount - method

fun paramCount(numRange: IntRange)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

paramCount - method

fun paramCount(conditions: CountConditions)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,50),c=[p];function t(l,r){return o(),a("div",null,c)}const i=s(e,[["render",t],["__file","ConstructorRules.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,57),t=[p];function c(r,l){return o(),a("div",null,t)}const i=s(e,[["render",c],["__file","ConstructorRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/ConstructorRules.html.89ac6cea.js b/docs/assets/ConstructorRules.html.bb803535.js similarity index 79% rename from docs/assets/ConstructorRules.html.89ac6cea.js rename to docs/assets/ConstructorRules.html.bb803535.js index 9e8a85899..ffb118139 100644 --- a/docs/assets/ConstructorRules.html.89ac6cea.js +++ b/docs/assets/ConstructorRules.html.bb803535.js @@ -1,8 +1,9 @@ -import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},t=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ConstructorRules - class

class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
+import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},t=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ConstructorRules - class

class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
 

Change Records

v1.1.0 added

Function Illustrate

Constructor \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

paramCount - field

var paramCount: Int
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

emptyParam - method

fun emptyParam()
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any)
-

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

paramCount - method

fun paramCount(numRange: IntRange)
+

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Constructor \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

param - method

fun param(conditions: ObjectsConditions)
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u6761\u4EF6\u3002

Pay Attention

\u65E0\u53C2 Constructor \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Constructor \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

paramCount - method

fun paramCount(numRange: IntRange)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

paramCount - method

fun paramCount(conditions: CountConditions)
-

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,51),p=[t];function c(l,r){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorRules.html.vue"]]);export{i as default}; +

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Constructor \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,58),p=[t];function c(r,l){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","ConstructorRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/ConstructorRules.html.d62bae6c.js b/docs/assets/ConstructorRules.html.c7161b83.js similarity index 55% rename from docs/assets/ConstructorRules.html.d62bae6c.js rename to docs/assets/ConstructorRules.html.c7161b83.js index cc8270286..29fdc54fe 100644 --- a/docs/assets/ConstructorRules.html.d62bae6c.js +++ b/docs/assets/ConstructorRules.html.c7161b83.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-08b70f7f","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html","title":"ConstructorRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-08b70f7f","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html","title":"ConstructorRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"}');export{e as data}; diff --git a/docs/assets/ConstructorRules.html.f8d7dd83.js b/docs/assets/ConstructorRules.html.f8ba43ee.js similarity index 55% rename from docs/assets/ConstructorRules.html.f8d7dd83.js rename to docs/assets/ConstructorRules.html.f8ba43ee.js index 010162380..28eca65f8 100644 --- a/docs/assets/ConstructorRules.html.f8d7dd83.js +++ b/docs/assets/ConstructorRules.html.f8ba43ee.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-a42f54a4","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html","title":"ConstructorRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-a42f54a4","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html","title":"ConstructorRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"}');export{e as data}; diff --git a/docs/assets/CountRules.html.64b9467a.js b/docs/assets/CountRules.html.302238b6.js similarity index 98% rename from docs/assets/CountRules.html.64b9467a.js rename to docs/assets/CountRules.html.302238b6.js index f228ef4d1..42ea1479a 100644 --- a/docs/assets/CountRules.html.64b9467a.js +++ b/docs/assets/CountRules.html.302238b6.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

CountRules - class

class CountRules private constructor()
+import{_ as s,o,c as n,a as e}from"./app.6074a838.js";const a={},l=e(`

CountRules - class

class CountRules private constructor()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u6A21\u7CCA Class\u3001Member \u6570\u7EC4 (\u4E0B\u6807) \u4E2A\u6570\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

\u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

Int.isZero - i-ext-method

fun Int.isZero(): Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u662F\u5426\u4E3A 0\u3002

Int.moreThan - i-ext-method

fun Int.moreThan(count: Int): Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5927\u4E8E count\u3002

Int.lessThan - i-ext-method

fun Int.lessThan(count: Int): Boolean
diff --git a/docs/assets/CountRules.html.3361aff7.js b/docs/assets/CountRules.html.a37475d9.js
similarity index 98%
rename from docs/assets/CountRules.html.3361aff7.js
rename to docs/assets/CountRules.html.a37475d9.js
index dbeaf8dbe..dc9974571 100644
--- a/docs/assets/CountRules.html.3361aff7.js
+++ b/docs/assets/CountRules.html.a37475d9.js
@@ -1,4 +1,4 @@
-import{_ as s,o as n,c as o,a as e}from"./app.99fcdd51.js";const a={},t=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

CountRules - class

class CountRules private constructor()
+import{_ as s,o as n,c as o,a as e}from"./app.6074a838.js";const a={},t=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

CountRules - class

class CountRules private constructor()
 

Change Records

v1.1.0 added

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u6A21\u7CCA Class\u3001Member \u6570\u7EC4 (\u4E0B\u6807) \u4E2A\u6570\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

\u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

Int.isZero - i-ext-method

fun Int.isZero(): Boolean
 

Change Records

v1.1.0 added

Function Illustrate

\u662F\u5426\u4E3A 0\u3002

Int.moreThan - i-ext-method

fun Int.moreThan(count: Int): Boolean
 

Change Records

v1.1.0 added

Function Illustrate

\u5927\u4E8E count\u3002

Int.lessThan - i-ext-method

fun Int.lessThan(count: Int): Boolean
diff --git a/docs/assets/CurrentClass.html.8b40838c.js b/docs/assets/CurrentClass.html.46b5c33a.js
similarity index 99%
rename from docs/assets/CurrentClass.html.8b40838c.js
rename to docs/assets/CurrentClass.html.46b5c33a.js
index cc16e4e10..ea6ef88ee 100644
--- a/docs/assets/CurrentClass.html.8b40838c.js
+++ b/docs/assets/CurrentClass.html.46b5c33a.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as e,a as n}from"./app.99fcdd51.js";const o={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

CurrentClass - class

class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
+import{_ as s,o as a,c as e,a as n}from"./app.6074a838.js";const o={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

CurrentClass - class

class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
 

Change Records

v1.0.70 added

v1.1.0 modified

\u8C03\u6574\u4E86\u6784\u9020\u65B9\u6CD5\u7684\u53C2\u6570\u540D\u79F0

Function Illustrate

\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

name - field

val name: String
 

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u5F97\u5F53\u524D classSet \u7684 Class.getName\u3002

simpleName - field

val simpleName: String
 

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u5F97\u5F53\u524D classSet \u7684 Class.getSimpleName\u3002

generic - method

fun generic(): GenericClass?
diff --git a/docs/assets/CurrentClass.html.7154b0ad.js b/docs/assets/CurrentClass.html.9ebd6de0.js
similarity index 99%
rename from docs/assets/CurrentClass.html.7154b0ad.js
rename to docs/assets/CurrentClass.html.9ebd6de0.js
index fccd8b4b3..7bd2c629e 100644
--- a/docs/assets/CurrentClass.html.7154b0ad.js
+++ b/docs/assets/CurrentClass.html.9ebd6de0.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,a as o}from"./app.99fcdd51.js";const e={},l=o(`

CurrentClass - class

class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
+import{_ as s,o as a,c as n,a as o}from"./app.6074a838.js";const e={},l=o(`

CurrentClass - class

class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u8C03\u6574\u4E86\u6784\u9020\u65B9\u6CD5\u7684\u53C2\u6570\u540D\u79F0

\u529F\u80FD\u63CF\u8FF0

\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

name - field

val name: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u5F97\u5F53\u524D classSet \u7684 Class.getName\u3002

simpleName - field

val simpleName: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u5F97\u5F53\u524D classSet \u7684 Class.getSimpleName\u3002

generic - method

fun generic(): GenericClass?
diff --git a/docs/assets/DefinedTypeFactory.html.3ff07e63.js b/docs/assets/DefinedTypeFactory.html.4e8930dc.js
similarity index 95%
rename from docs/assets/DefinedTypeFactory.html.3ff07e63.js
rename to docs/assets/DefinedTypeFactory.html.4e8930dc.js
index 660f5b990..3707ba291 100644
--- a/docs/assets/DefinedTypeFactory.html.3ff07e63.js
+++ b/docs/assets/DefinedTypeFactory.html.4e8930dc.js
@@ -1,2 +1,2 @@
-import{_ as e,o as s,c as a,a as o}from"./app.99fcdd51.js";const t={},n=o(`

DefinedTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u5185\u90E8\u7C7B\u578B\u7684\u5B9A\u4E49\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u7528\u4E8E\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u7684\u5EF6\u4F38\u3002

VagueType - field

val VagueType: Class<*>
+import{_ as e,o as s,c as a,a as o}from"./app.6074a838.js";const t={},n=o(`

DefinedTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u5185\u90E8\u7C7B\u578B\u7684\u5B9A\u4E49\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u7528\u4E8E\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u7684\u5EF6\u4F38\u3002

VagueType - field

val VagueType: Class<*>
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5F97\u5230\u6A21\u7CCA\u7C7B\u578B\u3002

`,11),c=[n];function p(l,r){return s(),a("div",null,c)}const i=e(t,[["render",p],["__file","DefinedTypeFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/DefinedTypeFactory.html.d1c53dd5.js b/docs/assets/DefinedTypeFactory.html.972bb7a0.js similarity index 96% rename from docs/assets/DefinedTypeFactory.html.d1c53dd5.js rename to docs/assets/DefinedTypeFactory.html.972bb7a0.js index 49b129e62..09be81fc8 100644 --- a/docs/assets/DefinedTypeFactory.html.d1c53dd5.js +++ b/docs/assets/DefinedTypeFactory.html.972bb7a0.js @@ -1,2 +1,2 @@ -import{_ as e,o as s,c as o,a}from"./app.99fcdd51.js";const t={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

DefinedTypeFactory - kt

Change Records

v1.1.0 added

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u5185\u90E8\u7C7B\u578B\u7684\u5B9A\u4E49\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u7528\u4E8E\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u7684\u5EF6\u4F38\u3002

VagueType - field

val VagueType: Class<*>
+import{_ as e,o as s,c as o,a}from"./app.6074a838.js";const t={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

DefinedTypeFactory - kt

Change Records

v1.1.0 added

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u5185\u90E8\u7C7B\u578B\u7684\u5B9A\u4E49\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u7528\u4E8E\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u7684\u5EF6\u4F38\u3002

VagueType - field

val VagueType: Class<*>
 

Change Records

v1.1.0 added

Function Illustrate

\u5F97\u5230\u6A21\u7CCA\u7C7B\u578B\u3002

`,12),c=[n];function r(l,p){return s(),o("div",null,c)}const i=e(t,[["render",r],["__file","DefinedTypeFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/DexClassFinder.html.db21690b.js b/docs/assets/DexClassFinder.html.04d39013.js similarity index 99% rename from docs/assets/DexClassFinder.html.db21690b.js rename to docs/assets/DexClassFinder.html.04d39013.js index 06fa6dea3..1b6ee85dc 100644 --- a/docs/assets/DexClassFinder.html.db21690b.js +++ b/docs/assets/DexClassFinder.html.04d39013.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

DexClassFinder - class

class DexClassFinder internal constructor(
+import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

DexClassFinder - class

class DexClassFinder internal constructor(
     internal var name: String,
     internal var async: Boolean,
     override val loaderSet: ClassLoader?
diff --git a/docs/assets/DexClassFinder.html.d84667d3.js b/docs/assets/DexClassFinder.html.5b5ea097.js
similarity index 99%
rename from docs/assets/DexClassFinder.html.d84667d3.js
rename to docs/assets/DexClassFinder.html.5b5ea097.js
index 1973c2fda..566d796b7 100644
--- a/docs/assets/DexClassFinder.html.d84667d3.js
+++ b/docs/assets/DexClassFinder.html.5b5ea097.js
@@ -1,4 +1,4 @@
-import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

DexClassFinder - class

class DexClassFinder internal constructor(
+import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},l=e(`

DexClassFinder - class

class DexClassFinder internal constructor(
     internal var name: String,
     internal var async: Boolean,
     override val loaderSet: ClassLoader?
diff --git a/docs/assets/FieldFinder.html.25713065.js b/docs/assets/FieldFinder.html.25713065.js
deleted file mode 100644
index 45943452b..000000000
--- a/docs/assets/FieldFinder.html.25713065.js
+++ /dev/null
@@ -1 +0,0 @@
-const e=JSON.parse('{"key":"v-22449c48","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html","title":"FieldFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"field - method","slug":"field-method","link":"#field-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchField - method","slug":"onnosuchfield-method","link":"#onnosuchfield-method","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"}');export{e as data};
diff --git a/docs/assets/FieldFinder.html.7b0651b9.js b/docs/assets/FieldFinder.html.34287b71.js
similarity index 96%
rename from docs/assets/FieldFinder.html.7b0651b9.js
rename to docs/assets/FieldFinder.html.34287b71.js
index 1ecfed882..d59f7f9e9 100644
--- a/docs/assets/FieldFinder.html.7b0651b9.js
+++ b/docs/assets/FieldFinder.html.34287b71.js
@@ -1,4 +1,4 @@
-import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

FieldFinder - class

class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
+import{_ as s,o,c as n,a as e}from"./app.6074a838.js";const a={},l=e(`

FieldFinder - class

class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.2 \u4FEE\u6539

\u5408\u5E76\u5230 BaseFinder

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 MemberBaseFinder

\u529F\u80FD\u63CF\u8FF0

Field \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Field \u6216\u4E00\u7EC4 Field\u3002

classSet - field

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.2 \u79FB\u9664

name - field

var name: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.70 \u4FEE\u6539

\u5141\u8BB8\u4E0D\u586B\u5199\u540D\u79F0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

type - field

var type: Any?
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
@@ -6,7 +6,8 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u987A\u5E8F\u7B5B\u9009\u5B57\u8282\u7801\u7684\u4E0B\u6807\u3002

name - method

fun name(value: String): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

name - method

fun name(conditions: NameConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.88 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 NameConditions

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

type - method

fun type(value: Any): IndexTypeCondition
-

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u7279\u522B\u6CE8\u610F

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

type - method

fun type(conditions: ObjectConditions): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.80 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5728 classSet \u7684\u6240\u6709\u7236\u7C7B\u4E2D\u67E5\u627E\u5F53\u524D Field\u3002

\u6CE8\u610F

\u82E5\u5F53\u524D classSet \u7684\u7236\u7C7B\u8F83\u591A\u53EF\u80FD\u4F1A\u8017\u65F6\uFF0CAPI \u4F1A\u81EA\u52A8\u5FAA\u73AF\u5230\u7236\u7C7B\u7EE7\u627F\u662F Any \u524D\u7684\u6700\u540E\u4E00\u4E2A\u7C7B\u3002

RemedyPlan - class

inner class RemedyPlan internal constructor()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

Field \u91CD\u67E5\u627E\u5B9E\u73B0\u7C7B\uFF0C\u53EF\u7D2F\u8BA1\u5931\u8D25\u6B21\u6570\u76F4\u5230\u67E5\u627E\u6210\u529F\u3002

field - method

inline fun field(initiate: FieldConditions): Result
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u521B\u5EFA\u9700\u8981\u91CD\u65B0\u67E5\u627E\u7684 Field\u3002

\u4F60\u53EF\u4EE5\u6DFB\u52A0\u591A\u4E2A\u5907\u9009 Field\uFF0C\u76F4\u5230\u6210\u529F\u4E3A\u6B62\uFF0C\u82E5\u6700\u540E\u4F9D\u7136\u5931\u8D25\uFF0C\u5C06\u505C\u6B62\u67E5\u627E\u5E76\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u3002

Result - class

inner class Result internal constructor()
@@ -80,4 +81,4 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u3002

setTrue - method

fun setTrue()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A true\u3002

\u7279\u522B\u6CE8\u610F

\u8BF7\u786E\u4FDD\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B\u4E3A Boolean\u3002

setFalse - method

fun setFalse()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A false\u3002

\u7279\u522B\u6CE8\u610F

\u8BF7\u786E\u4FDD\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B\u4E3A Boolean\u3002

setNull - method

fun setNull()
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A null\u3002

`,367),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(a,[["render",c],["__file","FieldFinder.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A null\u3002

`,376),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(a,[["render",c],["__file","FieldFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/FieldFinder.html.4410e26c.js b/docs/assets/FieldFinder.html.4410e26c.js deleted file mode 100644 index 61197677e..000000000 --- a/docs/assets/FieldFinder.html.4410e26c.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-42e0f0ab","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html","title":"FieldFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"field - method","slug":"field-method","link":"#field-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchField - method","slug":"onnosuchfield-method","link":"#onnosuchfield-method","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"}');export{e as data}; diff --git a/docs/assets/FieldFinder.html.7f9e6371.js b/docs/assets/FieldFinder.html.7f9e6371.js new file mode 100644 index 000000000..9a4201ec4 --- /dev/null +++ b/docs/assets/FieldFinder.html.7f9e6371.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-22449c48","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html","title":"FieldFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]},{"level":2,"title":"type - method","slug":"type-method-1","link":"#type-method-1","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"field - method","slug":"field-method","link":"#field-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchField - method","slug":"onnosuchfield-method","link":"#onnosuchfield-method","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"}');export{e as data}; diff --git a/docs/assets/FieldFinder.html.9d8f7b17.js b/docs/assets/FieldFinder.html.a54e7410.js similarity index 96% rename from docs/assets/FieldFinder.html.9d8f7b17.js rename to docs/assets/FieldFinder.html.a54e7410.js index 3433feaf2..749968595 100644 --- a/docs/assets/FieldFinder.html.9d8f7b17.js +++ b/docs/assets/FieldFinder.html.a54e7410.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

FieldFinder - class

class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
+import{_ as s,o,c as e,a as n}from"./app.6074a838.js";const a={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

FieldFinder - class

class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
 

Change Records

v1.0 first

v1.0.2 modified

\u5408\u5E76\u5230 BaseFinder

v1.1.0 modified

\u5408\u5E76\u5230 MemberBaseFinder

Function Illustrate

Field \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Field \u6216\u4E00\u7EC4 Field\u3002

classSet - field

Change Records

v1.0 first

v1.0.2 removed

name - field

var name: String
 

Change Records

v1.0 first

v1.0.70 modified

\u5141\u8BB8\u4E0D\u586B\u5199\u540D\u79F0

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

type - field

var type: Any?
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
@@ -6,7 +6,8 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

Change Records

v1.0.70 added

Function Illustrate

\u987A\u5E8F\u7B5B\u9009\u5B57\u8282\u7801\u7684\u4E0B\u6807\u3002

name - method

fun name(value: String): IndexTypeCondition
 

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

name - method

fun name(conditions: NameConditions): IndexTypeCondition
 

Change Records

v1.0.88 added

v1.1.0 modified

\u5408\u5E76\u5230 NameConditions

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

type - method

fun type(value: Any): IndexTypeCondition
-

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

Pay Attention

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
+

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

type - method

fun type(conditions: ObjectConditions): IndexTypeCondition
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
 

Change Records

v1.0.80 added

Function Illustrate

\u8BBE\u7F6E\u5728 classSet \u7684\u6240\u6709\u7236\u7C7B\u4E2D\u67E5\u627E\u5F53\u524D Field\u3002

Notice

\u82E5\u5F53\u524D classSet \u7684\u7236\u7C7B\u8F83\u591A\u53EF\u80FD\u4F1A\u8017\u65F6\uFF0CAPI \u4F1A\u81EA\u52A8\u5FAA\u73AF\u5230\u7236\u7C7B\u7EE7\u627F\u662F Any \u524D\u7684\u6700\u540E\u4E00\u4E2A\u7C7B\u3002

RemedyPlan - class

inner class RemedyPlan internal constructor()
 

Change Records

v1.1.0 added

Function Illustrate

Field \u91CD\u67E5\u627E\u5B9E\u73B0\u7C7B\uFF0C\u53EF\u7D2F\u8BA1\u5931\u8D25\u6B21\u6570\u76F4\u5230\u67E5\u627E\u6210\u529F\u3002

field - method

inline fun field(initiate: FieldConditions): Result
 

Change Records

v1.1.0 added

Function Illustrate

\u521B\u5EFA\u9700\u8981\u91CD\u65B0\u67E5\u627E\u7684 Field\u3002

\u4F60\u53EF\u4EE5\u6DFB\u52A0\u591A\u4E2A\u5907\u9009 Field\uFF0C\u76F4\u5230\u6210\u529F\u4E3A\u6B62\uFF0C\u82E5\u6700\u540E\u4F9D\u7136\u5931\u8D25\uFF0C\u5C06\u505C\u6B62\u67E5\u627E\u5E76\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u3002

Result - class

inner class Result internal constructor()
@@ -80,4 +81,4 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u3002

setTrue - method

fun setTrue()
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A true\u3002

Pay Attention

\u8BF7\u786E\u4FDD\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B\u4E3A Boolean\u3002

setFalse - method

fun setFalse()
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A false\u3002

Pay Attention

\u8BF7\u786E\u4FDD\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B\u4E3A Boolean\u3002

setNull - method

fun setNull()
-

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A null\u3002

`,368),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(a,[["render",c],["__file","FieldFinder.html.vue"]]);export{i as default}; +

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Field \u5B9E\u4F8B\u4E3A null\u3002

`,377),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(a,[["render",c],["__file","FieldFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/FieldFinder.html.ba29e9c4.js b/docs/assets/FieldFinder.html.ba29e9c4.js new file mode 100644 index 000000000..67436ce65 --- /dev/null +++ b/docs/assets/FieldFinder.html.ba29e9c4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-42e0f0ab","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html","title":"FieldFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]},{"level":2,"title":"type - method","slug":"type-method-1","link":"#type-method-1","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"field - method","slug":"field-method","link":"#field-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchField - method","slug":"onnosuchfield-method","link":"#onnosuchfield-method","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"}');export{e as data}; diff --git a/docs/assets/FieldRules.html.d12c9b1b.js b/docs/assets/FieldRules.html.2a5e175f.js similarity index 81% rename from docs/assets/FieldRules.html.d12c9b1b.js rename to docs/assets/FieldRules.html.2a5e175f.js index 05d7c9877..015756e94 100644 --- a/docs/assets/FieldRules.html.d12c9b1b.js +++ b/docs/assets/FieldRules.html.2a5e175f.js @@ -1,6 +1,7 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

FieldRules - class

class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
+import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

FieldRules - class

class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
 

Change Records

v1.1.0 added

Function Illustrate

Field \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

name - field

var name: String
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u3002

type - field

var type: Any?
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Field \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

name - method

fun name(conditions: NameConditions)
-

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

`,33),p=[l];function c(t,r){return e(),o("div",null,p)}const i=s(n,[["render",c],["__file","FieldRules.html.vue"]]);export{i as default}; +

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

type - method

fun type(conditions: ObjectConditions)
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Field \u7C7B\u578B\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

`,40),p=[l];function t(c,r){return e(),o("div",null,p)}const i=s(n,[["render",t],["__file","FieldRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/FieldRules.html.0cbc7d43.js b/docs/assets/FieldRules.html.9cc3cdd7.js similarity index 62% rename from docs/assets/FieldRules.html.0cbc7d43.js rename to docs/assets/FieldRules.html.9cc3cdd7.js index b7161312d..3fcf61c27 100644 --- a/docs/assets/FieldRules.html.0cbc7d43.js +++ b/docs/assets/FieldRules.html.9cc3cdd7.js @@ -1,6 +1,7 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

FieldRules - class

class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
+import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},l=a(`

FieldRules - class

class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

Field \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

name - field

var name: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u3002

type - field

var type: Any?
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

name - method

fun name(conditions: NameConditions)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

`,32),p=[l];function c(t,r){return e(),o("div",null,p)}const i=s(n,[["render",c],["__file","FieldRules.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u540D\u79F0\u6761\u4EF6\u3002

type - method

fun type(conditions: ObjectConditions)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Field \u7C7B\u578B\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u7C7B\u578B\u3002

`,39),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","FieldRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/FieldRules.html.6858f0d6.js b/docs/assets/FieldRules.html.a499e892.js similarity index 59% rename from docs/assets/FieldRules.html.6858f0d6.js rename to docs/assets/FieldRules.html.a499e892.js index 624620bbb..58f63324f 100644 --- a/docs/assets/FieldRules.html.6858f0d6.js +++ b/docs/assets/FieldRules.html.a499e892.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-3e67a42e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html","title":"FieldRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-3e67a42e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html","title":"FieldRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"}');export{e as data}; diff --git a/docs/assets/FieldRules.html.9b04521f.js b/docs/assets/FieldRules.html.c8edc48c.js similarity index 59% rename from docs/assets/FieldRules.html.9b04521f.js rename to docs/assets/FieldRules.html.c8edc48c.js index 62a7727e8..45d5daa5d 100644 --- a/docs/assets/FieldRules.html.9b04521f.js +++ b/docs/assets/FieldRules.html.c8edc48c.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-21f64ebf","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html","title":"FieldRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-21f64ebf","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html","title":"FieldRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"type - field","slug":"type-field","link":"#type-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"type - method","slug":"type-method","link":"#type-method","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"}');export{e as data}; diff --git a/docs/assets/GenericClass.html.d5c74ff7.js b/docs/assets/GenericClass.html.2c071f63.js similarity index 56% rename from docs/assets/GenericClass.html.d5c74ff7.js rename to docs/assets/GenericClass.html.2c071f63.js index d6e1d9991..47ca9caee 100644 --- a/docs/assets/GenericClass.html.d5c74ff7.js +++ b/docs/assets/GenericClass.html.2c071f63.js @@ -1,3 +1,4 @@ -import{_ as s,o as a,c as e,a as n}from"./app.99fcdd51.js";const o={},l=n(`

GenericClass - class

class GenericClass internal constructor(private val type: ParameterizedType)
+import{_ as s,o as a,c as n,a as o}from"./app.6074a838.js";const l={},e=o(`

GenericClass - class

class GenericClass internal constructor(private val type: ParameterizedType)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5F53\u524D Class \u7684\u6CDB\u578B\u7236\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

argument - method

fun argument(index: Int): Class<*>
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u5F97\u6CDB\u578B\u53C2\u6570\u6570\u7EC4\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u3002

`,12),c=[l];function p(t,r){return a(),e("div",null,c)}const i=s(o,[["render",p],["__file","GenericClass.html.vue"]]);export{i as default}; +
inline fun <reified T> argument(index: Int): Class<T>
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

v1.1.5 \u4FEE\u6539

\u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

\u529F\u80FD\u63CF\u8FF0

\u83B7\u5F97\u6CDB\u578B\u53C2\u6570\u6570\u7EC4\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u3002

`,15),p=[e];function c(t,r){return a(),n("div",null,p)}const y=s(l,[["render",c],["__file","GenericClass.html.vue"]]);export{y as default}; diff --git a/docs/assets/GenericClass.html.3a0e1ac6.js b/docs/assets/GenericClass.html.5d4a2ffe.js similarity index 77% rename from docs/assets/GenericClass.html.3a0e1ac6.js rename to docs/assets/GenericClass.html.5d4a2ffe.js index 700262179..351f897e4 100644 --- a/docs/assets/GenericClass.html.3a0e1ac6.js +++ b/docs/assets/GenericClass.html.5d4a2ffe.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-69c1c226","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html","title":"GenericClass - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"argument - method","slug":"argument-method","link":"#argument-method","children":[]}],"git":{"updatedTime":1663646280000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-69c1c226","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html","title":"GenericClass - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"argument - method","slug":"argument-method","link":"#argument-method","children":[]}],"git":{"updatedTime":1672916955000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"}');export{e as data}; diff --git a/docs/assets/GenericClass.html.81e862b7.js b/docs/assets/GenericClass.html.ee1f4409.js similarity index 59% rename from docs/assets/GenericClass.html.81e862b7.js rename to docs/assets/GenericClass.html.ee1f4409.js index 78be3f946..a2093f900 100644 --- a/docs/assets/GenericClass.html.81e862b7.js +++ b/docs/assets/GenericClass.html.ee1f4409.js @@ -1,3 +1,4 @@ -import{_ as s,o as a,c as e,a as n}from"./app.99fcdd51.js";const o={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

GenericClass - class

class GenericClass internal constructor(private val type: ParameterizedType)
+import{_ as s,o as a,c as n,a as o}from"./app.6074a838.js";const e={},l=o(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

GenericClass - class

class GenericClass internal constructor(private val type: ParameterizedType)
 

Change Records

v1.1.0 added

Function Illustrate

\u5F53\u524D Class \u7684\u6CDB\u578B\u7236\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

argument - method

fun argument(index: Int): Class<*>
-

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u5F97\u6CDB\u578B\u53C2\u6570\u6570\u7EC4\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u3002

`,13),t=[l];function c(p,r){return a(),e("div",null,t)}const d=s(o,[["render",c],["__file","GenericClass.html.vue"]]);export{d as default}; +
inline fun <reified T> argument(index: Int): Class<T>
+

Change Records

v1.1.0 added

v1.1.5 modified

\u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

Function Illustrate

\u83B7\u5F97\u6CDB\u578B\u53C2\u6570\u6570\u7EC4\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u3002

`,16),p=[l];function t(c,r){return a(),n("div",null,p)}const d=s(e,[["render",t],["__file","GenericClass.html.vue"]]);export{d as default}; diff --git a/docs/assets/GenericClass.html.7b666428.js b/docs/assets/GenericClass.html.f94281cf.js similarity index 77% rename from docs/assets/GenericClass.html.7b666428.js rename to docs/assets/GenericClass.html.f94281cf.js index 8b97cc1e4..76c8c46ae 100644 --- a/docs/assets/GenericClass.html.7b666428.js +++ b/docs/assets/GenericClass.html.f94281cf.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-0183e3fc","path":"/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html","title":"GenericClass - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"argument - method","slug":"argument-method","link":"#argument-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-0183e3fc","path":"/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html","title":"GenericClass - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"argument - method","slug":"argument-method","link":"#argument-method","children":[]}],"git":{"updatedTime":1672916955000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"}');export{e as data}; diff --git a/docs/assets/GraphicsTypeFactory.html.c87070a1.js b/docs/assets/GraphicsTypeFactory.html.1ef8a384.js similarity index 95% rename from docs/assets/GraphicsTypeFactory.html.c87070a1.js rename to docs/assets/GraphicsTypeFactory.html.1ef8a384.js index 9f2018e0e..41cc80494 100644 --- a/docs/assets/GraphicsTypeFactory.html.c87070a1.js +++ b/docs/assets/GraphicsTypeFactory.html.1ef8a384.js @@ -1 +1 @@ -import{_ as a,r as c,o as s,c as r,b as o,d as n,a as i,e}from"./app.99fcdd51.js";const p={},l=i('

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

GraphicsTypeFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Graphics \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',6),d=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(f,g){const t=c("ExternalLinkIcon");return s(),r("div",null,[l,o("p",null,[d,o("a",h,[_,n(t)]),u])])}const y=a(p,[["render",k],["__file","GraphicsTypeFactory.html.vue"]]);export{y as default}; +import{_ as a,r as c,o as s,c as r,b as o,d as n,a as i,e}from"./app.6074a838.js";const p={},l=i('

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

GraphicsTypeFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Graphics \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',6),d=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(f,g){const t=c("ExternalLinkIcon");return s(),r("div",null,[l,o("p",null,[d,o("a",h,[_,n(t)]),u])])}const y=a(p,[["render",k],["__file","GraphicsTypeFactory.html.vue"]]);export{y as default}; diff --git a/docs/assets/GraphicsTypeFactory.html.7de8d5a4.js b/docs/assets/GraphicsTypeFactory.html.c239b92b.js similarity index 94% rename from docs/assets/GraphicsTypeFactory.html.7de8d5a4.js rename to docs/assets/GraphicsTypeFactory.html.c239b92b.js index e1dab7bd3..4f75e5a58 100644 --- a/docs/assets/GraphicsTypeFactory.html.7de8d5a4.js +++ b/docs/assets/GraphicsTypeFactory.html.c239b92b.js @@ -1 +1 @@ -import{_ as c,r as a,o as r,c as s,b as o,d as n,a as p,e}from"./app.99fcdd51.js";const i={},d=p('

GraphicsTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Graphics \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',5),h=e("\u8BE6\u60C5\u53EF "),l={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function y(f,u){const t=a("ExternalLinkIcon");return r(),s("div",null,[d,o("p",null,[h,o("a",l,[_,n(t)]),k])])}const b=c(i,[["render",y],["__file","GraphicsTypeFactory.html.vue"]]);export{b as default}; +import{_ as c,r as a,o as r,c as s,b as o,d as n,a as p,e}from"./app.6074a838.js";const i={},d=p('

GraphicsTypeFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Graphics \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

',5),h=e("\u8BE6\u60C5\u53EF "),l={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function y(f,u){const t=a("ExternalLinkIcon");return r(),s("div",null,[d,o("p",null,[h,o("a",l,[_,n(t)]),k])])}const b=c(i,[["render",y],["__file","GraphicsTypeFactory.html.vue"]]);export{b as default}; diff --git a/docs/assets/HookClass.html.8c45a8ee.js b/docs/assets/HookClass.html.5578b861.js similarity index 97% rename from docs/assets/HookClass.html.8c45a8ee.js rename to docs/assets/HookClass.html.5578b861.js index 066770ee4..c2b9896b9 100644 --- a/docs/assets/HookClass.html.8c45a8ee.js +++ b/docs/assets/HookClass.html.5578b861.js @@ -1,2 +1,2 @@ -import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const l={},e=n(`

HookClass - class

class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
+import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const l={},e=n(`

HookClass - class

class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

\u529F\u80FD\u63CF\u8FF0

\u521B\u5EFA\u4E00\u4E2A\u5F53\u524D Hook \u7684 Class \u63A5\u7BA1\u7C7B\u3002

instance \u4E3A\u5B9E\u4F8B\uFF0Cname \u4E3A\u5B9E\u4F8B\u5B8C\u6574\u5305\u540D\uFF0Cthrowable \u4E3A\u627E\u4E0D\u5230\u5B9E\u4F8B\u7684\u65F6\u5019\u629B\u51FA\u7684\u5F02\u5E38\u3002

`,9),p=[e];function c(t,r){return o(),a("div",null,p)}const y=s(l,[["render",c],["__file","HookClass.html.vue"]]);export{y as default}; diff --git a/docs/assets/HookClass.html.e17b98a3.js b/docs/assets/HookClass.html.5ea967d0.js similarity index 97% rename from docs/assets/HookClass.html.e17b98a3.js rename to docs/assets/HookClass.html.5ea967d0.js index 5872bdca7..58663c10a 100644 --- a/docs/assets/HookClass.html.e17b98a3.js +++ b/docs/assets/HookClass.html.5ea967d0.js @@ -1,2 +1,2 @@ -import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookClass - class

class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
+import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookClass - class

class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
 

Change Records

v1.0 first

v1.1.0 modified

HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

Function Illustrate

\u521B\u5EFA\u4E00\u4E2A\u5F53\u524D Hook \u7684 Class \u63A5\u7BA1\u7C7B\u3002

instance \u4E3A\u5B9E\u4F8B\uFF0Cname \u4E3A\u5B9E\u4F8B\u5B8C\u6574\u5305\u540D\uFF0Cthrowable \u4E3A\u627E\u4E0D\u5230\u5B9E\u4F8B\u7684\u65F6\u5019\u629B\u51FA\u7684\u5F02\u5E38\u3002

`,10),t=[l];function c(p,r){return o(),a("div",null,t)}const d=s(e,[["render",c],["__file","HookClass.html.vue"]]);export{d as default}; diff --git a/docs/assets/HookParam.html.0ea0d120.js b/docs/assets/HookParam.html.26451068.js similarity index 93% rename from docs/assets/HookParam.html.0ea0d120.js rename to docs/assets/HookParam.html.26451068.js index 63debc37d..36bc58b08 100644 --- a/docs/assets/HookParam.html.0ea0d120.js +++ b/docs/assets/HookParam.html.26451068.js @@ -1,12 +1,17 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

HookParam - class

class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u79FB\u52A8 HookParamWrapper \u5230 YukiHookCallback.Param

\u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 creater \u547D\u540D\u5230 creator

\u529F\u80FD\u63CF\u8FF0

Hook \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u76EE\u6807\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

args - field

val args: Array<Any?>
+import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},l=n(`

HookParam - class

class HookParam internal constructor(
+    private val creatorInstance: YukiMemberHookCreator,
+    private var paramId: String,
+    private var param: YukiHookCallback.Param?
+)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u79FB\u52A8 HookParamWrapper \u5230 YukiHookCallback.Param

\u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 creater \u547D\u540D\u5230 creator

v1.1.5 \u4FEE\u6539

\u65B0\u589E paramId \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

Hook \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u76EE\u6807\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

args - field

val args: Array<Any?>
 

\u53D8\u66F4\u8BB0\u5F55

\u5728 v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61 member \u6216 constructor \u7684\u53C2\u6570\u5BF9\u8C61\u6570\u7EC4\u3002

\u8FD9\u91CC\u7684\u6570\u7EC4\u6BCF\u9879\u7C7B\u578B\u9ED8\u8BA4\u4E3A Any\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 args \u65B9\u6CD5\u6765\u5B9E\u73B0 ArgsModifyer.cast \u529F\u80FD\u3002

firstArgs - field

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.75 \u79FB\u9664

\u8BF7\u4F7F\u7528 args(index = 0) \u6216 args().first()

lastArgs - field

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.75 \u79FB\u9664

\u8BF7\u4F7F\u7528 args().last()

instance - field

val instance: Any
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

\u7279\u522B\u6CE8\u610F

\u5982\u679C\u4F60\u5F53\u524D Hook \u7684\u5BF9\u8C61\u662F\u4E00\u4E2A\u9759\u6001\uFF0C\u90A3\u4E48\u5B83\u5C06\u4E0D\u5B58\u5728\u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

instanceClass - field

val instanceClass: Class<*>
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u7C7B\u5BF9\u8C61\u3002

member - field

val member: Member
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684 Member\u3002

\u5728\u4E0D\u786E\u5B9A Member \u7C7B\u578B\u4E3A Method \u6216 Constructor \u65F6\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u3002

method - field

val method: Method
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684\u65B9\u6CD5\u3002

constructor - field

val constructor: Constructor
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684\u6784\u9020\u65B9\u6CD5\u3002

result - field

var result: Any?
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook \u5BF9\u8C61\u7684 method \u6216 constructor \u7684\u8FD4\u56DE\u503C\u3002

hasThrowable - field

val hasThrowable: Boolean
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook \u5BF9\u8C61\u7684 method \u6216 constructor \u7684\u8FD4\u56DE\u503C\u3002

dataExtra - field

val dataExtra: Bundle
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D\u56DE\u8C03\u65B9\u6CD5\u4F53\u8303\u56F4\u5185\u7684\u6570\u636E\u5B58\u50A8\u5B9E\u4F8B\u3002

hasThrowable - field

val hasThrowable: Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5224\u65AD\u662F\u5426\u5B58\u5728\u8BBE\u7F6E\u8FC7\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

throwable - field

val throwable: Throwable?
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u8BBE\u7F6E\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

Throwable.throwToApp - i-ext-method

fun Throwable.throwToApp()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5411 Hook APP \u629B\u51FA\u5F02\u5E38\u3002

\u4F7F\u7528 hasThrowable \u5224\u65AD\u5F53\u524D\u662F\u5426\u5B58\u5728\u88AB\u629B\u51FA\u7684\u5F02\u5E38\u3002

\u4F7F\u7528 throwable \u83B7\u53D6\u5F53\u524D\u8BBE\u7F6E\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

\u4EC5\u4F1A\u5728\u56DE\u8C03\u65B9\u6CD5\u7684 MemberHookCreator.beforeHook \u6216 MemberHookCreator.afterHook \u4E2D\u751F\u6548\u3002

\u7279\u522B\u6CE8\u610F

\u8BBE\u7F6E\u540E\u4F1A\u540C\u65F6\u6267\u884C resultNull \u65B9\u6CD5\u5E76\u5C06\u5F02\u5E38\u629B\u51FA\u7ED9\u5F53\u524D Hook APP\u3002

\u529F\u80FD\u793A\u4F8B

Hook \u8FC7\u7A0B\u4E2D\u7684\u5F02\u5E38\u4EC5\u4F1A\u4F5C\u7528\u4E8E (Xposed) \u5BBF\u4E3B\u73AF\u5883\uFF0C\u76EE\u6807 Hook APP \u4E0D\u4F1A\u53D7\u5230\u5F71\u54CD\u3002

\u82E5\u60F3\u5C06\u5F02\u5E38\u629B\u7ED9 Hook APP\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u5982\u4E0B\u65B9\u6CD5\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
@@ -33,8 +38,8 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C\u539F\u59CB Member\u3002

\u8C03\u7528\u81EA\u8EAB\u672A\u8FDB\u884C Hook \u7684\u539F\u59CB Member \u5E76\u8C03\u7528\u539F\u59CB\u53C2\u6570\u6267\u884C\u3002

\u529F\u80FD\u5B9E\u4F8B

\u6B64\u65B9\u6CD5\u53EF\u4EE5 invoke \u539F\u59CB\u672A\u7ECF Hook \u7684 Member \u5BF9\u8C61\uFF0C\u53D6\u51B3\u4E8E\u539F\u59CB Member \u7684\u53C2\u6570\u3002

\u8C03\u7528\u81EA\u8EAB\u539F\u59CB\u7684\u65B9\u6CD5\u4E0D\u4F1A\u518D\u7ECF\u8FC7\u5F53\u524D beforeHook\u3001afterHook \u4EE5\u53CA replaceUnit\u3001replaceAny\u3002

\u6BD4\u5982\u6211\u4EEC Hook \u7684\u8FD9\u4E2A\u65B9\u6CD5\u88AB\u8FD9\u6837\u8C03\u7528 test("test value")\uFF0C\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u8C03\u7528\u5176\u4E2D\u7684 "test value" \u4F5C\u4E3A\u53C2\u6570\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
     method {
         name = "test"
-        param(StringType)
-        returnType = StringType
+        param(StringClass)
+        returnType = StringClass
     }
     afterHook {
         // <\u65B9\u68481> \u4E0D\u4F7F\u7528\u6CDB\u578B\uFF0C\u4E0D\u83B7\u53D6\u65B9\u6CD5\u6267\u884C\u7ED3\u679C\uFF0C\u8C03\u7528\u5C06\u4F7F\u7528\u539F\u65B9\u6CD5\u4F20\u5165\u7684 args \u81EA\u52A8\u4F20\u53C2
@@ -49,8 +54,8 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u4E0D\u518D\u9700\u8981\u4F7F\u7528 member.invokeOriginal \u8FDB\u884C\u8C03\u7528

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C\u539F\u59CB Member\u3002

\u8C03\u7528\u81EA\u8EAB\u672A\u8FDB\u884C Hook \u7684\u539F\u59CB Member \u5E76\u81EA\u5B9A\u4E49 args \u6267\u884C\u3002

\u529F\u80FD\u5B9E\u4F8B

\u6B64\u65B9\u6CD5\u53EF\u4EE5 invoke \u539F\u59CB\u672A\u7ECF Hook \u7684 Member \u5BF9\u8C61\uFF0C\u53EF\u81EA\u5B9A\u4E49\u9700\u8981\u8C03\u7528\u7684\u53C2\u6570\u5185\u5BB9\u3002

\u8C03\u7528\u81EA\u8EAB\u539F\u59CB\u7684\u65B9\u6CD5\u4E0D\u4F1A\u518D\u7ECF\u8FC7\u5F53\u524D beforeHook\u3001afterHook \u4EE5\u53CA replaceUnit\u3001replaceAny\u3002

\u6BD4\u5982\u6211\u4EEC Hook \u7684\u8FD9\u4E2A\u65B9\u6CD5\u88AB\u8FD9\u6837\u8C03\u7528 test("test value")\uFF0C\u4F7F\u7528\u6B64\u65B9\u6CD5\u53EF\u81EA\u5B9A\u4E49\u5176\u4E2D\u7684 args \u4F5C\u4E3A\u53C2\u6570\u3002

\u793A\u4F8B\u5982\u4E0B

injectMember {
     method {
         name = "test"
-        param(StringType)
-        returnType = StringType
+        param(StringClass)
+        returnType = StringClass
     }
     afterHook {
         // <\u65B9\u68481> \u4E0D\u4F7F\u7528\u6CDB\u578B\uFF0C\u4E0D\u83B7\u53D6\u65B9\u6CD5\u6267\u884C\u7ED3\u679C
@@ -83,4 +88,4 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u3002

setNull - method

fun setNull()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A null\u3002

setTrue - method

fun setTrue()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A true\u3002

\u7279\u522B\u6CE8\u610F

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

setFalse - method

fun setFalse()
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A false\u3002

\u7279\u522B\u6CE8\u610F

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

`,347),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(n,[["render",c],["__file","HookParam.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A false\u3002

\u7279\u522B\u6CE8\u610F

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

`,355),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","HookParam.html.vue"]]);export{i as default}; diff --git a/docs/assets/HookParam.html.74f919b4.js b/docs/assets/HookParam.html.74f919b4.js new file mode 100644 index 000000000..7a63c9f2c --- /dev/null +++ b/docs/assets/HookParam.html.74f919b4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-60cbe1b4","path":"/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html","title":"HookParam - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"args - field","slug":"args-field","link":"#args-field","children":[]},{"level":2,"title":"instance - field","slug":"instance-field","link":"#instance-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"member - field","slug":"member-field","link":"#member-field","children":[]},{"level":2,"title":"method - field","slug":"method-field","link":"#method-field","children":[]},{"level":2,"title":"constructor - field","slug":"constructor-field","link":"#constructor-field","children":[]},{"level":2,"title":"result - field","slug":"result-field","link":"#result-field","children":[]},{"level":2,"title":"dataExtra - field","slug":"dataextra-field","link":"#dataextra-field","children":[]},{"level":2,"title":"hasThrowable - field","slug":"hasthrowable-field","link":"#hasthrowable-field","children":[]},{"level":2,"title":"throwable - field","slug":"throwable-field","link":"#throwable-field","children":[]},{"level":2,"title":"Throwable.throwToApp - i-ext-method","slug":"throwable-throwtoapp-i-ext-method","link":"#throwable-throwtoapp-i-ext-method","children":[]},{"level":2,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":2,"title":"instance - method","slug":"instance-method","link":"#instance-method","children":[]},{"level":2,"title":"args - method","slug":"args-method","link":"#args-method","children":[]},{"level":2,"title":"args - method","slug":"args-method-1","link":"#args-method-1","children":[]},{"level":2,"title":"callOriginal - method","slug":"calloriginal-method","link":"#calloriginal-method","children":[]},{"level":2,"title":"invokeOriginal - method","slug":"invokeoriginal-method","link":"#invokeoriginal-method","children":[]},{"level":2,"title":"resultTrue - method","slug":"resulttrue-method","link":"#resulttrue-method","children":[]},{"level":2,"title":"resultFalse - method","slug":"resultfalse-method","link":"#resultfalse-method","children":[]},{"level":2,"title":"resultNull - method","slug":"resultnull-method","link":"#resultnull-method","children":[]},{"level":2,"title":"ArgsIndexCondition - class","slug":"argsindexcondition-class","link":"#argsindexcondition-class","children":[{"level":3,"title":"first - method","slug":"first-method","link":"#first-method","children":[]},{"level":3,"title":"last - method","slug":"last-method","link":"#last-method","children":[]}]},{"level":2,"title":"ArgsModifyer - class","slug":"argsmodifyer-class","link":"#argsmodifyer-class","children":[{"level":3,"title":"cast - method","slug":"cast-method","link":"#cast-method","children":[]},{"level":3,"title":"byte - method","slug":"byte-method","link":"#byte-method","children":[]},{"level":3,"title":"int - method","slug":"int-method","link":"#int-method","children":[]},{"level":3,"title":"long - method","slug":"long-method","link":"#long-method","children":[]},{"level":3,"title":"short - method","slug":"short-method","link":"#short-method","children":[]},{"level":3,"title":"double - method","slug":"double-method","link":"#double-method","children":[]},{"level":3,"title":"float - method","slug":"float-method","link":"#float-method","children":[]},{"level":3,"title":"string - method","slug":"string-method","link":"#string-method","children":[]},{"level":3,"title":"char - method","slug":"char-method","link":"#char-method","children":[]},{"level":3,"title":"boolean - method","slug":"boolean-method","link":"#boolean-method","children":[]},{"level":3,"title":"any - method","slug":"any-method","link":"#any-method","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]},{"level":3,"title":"set - method","slug":"set-method","link":"#set-method","children":[]},{"level":3,"title":"setNull - method","slug":"setnull-method","link":"#setnull-method","children":[]},{"level":3,"title":"setTrue - method","slug":"settrue-method","link":"#settrue-method","children":[]},{"level":3,"title":"setFalse - method","slug":"setfalse-method","link":"#setfalse-method","children":[]}]}],"git":{"updatedTime":1673539070000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"}');export{e as data}; diff --git a/docs/assets/HookParam.html.a5a7a5a4.js b/docs/assets/HookParam.html.a5a7a5a4.js new file mode 100644 index 000000000..ed5a03cc7 --- /dev/null +++ b/docs/assets/HookParam.html.a5a7a5a4.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-75a9b636","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html","title":"HookParam - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"args - field","slug":"args-field","link":"#args-field","children":[]},{"level":2,"title":"instance - field","slug":"instance-field","link":"#instance-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"member - field","slug":"member-field","link":"#member-field","children":[]},{"level":2,"title":"method - field","slug":"method-field","link":"#method-field","children":[]},{"level":2,"title":"constructor - field","slug":"constructor-field","link":"#constructor-field","children":[]},{"level":2,"title":"result - field","slug":"result-field","link":"#result-field","children":[]},{"level":2,"title":"dataExtra - field","slug":"dataextra-field","link":"#dataextra-field","children":[]},{"level":2,"title":"hasThrowable - field","slug":"hasthrowable-field","link":"#hasthrowable-field","children":[]},{"level":2,"title":"throwable - field","slug":"throwable-field","link":"#throwable-field","children":[]},{"level":2,"title":"Throwable.throwToApp - i-ext-method","slug":"throwable-throwtoapp-i-ext-method","link":"#throwable-throwtoapp-i-ext-method","children":[]},{"level":2,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":2,"title":"instance - method","slug":"instance-method","link":"#instance-method","children":[]},{"level":2,"title":"args - method","slug":"args-method","link":"#args-method","children":[]},{"level":2,"title":"args - method","slug":"args-method-1","link":"#args-method-1","children":[]},{"level":2,"title":"callOriginal - method","slug":"calloriginal-method","link":"#calloriginal-method","children":[]},{"level":2,"title":"invokeOriginal - method","slug":"invokeoriginal-method","link":"#invokeoriginal-method","children":[]},{"level":2,"title":"resultTrue - method","slug":"resulttrue-method","link":"#resulttrue-method","children":[]},{"level":2,"title":"resultFalse - method","slug":"resultfalse-method","link":"#resultfalse-method","children":[]},{"level":2,"title":"resultNull - method","slug":"resultnull-method","link":"#resultnull-method","children":[]},{"level":2,"title":"ArgsIndexCondition - class","slug":"argsindexcondition-class","link":"#argsindexcondition-class","children":[{"level":3,"title":"first - method","slug":"first-method","link":"#first-method","children":[]},{"level":3,"title":"last - method","slug":"last-method","link":"#last-method","children":[]}]},{"level":2,"title":"ArgsModifyer - class","slug":"argsmodifyer-class","link":"#argsmodifyer-class","children":[{"level":3,"title":"cast - method","slug":"cast-method","link":"#cast-method","children":[]},{"level":3,"title":"byte - method","slug":"byte-method","link":"#byte-method","children":[]},{"level":3,"title":"int - method","slug":"int-method","link":"#int-method","children":[]},{"level":3,"title":"long - method","slug":"long-method","link":"#long-method","children":[]},{"level":3,"title":"short - method","slug":"short-method","link":"#short-method","children":[]},{"level":3,"title":"double - method","slug":"double-method","link":"#double-method","children":[]},{"level":3,"title":"float - method","slug":"float-method","link":"#float-method","children":[]},{"level":3,"title":"string - method","slug":"string-method","link":"#string-method","children":[]},{"level":3,"title":"char - method","slug":"char-method","link":"#char-method","children":[]},{"level":3,"title":"boolean - method","slug":"boolean-method","link":"#boolean-method","children":[]},{"level":3,"title":"any - method","slug":"any-method","link":"#any-method","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]},{"level":3,"title":"set - method","slug":"set-method","link":"#set-method","children":[]},{"level":3,"title":"setNull - method","slug":"setnull-method","link":"#setnull-method","children":[]},{"level":3,"title":"setTrue - method","slug":"settrue-method","link":"#settrue-method","children":[]},{"level":3,"title":"setFalse - method","slug":"setfalse-method","link":"#setfalse-method","children":[]}]}],"git":{"updatedTime":1673539070000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"}');export{e as data}; diff --git a/docs/assets/HookParam.html.b19d4ad2.js b/docs/assets/HookParam.html.b19d4ad2.js deleted file mode 100644 index 650ee0643..000000000 --- a/docs/assets/HookParam.html.b19d4ad2.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-60cbe1b4","path":"/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html","title":"HookParam - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"args - field","slug":"args-field","link":"#args-field","children":[]},{"level":2,"title":"instance - field","slug":"instance-field","link":"#instance-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"member - field","slug":"member-field","link":"#member-field","children":[]},{"level":2,"title":"method - field","slug":"method-field","link":"#method-field","children":[]},{"level":2,"title":"constructor - field","slug":"constructor-field","link":"#constructor-field","children":[]},{"level":2,"title":"result - field","slug":"result-field","link":"#result-field","children":[]},{"level":2,"title":"hasThrowable - field","slug":"hasthrowable-field","link":"#hasthrowable-field","children":[]},{"level":2,"title":"throwable - field","slug":"throwable-field","link":"#throwable-field","children":[]},{"level":2,"title":"Throwable.throwToApp - i-ext-method","slug":"throwable-throwtoapp-i-ext-method","link":"#throwable-throwtoapp-i-ext-method","children":[]},{"level":2,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":2,"title":"instance - method","slug":"instance-method","link":"#instance-method","children":[]},{"level":2,"title":"args - method","slug":"args-method","link":"#args-method","children":[]},{"level":2,"title":"args - method","slug":"args-method-1","link":"#args-method-1","children":[]},{"level":2,"title":"callOriginal - method","slug":"calloriginal-method","link":"#calloriginal-method","children":[]},{"level":2,"title":"invokeOriginal - method","slug":"invokeoriginal-method","link":"#invokeoriginal-method","children":[]},{"level":2,"title":"resultTrue - method","slug":"resulttrue-method","link":"#resulttrue-method","children":[]},{"level":2,"title":"resultFalse - method","slug":"resultfalse-method","link":"#resultfalse-method","children":[]},{"level":2,"title":"resultNull - method","slug":"resultnull-method","link":"#resultnull-method","children":[]},{"level":2,"title":"ArgsIndexCondition - class","slug":"argsindexcondition-class","link":"#argsindexcondition-class","children":[{"level":3,"title":"first - method","slug":"first-method","link":"#first-method","children":[]},{"level":3,"title":"last - method","slug":"last-method","link":"#last-method","children":[]}]},{"level":2,"title":"ArgsModifyer - class","slug":"argsmodifyer-class","link":"#argsmodifyer-class","children":[{"level":3,"title":"cast - method","slug":"cast-method","link":"#cast-method","children":[]},{"level":3,"title":"byte - method","slug":"byte-method","link":"#byte-method","children":[]},{"level":3,"title":"int - method","slug":"int-method","link":"#int-method","children":[]},{"level":3,"title":"long - method","slug":"long-method","link":"#long-method","children":[]},{"level":3,"title":"short - method","slug":"short-method","link":"#short-method","children":[]},{"level":3,"title":"double - method","slug":"double-method","link":"#double-method","children":[]},{"level":3,"title":"float - method","slug":"float-method","link":"#float-method","children":[]},{"level":3,"title":"string - method","slug":"string-method","link":"#string-method","children":[]},{"level":3,"title":"char - method","slug":"char-method","link":"#char-method","children":[]},{"level":3,"title":"boolean - method","slug":"boolean-method","link":"#boolean-method","children":[]},{"level":3,"title":"any - method","slug":"any-method","link":"#any-method","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]},{"level":3,"title":"set - method","slug":"set-method","link":"#set-method","children":[]},{"level":3,"title":"setNull - method","slug":"setnull-method","link":"#setnull-method","children":[]},{"level":3,"title":"setTrue - method","slug":"settrue-method","link":"#settrue-method","children":[]},{"level":3,"title":"setFalse - method","slug":"setfalse-method","link":"#setfalse-method","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"}');export{e as data}; diff --git a/docs/assets/HookParam.html.f98d02d2.js b/docs/assets/HookParam.html.f98d02d2.js deleted file mode 100644 index 869fdbf79..000000000 --- a/docs/assets/HookParam.html.f98d02d2.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-75a9b636","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html","title":"HookParam - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"args - field","slug":"args-field","link":"#args-field","children":[]},{"level":2,"title":"instance - field","slug":"instance-field","link":"#instance-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"member - field","slug":"member-field","link":"#member-field","children":[]},{"level":2,"title":"method - field","slug":"method-field","link":"#method-field","children":[]},{"level":2,"title":"constructor - field","slug":"constructor-field","link":"#constructor-field","children":[]},{"level":2,"title":"result - field","slug":"result-field","link":"#result-field","children":[]},{"level":2,"title":"hasThrowable - field","slug":"hasthrowable-field","link":"#hasthrowable-field","children":[]},{"level":2,"title":"throwable - field","slug":"throwable-field","link":"#throwable-field","children":[]},{"level":2,"title":"Throwable.throwToApp - i-ext-method","slug":"throwable-throwtoapp-i-ext-method","link":"#throwable-throwtoapp-i-ext-method","children":[]},{"level":2,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":2,"title":"instance - method","slug":"instance-method","link":"#instance-method","children":[]},{"level":2,"title":"args - method","slug":"args-method","link":"#args-method","children":[]},{"level":2,"title":"args - method","slug":"args-method-1","link":"#args-method-1","children":[]},{"level":2,"title":"callOriginal - method","slug":"calloriginal-method","link":"#calloriginal-method","children":[]},{"level":2,"title":"invokeOriginal - method","slug":"invokeoriginal-method","link":"#invokeoriginal-method","children":[]},{"level":2,"title":"resultTrue - method","slug":"resulttrue-method","link":"#resulttrue-method","children":[]},{"level":2,"title":"resultFalse - method","slug":"resultfalse-method","link":"#resultfalse-method","children":[]},{"level":2,"title":"resultNull - method","slug":"resultnull-method","link":"#resultnull-method","children":[]},{"level":2,"title":"ArgsIndexCondition - class","slug":"argsindexcondition-class","link":"#argsindexcondition-class","children":[{"level":3,"title":"first - method","slug":"first-method","link":"#first-method","children":[]},{"level":3,"title":"last - method","slug":"last-method","link":"#last-method","children":[]}]},{"level":2,"title":"ArgsModifyer - class","slug":"argsmodifyer-class","link":"#argsmodifyer-class","children":[{"level":3,"title":"cast - method","slug":"cast-method","link":"#cast-method","children":[]},{"level":3,"title":"byte - method","slug":"byte-method","link":"#byte-method","children":[]},{"level":3,"title":"int - method","slug":"int-method","link":"#int-method","children":[]},{"level":3,"title":"long - method","slug":"long-method","link":"#long-method","children":[]},{"level":3,"title":"short - method","slug":"short-method","link":"#short-method","children":[]},{"level":3,"title":"double - method","slug":"double-method","link":"#double-method","children":[]},{"level":3,"title":"float - method","slug":"float-method","link":"#float-method","children":[]},{"level":3,"title":"string - method","slug":"string-method","link":"#string-method","children":[]},{"level":3,"title":"char - method","slug":"char-method","link":"#char-method","children":[]},{"level":3,"title":"boolean - method","slug":"boolean-method","link":"#boolean-method","children":[]},{"level":3,"title":"any - method","slug":"any-method","link":"#any-method","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]},{"level":3,"title":"set - method","slug":"set-method","link":"#set-method","children":[]},{"level":3,"title":"setNull - method","slug":"setnull-method","link":"#setnull-method","children":[]},{"level":3,"title":"setTrue - method","slug":"settrue-method","link":"#settrue-method","children":[]},{"level":3,"title":"setFalse - method","slug":"setfalse-method","link":"#setfalse-method","children":[]}]}],"git":{"updatedTime":1663398125000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"}');export{e as data}; diff --git a/docs/assets/HookParam.html.b72403ea.js b/docs/assets/HookParam.html.fb282ad5.js similarity index 93% rename from docs/assets/HookParam.html.b72403ea.js rename to docs/assets/HookParam.html.fb282ad5.js index c29ece1bf..87109b668 100644 --- a/docs/assets/HookParam.html.b72403ea.js +++ b/docs/assets/HookParam.html.fb282ad5.js @@ -1,12 +1,17 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookParam - class

class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?)
-

Change Records

v1.0 first

v1.1.0 modified

\u79FB\u52A8 HookParamWrapper \u5230 YukiHookCallback.Param

\u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 creater \u547D\u540D\u5230 creator

Function Illustrate

Hook \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u76EE\u6807\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

args - field

val args: Array<Any?>
+import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookParam - class

class HookParam internal constructor(
+    private val creatorInstance: YukiMemberHookCreator,
+    private var paramId: String,
+    private var param: YukiHookCallback.Param?
+)
+

Change Records

v1.0 first

v1.1.0 modified

\u79FB\u52A8 HookParamWrapper \u5230 YukiHookCallback.Param

\u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 creater \u547D\u540D\u5230 creator

v1.1.5 modified

\u65B0\u589E paramId \u53C2\u6570

Function Illustrate

Hook \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u76EE\u6807\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

args - field

val args: Array<Any?>
 

Change Records

\u5728 v1.0 \u6DFB\u52A0

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61 member \u6216 constructor \u7684\u53C2\u6570\u5BF9\u8C61\u6570\u7EC4\u3002

\u8FD9\u91CC\u7684\u6570\u7EC4\u6BCF\u9879\u7C7B\u578B\u9ED8\u8BA4\u4E3A Any\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 args \u65B9\u6CD5\u6765\u5B9E\u73B0 ArgsModifyer.cast \u529F\u80FD\u3002

firstArgs - field

Change Records

v1.0 first

v1.0.75 removed

\u8BF7\u4F7F\u7528 args(index = 0) \u6216 args().first()

lastArgs - field

Change Records

v1.0 first

v1.0.75 removed

\u8BF7\u4F7F\u7528 args().last()

instance - field

val instance: Any
 

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

Pay Attention

\u5982\u679C\u4F60\u5F53\u524D Hook \u7684\u5BF9\u8C61\u662F\u4E00\u4E2A\u9759\u6001\uFF0C\u90A3\u4E48\u5B83\u5C06\u4E0D\u5B58\u5728\u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

instanceClass - field

val instanceClass: Class<*>
 

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u7C7B\u5BF9\u8C61\u3002

member - field

val member: Member
 

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684 Member\u3002

\u5728\u4E0D\u786E\u5B9A Member \u7C7B\u578B\u4E3A Method \u6216 Constructor \u65F6\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u3002

method - field

val method: Method
 

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684\u65B9\u6CD5\u3002

constructor - field

val constructor: Constructor
 

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u5F53\u524D Hook \u5BF9\u8C61\u7684\u6784\u9020\u65B9\u6CD5\u3002

result - field

var result: Any?
-

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook \u5BF9\u8C61\u7684 method \u6216 constructor \u7684\u8FD4\u56DE\u503C\u3002

hasThrowable - field

val hasThrowable: Boolean
+

Change Records

v1.0 first

Function Illustrate

\u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook \u5BF9\u8C61\u7684 method \u6216 constructor \u7684\u8FD4\u56DE\u503C\u3002

dataExtra - field

val dataExtra: Bundle
+

Change Records

v1.1.5 added

Function Illustrate

\u83B7\u53D6\u5F53\u524D\u56DE\u8C03\u65B9\u6CD5\u4F53\u8303\u56F4\u5185\u7684\u6570\u636E\u5B58\u50A8\u5B9E\u4F8B\u3002

hasThrowable - field

val hasThrowable: Boolean
 

Change Records

v1.1.0 added

Function Illustrate

\u5224\u65AD\u662F\u5426\u5B58\u5728\u8BBE\u7F6E\u8FC7\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

throwable - field

val throwable: Throwable?
 

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u53D6\u8BBE\u7F6E\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

Throwable.throwToApp - i-ext-method

fun Throwable.throwToApp()
 

Change Records

v1.1.0 added

Function Illustrate

\u5411 Hook APP \u629B\u51FA\u5F02\u5E38\u3002

\u4F7F\u7528 hasThrowable \u5224\u65AD\u5F53\u524D\u662F\u5426\u5B58\u5728\u88AB\u629B\u51FA\u7684\u5F02\u5E38\u3002

\u4F7F\u7528 throwable \u83B7\u53D6\u5F53\u524D\u8BBE\u7F6E\u7684\u65B9\u6CD5\u8C03\u7528\u629B\u51FA\u5F02\u5E38\u3002

\u4EC5\u4F1A\u5728\u56DE\u8C03\u65B9\u6CD5\u7684 MemberHookCreator.beforeHook \u6216 MemberHookCreator.afterHook \u4E2D\u751F\u6548\u3002

Pay Attention

\u8BBE\u7F6E\u540E\u4F1A\u540C\u65F6\u6267\u884C resultNull \u65B9\u6CD5\u5E76\u5C06\u5F02\u5E38\u629B\u51FA\u7ED9\u5F53\u524D Hook APP\u3002

Function Example

Hook \u8FC7\u7A0B\u4E2D\u7684\u5F02\u5E38\u4EC5\u4F1A\u4F5C\u7528\u4E8E (Xposed) \u5BBF\u4E3B\u73AF\u5883\uFF0C\u76EE\u6807 Hook APP \u4E0D\u4F1A\u53D7\u5230\u5F71\u54CD\u3002

\u82E5\u60F3\u5C06\u5F02\u5E38\u629B\u7ED9 Hook APP\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u5982\u4E0B\u65B9\u6CD5\u3002

The following example

injectMember {
@@ -33,8 +38,8 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Change Records

v1.1.0 added

Function Illustrate

\u6267\u884C\u539F\u59CB Member\u3002

\u8C03\u7528\u81EA\u8EAB\u672A\u8FDB\u884C Hook \u7684\u539F\u59CB Member \u5E76\u8C03\u7528\u539F\u59CB\u53C2\u6570\u6267\u884C\u3002

\u529F\u80FD\u5B9E\u4F8B

\u6B64\u65B9\u6CD5\u53EF\u4EE5 invoke \u539F\u59CB\u672A\u7ECF Hook \u7684 Member \u5BF9\u8C61\uFF0C\u53D6\u51B3\u4E8E\u539F\u59CB Member \u7684\u53C2\u6570\u3002

\u8C03\u7528\u81EA\u8EAB\u539F\u59CB\u7684\u65B9\u6CD5\u4E0D\u4F1A\u518D\u7ECF\u8FC7\u5F53\u524D beforeHook\u3001afterHook \u4EE5\u53CA replaceUnit\u3001replaceAny\u3002

\u6BD4\u5982\u6211\u4EEC Hook \u7684\u8FD9\u4E2A\u65B9\u6CD5\u88AB\u8FD9\u6837\u8C03\u7528 test("test value")\uFF0C\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u8C03\u7528\u5176\u4E2D\u7684 "test value" \u4F5C\u4E3A\u53C2\u6570\u3002

The following example

injectMember {
     method {
         name = "test"
-        param(StringType)
-        returnType = StringType
+        param(StringClass)
+        returnType = StringClass
     }
     afterHook {
         // <\u65B9\u68481> \u4E0D\u4F7F\u7528\u6CDB\u578B\uFF0C\u4E0D\u83B7\u53D6\u65B9\u6CD5\u6267\u884C\u7ED3\u679C\uFF0C\u8C03\u7528\u5C06\u4F7F\u7528\u539F\u65B9\u6CD5\u4F20\u5165\u7684 args \u81EA\u52A8\u4F20\u53C2
@@ -49,8 +54,8 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Change Records

v1.0 first

v1.1.0 modified

\u4E0D\u518D\u9700\u8981\u4F7F\u7528 member.invokeOriginal \u8FDB\u884C\u8C03\u7528

Function Illustrate

\u6267\u884C\u539F\u59CB Member\u3002

\u8C03\u7528\u81EA\u8EAB\u672A\u8FDB\u884C Hook \u7684\u539F\u59CB Member \u5E76\u81EA\u5B9A\u4E49 args \u6267\u884C\u3002

\u529F\u80FD\u5B9E\u4F8B

\u6B64\u65B9\u6CD5\u53EF\u4EE5 invoke \u539F\u59CB\u672A\u7ECF Hook \u7684 Member \u5BF9\u8C61\uFF0C\u53EF\u81EA\u5B9A\u4E49\u9700\u8981\u8C03\u7528\u7684\u53C2\u6570\u5185\u5BB9\u3002

\u8C03\u7528\u81EA\u8EAB\u539F\u59CB\u7684\u65B9\u6CD5\u4E0D\u4F1A\u518D\u7ECF\u8FC7\u5F53\u524D beforeHook\u3001afterHook \u4EE5\u53CA replaceUnit\u3001replaceAny\u3002

\u6BD4\u5982\u6211\u4EEC Hook \u7684\u8FD9\u4E2A\u65B9\u6CD5\u88AB\u8FD9\u6837\u8C03\u7528 test("test value")\uFF0C\u4F7F\u7528\u6B64\u65B9\u6CD5\u53EF\u81EA\u5B9A\u4E49\u5176\u4E2D\u7684 args \u4F5C\u4E3A\u53C2\u6570\u3002

The following example

injectMember {
     method {
         name = "test"
-        param(StringType)
-        returnType = StringType
+        param(StringClass)
+        returnType = StringClass
     }
     afterHook {
         // <\u65B9\u68481> \u4E0D\u4F7F\u7528\u6CDB\u578B\uFF0C\u4E0D\u83B7\u53D6\u65B9\u6CD5\u6267\u884C\u7ED3\u679C
@@ -83,4 +88,4 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u3002

setNull - method

fun setNull()
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A null\u3002

setTrue - method

fun setTrue()
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A true\u3002

Pay Attention

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

setFalse - method

fun setFalse()
-

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A false\u3002

Pay Attention

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

`,348),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","HookParam.html.vue"]]);export{i as default}; +

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E\u65B9\u6CD5\u53C2\u6570\u7684\u5B9E\u4F8B\u5BF9\u8C61\u4E3A false\u3002

Pay Attention

\u8BF7\u786E\u4FDD\u76EE\u6807\u5BF9\u8C61\u7684\u7C7B\u578B\u662F Boolean\u3002

`,356),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","HookParam.html.vue"]]);export{i as default}; diff --git a/docs/assets/HookResources.html.505eac26.js b/docs/assets/HookResources.html.1c32befa.js similarity index 95% rename from docs/assets/HookResources.html.505eac26.js rename to docs/assets/HookResources.html.1c32befa.js index 717a3e8d2..aa203b7e1 100644 --- a/docs/assets/HookResources.html.505eac26.js +++ b/docs/assets/HookResources.html.1c32befa.js @@ -1,2 +1,2 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const c={},n=a(`

HookResources - class

class HookResources internal constructor(var instance: YukiResources?)
+import{_ as s,o,c as e,a}from"./app.6074a838.js";const c={},n=a(`

HookResources - class

class HookResources internal constructor(var instance: YukiResources?)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.80 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u521B\u5EFA\u4E00\u4E2A\u5F53\u524D Hook \u7684 YukiResources \u63A5\u7BA1\u7C7B\u3002

`,6),l=[n];function r(t,p){return o(),e("div",null,l)}const i=s(c,[["render",r],["__file","HookResources.html.vue"]]);export{i as default}; diff --git a/docs/assets/HookResources.html.78582f9b.js b/docs/assets/HookResources.html.7c7e37b1.js similarity index 96% rename from docs/assets/HookResources.html.78582f9b.js rename to docs/assets/HookResources.html.7c7e37b1.js index cec40b18a..847e7ef95 100644 --- a/docs/assets/HookResources.html.78582f9b.js +++ b/docs/assets/HookResources.html.7c7e37b1.js @@ -1,2 +1,2 @@ -import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},c=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookResources - class

class HookResources internal constructor(var instance: YukiResources?)
+import{_ as s,o,c as e,a as n}from"./app.6074a838.js";const a={},c=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

HookResources - class

class HookResources internal constructor(var instance: YukiResources?)
 

Change Records

v1.0.80 added

Function Illustrate

\u521B\u5EFA\u4E00\u4E2A\u5F53\u524D Hook \u7684 YukiResources \u63A5\u7BA1\u7C7B\u3002

`,7),t=[c];function r(l,p){return o(),e("div",null,t)}const u=s(a,[["render",r],["__file","HookResources.html.vue"]]);export{u as default}; diff --git a/docs/assets/IYukiHookXposedInit.html.c8afa33e.js b/docs/assets/IYukiHookXposedInit.html.4b063082.js similarity index 98% rename from docs/assets/IYukiHookXposedInit.html.c8afa33e.js rename to docs/assets/IYukiHookXposedInit.html.4b063082.js index 5ee09d784..2678aae3e 100644 --- a/docs/assets/IYukiHookXposedInit.html.c8afa33e.js +++ b/docs/assets/IYukiHookXposedInit.html.4b063082.js @@ -1,4 +1,4 @@ -import{_ as o,o as e,c as s,a as n}from"./app.99fcdd51.js";const p={},a=n(`

IYukiHookXposedInit - interface

interface IYukiHookXposedInit
+import{_ as o,o as e,c as s,a as n}from"./app.6074a838.js";const p={},a=n(`

IYukiHookXposedInit - interface

interface IYukiHookXposedInit
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.80 \u4FEE\u6539 \u4F5C\u5E9F

\u4F5C\u5E9F\u4E86 YukiHookXposedInitProxy \u540D\u79F0\u4F46\u4FDD\u7559\u63A5\u53E3

\u8F6C\u79FB\u5230 IYukiHookXposedInit \u65B0\u540D\u79F0

\u529F\u80FD\u63CF\u8FF0

YukiHookAPI \u7684 Xposed \u88C5\u8F7D API \u8C03\u7528\u63A5\u53E3\u3002

onInit - method

fun onInit()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u914D\u7F6E YukiHookAPI.Configs \u7684\u521D\u59CB\u5316\u65B9\u6CD5\u3002

\u7279\u522B\u6CE8\u610F

\u5728\u8FD9\u91CC\u53EA\u80FD\u8FDB\u884C\u521D\u59CB\u5316\u914D\u7F6E\uFF0C\u4E0D\u80FD\u8FDB\u884C Hook \u64CD\u4F5C\u3002

\u6B64\u65B9\u6CD5\u53EF\u9009\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u9009\u62E9\u4E0D\u5BF9 YukiHookAPI.Configs \u8FDB\u884C\u914D\u7F6E\u3002

onHook - method

fun onHook()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

Xposed API \u7684\u6A21\u5757\u88C5\u8F7D\u8C03\u7528\u5165\u53E3\u65B9\u6CD5\u3002

onXposedEvent - method

fun onXposedEvent()
diff --git a/docs/assets/IYukiHookXposedInit.html.ceb84101.js b/docs/assets/IYukiHookXposedInit.html.67168009.js
similarity index 98%
rename from docs/assets/IYukiHookXposedInit.html.ceb84101.js
rename to docs/assets/IYukiHookXposedInit.html.67168009.js
index 7b3236f41..07a8cff2b 100644
--- a/docs/assets/IYukiHookXposedInit.html.ceb84101.js
+++ b/docs/assets/IYukiHookXposedInit.html.67168009.js
@@ -1,4 +1,4 @@
-import{_ as o,o as e,c as s,a as n}from"./app.99fcdd51.js";const a={},t=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

IYukiHookXposedInit - interface

interface IYukiHookXposedInit
+import{_ as o,o as e,c as s,a as n}from"./app.6074a838.js";const a={},t=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

IYukiHookXposedInit - interface

interface IYukiHookXposedInit
 

Change Records

v1.0 first

v1.0.80 modified deprecated

\u4F5C\u5E9F\u4E86 YukiHookXposedInitProxy \u540D\u79F0\u4F46\u4FDD\u7559\u63A5\u53E3

\u8F6C\u79FB\u5230 IYukiHookXposedInit \u65B0\u540D\u79F0

Function Illustrate

YukiHookAPI \u7684 Xposed \u88C5\u8F7D API \u8C03\u7528\u63A5\u53E3\u3002

onInit - method

fun onInit()
 

Change Records

v1.0.5 added

Function Illustrate

\u914D\u7F6E YukiHookAPI.Configs \u7684\u521D\u59CB\u5316\u65B9\u6CD5\u3002

Pay Attention

\u5728\u8FD9\u91CC\u53EA\u80FD\u8FDB\u884C\u521D\u59CB\u5316\u914D\u7F6E\uFF0C\u4E0D\u80FD\u8FDB\u884C Hook \u64CD\u4F5C\u3002

\u6B64\u65B9\u6CD5\u53EF\u9009\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u9009\u62E9\u4E0D\u5BF9 YukiHookAPI.Configs \u8FDB\u884C\u914D\u7F6E\u3002

onHook - method

fun onHook()
 

Change Records

v1.0 first

Function Illustrate

Xposed API \u7684\u6A21\u5757\u88C5\u8F7D\u8C03\u7528\u5165\u53E3\u65B9\u6CD5\u3002

onXposedEvent - method

fun onXposedEvent()
diff --git a/docs/assets/InjectYukiHookWithXposed.html.50a0e9ff.js b/docs/assets/InjectYukiHookWithXposed.html.7b3405c0.js
similarity index 97%
rename from docs/assets/InjectYukiHookWithXposed.html.50a0e9ff.js
rename to docs/assets/InjectYukiHookWithXposed.html.7b3405c0.js
index d056200b9..603bb4c36 100644
--- a/docs/assets/InjectYukiHookWithXposed.html.50a0e9ff.js
+++ b/docs/assets/InjectYukiHookWithXposed.html.7b3405c0.js
@@ -1,4 +1,4 @@
-import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},p=a(`

InjectYukiHookWithXposed - annotation

annotation class InjectYukiHookWithXposed(
+import{_ as s,o,c as n,a}from"./app.6074a838.js";const e={},p=a(`

InjectYukiHookWithXposed - annotation

annotation class InjectYukiHookWithXposed(
     val sourcePath: String,
     val modulePackageName: String,
     val entryClassName: String,
diff --git a/docs/assets/InjectYukiHookWithXposed.html.7e7e596c.js b/docs/assets/InjectYukiHookWithXposed.html.abda4352.js
similarity index 97%
rename from docs/assets/InjectYukiHookWithXposed.html.7e7e596c.js
rename to docs/assets/InjectYukiHookWithXposed.html.abda4352.js
index 80bf205ef..624cb1285 100644
--- a/docs/assets/InjectYukiHookWithXposed.html.7e7e596c.js
+++ b/docs/assets/InjectYukiHookWithXposed.html.abda4352.js
@@ -1,4 +1,4 @@
-import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},t=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

InjectYukiHookWithXposed - annotation

annotation class InjectYukiHookWithXposed(
+import{_ as s,o,c as n,a}from"./app.6074a838.js";const e={},t=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

InjectYukiHookWithXposed - annotation

annotation class InjectYukiHookWithXposed(
     val sourcePath: String,
     val modulePackageName: String,
     val entryClassName: String,
diff --git a/docs/assets/LoggerFactory.html.c27c8365.js b/docs/assets/LoggerFactory.html.1cd3639f.js
similarity index 63%
rename from docs/assets/LoggerFactory.html.c27c8365.js
rename to docs/assets/LoggerFactory.html.1cd3639f.js
index 62a7bfd6d..0bf29778b 100644
--- a/docs/assets/LoggerFactory.html.c27c8365.js
+++ b/docs/assets/LoggerFactory.html.1cd3639f.js
@@ -1,9 +1,9 @@
-import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},p=a(`

LoggerFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F YukiHookAPI \u7684\u65E5\u5FD7\u5C01\u88C5\u7C7B\uFF0C\u53EF\u5B9E\u73B0\u540C\u65F6\u5411 Logcat \u548C XposedBridge.log \u6253\u5370\u65E5\u5FD7\u7684\u529F\u80FD\u3002

LoggerType - class

enum class LoggerType
+import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},p=e(`

LoggerFactory - kt

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F YukiHookAPI \u7684\u65E5\u5FD7\u5C01\u88C5\u7C7B\uFF0C\u53EF\u5B9E\u73B0\u540C\u65F6\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\u7684\u529F\u80FD\u3002

LoggerType - class

enum class LoggerType
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u9700\u8981\u6253\u5370\u7684\u65E5\u5FD7\u7C7B\u578B\u3002

\u51B3\u5B9A\u4E8E\u6A21\u5757\u4E0E (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u7684\u6253\u5370\u65B9\u5F0F\u3002

LOGD - enum

LOGD
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EC5\u4F7F\u7528 android.util.Log\u3002

XPOSEDBRIDGE - enum

XPOSEDBRIDGE
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EC5\u4F7F\u7528 XposedBridge.log\u3002

\u7279\u522B\u6CE8\u610F

\u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u5C06\u4E0D\u751F\u6548\u3002

SCOPE - enum

SCOPE
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5206\u533A\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4EC5\u4F7F\u7528 XPOSEDBRIDGE\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

BOTH - enum

BOTH
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u540C\u65F6\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528 LOGD \u4E0E XPOSEDBRIDGE\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

YukiLoggerData - class

data class YukiLoggerData internal constructor(
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EC5\u4F7F\u7528 android.util.Log\u3002

XPOSEDBRIDGE - enum

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

v1.1.5 \u4F5C\u5E9F

\u8BF7\u8F6C\u79FB\u5230 XPOSED_ENVIRONMENT

XPOSED_ENVIRONMENT - enum

XPOSED_ENVIRONMENT
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EC5\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u3002

\u7279\u522B\u6CE8\u610F

\u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u5C06\u4E0D\u751F\u6548\u3002

SCOPE - enum

SCOPE
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5206\u533A\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4EC5\u4F7F\u7528 XPOSED_ENVIRONMENT\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

BOTH - enum

BOTH
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u540C\u65F6\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528 LOGD \u4E0E XPOSED_ENVIRONMENT\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

YukiLoggerData - class

data class YukiLoggerData internal constructor(
     var timestamp: Long,
     var time: String,
     var tag: String,
@@ -16,9 +16,10 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},p=a(`

\u53D8\u66F4\u8BB0\u5F55

v1.1.2 \u65B0\u589E

v1.1.4 \u4FEE\u6539

\u5B9E\u73B0 Serializable \u63A5\u53E3\u5E76\u6807\u8BC6\u4E3A data class

\u529F\u80FD\u63CF\u8FF0

\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u5B9E\u73B0\u7C7B\u3002

YukiHookLogger - object

object YukiHookLogger
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8C03\u8BD5\u65E5\u5FD7\u5B9E\u73B0\u7C7B\u3002

inMemoryData - field

val inMemoryData: ArrayList<YukiLoggerData>
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.2 \u65B0\u589E

v1.1.4 \u4FEE\u6539

\u7C7B\u578B\u7531 HashSet \u4FEE\u6539\u4E3A ArrayList

\u529F\u80FD\u63CF\u8FF0

\u5F53\u524D\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u6570\u636E\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

contents - field

val contents: String
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

clear - method

fun clear()
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6E05\u9664\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u3002

\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u83B7\u53D6 inMemoryData \u6765\u6E05\u9664\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

saveToFile - method

fun saveToFile(fileName: String)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4FDD\u5B58\u5F53\u524D\u65E5\u5FD7\u5230\u6587\u4EF6\u3002

\u82E5\u5F53\u524D\u672A\u5F00\u542F Configs.isRecord \u6216\u8BB0\u5F55\u4E3A\u7A7A\u5219\u4E0D\u4F1A\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002

\u65E5\u5FD7\u6587\u4EF6\u4F1A\u8FFD\u52A0\u5230 fileName \u7684\u6587\u4EF6\u7ED3\u5C3E\uFF0C\u82E5\u6587\u4EF6\u4E0D\u5B58\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002

\u7279\u522B\u6CE8\u610F

\u6587\u4EF6\u8BFB\u5199\u6743\u9650\u53D6\u51B3\u4E8E\u5F53\u524D\u5BBF\u4E3B\u3001\u6A21\u5757\u5DF2\u83B7\u53D6\u7684\u6743\u9650\u3002

Configs - object

object Configs
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

contents - method

fun contents(data: ArrayList<YukiLoggerData>): String
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u83B7\u53D6\u3001\u683C\u5F0F\u5316\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7 (data \u4E3A\u7A7A) \u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

clear - method

fun clear()
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6E05\u9664\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u3002

\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u83B7\u53D6 inMemoryData \u6765\u6E05\u9664\u3002

\u7279\u522B\u6CE8\u610F

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

saveToFile - method

fun saveToFile(fileName: String, data: ArrayList<YukiLoggerData>)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

v1.1.5 \u4FEE\u6539

\u65B0\u589E data \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u4FDD\u5B58\u5F53\u524D\u65E5\u5FD7\u5230\u6587\u4EF6\u3002

\u82E5\u5F53\u524D\u672A\u5F00\u542F Configs.isRecord \u6216\u8BB0\u5F55\u4E3A\u7A7A\u5219\u4E0D\u4F1A\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002

\u65E5\u5FD7\u6587\u4EF6\u4F1A\u8FFD\u52A0\u5230 fileName \u7684\u6587\u4EF6\u7ED3\u5C3E\uFF0C\u82E5\u6587\u4EF6\u4E0D\u5B58\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002

\u7279\u522B\u6CE8\u610F

\u6587\u4EF6\u8BFB\u5199\u6743\u9650\u53D6\u51B3\u4E8E\u5F53\u524D\u5BBF\u4E3B\u3001\u6A21\u5757\u5DF2\u83B7\u53D6\u7684\u6743\u9650\u3002

Configs - object

object Configs
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u914D\u7F6E YukiHookLogger\u3002

TAG - field

const val TAG: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6807\u7B7E\u3002

PRIORITY - field

const val PRIORITY: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4F18\u5148\u7EA7\u3002

PACKAGE_NAME - field

const val PACKAGE_NAME: Int
@@ -27,12 +28,12 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},p=a(`

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u662F\u5426\u542F\u7528\u8C03\u8BD5\u65E5\u5FD7\u7684\u8F93\u51FA\u529F\u80FD\u3002

\u5173\u95ED\u540E\u5C06\u4F1A\u505C\u7528 YukiHookAPI \u5BF9\u5168\u90E8\u65E5\u5FD7\u7684\u8F93\u51FA\u3002

\u4F46\u662F\u4E0D\u5F71\u54CD\u5F53\u4F60\u624B\u52A8\u8C03\u7528\u4E0B\u9762\u8FD9\u4E9B\u65B9\u6CD5\u8F93\u51FA\u65E5\u5FD7\u3002

loggerD\u3001loggerI\u3001loggerW\u3001loggerE\u3002

\u5F53 isEnable \u5173\u95ED\u540E YukiHookAPI.Configs.isDebug \u4E5F\u5C06\u540C\u65F6\u5173\u95ED\u3002

isRecord - field

var isRecord: Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u662F\u5426\u542F\u7528\u8C03\u8BD5\u65E5\u5FD7\u7684\u8BB0\u5F55\u529F\u80FD\u3002

\u5F00\u542F\u540E\u5C06\u4F1A\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5168\u90E8\u53EF\u7528\u7684\u65E5\u5FD7\u548C\u5F02\u5E38\u5806\u6808\u3002

\u9700\u8981\u540C\u65F6\u542F\u7528 isEnable \u624D\u80FD\u6709\u6548\u3002

\u7279\u522B\u6CE8\u610F

\u8FC7\u91CF\u7684\u65E5\u5FD7\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5BBF\u4E3B\u8FD0\u884C\u7F13\u6162\u6216\u9020\u6210\u9891\u7E41 GC\u3002

\u5F00\u542F\u540E\u4F60\u53EF\u4EE5\u8C03\u7528 YukiHookLogger.saveToFile \u5B9E\u65F6\u4FDD\u5B58\u65E5\u5FD7\u5230\u6587\u4EF6\u6216\u4F7F\u7528 YukiHookLogger.contents \u83B7\u53D6\u5B9E\u65F6\u65E5\u5FD7\u6587\u4EF6\u3002

tag - field

var tag: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A\u8C03\u8BD5\u65E5\u5FD7\u7684\u5168\u5C40\u6807\u8BC6\u3002

\u9ED8\u8BA4\u6587\u6848\u4E3A YukiHookAPI\u3002

\u4F60\u53EF\u4EE5\u4FEE\u6539\u4E3A\u4F60\u81EA\u5DF1\u7684\u6587\u6848\u3002

elements - method

fun elements(vararg item: Int)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

\u53EA\u5BF9\u65E5\u5FD7\u8BB0\u5F55\u548C XposedBridge.log \u751F\u6548\u3002

\u65E5\u5FD7\u5143\u7D20\u7684\u6392\u5217\u5C06\u6309\u7167\u4F60\u5728 item \u4E2D\u8BBE\u7F6E\u7684\u987A\u5E8F\u8FDB\u884C\u663E\u793A\u3002

\u4F60\u8FD8\u53EF\u4EE5\u7559\u7A7A item \u4EE5\u4E0D\u663E\u793A\u9664\u65E5\u5FD7\u5185\u5BB9\u5916\u7684\u5168\u90E8\u5143\u7D20\u3002

\u53EF\u7528\u7684\u5143\u7D20\u6709\uFF1ATAG\u3001PRIORITY\u3001PACKAGE_NAME\u3001USER_ID\u3002

\u529F\u80FD\u793A\u4F8B

\u6253\u5370\u7684\u65E5\u5FD7\u6837\u5F0F\u5C06\u6309\u7167\u4F60\u8BBE\u7F6E\u7684\u6392\u5217\u987A\u5E8F\u548C\u5143\u7D20\u5185\u5BB9\u8FDB\u884C\u3002

\u793A\u4F8B\u5982\u4E0B

elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

\u53EA\u5BF9\u65E5\u5FD7\u8BB0\u5F55\u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u7684\u65E5\u5FD7\u751F\u6548\u3002

\u65E5\u5FD7\u5143\u7D20\u7684\u6392\u5217\u5C06\u6309\u7167\u4F60\u5728 item \u4E2D\u8BBE\u7F6E\u7684\u987A\u5E8F\u8FDB\u884C\u663E\u793A\u3002

\u4F60\u8FD8\u53EF\u4EE5\u7559\u7A7A item \u4EE5\u4E0D\u663E\u793A\u9664\u65E5\u5FD7\u5185\u5BB9\u5916\u7684\u5168\u90E8\u5143\u7D20\u3002

\u53EF\u7528\u7684\u5143\u7D20\u6709\uFF1ATAG\u3001PRIORITY\u3001PACKAGE_NAME\u3001USER_ID\u3002

\u529F\u80FD\u793A\u4F8B

\u6253\u5370\u7684\u65E5\u5FD7\u6837\u5F0F\u5C06\u6309\u7167\u4F60\u8BBE\u7F6E\u7684\u6392\u5217\u987A\u5E8F\u548C\u5143\u7D20\u5185\u5BB9\u8FDB\u884C\u3002

\u793A\u4F8B\u5982\u4E0B

elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
 

\u4EE5\u4E0A\u5185\u5BB9\u5B9A\u4E49\u7684\u65E5\u5FD7\u5C06\u663E\u793A\u4E3A\u5982\u4E0B\u6837\u5F0F\u3002

\u793A\u4F8B\u5982\u4E0B

[YukiHookAPI][D][com.demo.test][999]--> This is a log
 

\u5982\u679C\u6211\u4EEC\u8C03\u6574\u5143\u7D20\u987A\u5E8F\u4EE5\u53CA\u51CF\u5C11\u4E2A\u6570\uFF0C\u90A3\u4E48\u7ED3\u679C\u53C8\u4F1A\u4E0D\u4E00\u6837\u3002

\u793A\u4F8B\u5982\u4E0B

elements(PACKAGE_NAME, USER_ID, PRIORITY)
 

\u4EE5\u4E0A\u5185\u5BB9\u5B9A\u4E49\u7684\u65E5\u5FD7\u5C06\u663E\u793A\u4E3A\u5982\u4E0B\u6837\u5F0F\u3002

\u793A\u4F8B\u5982\u4E0B

[com.demo.test][999][D]--> This is a log
 

loggerD - method

fun loggerD(tag: String, msg: String, type: LoggerType)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B D\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerI - method

fun loggerI(tag: String, msg: String, type: LoggerType)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B I\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerW - method

fun loggerW(tag: String, msg: String, type: LoggerType)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B W\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerE - method

fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B E\uFF0C\u53EF\u643A\u5E26 e \u5F02\u5E38\u4FE1\u606F\uFF0C\u5C06\u6253\u5370\u5F02\u5E38\u5806\u6808\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

`,206),l=[p];function c(t,r){return o(),e("div",null,l)}const i=s(n,[["render",c],["__file","LoggerFactory.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B D\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerI - method

fun loggerI(tag: String, msg: String, type: LoggerType)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B I\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerW - method

fun loggerW(tag: String, msg: String, type: LoggerType)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B W\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerE - method

fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.1.0 \u4FEE\u6539

\u65B0\u589E type \u53C2\u6570

\u529F\u80FD\u63CF\u8FF0

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B E\uFF0C\u53EF\u643A\u5E26 e \u5F02\u5E38\u4FE1\u606F\uFF0C\u5C06\u6253\u5370\u5F02\u5E38\u5806\u6808\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

`,221),l=[p];function c(t,r){return o(),a("div",null,l)}const i=s(n,[["render",c],["__file","LoggerFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/LoggerFactory.html.b69954d3.js b/docs/assets/LoggerFactory.html.3ad979ec.js similarity index 63% rename from docs/assets/LoggerFactory.html.b69954d3.js rename to docs/assets/LoggerFactory.html.3ad979ec.js index 6af35f071..9c9c11717 100644 --- a/docs/assets/LoggerFactory.html.b69954d3.js +++ b/docs/assets/LoggerFactory.html.3ad979ec.js @@ -1,9 +1,9 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

LoggerFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F YukiHookAPI \u7684\u65E5\u5FD7\u5C01\u88C5\u7C7B\uFF0C\u53EF\u5B9E\u73B0\u540C\u65F6\u5411 Logcat \u548C XposedBridge.log \u6253\u5370\u65E5\u5FD7\u7684\u529F\u80FD\u3002

LoggerType - class

enum class LoggerType
+import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

LoggerFactory - kt

Change Records

v1.0 first

Function Illustrate

\u8FD9\u662F YukiHookAPI \u7684\u65E5\u5FD7\u5C01\u88C5\u7C7B\uFF0C\u53EF\u5B9E\u73B0\u540C\u65F6\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\u7684\u529F\u80FD\u3002

LoggerType - class

enum class LoggerType
 

Change Records

v1.1.0 added

Function Illustrate

\u9700\u8981\u6253\u5370\u7684\u65E5\u5FD7\u7C7B\u578B\u3002

\u51B3\u5B9A\u4E8E\u6A21\u5757\u4E0E (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u7684\u6253\u5370\u65B9\u5F0F\u3002

LOGD - enum

LOGD
-

Change Records

v1.1.0 added

Function Illustrate

\u4EC5\u4F7F\u7528 android.util.Log\u3002

XPOSEDBRIDGE - enum

XPOSEDBRIDGE
-

Change Records

v1.1.0 added

Function Illustrate

\u4EC5\u4F7F\u7528 XposedBridge.log\u3002

Pay Attention

\u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u5C06\u4E0D\u751F\u6548\u3002

SCOPE - enum

SCOPE
-

Change Records

v1.1.0 added

Function Illustrate

\u5206\u533A\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4EC5\u4F7F\u7528 XPOSEDBRIDGE\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

BOTH - enum

BOTH
-

Change Records

v1.1.0 added

Function Illustrate

\u540C\u65F6\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528 LOGD \u4E0E XPOSEDBRIDGE\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

YukiLoggerData - class

data class YukiLoggerData internal constructor(
+

Change Records

v1.1.0 added

Function Illustrate

\u4EC5\u4F7F\u7528 android.util.Log\u3002

XPOSEDBRIDGE - enum

Change Records

v1.1.0 added

v1.1.5 deprecated

\u8BF7\u8F6C\u79FB\u5230 XPOSED_ENVIRONMENT

XPOSED_ENVIRONMENT - enum

XPOSED_ENVIRONMENT
+

Change Records

v1.1.5 added

Function Illustrate

\u4EC5\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u3002

Pay Attention

\u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u5C06\u4E0D\u751F\u6548\u3002

SCOPE - enum

SCOPE
+

Change Records

v1.1.0 added

Function Illustrate

\u5206\u533A\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4EC5\u4F7F\u7528 XPOSED_ENVIRONMENT\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

BOTH - enum

BOTH
+

Change Records

v1.1.0 added

Function Illustrate

\u540C\u65F6\u4F7F\u7528\u3002

(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528 LOGD \u4E0E XPOSED_ENVIRONMENT\u3002

\u6A21\u5757\u73AF\u5883\u4EC5\u4F7F\u7528 LOGD\u3002

YukiLoggerData - class

data class YukiLoggerData internal constructor(
     var timestamp: Long,
     var time: String,
     var tag: String,
@@ -16,9 +16,10 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Change Records

v1.1.2 added

v1.1.4 modified

\u5B9E\u73B0 Serializable \u63A5\u53E3\u5E76\u6807\u8BC6\u4E3A data class

Function Illustrate

\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u5B9E\u73B0\u7C7B\u3002

YukiHookLogger - object

object YukiHookLogger
 

Change Records

v1.1.0 added

Function Illustrate

\u8C03\u8BD5\u65E5\u5FD7\u5B9E\u73B0\u7C7B\u3002

inMemoryData - field

val inMemoryData: ArrayList<YukiLoggerData>
 

Change Records

v1.1.2 added

v1.1.4 modified

\u7C7B\u578B\u7531 HashSet \u4FEE\u6539\u4E3A ArrayList

Function Illustrate

\u5F53\u524D\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u6570\u636E\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

contents - field

val contents: String
-

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u53D6\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

clear - method

fun clear()
-

Change Records

v1.1.0 added

Function Illustrate

\u6E05\u9664\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u83B7\u53D6 inMemoryData \u6765\u6E05\u9664\u3002

saveToFile - method

fun saveToFile(fileName: String)
-

Change Records

v1.1.0 added

Function Illustrate

\u4FDD\u5B58\u5F53\u524D\u65E5\u5FD7\u5230\u6587\u4EF6\u3002

\u82E5\u5F53\u524D\u672A\u5F00\u542F Configs.isRecord \u6216\u8BB0\u5F55\u4E3A\u7A7A\u5219\u4E0D\u4F1A\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002

\u65E5\u5FD7\u6587\u4EF6\u4F1A\u8FFD\u52A0\u5230 fileName \u7684\u6587\u4EF6\u7ED3\u5C3E\uFF0C\u82E5\u6587\u4EF6\u4E0D\u5B58\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002

Pay Attention

\u6587\u4EF6\u8BFB\u5199\u6743\u9650\u53D6\u51B3\u4E8E\u5F53\u524D\u5BBF\u4E3B\u3001\u6A21\u5757\u5DF2\u83B7\u53D6\u7684\u6743\u9650\u3002

Configs - object

object Configs
+

Change Records

v1.1.0 added

Function Illustrate

\u83B7\u53D6\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

contents - method

fun contents(data: ArrayList<YukiLoggerData>): String
+

Change Records

v1.1.5 added

Function Illustrate

\u83B7\u53D6\u3001\u683C\u5F0F\u5316\u5F53\u524D\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002

\u5982\u679C\u5F53\u524D\u6CA1\u6709\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7 (data \u4E3A\u7A7A) \u4F1A\u8FD4\u56DE\u7A7A\u5B57\u7B26\u4E32\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

clear - method

fun clear()
+

Change Records

v1.1.0 added

Function Illustrate

\u6E05\u9664\u5168\u90E8\u5DF2\u8BB0\u5F55\u7684\u65E5\u5FD7\u3002

Pay Attention

\u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u83B7\u53D6 inMemoryData \u6765\u6E05\u9664\u3002

saveToFile - method

fun saveToFile(fileName: String, data: ArrayList<YukiLoggerData>)
+

Change Records

v1.1.0 added

v1.1.5 modified

\u65B0\u589E data \u53C2\u6570

Function Illustrate

\u4FDD\u5B58\u5F53\u524D\u65E5\u5FD7\u5230\u6587\u4EF6\u3002

\u82E5\u5F53\u524D\u672A\u5F00\u542F Configs.isRecord \u6216\u8BB0\u5F55\u4E3A\u7A7A\u5219\u4E0D\u4F1A\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\u3002

\u65E5\u5FD7\u6587\u4EF6\u4F1A\u8FFD\u52A0\u5230 fileName \u7684\u6587\u4EF6\u7ED3\u5C3E\uFF0C\u82E5\u6587\u4EF6\u4E0D\u5B58\u5728\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002

Pay Attention

\u6587\u4EF6\u8BFB\u5199\u6743\u9650\u53D6\u51B3\u4E8E\u5F53\u524D\u5BBF\u4E3B\u3001\u6A21\u5757\u5DF2\u83B7\u53D6\u7684\u6743\u9650\u3002

Configs - object

object Configs
 

Change Records

v1.1.0 added

Function Illustrate

\u914D\u7F6E YukiHookLogger\u3002

TAG - field

const val TAG: Int
 

Change Records

v1.1.0 added

Function Illustrate

\u6807\u7B7E\u3002

PRIORITY - field

const val PRIORITY: Int
 

Change Records

v1.1.0 added

Function Illustrate

\u4F18\u5148\u7EA7\u3002

PACKAGE_NAME - field

const val PACKAGE_NAME: Int
@@ -27,12 +28,12 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

Change Records

v1.1.0 added

Function Illustrate

\u662F\u5426\u542F\u7528\u8C03\u8BD5\u65E5\u5FD7\u7684\u8F93\u51FA\u529F\u80FD\u3002

\u5173\u95ED\u540E\u5C06\u4F1A\u505C\u7528 YukiHookAPI \u5BF9\u5168\u90E8\u65E5\u5FD7\u7684\u8F93\u51FA\u3002

\u4F46\u662F\u4E0D\u5F71\u54CD\u5F53\u4F60\u624B\u52A8\u8C03\u7528\u4E0B\u9762\u8FD9\u4E9B\u65B9\u6CD5\u8F93\u51FA\u65E5\u5FD7\u3002

loggerD\u3001loggerI\u3001loggerW\u3001loggerE\u3002

\u5F53 isEnable \u5173\u95ED\u540E YukiHookAPI.Configs.isDebug \u4E5F\u5C06\u540C\u65F6\u5173\u95ED\u3002

isRecord - field

var isRecord: Boolean
 

Change Records

v1.1.0 added

Function Illustrate

\u662F\u5426\u542F\u7528\u8C03\u8BD5\u65E5\u5FD7\u7684\u8BB0\u5F55\u529F\u80FD\u3002

\u5F00\u542F\u540E\u5C06\u4F1A\u5728\u5185\u5B58\u4E2D\u8BB0\u5F55\u5168\u90E8\u53EF\u7528\u7684\u65E5\u5FD7\u548C\u5F02\u5E38\u5806\u6808\u3002

\u9700\u8981\u540C\u65F6\u542F\u7528 isEnable \u624D\u80FD\u6709\u6548\u3002

Pay Attention

\u8FC7\u91CF\u7684\u65E5\u5FD7\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5BBF\u4E3B\u8FD0\u884C\u7F13\u6162\u6216\u9020\u6210\u9891\u7E41 GC\u3002

\u5F00\u542F\u540E\u4F60\u53EF\u4EE5\u8C03\u7528 YukiHookLogger.saveToFile \u5B9E\u65F6\u4FDD\u5B58\u65E5\u5FD7\u5230\u6587\u4EF6\u6216\u4F7F\u7528 YukiHookLogger.contents \u83B7\u53D6\u5B9E\u65F6\u65E5\u5FD7\u6587\u4EF6\u3002

tag - field

var tag: String
 

Change Records

v1.1.0 added

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A\u8C03\u8BD5\u65E5\u5FD7\u7684\u5168\u5C40\u6807\u8BC6\u3002

\u9ED8\u8BA4\u6587\u6848\u4E3A YukiHookAPI\u3002

\u4F60\u53EF\u4EE5\u4FEE\u6539\u4E3A\u4F60\u81EA\u5DF1\u7684\u6587\u6848\u3002

elements - method

fun elements(vararg item: Int)
-

Change Records

v1.1.0 added

Function Illustrate

\u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

\u53EA\u5BF9\u65E5\u5FD7\u8BB0\u5F55\u548C XposedBridge.log \u751F\u6548\u3002

\u65E5\u5FD7\u5143\u7D20\u7684\u6392\u5217\u5C06\u6309\u7167\u4F60\u5728 item \u4E2D\u8BBE\u7F6E\u7684\u987A\u5E8F\u8FDB\u884C\u663E\u793A\u3002

\u4F60\u8FD8\u53EF\u4EE5\u7559\u7A7A item \u4EE5\u4E0D\u663E\u793A\u9664\u65E5\u5FD7\u5185\u5BB9\u5916\u7684\u5168\u90E8\u5143\u7D20\u3002

\u53EF\u7528\u7684\u5143\u7D20\u6709\uFF1ATAG\u3001PRIORITY\u3001PACKAGE_NAME\u3001USER_ID\u3002

Function Example

\u6253\u5370\u7684\u65E5\u5FD7\u6837\u5F0F\u5C06\u6309\u7167\u4F60\u8BBE\u7F6E\u7684\u6392\u5217\u987A\u5E8F\u548C\u5143\u7D20\u5185\u5BB9\u8FDB\u884C\u3002

The following example

elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
+

Change Records

v1.1.0 added

Function Illustrate

\u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

\u53EA\u5BF9\u65E5\u5FD7\u8BB0\u5F55\u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u7684\u65E5\u5FD7\u751F\u6548\u3002

\u65E5\u5FD7\u5143\u7D20\u7684\u6392\u5217\u5C06\u6309\u7167\u4F60\u5728 item \u4E2D\u8BBE\u7F6E\u7684\u987A\u5E8F\u8FDB\u884C\u663E\u793A\u3002

\u4F60\u8FD8\u53EF\u4EE5\u7559\u7A7A item \u4EE5\u4E0D\u663E\u793A\u9664\u65E5\u5FD7\u5185\u5BB9\u5916\u7684\u5168\u90E8\u5143\u7D20\u3002

\u53EF\u7528\u7684\u5143\u7D20\u6709\uFF1ATAG\u3001PRIORITY\u3001PACKAGE_NAME\u3001USER_ID\u3002

Function Example

\u6253\u5370\u7684\u65E5\u5FD7\u6837\u5F0F\u5C06\u6309\u7167\u4F60\u8BBE\u7F6E\u7684\u6392\u5217\u987A\u5E8F\u548C\u5143\u7D20\u5185\u5BB9\u8FDB\u884C\u3002

The following example

elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
 

\u4EE5\u4E0A\u5185\u5BB9\u5B9A\u4E49\u7684\u65E5\u5FD7\u5C06\u663E\u793A\u4E3A\u5982\u4E0B\u6837\u5F0F\u3002

The following example

[YukiHookAPI][D][com.demo.test][999]--> This is a log
 

\u5982\u679C\u6211\u4EEC\u8C03\u6574\u5143\u7D20\u987A\u5E8F\u4EE5\u53CA\u51CF\u5C11\u4E2A\u6570\uFF0C\u90A3\u4E48\u7ED3\u679C\u53C8\u4F1A\u4E0D\u4E00\u6837\u3002

The following example

elements(PACKAGE_NAME, USER_ID, PRIORITY)
 

\u4EE5\u4E0A\u5185\u5BB9\u5B9A\u4E49\u7684\u65E5\u5FD7\u5C06\u663E\u793A\u4E3A\u5982\u4E0B\u6837\u5F0F\u3002

The following example

[com.demo.test][999][D]--> This is a log
 

loggerD - method

fun loggerD(tag: String, msg: String, type: LoggerType)
-

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B D\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerI - method

fun loggerI(tag: String, msg: String, type: LoggerType)
-

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B I\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerW - method

fun loggerW(tag: String, msg: String, type: LoggerType)
-

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B W\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerE - method

fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
-

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C XposedBridge \u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B E\uFF0C\u53EF\u643A\u5E26 e \u5F02\u5E38\u4FE1\u606F\uFF0C\u5C06\u6253\u5370\u5F02\u5E38\u5806\u6808\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

`,207),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","LoggerFactory.html.vue"]]);export{i as default}; +

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B D\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerI - method

fun loggerI(tag: String, msg: String, type: LoggerType)
+

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B I\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerW - method

fun loggerW(tag: String, msg: String, type: LoggerType)
+

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B W\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

loggerE - method

fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
+

Change Records

v1.0 first

v1.1.0 modified

\u65B0\u589E type \u53C2\u6570

Function Illustrate

\u5411 Logcat \u548C (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u65E5\u5FD7\uFF0C\u7EA7\u522B E\uFF0C\u53EF\u643A\u5E26 e \u5F02\u5E38\u4FE1\u606F\uFF0C\u5C06\u6253\u5370\u5F02\u5E38\u5806\u6808\u3002

tag \u7684\u9ED8\u8BA4\u53C2\u6570\u4E3A YukiHookAPI.Configs.debugTag\uFF0C\u4F60\u53EF\u4EE5\u8FDB\u884C\u81EA\u5B9A\u4E49\u3002

`,222),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","LoggerFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/LoggerFactory.html.52af0d44.js b/docs/assets/LoggerFactory.html.52af0d44.js new file mode 100644 index 000000000..db61a26b8 --- /dev/null +++ b/docs/assets/LoggerFactory.html.52af0d44.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-36aec5ad","path":"/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html","title":"LoggerFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"LoggerType - class","slug":"loggertype-class","link":"#loggertype-class","children":[{"level":3,"title":"LOGD - enum","slug":"logd-enum","link":"#logd-enum","children":[]},{"level":3,"title":"XPOSED_ENVIRONMENT - enum","slug":"xposed-environment-enum","link":"#xposed-environment-enum","children":[]},{"level":3,"title":"SCOPE - enum","slug":"scope-enum","link":"#scope-enum","children":[]},{"level":3,"title":"BOTH - enum","slug":"both-enum","link":"#both-enum","children":[]}]},{"level":2,"title":"YukiLoggerData - class","slug":"yukiloggerdata-class","link":"#yukiloggerdata-class","children":[]},{"level":2,"title":"YukiHookLogger - object","slug":"yukihooklogger-object","link":"#yukihooklogger-object","children":[{"level":3,"title":"inMemoryData - field","slug":"inmemorydata-field","link":"#inmemorydata-field","children":[]},{"level":3,"title":"contents - field","slug":"contents-field","link":"#contents-field","children":[]},{"level":3,"title":"contents - method","slug":"contents-method","link":"#contents-method","children":[]},{"level":3,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":3,"title":"saveToFile - method","slug":"savetofile-method","link":"#savetofile-method","children":[]},{"level":3,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[]}]},{"level":2,"title":"loggerD - method","slug":"loggerd-method","link":"#loggerd-method","children":[]},{"level":2,"title":"loggerI - method","slug":"loggeri-method","link":"#loggeri-method","children":[]},{"level":2,"title":"loggerW - method","slug":"loggerw-method","link":"#loggerw-method","children":[]},{"level":2,"title":"loggerE - method","slug":"loggere-method","link":"#loggere-method","children":[]}],"git":{"updatedTime":1673455323000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"}');export{e as data}; diff --git a/docs/assets/LoggerFactory.html.5acb1c04.js b/docs/assets/LoggerFactory.html.5acb1c04.js deleted file mode 100644 index fd9073614..000000000 --- a/docs/assets/LoggerFactory.html.5acb1c04.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-36aec5ad","path":"/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html","title":"LoggerFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"LoggerType - class","slug":"loggertype-class","link":"#loggertype-class","children":[{"level":3,"title":"LOGD - enum","slug":"logd-enum","link":"#logd-enum","children":[]},{"level":3,"title":"XPOSEDBRIDGE - enum","slug":"xposedbridge-enum","link":"#xposedbridge-enum","children":[]},{"level":3,"title":"SCOPE - enum","slug":"scope-enum","link":"#scope-enum","children":[]},{"level":3,"title":"BOTH - enum","slug":"both-enum","link":"#both-enum","children":[]}]},{"level":2,"title":"YukiLoggerData - class","slug":"yukiloggerdata-class","link":"#yukiloggerdata-class","children":[]},{"level":2,"title":"YukiHookLogger - object","slug":"yukihooklogger-object","link":"#yukihooklogger-object","children":[{"level":3,"title":"inMemoryData - field","slug":"inmemorydata-field","link":"#inmemorydata-field","children":[]},{"level":3,"title":"contents - field","slug":"contents-field","link":"#contents-field","children":[]},{"level":3,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":3,"title":"saveToFile - method","slug":"savetofile-method","link":"#savetofile-method","children":[]},{"level":3,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[]}]},{"level":2,"title":"loggerD - method","slug":"loggerd-method","link":"#loggerd-method","children":[]},{"level":2,"title":"loggerI - method","slug":"loggeri-method","link":"#loggeri-method","children":[]},{"level":2,"title":"loggerW - method","slug":"loggerw-method","link":"#loggerw-method","children":[]},{"level":2,"title":"loggerE - method","slug":"loggere-method","link":"#loggere-method","children":[]}],"git":{"updatedTime":1664828712000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"}');export{e as data}; diff --git a/docs/assets/LoggerFactory.html.ae54c997.js b/docs/assets/LoggerFactory.html.ae54c997.js new file mode 100644 index 000000000..c5a5469b7 --- /dev/null +++ b/docs/assets/LoggerFactory.html.ae54c997.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-004a009e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html","title":"LoggerFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"LoggerType - class","slug":"loggertype-class","link":"#loggertype-class","children":[{"level":3,"title":"LOGD - enum","slug":"logd-enum","link":"#logd-enum","children":[]},{"level":3,"title":"XPOSED_ENVIRONMENT - enum","slug":"xposed-environment-enum","link":"#xposed-environment-enum","children":[]},{"level":3,"title":"SCOPE - enum","slug":"scope-enum","link":"#scope-enum","children":[]},{"level":3,"title":"BOTH - enum","slug":"both-enum","link":"#both-enum","children":[]}]},{"level":2,"title":"YukiLoggerData - class","slug":"yukiloggerdata-class","link":"#yukiloggerdata-class","children":[]},{"level":2,"title":"YukiHookLogger - object","slug":"yukihooklogger-object","link":"#yukihooklogger-object","children":[{"level":3,"title":"inMemoryData - field","slug":"inmemorydata-field","link":"#inmemorydata-field","children":[]},{"level":3,"title":"contents - field","slug":"contents-field","link":"#contents-field","children":[]},{"level":3,"title":"contents - method","slug":"contents-method","link":"#contents-method","children":[]},{"level":3,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":3,"title":"saveToFile - method","slug":"savetofile-method","link":"#savetofile-method","children":[]},{"level":3,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[]}]},{"level":2,"title":"loggerD - method","slug":"loggerd-method","link":"#loggerd-method","children":[]},{"level":2,"title":"loggerI - method","slug":"loggeri-method","link":"#loggeri-method","children":[]},{"level":2,"title":"loggerW - method","slug":"loggerw-method","link":"#loggerw-method","children":[]},{"level":2,"title":"loggerE - method","slug":"loggere-method","link":"#loggere-method","children":[]}],"git":{"updatedTime":1673455323000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":8}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"}');export{e as data}; diff --git a/docs/assets/LoggerFactory.html.b8bfff32.js b/docs/assets/LoggerFactory.html.b8bfff32.js deleted file mode 100644 index f411d10ed..000000000 --- a/docs/assets/LoggerFactory.html.b8bfff32.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-004a009e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html","title":"LoggerFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"LoggerType - class","slug":"loggertype-class","link":"#loggertype-class","children":[{"level":3,"title":"LOGD - enum","slug":"logd-enum","link":"#logd-enum","children":[]},{"level":3,"title":"XPOSEDBRIDGE - enum","slug":"xposedbridge-enum","link":"#xposedbridge-enum","children":[]},{"level":3,"title":"SCOPE - enum","slug":"scope-enum","link":"#scope-enum","children":[]},{"level":3,"title":"BOTH - enum","slug":"both-enum","link":"#both-enum","children":[]}]},{"level":2,"title":"YukiLoggerData - class","slug":"yukiloggerdata-class","link":"#yukiloggerdata-class","children":[]},{"level":2,"title":"YukiHookLogger - object","slug":"yukihooklogger-object","link":"#yukihooklogger-object","children":[{"level":3,"title":"inMemoryData - field","slug":"inmemorydata-field","link":"#inmemorydata-field","children":[]},{"level":3,"title":"contents - field","slug":"contents-field","link":"#contents-field","children":[]},{"level":3,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":3,"title":"saveToFile - method","slug":"savetofile-method","link":"#savetofile-method","children":[]},{"level":3,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[]}]},{"level":2,"title":"loggerD - method","slug":"loggerd-method","link":"#loggerd-method","children":[]},{"level":2,"title":"loggerI - method","slug":"loggeri-method","link":"#loggeri-method","children":[]},{"level":2,"title":"loggerW - method","slug":"loggerw-method","link":"#loggerw-method","children":[]},{"level":2,"title":"loggerE - method","slug":"loggere-method","link":"#loggere-method","children":[]}],"git":{"updatedTime":1664828712000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"}');export{e as data}; diff --git a/docs/assets/MemberRules.html.a94d7ce4.js b/docs/assets/MemberRules.html.a2893e5a.js similarity index 97% rename from docs/assets/MemberRules.html.a94d7ce4.js rename to docs/assets/MemberRules.html.a2893e5a.js index 419045cd9..66ef38fa6 100644 --- a/docs/assets/MemberRules.html.a94d7ce4.js +++ b/docs/assets/MemberRules.html.a2893e5a.js @@ -1,3 +1,3 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

MemberRules - class

class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
+import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

MemberRules - class

class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

Member \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Member \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

`,13),p=[l];function c(r,t){return e(),o("div",null,p)}const i=s(n,[["render",c],["__file","MemberRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/MemberRules.html.bfe09c90.js b/docs/assets/MemberRules.html.ba98f1ad.js similarity index 97% rename from docs/assets/MemberRules.html.bfe09c90.js rename to docs/assets/MemberRules.html.ba98f1ad.js index 0e62a0496..466bb96eb 100644 --- a/docs/assets/MemberRules.html.bfe09c90.js +++ b/docs/assets/MemberRules.html.ba98f1ad.js @@ -1,3 +1,3 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MemberRules - class

class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
+import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MemberRules - class

class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
 

Change Records

v1.1.0 added

Function Illustrate

Member \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Member \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

`,14),t=[l];function r(c,p){return e(),o("div",null,t)}const d=s(n,[["render",r],["__file","MemberRules.html.vue"]]);export{d as default}; diff --git a/docs/assets/MemberRulesResult.html.2769b569.js b/docs/assets/MemberRulesResult.html.92b1d783.js similarity index 98% rename from docs/assets/MemberRulesResult.html.2769b569.js rename to docs/assets/MemberRulesResult.html.92b1d783.js index 1798c14a9..834d0a040 100644 --- a/docs/assets/MemberRulesResult.html.2769b569.js +++ b/docs/assets/MemberRulesResult.html.92b1d783.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as o,a as n}from"./app.99fcdd51.js";const a={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MemberRulesResult - class

class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
+import{_ as s,o as e,c as o,a as n}from"./app.6074a838.js";const a={},l=n(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MemberRulesResult - class

class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
 

Change Records

v1.1.0 added

Function Illustrate

\u5F53\u524D Member \u67E5\u627E\u6761\u4EF6\u7ED3\u679C\u5B9E\u73B0\u7C7B\u3002

none - method

fun none(): MemberRulesResult
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Member \u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u4E2A\u6570\u4E3A 0\u3002

count - method

fun count(num: Int): MemberRulesResult
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D Member \u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u9700\u8981\u5168\u90E8\u5339\u914D\u7684\u4E2A\u6570\u3002

count - method

fun count(numRange: IntRange): MemberRulesResult
diff --git a/docs/assets/MemberRulesResult.html.c69c4756.js b/docs/assets/MemberRulesResult.html.e6b8258c.js
similarity index 98%
rename from docs/assets/MemberRulesResult.html.c69c4756.js
rename to docs/assets/MemberRulesResult.html.e6b8258c.js
index 370f258ff..e447afc14 100644
--- a/docs/assets/MemberRulesResult.html.c69c4756.js
+++ b/docs/assets/MemberRulesResult.html.e6b8258c.js
@@ -1,4 +1,4 @@
-import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

MemberRulesResult - class

class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
+import{_ as s,o,c as e,a as n}from"./app.6074a838.js";const a={},l=n(`

MemberRulesResult - class

class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u5F53\u524D Member \u67E5\u627E\u6761\u4EF6\u7ED3\u679C\u5B9E\u73B0\u7C7B\u3002

none - method

fun none(): MemberRulesResult
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Member \u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u4E2A\u6570\u4E3A 0\u3002

count - method

fun count(num: Int): MemberRulesResult
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D Member \u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u9700\u8981\u5168\u90E8\u5339\u914D\u7684\u4E2A\u6570\u3002

count - method

fun count(numRange: IntRange): MemberRulesResult
diff --git a/docs/assets/MethodFinder.html.03ce70ab.js b/docs/assets/MethodFinder.html.03ce70ab.js
deleted file mode 100644
index 3a3ce265c..000000000
--- a/docs/assets/MethodFinder.html.03ce70ab.js
+++ /dev/null
@@ -1 +0,0 @@
-const e=JSON.parse('{"key":"v-fd738322","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html","title":"MethodFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method","link":"#onnosuchmethod-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method-1","link":"#onnosuchmethod-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]}]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"}');export{e as data};
diff --git a/docs/assets/MethodFinder.html.0e730b7b.js b/docs/assets/MethodFinder.html.0f8d3ec6.js
similarity index 94%
rename from docs/assets/MethodFinder.html.0e730b7b.js
rename to docs/assets/MethodFinder.html.0f8d3ec6.js
index a1b9833e7..fe5e8c14f 100644
--- a/docs/assets/MethodFinder.html.0e730b7b.js
+++ b/docs/assets/MethodFinder.html.0f8d3ec6.js
@@ -1,18 +1,20 @@
-import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},l=a(`

MethodFinder - class

class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
+import{_ as s,o,c as n,a}from"./app.6074a838.js";const e={},l=a(`

MethodFinder - class

class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.2 \u4FEE\u6539

\u5408\u5E76\u5230 BaseFinder

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 MemberBaseFinder

\u529F\u80FD\u63CF\u8FF0

Method \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Method \u6216\u4E00\u7EC4 Method\u3002

name - field

var name: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.70 \u4FEE\u6539

\u5141\u8BB8\u4E0D\u586B\u5199\u540D\u79F0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u540D\u79F0\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

paramCount - field

var paramCount: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

returnType - field

var returnType: Any?
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\uFF0C\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

v1.0.80 \u4FEE\u6539

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 ModifierConditions

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

emptyParam - method

fun emptyParam(): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.75 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any): IndexTypeCondition
-

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

order - method

fun order(): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

param - method

fun param(conditions: ObjectsConditions): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

order - method

fun order(): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u987A\u5E8F\u7B5B\u9009\u5B57\u8282\u7801\u7684\u4E0B\u6807\u3002

name - method

fun name(value: String): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u540D\u79F0\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

name - method

fun name(conditions: NameConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.88 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u5408\u5E76\u5230 NameConditions

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u540D\u79F0\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(numRange: IntRange): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(conditions: CountConditions): IndexTypeCondition
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

returnType - method

fun returnType(value: Any): IndexTypeCondition
-

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
+

\u53D8\u66F4\u8BB0\u5F55

v1.0.70 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

returnType - method

fun returnType(conditions: ObjectConditions): IndexTypeCondition
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

\u7279\u522B\u6CE8\u610F

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.80 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5728 classSet \u7684\u6240\u6709\u7236\u7C7B\u4E2D\u67E5\u627E\u5F53\u524D Method\u3002

\u6CE8\u610F

\u82E5\u5F53\u524D classSet \u7684\u7236\u7C7B\u8F83\u591A\u53EF\u80FD\u4F1A\u8017\u65F6\uFF0CAPI \u4F1A\u81EA\u52A8\u5FAA\u73AF\u5230\u7236\u7C7B\u7EE7\u627F\u662F Any \u524D\u7684\u6700\u540E\u4E00\u4E2A\u7C7B\u3002

RemedyPlan - class

inner class RemedyPlan internal constructor()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

\u529F\u80FD\u63CF\u8FF0

Method \u91CD\u67E5\u627E\u5B9E\u73B0\u7C7B\uFF0C\u53EF\u7D2F\u8BA1\u5931\u8D25\u6B21\u6570\u76F4\u5230\u67E5\u627E\u6210\u529F\u3002

method - method

inline fun method(initiate: MethodConditions): Result
 

\u53D8\u66F4\u8BB0\u5F55

v1.0 \u6DFB\u52A0

v1.0.80 \u4FEE\u6539

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

\u529F\u80FD\u63CF\u8FF0

\u521B\u5EFA\u9700\u8981\u91CD\u65B0\u67E5\u627E\u7684 Method\u3002

\u4F60\u53EF\u4EE5\u6DFB\u52A0\u591A\u4E2A\u5907\u9009 Method\uFF0C\u76F4\u5230\u6210\u529F\u4E3A\u6B62\uFF0C\u82E5\u6700\u540E\u4F9D\u7136\u5931\u8D25\uFF0C\u5C06\u505C\u6B62\u67E5\u627E\u5E76\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u3002

Result - class

inner class Result internal constructor()
@@ -99,4 +101,4 @@ import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},l=a(`

\u53D8\u66F4\u8BB0\u5F55

v1.0.68 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Method\uFF0C\u6307\u5B9A Char \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

boolean - method

fun boolean(vararg param: Any?): Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.65 \u65B0\u589E

v1.0.68 \u4FEE\u6539

\u4FEE\u6539 callBoolean \u4E3A boolean

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Method\uFF0C\u6307\u5B9A Boolean \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

array - method

inline fun <reified T> array(vararg param: Any?): Array<T>
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.68 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Method\uFF0C\u6307\u5B9A Array \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

list - method

inline fun <reified T> list(vararg param: Any?): List<T>
-

\u53D8\u66F4\u8BB0\u5F55

v1.0.68 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Method\uFF0C\u6307\u5B9A List \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

`,417),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(e,[["render",c],["__file","MethodFinder.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.0.68 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u6267\u884C Method\uFF0C\u6307\u5B9A List \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

`,432),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(e,[["render",c],["__file","MethodFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/MethodFinder.html.417d29b0.js b/docs/assets/MethodFinder.html.2f547804.js similarity index 94% rename from docs/assets/MethodFinder.html.417d29b0.js rename to docs/assets/MethodFinder.html.2f547804.js index ca5f236d7..2369ad597 100644 --- a/docs/assets/MethodFinder.html.417d29b0.js +++ b/docs/assets/MethodFinder.html.2f547804.js @@ -1,18 +1,20 @@ -import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MethodFinder - class

class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
+import{_ as s,o,c as n,a}from"./app.6074a838.js";const e={},l=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MethodFinder - class

class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
 

Change Records

v1.0 first

v1.0.2 modified

\u5408\u5E76\u5230 BaseFinder

v1.1.0 modified

\u5408\u5E76\u5230 MemberBaseFinder

Function Illustrate

Method \u67E5\u627E\u7C7B\u3002

\u53EF\u901A\u8FC7\u6307\u5B9A\u7C7B\u578B\u67E5\u627E\u6307\u5B9A Method \u6216\u4E00\u7EC4 Method\u3002

name - field

var name: String
 

Change Records

v1.0 first

v1.0.70 modified

\u5141\u8BB8\u4E0D\u586B\u5199\u540D\u79F0

Function Illustrate

\u8BBE\u7F6E Method \u540D\u79F0\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

paramCount - field

var paramCount: Int
 

Change Records

v1.0.67 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

returnType - field

var returnType: Any?
 

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\uFF0C\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions): IndexTypeCondition
 

Change Records

v1.0.67 added

v1.0.80 modified

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

v1.1.0 modified

\u5408\u5E76\u5230 ModifierConditions

Function Illustrate

\u8BBE\u7F6E Method \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

emptyParam - method

fun emptyParam(): IndexTypeCondition
 

Change Records

v1.0.75 added

Function Illustrate

\u8BBE\u7F6E Method \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any): IndexTypeCondition
-

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

order - method

fun order(): IndexTypeCondition
+

Change Records

v1.0 first

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

param - method

fun param(conditions: ObjectsConditions): IndexTypeCondition
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u6761\u4EF6\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

order - method

fun order(): IndexTypeCondition
 

Change Records

v1.0.70 added

Function Illustrate

\u987A\u5E8F\u7B5B\u9009\u5B57\u8282\u7801\u7684\u4E0B\u6807\u3002

name - method

fun name(value: String): IndexTypeCondition
 

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Method \u540D\u79F0\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

name - method

fun name(conditions: NameConditions): IndexTypeCondition
 

Change Records

v1.0.88 added

v1.1.0 modified

\u5408\u5E76\u5230 NameConditions

Function Illustrate

\u8BBE\u7F6E Method \u540D\u79F0\u6761\u4EF6\u3002

Pay Attention

\u82E5\u4E0D\u586B\u5199\u540D\u79F0\u5219\u5FC5\u987B\u5B58\u5728\u4E00\u4E2A\u5176\u5B83\u6761\u4EF6\u3002

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(num: Int): IndexTypeCondition
 

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(numRange: IntRange): IndexTypeCondition
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

paramCount - method

fun paramCount(conditions: CountConditions): IndexTypeCondition
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

returnType - method

fun returnType(value: Any): IndexTypeCondition
-

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
+

Change Records

v1.0.70 added

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

returnType - method

fun returnType(conditions: ObjectConditions): IndexTypeCondition
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

Pay Attention

\u5B58\u5728\u591A\u4E2A IndexTypeCondition \u65F6\u9664\u4E86 order \u53EA\u4F1A\u751F\u6548\u6700\u540E\u4E00\u4E2A\u3002

superClass - method

fun superClass(isOnlySuperClass: Boolean)
 

Change Records

v1.0.80 added

Function Illustrate

\u8BBE\u7F6E\u5728 classSet \u7684\u6240\u6709\u7236\u7C7B\u4E2D\u67E5\u627E\u5F53\u524D Method\u3002

Notice

\u82E5\u5F53\u524D classSet \u7684\u7236\u7C7B\u8F83\u591A\u53EF\u80FD\u4F1A\u8017\u65F6\uFF0CAPI \u4F1A\u81EA\u52A8\u5FAA\u73AF\u5230\u7236\u7C7B\u7EE7\u627F\u662F Any \u524D\u7684\u6700\u540E\u4E00\u4E2A\u7C7B\u3002

RemedyPlan - class

inner class RemedyPlan internal constructor()
 

Change Records

v1.0 first

Function Illustrate

Method \u91CD\u67E5\u627E\u5B9E\u73B0\u7C7B\uFF0C\u53EF\u7D2F\u8BA1\u5931\u8D25\u6B21\u6570\u76F4\u5230\u67E5\u627E\u6210\u529F\u3002

method - method

inline fun method(initiate: MethodConditions): Result
 

Change Records

v1.0 first

v1.0.80 modified

\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

Function Illustrate

\u521B\u5EFA\u9700\u8981\u91CD\u65B0\u67E5\u627E\u7684 Method\u3002

\u4F60\u53EF\u4EE5\u6DFB\u52A0\u591A\u4E2A\u5907\u9009 Method\uFF0C\u76F4\u5230\u6210\u529F\u4E3A\u6B62\uFF0C\u82E5\u6700\u540E\u4F9D\u7136\u5931\u8D25\uFF0C\u5C06\u505C\u6B62\u67E5\u627E\u5E76\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u3002

Result - class

inner class Result internal constructor()
@@ -99,4 +101,4 @@ import{_ as s,o,c as n,a}from"./app.99fcdd51.js";const e={},l=a(`

Change Records

v1.0.68 added

Function Illustrate

\u6267\u884C Method\uFF0C\u6307\u5B9A Char \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

boolean - method

fun boolean(vararg param: Any?): Boolean
 

Change Records

v1.0.65 added

v1.0.68 modified

\u4FEE\u6539 callBoolean \u4E3A boolean

Function Illustrate

\u6267\u884C Method\uFF0C\u6307\u5B9A Boolean \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

array - method

inline fun <reified T> array(vararg param: Any?): Array<T>
 

Change Records

v1.0.68 added

Function Illustrate

\u6267\u884C Method\uFF0C\u6307\u5B9A Array \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

list - method

inline fun <reified T> list(vararg param: Any?): List<T>
-

Change Records

v1.0.68 added

Function Illustrate

\u6267\u884C Method\uFF0C\u6307\u5B9A List \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

`,418),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(e,[["render",c],["__file","MethodFinder.html.vue"]]);export{i as default}; +

Change Records

v1.0.68 added

Function Illustrate

\u6267\u884C Method\uFF0C\u6307\u5B9A List \u8FD4\u56DE\u503C\u7C7B\u578B\u3002

`,433),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(e,[["render",c],["__file","MethodFinder.html.vue"]]);export{i as default}; diff --git a/docs/assets/MethodFinder.html.97f89f93.js b/docs/assets/MethodFinder.html.97f89f93.js deleted file mode 100644 index 1656f1735..000000000 --- a/docs/assets/MethodFinder.html.97f89f93.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-a4aa4d00","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html","title":"MethodFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method","link":"#onnosuchmethod-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method-1","link":"#onnosuchmethod-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"}');export{e as data}; diff --git a/docs/assets/MethodFinder.html.99f87a1e.js b/docs/assets/MethodFinder.html.99f87a1e.js new file mode 100644 index 000000000..3aa3d0988 --- /dev/null +++ b/docs/assets/MethodFinder.html.99f87a1e.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-a4aa4d00","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html","title":"MethodFinder - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method-1","link":"#returntype-method-1","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method","link":"#onnosuchmethod-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method-1","link":"#onnosuchmethod-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"}');export{e as data}; diff --git a/docs/assets/MethodFinder.html.ede3f1a0.js b/docs/assets/MethodFinder.html.ede3f1a0.js new file mode 100644 index 000000000..04043417d --- /dev/null +++ b/docs/assets/MethodFinder.html.ede3f1a0.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-fd738322","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html","title":"MethodFinder - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"order - method","slug":"order-method","link":"#order-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"name - method","slug":"name-method-1","link":"#name-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-2","link":"#paramcount-method-2","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method-1","link":"#returntype-method-1","children":[]},{"level":2,"title":"superClass - method","slug":"superclass-method","link":"#superclass-method","children":[]},{"level":2,"title":"RemedyPlan - class","slug":"remedyplan-class","link":"#remedyplan-class","children":[{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Process - class","slug":"process-class","link":"#process-class","children":[{"level":3,"title":"result - method","slug":"result-method","link":"#result-method","children":[]},{"level":3,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method","link":"#remedys-method","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method","link":"#onnosuchmethod-method","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":3,"title":"all - method","slug":"all-method-1","link":"#all-method-1","children":[]},{"level":3,"title":"give - method","slug":"give-method","link":"#give-method","children":[]},{"level":3,"title":"giveAll - method","slug":"giveall-method","link":"#giveall-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"waitAll - method","slug":"waitall-method","link":"#waitall-method","children":[]},{"level":3,"title":"remedys - method","slug":"remedys-method-1","link":"#remedys-method-1","children":[]},{"level":3,"title":"onNoSuchMethod - method","slug":"onnosuchmethod-method-1","link":"#onnosuchmethod-method-1","children":[]},{"level":3,"title":"ignored - method","slug":"ignored-method","link":"#ignored-method","children":[]},{"level":3,"title":"Instance - class","slug":"instance-class","link":"#instance-class","children":[]},{"level":3,"title":"array - method","slug":"array-method","link":"#array-method","children":[]},{"level":3,"title":"list - method","slug":"list-method","link":"#list-method","children":[]}]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"}');export{e as data}; diff --git a/docs/assets/MethodRules.html.3a185a29.js b/docs/assets/MethodRules.html.2f27242f.js similarity index 75% rename from docs/assets/MethodRules.html.3a185a29.js rename to docs/assets/MethodRules.html.2f27242f.js index 80e266a6f..7ee40cefc 100644 --- a/docs/assets/MethodRules.html.3a185a29.js +++ b/docs/assets/MethodRules.html.2f27242f.js @@ -1,11 +1,13 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},p=e(`

MethodRules - class

class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
+import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},p=e(`

MethodRules - class

class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

Method \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

name - field

var name: String
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u540D\u79F0\u3002

paramCount - field

var paramCount: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

returnType - field

var returnType: Any?
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

emptyParam - method

fun emptyParam()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

name - method

fun name(conditions: NameConditions)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

param - method

fun param(conditions: ObjectsConditions)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u6761\u4EF6\u3002

\u7279\u522B\u6CE8\u610F

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

name - method

fun name(conditions: NameConditions)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u540D\u79F0\u6761\u4EF6\u3002

paramCount - method

fun paramCount(numRange: IntRange)
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

paramCount - method

fun paramCount(conditions: CountConditions)
-

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,69),l=[p];function c(t,r){return o(),a("div",null,l)}const i=s(n,[["render",c],["__file","MethodRules.html.vue"]]);export{i as default}; +

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

returnType - method

fun returnType(conditions: ObjectConditions)
+

\u53D8\u66F4\u8BB0\u5F55

v1.1.5 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

`,83),l=[p];function t(c,r){return o(),a("div",null,l)}const i=s(n,[["render",t],["__file","MethodRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/MethodRules.html.c10f9770.js b/docs/assets/MethodRules.html.6c9a8df6.js similarity index 50% rename from docs/assets/MethodRules.html.c10f9770.js rename to docs/assets/MethodRules.html.6c9a8df6.js index 2e93f2b43..a2c9fce21 100644 --- a/docs/assets/MethodRules.html.c10f9770.js +++ b/docs/assets/MethodRules.html.6c9a8df6.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-64827680","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html","title":"MethodRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-64827680","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html","title":"MethodRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"}');export{e as data}; diff --git a/docs/assets/MethodRules.html.181e5e4f.js b/docs/assets/MethodRules.html.a600b3a9.js similarity index 76% rename from docs/assets/MethodRules.html.181e5e4f.js rename to docs/assets/MethodRules.html.a600b3a9.js index 6648d50ee..8a55ac133 100644 --- a/docs/assets/MethodRules.html.181e5e4f.js +++ b/docs/assets/MethodRules.html.a600b3a9.js @@ -1,11 +1,13 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},p=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MethodRules - class

class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
+import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},p=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

MethodRules - class

class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
 

Change Records

v1.1.0 added

Function Illustrate

Method \u67E5\u627E\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

name - field

var name: String
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u540D\u79F0\u3002

paramCount - field

var paramCount: Int
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u53D8\u91CF\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u3002

\u82E5\u53C2\u6570\u4E2A\u6570\u5C0F\u4E8E\u96F6\u5219\u5FFD\u7565\u5E76\u4F7F\u7528 param\u3002

returnType - field

var returnType: Any?
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

modifiers - method

fun modifiers(conditions: ModifierConditions)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u6807\u8BC6\u7B26\u7B5B\u9009\u6761\u4EF6\u3002

\u53EF\u4E0D\u8BBE\u7F6E\u7B5B\u9009\u6761\u4EF6\u3002

emptyParam - method

fun emptyParam()
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u7A7A\u53C2\u6570\u3001\u65E0\u53C2\u6570\u3002

param - method

fun param(vararg paramType: Any)
-

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

name - method

fun name(conditions: NameConditions)
+

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u3002

\u5982\u679C\u540C\u65F6\u4F7F\u7528\u4E86 paramCount \u5219 paramType \u7684\u6570\u91CF\u5FC5\u987B\u4E0E paramCount \u5B8C\u5168\u5339\u914D\u3002

\u5982\u679C Method \u4E2D\u5B58\u5728\u4E00\u4E9B\u65E0\u610F\u4E49\u53C8\u5F88\u957F\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 VagueType \u6765\u66FF\u4EE3\u5B83\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

param - method

fun param(conditions: ObjectsConditions)
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u6761\u4EF6\u3002

Pay Attention

\u65E0\u53C2 Method \u8BF7\u4F7F\u7528 emptyParam \u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\u3002

\u6709\u53C2 Method \u5FC5\u987B\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u5B9A\u53C2\u6570\u6216\u4F7F\u7528 paramCount \u6307\u5B9A\u4E2A\u6570\u3002

name - method

fun name(conditions: NameConditions)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u540D\u79F0\u6761\u4EF6\u3002

paramCount - method

fun paramCount(numRange: IntRange)
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u3002

paramCount - method

fun paramCount(conditions: CountConditions)
-

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

`,70),l=[p];function t(c,r){return o(),a("div",null,l)}const i=s(n,[["render",t],["__file","MethodRules.html.vue"]]);export{i as default}; +

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E Method \u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

\u4F60\u53EF\u4EE5\u4E0D\u4F7F\u7528 param \u6307\u5B9A\u53C2\u6570\u7C7B\u578B\u800C\u662F\u4EC5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6307\u5B9A\u53C2\u6570\u4E2A\u6570\u6761\u4EF6\u3002

returnType - method

fun returnType(conditions: ObjectConditions)
+

Change Records

v1.1.5 added

Function Illustrate

\u8BBE\u7F6E Method \u8FD4\u56DE\u503C\u6761\u4EF6\u3002

\u53EF\u4E0D\u586B\u5199\u8FD4\u56DE\u503C\u3002

`,84),t=[p];function l(c,r){return o(),a("div",null,t)}const i=s(n,[["render",l],["__file","MethodRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/MethodRules.html.146b27be.js b/docs/assets/MethodRules.html.afeaf85e.js similarity index 50% rename from docs/assets/MethodRules.html.146b27be.js rename to docs/assets/MethodRules.html.afeaf85e.js index 7d7008413..d95f39ced 100644 --- a/docs/assets/MethodRules.html.146b27be.js +++ b/docs/assets/MethodRules.html.afeaf85e.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-5388621e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html","title":"MethodRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-5388621e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html","title":"MethodRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"name - field","slug":"name-field","link":"#name-field","children":[]},{"level":2,"title":"paramCount - field","slug":"paramcount-field","link":"#paramcount-field","children":[]},{"level":2,"title":"returnType - field","slug":"returntype-field","link":"#returntype-field","children":[]},{"level":2,"title":"modifiers - method","slug":"modifiers-method","link":"#modifiers-method","children":[]},{"level":2,"title":"emptyParam - method","slug":"emptyparam-method","link":"#emptyparam-method","children":[]},{"level":2,"title":"param - method","slug":"param-method","link":"#param-method","children":[]},{"level":2,"title":"param - method","slug":"param-method-1","link":"#param-method-1","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method","link":"#paramcount-method","children":[]},{"level":2,"title":"paramCount - method","slug":"paramcount-method-1","link":"#paramcount-method-1","children":[]},{"level":2,"title":"returnType - method","slug":"returntype-method","link":"#returntype-method","children":[]}],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"}');export{e as data}; diff --git a/docs/assets/ModifierRules.html.5e136d47.js b/docs/assets/ModifierRules.html.d20ef28f.js similarity index 99% rename from docs/assets/ModifierRules.html.5e136d47.js rename to docs/assets/ModifierRules.html.d20ef28f.js index 1d31f0460..14ab7af5a 100644 --- a/docs/assets/ModifierRules.html.5e136d47.js +++ b/docs/assets/ModifierRules.html.d20ef28f.js @@ -1,4 +1,4 @@ -import{_ as e,o as s,c as o,a}from"./app.99fcdd51.js";const c={},n=a(`

ModifierRules - class

class ModifierRules private constructor()
+import{_ as e,o as s,c as o,a}from"./app.6074a838.js";const c={},n=a(`

ModifierRules - class

class ModifierRules private constructor()
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u65B0\u589E Class \u7684\u63CF\u8FF0\u7B26\u5224\u65AD

\u4F5C\u4E3A lambda \u6574\u4F53\u5224\u65AD\u6761\u4EF6\u4F7F\u7528

\u79FB\u52A8\u5230 base \u5305\u540D

\u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

\u529F\u80FD\u63CF\u8FF0

\u8FD9\u662F\u4E00\u4E2A Class\u3001Member \u63CF\u8FF0\u7B26\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

\u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

isPublic - i-ext-field

val isPublic: Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

\u529F\u80FD\u63CF\u8FF0

Class\u3001Member \u7C7B\u578B\u662F\u5426\u5305\u542B public\u3002

isPrivate - i-ext-field

val isPrivate: Boolean
 

\u53D8\u66F4\u8BB0\u5F55

v1.0.67 \u65B0\u589E

v1.1.0 \u4FEE\u6539

\u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

\u529F\u80FD\u63CF\u8FF0

Class\u3001Member \u7C7B\u578B\u662F\u5426\u5305\u542B private\u3002

isProtected - i-ext-field

val isProtected: Boolean
diff --git a/docs/assets/ModifierRules.html.a23f860d.js b/docs/assets/ModifierRules.html.f137fa02.js
similarity index 99%
rename from docs/assets/ModifierRules.html.a23f860d.js
rename to docs/assets/ModifierRules.html.f137fa02.js
index 7972dfc1c..b795df772 100644
--- a/docs/assets/ModifierRules.html.a23f860d.js
+++ b/docs/assets/ModifierRules.html.f137fa02.js
@@ -1,4 +1,4 @@
-import{_ as e,o as s,c as o,a}from"./app.99fcdd51.js";const c={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModifierRules - class

class ModifierRules private constructor()
+import{_ as e,o as s,c as o,a}from"./app.6074a838.js";const c={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModifierRules - class

class ModifierRules private constructor()
 

Change Records

v1.0.67 added

v1.1.0 modified

\u65B0\u589E Class \u7684\u63CF\u8FF0\u7B26\u5224\u65AD

\u4F5C\u4E3A lambda \u6574\u4F53\u5224\u65AD\u6761\u4EF6\u4F7F\u7528

\u79FB\u52A8\u5230 base \u5305\u540D

\u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

Function Illustrate

\u8FD9\u662F\u4E00\u4E2A Class\u3001Member \u63CF\u8FF0\u7B26\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

\u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

isPublic - i-ext-field

val isPublic: Boolean
 

Change Records

v1.0.67 added

v1.1.0 modified

\u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

Function Illustrate

Class\u3001Member \u7C7B\u578B\u662F\u5426\u5305\u542B public\u3002

isPrivate - i-ext-field

val isPrivate: Boolean
 

Change Records

v1.0.67 added

v1.1.0 modified

\u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

Function Illustrate

Class\u3001Member \u7C7B\u578B\u662F\u5426\u5305\u542B private\u3002

isProtected - i-ext-field

val isProtected: Boolean
diff --git a/docs/assets/ModuleAppActivity.html.f8671049.js b/docs/assets/ModuleAppActivity.html.3bf696cc.js
similarity index 95%
rename from docs/assets/ModuleAppActivity.html.f8671049.js
rename to docs/assets/ModuleAppActivity.html.3bf696cc.js
index 1f3a61acb..b211968c3 100644
--- a/docs/assets/ModuleAppActivity.html.f8671049.js
+++ b/docs/assets/ModuleAppActivity.html.3bf696cc.js
@@ -1,2 +1,2 @@
-import{_ as s,o as e,c as o,a as t}from"./app.99fcdd51.js";const c={},a=t(`

ModuleAppActivity - class

open class ModuleAppActivity : Activity()
+import{_ as s,o as e,c as o,a as t}from"./app.6074a838.js";const c={},a=t(`

ModuleAppActivity - class

open class ModuleAppActivity : Activity()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EE3\u7406 Activity\u3002

\u7EE7\u627F\u4E8E\u6B64\u7C7B\u7684 Activity \u53EF\u4EE5\u540C\u65F6\u5728\u5BBF\u4E3B\u4E0E\u6A21\u5757\u4E2D\u542F\u52A8\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u8C03\u7528 Context.registerModuleAppActivities \u8FDB\u884C\u6CE8\u518C\u3002

`,8),p=[a];function l(n,i){return e(),o("div",null,p)}const d=s(c,[["render",l],["__file","ModuleAppActivity.html.vue"]]);export{d as default}; diff --git a/docs/assets/ModuleAppActivity.html.31db2b27.js b/docs/assets/ModuleAppActivity.html.98503158.js similarity index 96% rename from docs/assets/ModuleAppActivity.html.31db2b27.js rename to docs/assets/ModuleAppActivity.html.98503158.js index 65b4a9591..5fa62a6bd 100644 --- a/docs/assets/ModuleAppActivity.html.31db2b27.js +++ b/docs/assets/ModuleAppActivity.html.98503158.js @@ -1,2 +1,2 @@ -import{_ as e,o as s,c as o,a as t}from"./app.99fcdd51.js";const a={},n=t(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleAppActivity - class

open class ModuleAppActivity : Activity()
+import{_ as e,o as s,c as o,a as t}from"./app.6074a838.js";const a={},n=t(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleAppActivity - class

open class ModuleAppActivity : Activity()
 

Change Records

v1.1.0 added

Function Illustrate

\u4EE3\u7406 Activity\u3002

\u7EE7\u627F\u4E8E\u6B64\u7C7B\u7684 Activity \u53EF\u4EE5\u540C\u65F6\u5728\u5BBF\u4E3B\u4E0E\u6A21\u5757\u4E2D\u542F\u52A8\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u8C03\u7528 Context.registerModuleAppActivities \u8FDB\u884C\u6CE8\u518C\u3002

`,9),c=[n];function p(l,i){return s(),o("div",null,c)}const d=e(a,[["render",p],["__file","ModuleAppActivity.html.vue"]]);export{d as default}; diff --git a/docs/assets/ModuleAppCompatActivity.html.6fd72462.js b/docs/assets/ModuleAppCompatActivity.html.211b0863.js similarity index 97% rename from docs/assets/ModuleAppCompatActivity.html.6fd72462.js rename to docs/assets/ModuleAppCompatActivity.html.211b0863.js index c7befb6b1..b65340887 100644 --- a/docs/assets/ModuleAppCompatActivity.html.6fd72462.js +++ b/docs/assets/ModuleAppCompatActivity.html.211b0863.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as e,a as p}from"./app.99fcdd51.js";const a={},t=p(`

ModuleAppCompatActivity - class

open class ModuleAppCompatActivity : AppCompatActivity()
+import{_ as s,o,c as e,a as p}from"./app.6074a838.js";const a={},t=p(`

ModuleAppCompatActivity - class

open class ModuleAppCompatActivity : AppCompatActivity()
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u4EE3\u7406 AppCompatActivity\u3002

\u7EE7\u627F\u4E8E\u6B64\u7C7B\u7684 Activity \u53EF\u4EE5\u540C\u65F6\u5728\u5BBF\u4E3B\u4E0E\u6A21\u5757\u4E2D\u542F\u52A8\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u8C03\u7528 Context.registerModuleAppActivities \u8FDB\u884C\u6CE8\u518C\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u91CD\u5199 moduleTheme \u8BBE\u7F6E AppCompat \u4E3B\u9898\uFF0C\u5426\u5219\u4F1A\u65E0\u6CD5\u542F\u52A8\u3002

moduleTheme - field

open val moduleTheme: Int
 

\u53D8\u66F4\u8BB0\u5F55

v1.1.0 \u65B0\u589E

\u529F\u80FD\u63CF\u8FF0

\u8BBE\u7F6E\u5F53\u524D\u4EE3\u7406\u7684 Activity \u4E3B\u9898\u3002

`,15),c=[t];function l(n,d){return o(),e("div",null,c)}const r=s(a,[["render",l],["__file","ModuleAppCompatActivity.html.vue"]]);export{r as default}; diff --git a/docs/assets/ModuleAppCompatActivity.html.d6ea50a2.js b/docs/assets/ModuleAppCompatActivity.html.6270d1af.js similarity index 97% rename from docs/assets/ModuleAppCompatActivity.html.d6ea50a2.js rename to docs/assets/ModuleAppCompatActivity.html.6270d1af.js index 0836c031f..543188db6 100644 --- a/docs/assets/ModuleAppCompatActivity.html.d6ea50a2.js +++ b/docs/assets/ModuleAppCompatActivity.html.6270d1af.js @@ -1,3 +1,3 @@ -import{_ as e,o,c as s,a}from"./app.99fcdd51.js";const t={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleAppCompatActivity - class

open class ModuleAppCompatActivity : AppCompatActivity()
+import{_ as e,o,c as s,a}from"./app.6074a838.js";const t={},n=a(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleAppCompatActivity - class

open class ModuleAppCompatActivity : AppCompatActivity()
 

Change Records

v1.1.0 added

Function Illustrate

\u4EE3\u7406 AppCompatActivity\u3002

\u7EE7\u627F\u4E8E\u6B64\u7C7B\u7684 Activity \u53EF\u4EE5\u540C\u65F6\u5728\u5BBF\u4E3B\u4E0E\u6A21\u5757\u4E2D\u542F\u52A8\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u65F6\u8C03\u7528 Context.registerModuleAppActivities \u8FDB\u884C\u6CE8\u518C\u3002

\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u9700\u8981\u91CD\u5199 moduleTheme \u8BBE\u7F6E AppCompat \u4E3B\u9898\uFF0C\u5426\u5219\u4F1A\u65E0\u6CD5\u542F\u52A8\u3002

moduleTheme - field

open val moduleTheme: Int
 

Change Records

v1.1.0 added

Function Illustrate

\u8BBE\u7F6E\u5F53\u524D\u4EE3\u7406\u7684 Activity \u4E3B\u9898\u3002

`,16),p=[n];function c(l,r){return o(),s("div",null,p)}const d=e(t,[["render",c],["__file","ModuleAppCompatActivity.html.vue"]]);export{d as default}; diff --git a/docs/assets/ModuleApplication.html.b6666040.js b/docs/assets/ModuleApplication.html.de53842b.js similarity index 99% rename from docs/assets/ModuleApplication.html.b6666040.js rename to docs/assets/ModuleApplication.html.de53842b.js index 8b244ed3d..39ac8c980 100644 --- a/docs/assets/ModuleApplication.html.b6666040.js +++ b/docs/assets/ModuleApplication.html.de53842b.js @@ -1,4 +1,4 @@ -import{_ as a,r as l,o as p,c,b as s,d as i,a as e,e as n}from"./app.99fcdd51.js";const t={},d=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleApplication - class

open class ModuleApplication: Application()
+import{_ as a,r as l,o as p,c,b as s,d as i,a as e,e as n}from"./app.6074a838.js";const t={},d=e(`

Notice

The English translation of this page has not been completed, you are welcome to contribute translations to us.

You can use the Chrome Translation Plugin to translate entire pages for reference.

ModuleApplication - class

open class ModuleApplication: Application()
 

Change Records

v1.0.77 added

Function Illustrate

\u8FD9\u662F\u5BF9\u4F7F\u7528 YukiHookAPI Xposed \u6A21\u5757\u5B9E\u73B0\u4E2D\u7684\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\u3002

\u5728\u4F60\u7684 Xposed \u6A21\u5757\u7684 Application \u4E2D\u7EE7\u627F\u6B64\u7C7B\u3002

\u6216\u5728 AndroidManifest.xml \u7684 application \u6807\u7B7E\u4E2D\u6307\u5B9A\u6B64\u7C7B\u3002

\u76EE\u524D\u53EF\u5B9E\u73B0\u529F\u80FD\u5982\u4E0B

`,10),r=e("
  • \u5168\u5C40\u5171\u4EAB\u6A21\u5757\u4E2D\u9759\u6001\u7684 appContext

  • \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u88C5\u8F7D YukiHookAPI.Config \u4EE5\u786E\u4FDD YukiHookAPI.Configs.debugTag \u4E0D\u9700\u8981\u91CD\u590D\u5B9A\u4E49

  • \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u4F7F\u7528 YukiHookDataChannel \u8FDB\u884C\u901A\u8BAF

  • ",3),u=n("\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u7CFB\u7EDF\u9690\u85CF API\uFF0C\u6838\u5FC3\u6280\u672F\u5F15\u7528\u4E86\u5F00\u6E90\u9879\u76EE "),A={href:"https://github.com/tiann/FreeReflection",target:"_blank",rel:"noopener noreferrer"},y=n("FreeReflection"),m=s("li",null,[s("p",null,[n("\u5728\u6A21\u5757\u4E2D\u4F7F\u7528 "),s("code",null,"YukiHookAPI.Status.isTaiChiModuleActive"),n(" \u5224\u65AD\u592A\u6781\u3001\u65E0\u6781\u6FC0\u6D3B\u72B6\u6001")])],-1),v=e(`

    Function Example

    \u5C06\u6B64\u7C7B\u7EE7\u627F\u5230\u4F60\u7684\u81EA\u5B9A\u4E49 Application \u4E0A\u3002

    The following example

    package com.demo
     
     class MyApplication: ModuleApplication() {
    diff --git a/docs/assets/ModuleApplication.html.0947d2e6.js b/docs/assets/ModuleApplication.html.eba04cee.js
    similarity index 99%
    rename from docs/assets/ModuleApplication.html.0947d2e6.js
    rename to docs/assets/ModuleApplication.html.eba04cee.js
    index c97c371a2..0ac6aea85 100644
    --- a/docs/assets/ModuleApplication.html.0947d2e6.js
    +++ b/docs/assets/ModuleApplication.html.eba04cee.js
    @@ -1,4 +1,4 @@
    -import{_ as a,r as l,o as p,c,b as s,d as i,a as o,e as n}from"./app.99fcdd51.js";const t={},d=o(`

    ModuleApplication - class

    open class ModuleApplication: Application()
    +import{_ as a,r as l,o as p,c,b as s,d as i,a as o,e as n}from"./app.6074a838.js";const t={},d=o(`

    ModuleApplication - class

    open class ModuleApplication: Application()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.77 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u5BF9\u4F7F\u7528 YukiHookAPI Xposed \u6A21\u5757\u5B9E\u73B0\u4E2D\u7684\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\u3002

    \u5728\u4F60\u7684 Xposed \u6A21\u5757\u7684 Application \u4E2D\u7EE7\u627F\u6B64\u7C7B\u3002

    \u6216\u5728 AndroidManifest.xml \u7684 application \u6807\u7B7E\u4E2D\u6307\u5B9A\u6B64\u7C7B\u3002

    \u76EE\u524D\u53EF\u5B9E\u73B0\u529F\u80FD\u5982\u4E0B

    `,9),r=o("
  • \u5168\u5C40\u5171\u4EAB\u6A21\u5757\u4E2D\u9759\u6001\u7684 appContext

  • \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u88C5\u8F7D YukiHookAPI.Config \u4EE5\u786E\u4FDD YukiHookAPI.Configs.debugTag \u4E0D\u9700\u8981\u91CD\u590D\u5B9A\u4E49

  • \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u4F7F\u7528 YukiHookDataChannel \u8FDB\u884C\u901A\u8BAF

  • ",3),u=n("\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u7CFB\u7EDF\u9690\u85CF API\uFF0C\u6838\u5FC3\u6280\u672F\u5F15\u7528\u4E86\u5F00\u6E90\u9879\u76EE "),A={href:"https://github.com/tiann/FreeReflection",target:"_blank",rel:"noopener noreferrer"},y=n("FreeReflection"),v=s("li",null,[s("p",null,[n("\u5728\u6A21\u5757\u4E2D\u4F7F\u7528 "),s("code",null,"YukiHookAPI.Status.isTaiChiModuleActive"),n(" \u5224\u65AD\u592A\u6781\u3001\u65E0\u6781\u6FC0\u6D3B\u72B6\u6001")])],-1),m=o(`

    \u529F\u80FD\u793A\u4F8B

    \u5C06\u6B64\u7C7B\u7EE7\u627F\u5230\u4F60\u7684\u81EA\u5B9A\u4E49 Application \u4E0A\u3002

    \u793A\u4F8B\u5982\u4E0B

    package com.demo
     
     class MyApplication: ModuleApplication() {
    diff --git a/docs/assets/ModuleClassLoader.html.7b5cc225.js b/docs/assets/ModuleClassLoader.html.1b539bd2.js
    similarity index 98%
    rename from docs/assets/ModuleClassLoader.html.7b5cc225.js
    rename to docs/assets/ModuleClassLoader.html.1b539bd2.js
    index 63fff9006..7cd833068 100644
    --- a/docs/assets/ModuleClassLoader.html.7b5cc225.js
    +++ b/docs/assets/ModuleClassLoader.html.1b539bd2.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
     

    Change Records

    v1.1.2 added

    Function Illustrate

    \u81EA\u52A8\u5904\u7406 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0E\u6A21\u5757\u73AF\u5883\u7684 ClassLoader\u3002

    companion object - object

    Change Records

    v1.1.2 added

    excludeHostClasses - method

    fun excludeHostClasses(vararg name: String)
     

    Change Records

    v1.1.2 added

    Function Illustrate

    \u6DFB\u52A0\u5230 Hook APP (\u5BBF\u4E3B) Class \u6392\u9664\u5217\u8868\u3002

    \u6392\u9664\u5217\u8868\u4E2D\u7684 Class \u5C06\u4F1A\u4F7F\u7528\u5BBF\u4E3B\u7684 ClassLoader \u8FDB\u884C\u88C5\u8F7D\u3002

    Pay Attention

    \u6392\u9664\u5217\u8868\u4EC5\u4F1A\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u751F\u6548\u3002

    excludeModuleClasses - method

    fun excludeModuleClasses(vararg name: String)
     

    Change Records

    v1.1.2 added

    Function Illustrate

    \u6DFB\u52A0\u5230\u6A21\u5757 Class \u6392\u9664\u5217\u8868\u3002

    \u6392\u9664\u5217\u8868\u4E2D\u7684 Class \u5C06\u4F1A\u4F7F\u7528\u6A21\u5757 (\u5F53\u524D\u5BBF\u4E3B\u73AF\u5883\u7684\u6A21\u5757\u6CE8\u5165\u8FDB\u7A0B) \u7684 ClassLoader \u8FDB\u884C\u88C5\u8F7D\u3002

    Pay Attention

    \u6392\u9664\u5217\u8868\u4EC5\u4F1A\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u751F\u6548\u3002

    `,26),c=[l];function t(p,r){return e(),o("div",null,c)}const i=s(n,[["render",t],["__file","ModuleClassLoader.html.vue"]]);export{i as default}; diff --git a/docs/assets/ModuleClassLoader.html.dd180fc9.js b/docs/assets/ModuleClassLoader.html.c67890dd.js similarity index 98% rename from docs/assets/ModuleClassLoader.html.dd180fc9.js rename to docs/assets/ModuleClassLoader.html.c67890dd.js index 9d9937653..6a795a271 100644 --- a/docs/assets/ModuleClassLoader.html.dd180fc9.js +++ b/docs/assets/ModuleClassLoader.html.c67890dd.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const l={},n=a(`

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
    +import{_ as s,o,c as e,a}from"./app.6074a838.js";const l={},n=a(`

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.2 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u81EA\u52A8\u5904\u7406 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0E\u6A21\u5757\u73AF\u5883\u7684 ClassLoader\u3002

    companion object - object

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.2 \u65B0\u589E

    excludeHostClasses - method

    fun excludeHostClasses(vararg name: String)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.2 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6DFB\u52A0\u5230 Hook APP (\u5BBF\u4E3B) Class \u6392\u9664\u5217\u8868\u3002

    \u6392\u9664\u5217\u8868\u4E2D\u7684 Class \u5C06\u4F1A\u4F7F\u7528\u5BBF\u4E3B\u7684 ClassLoader \u8FDB\u884C\u88C5\u8F7D\u3002

    \u7279\u522B\u6CE8\u610F

    \u6392\u9664\u5217\u8868\u4EC5\u4F1A\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u751F\u6548\u3002

    excludeModuleClasses - method

    fun excludeModuleClasses(vararg name: String)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.2 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6DFB\u52A0\u5230\u6A21\u5757 Class \u6392\u9664\u5217\u8868\u3002

    \u6392\u9664\u5217\u8868\u4E2D\u7684 Class \u5C06\u4F1A\u4F7F\u7528\u6A21\u5757 (\u5F53\u524D\u5BBF\u4E3B\u73AF\u5883\u7684\u6A21\u5757\u6CE8\u5165\u8FDB\u7A0B) \u7684 ClassLoader \u8FDB\u884C\u88C5\u8F7D\u3002

    \u7279\u522B\u6CE8\u610F

    \u6392\u9664\u5217\u8868\u4EC5\u4F1A\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u751F\u6548\u3002

    `,25),c=[n];function p(t,d){return o(),e("div",null,c)}const i=s(l,[["render",p],["__file","ModuleClassLoader.html.vue"]]);export{i as default}; diff --git a/docs/assets/ModuleContextThemeWrapper.html.5f49ff05.js b/docs/assets/ModuleContextThemeWrapper.html.477209a2.js similarity index 98% rename from docs/assets/ModuleContextThemeWrapper.html.5f49ff05.js rename to docs/assets/ModuleContextThemeWrapper.html.477209a2.js index e10520d31..5c977ff40 100644 --- a/docs/assets/ModuleContextThemeWrapper.html.5f49ff05.js +++ b/docs/assets/ModuleContextThemeWrapper.html.477209a2.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},t=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
    +import{_ as s,o,c as e,a as n}from"./app.6074a838.js";const a={},t=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u4EE3\u7406 ContextThemeWrapper\u3002

    \u901A\u8FC7\u5305\u88C5\uFF0C\u4F60\u53EF\u4EE5\u8F7B\u677E\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6765\u81EA\u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    applyConfiguration - method

    fun applyConfiguration(initiate: Configuration.() -> Unit): ModuleContextThemeWrapper
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u8BBE\u7F6E\u5F53\u524D ModuleContextThemeWrapper \u7684 Configuration\u3002

    \u8BBE\u7F6E\u540E\u4F1A\u81EA\u52A8\u8C03\u7528 Resources.updateConfiguration\u3002

    `,15),p=[t];function l(r,c){return o(),e("div",null,p)}const d=s(a,[["render",l],["__file","ModuleContextThemeWrapper.html.vue"]]);export{d as default}; diff --git a/docs/assets/ModuleContextThemeWrapper.html.5e67972f.js b/docs/assets/ModuleContextThemeWrapper.html.81c085e0.js similarity index 98% rename from docs/assets/ModuleContextThemeWrapper.html.5e67972f.js rename to docs/assets/ModuleContextThemeWrapper.html.81c085e0.js index 961eb985a..82550be15 100644 --- a/docs/assets/ModuleContextThemeWrapper.html.5e67972f.js +++ b/docs/assets/ModuleContextThemeWrapper.html.81c085e0.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},p=a(`

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
    +import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},p=a(`

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EE3\u7406 ContextThemeWrapper\u3002

    \u901A\u8FC7\u5305\u88C5\uFF0C\u4F60\u53EF\u4EE5\u8F7B\u677E\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6765\u81EA\u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    applyConfiguration - method

    fun applyConfiguration(initiate: Configuration.() -> Unit): ModuleContextThemeWrapper
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u8BBE\u7F6E\u5F53\u524D ModuleContextThemeWrapper \u7684 Configuration\u3002

    \u8BBE\u7F6E\u540E\u4F1A\u81EA\u52A8\u8C03\u7528 Resources.updateConfiguration\u3002

    `,14),l=[p];function t(c,r){return o(),e("div",null,l)}const i=s(n,[["render",t],["__file","ModuleContextThemeWrapper.html.vue"]]);export{i as default}; diff --git a/docs/assets/ModulePreferenceFragment.html.03eaf777.js b/docs/assets/ModulePreferenceFragment.html.88c44372.js similarity index 99% rename from docs/assets/ModulePreferenceFragment.html.03eaf777.js rename to docs/assets/ModulePreferenceFragment.html.88c44372.js index b76a3d67e..d855795be 100644 --- a/docs/assets/ModulePreferenceFragment.html.03eaf777.js +++ b/docs/assets/ModulePreferenceFragment.html.88c44372.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
    +import{_ as s,o as e,c as n,a}from"./app.6074a838.js";const o={},l=a(`

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.78 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u5BF9\u4F7F\u7528 YukiHookAPI Xposed \u6A21\u5757\u5B9E\u73B0\u4E2D\u7684\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\u3002

    \u6B64\u7C7B\u63A5\u7BA1\u4E86 PreferenceFragmentCompat \u5E76\u5BF9\u5176\u5B9E\u73B0\u4E86 Sp \u5B58\u50A8\u5728 Xposed \u6A21\u5757\u4E2D\u7684\u5168\u5C40\u53EF\u8BFB\u53EF\u5199\u3002

    \u5728\u4F60\u4F7F\u7528 PreferenceFragmentCompat \u7684\u5B9E\u4F8B\u4E2D\uFF0C\u5C06\u7EE7\u627F\u5BF9\u8C61\u6362\u6210\u6B64\u7C7B\u3002

    \u7136\u540E\u8BF7\u5C06\u91CD\u5199\u65B9\u6CD5\u7531 onCreatePreferences \u66FF\u6362\u4E3A onCreatePreferencesInModuleApp \u5373\u53EF\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F7F\u7528 ModulePreferenceFragment \u521B\u5EFA\u4E00\u4E2A PreferenceFragmentCompat \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    class SettingsFragment : ModulePreferenceFragment() {
     
         override fun onCreatePreferencesInModuleApp(savedInstanceState: Bundle?, rootKey: String?) {
    diff --git a/docs/assets/ModulePreferenceFragment.html.f7ecd440.js b/docs/assets/ModulePreferenceFragment.html.bb2257cc.js
    similarity index 99%
    rename from docs/assets/ModulePreferenceFragment.html.f7ecd440.js
    rename to docs/assets/ModulePreferenceFragment.html.bb2257cc.js
    index a63f0d70d..3fbe0127e 100644
    --- a/docs/assets/ModulePreferenceFragment.html.f7ecd440.js
    +++ b/docs/assets/ModulePreferenceFragment.html.bb2257cc.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
    +import{_ as s,o as e,c as n,a}from"./app.6074a838.js";const o={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
     

    Change Records

    v1.0.78 added

    Function Illustrate

    \u8FD9\u662F\u5BF9\u4F7F\u7528 YukiHookAPI Xposed \u6A21\u5757\u5B9E\u73B0\u4E2D\u7684\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\u3002

    \u6B64\u7C7B\u63A5\u7BA1\u4E86 PreferenceFragmentCompat \u5E76\u5BF9\u5176\u5B9E\u73B0\u4E86 Sp \u5B58\u50A8\u5728 Xposed \u6A21\u5757\u4E2D\u7684\u5168\u5C40\u53EF\u8BFB\u53EF\u5199\u3002

    \u5728\u4F60\u4F7F\u7528 PreferenceFragmentCompat \u7684\u5B9E\u4F8B\u4E2D\uFF0C\u5C06\u7EE7\u627F\u5BF9\u8C61\u6362\u6210\u6B64\u7C7B\u3002

    \u7136\u540E\u8BF7\u5C06\u91CD\u5199\u65B9\u6CD5\u7531 onCreatePreferences \u66FF\u6362\u4E3A onCreatePreferencesInModuleApp \u5373\u53EF\u3002

    Function Example

    \u4F7F\u7528 ModulePreferenceFragment \u521B\u5EFA\u4E00\u4E2A PreferenceFragmentCompat \u5BF9\u8C61\u3002

    The following example

    class SettingsFragment : ModulePreferenceFragment() {
     
         override fun onCreatePreferencesInModuleApp(savedInstanceState: Bundle?, rootKey: String?) {
    diff --git a/docs/assets/NameRules.html.eb726c41.js b/docs/assets/NameRules.html.16838860.js
    similarity index 99%
    rename from docs/assets/NameRules.html.eb726c41.js
    rename to docs/assets/NameRules.html.16838860.js
    index 964d0a887..1dec8a63a 100644
    --- a/docs/assets/NameRules.html.eb726c41.js
    +++ b/docs/assets/NameRules.html.16838860.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as o,a as n}from"./app.99fcdd51.js";const a={},p=n(`

    NameRules - class

    class NameRules private constructor()
    +import{_ as s,o as e,c as o,a as n}from"./app.6074a838.js";const a={},p=n(`

    NameRules - class

    class NameRules private constructor()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    NameConditions \u66F4\u540D\u4E3A NameRules

    \u4F5C\u4E3A lambda \u6574\u4F53\u5224\u65AD\u6761\u4EF6\u4F7F\u7528

    \u79FB\u52A8\u5230 base \u5305\u540D

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u6A21\u7CCA Class\u3001Member \u540D\u79F0\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

    \u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

    String.isSynthetic - i-ext-method

    fun String.isSynthetic(index: Int): Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    \u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

    \u529F\u80FD\u63CF\u8FF0

    \u662F\u5426\u4E3A\u533F\u540D\u7C7B\u7684\u4E3B\u7C7B\u8C03\u7528\u5BF9\u8C61\u3002

    String.isOnlySymbols - i-ext-method

    fun String.isOnlySymbols(): Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    \u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

    \u529F\u80FD\u63CF\u8FF0

    \u662F\u5426\u53EA\u6709\u7B26\u53F7\u3002

    String.isOnlyLetters - i-ext-method

    fun String.isOnlyLetters(): Boolean
    diff --git a/docs/assets/NameRules.html.1ac92120.js b/docs/assets/NameRules.html.b0ccbaa6.js
    similarity index 99%
    rename from docs/assets/NameRules.html.1ac92120.js
    rename to docs/assets/NameRules.html.b0ccbaa6.js
    index 7f5b716f6..12e331361 100644
    --- a/docs/assets/NameRules.html.1ac92120.js
    +++ b/docs/assets/NameRules.html.b0ccbaa6.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as o,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    NameRules - class

    class NameRules private constructor()
    +import{_ as s,o as e,c as o,a as n}from"./app.6074a838.js";const a={},l=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    NameRules - class

    class NameRules private constructor()
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    NameConditions \u66F4\u540D\u4E3A NameRules

    \u4F5C\u4E3A lambda \u6574\u4F53\u5224\u65AD\u6761\u4EF6\u4F7F\u7528

    \u79FB\u52A8\u5230 base \u5305\u540D

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u6A21\u7CCA Class\u3001Member \u540D\u79F0\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

    \u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

    String.isSynthetic - i-ext-method

    fun String.isSynthetic(index: Int): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    \u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

    Function Illustrate

    \u662F\u5426\u4E3A\u533F\u540D\u7C7B\u7684\u4E3B\u7C7B\u8C03\u7528\u5BF9\u8C61\u3002

    String.isOnlySymbols - i-ext-method

    fun String.isOnlySymbols(): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    \u7EDF\u4E00\u5408\u5E76\u5230\u6269\u5C55\u65B9\u6CD5\u5E76\u6539\u540D

    Function Illustrate

    \u662F\u5426\u53EA\u6709\u7B26\u53F7\u3002

    String.isOnlyLetters - i-ext-method

    fun String.isOnlyLetters(): Boolean
    diff --git a/docs/assets/ObjectRules.html.4b682129.js b/docs/assets/ObjectRules.html.4b682129.js
    new file mode 100644
    index 000000000..ba4f83d7b
    --- /dev/null
    +++ b/docs/assets/ObjectRules.html.4b682129.js
    @@ -0,0 +1 @@
    +const e=JSON.parse('{"key":"v-80fd32ec","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html","title":"ObjectRules - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.md"}');export{e as data};
    diff --git a/docs/assets/ObjectRules.html.5f24915c.js b/docs/assets/ObjectRules.html.5f24915c.js
    new file mode 100644
    index 000000000..bfa4cfce3
    --- /dev/null
    +++ b/docs/assets/ObjectRules.html.5f24915c.js
    @@ -0,0 +1,2 @@
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},t=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ObjectRules - class

    class ObjectRules private constructor(private val instance: Any)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u4EFB\u610F\u5BF9\u8C61\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

    \u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

    `,8),c=[t];function l(r,p){return e(),o("div",null,c)}const d=s(n,[["render",l],["__file","ObjectRules.html.vue"]]);export{d as default}; diff --git a/docs/assets/ObjectRules.html.70d91cad.js b/docs/assets/ObjectRules.html.70d91cad.js new file mode 100644 index 000000000..7896d75f3 --- /dev/null +++ b/docs/assets/ObjectRules.html.70d91cad.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-652b815b","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html","title":"ObjectRules - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672424460000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.md"}');export{e as data}; diff --git a/docs/assets/ObjectRules.html.b6996688.js b/docs/assets/ObjectRules.html.b6996688.js new file mode 100644 index 000000000..7563a003b --- /dev/null +++ b/docs/assets/ObjectRules.html.b6996688.js @@ -0,0 +1,2 @@ +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const l={},n=a(`

    ObjectRules - class

    class ObjectRules private constructor(private val instance: Any)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u4EFB\u610F\u5BF9\u8C61\u6761\u4EF6\u5B9E\u73B0\u7C7B\u3002

    \u53EF\u5BF9 R8 \u6DF7\u6DC6\u540E\u7684 Class\u3001Member \u8FDB\u884C\u66F4\u52A0\u8BE6\u7EC6\u7684\u5B9A\u4F4D\u3002

    `,7),c=[n];function t(p,r){return e(),o("div",null,c)}const i=s(l,[["render",t],["__file","ObjectRules.html.vue"]]);export{i as default}; diff --git a/docs/assets/PackageParam.html.9385a8d2.js b/docs/assets/PackageParam.html.510255b8.js similarity index 97% rename from docs/assets/PackageParam.html.9385a8d2.js rename to docs/assets/PackageParam.html.510255b8.js index 13ff52e4b..6ebd57923 100644 --- a/docs/assets/PackageParam.html.9385a8d2.js +++ b/docs/assets/PackageParam.html.510255b8.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-100b529c","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html","title":"PackageParam - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"appClassLoader - field","slug":"appclassloader-field","link":"#appclassloader-field","children":[]},{"level":2,"title":"appInfo - field","slug":"appinfo-field","link":"#appinfo-field","children":[]},{"level":2,"title":"appUserId - field","slug":"appuserid-field","link":"#appuserid-field","children":[]},{"level":2,"title":"appContext - field","slug":"appcontext-field","link":"#appcontext-field","children":[]},{"level":2,"title":"appResources - field","slug":"appresources-field","link":"#appresources-field","children":[]},{"level":2,"title":"systemContext - field","slug":"systemcontext-field","link":"#systemcontext-field","children":[]},{"level":2,"title":"processName - field","slug":"processname-field","link":"#processname-field","children":[]},{"level":2,"title":"packageName - field","slug":"packagename-field","link":"#packagename-field","children":[]},{"level":2,"title":"isFirstApplication - field","slug":"isfirstapplication-field","link":"#isfirstapplication-field","children":[]},{"level":2,"title":"mainProcessName - field","slug":"mainprocessname-field","link":"#mainprocessname-field","children":[]},{"level":2,"title":"moduleAppFilePath - field","slug":"moduleappfilepath-field","link":"#moduleappfilepath-field","children":[]},{"level":2,"title":"moduleAppResources - field","slug":"moduleappresources-field","link":"#moduleappresources-field","children":[]},{"level":2,"title":"prefs - field","slug":"prefs-field","link":"#prefs-field","children":[]},{"level":2,"title":"prefs - method","slug":"prefs-method","link":"#prefs-method","children":[]},{"level":2,"title":"dataChannel - field","slug":"datachannel-field","link":"#datachannel-field","children":[]},{"level":2,"title":"resources - method","slug":"resources-method","link":"#resources-method","children":[]},{"level":2,"title":"refreshModuleAppResources - method","slug":"refreshmoduleappresources-method","link":"#refreshmoduleappresources-method","children":[]},{"level":2,"title":"onAppLifecycle - method","slug":"onapplifecycle-method","link":"#onapplifecycle-method","children":[]},{"level":2,"title":"loadApp - method","slug":"loadapp-method","link":"#loadapp-method","children":[]},{"level":2,"title":"loadZygote - method","slug":"loadzygote-method","link":"#loadzygote-method","children":[]},{"level":2,"title":"loadSystem - method","slug":"loadsystem-method","link":"#loadsystem-method","children":[]},{"level":2,"title":"withProcess - method","slug":"withprocess-method","link":"#withprocess-method","children":[]},{"level":2,"title":"loadHooker - method","slug":"loadhooker-method","link":"#loadhooker-method","children":[]},{"level":2,"title":"searchClass - method","slug":"searchclass-method","link":"#searchclass-method","children":[]},{"level":2,"title":"String+VariousClass.toClass - i-ext-method","slug":"string-variousclass-toclass-i-ext-method","link":"#string-variousclass-toclass-i-ext-method","children":[]},{"level":2,"title":"String+VariousClass.toClassOrNull - i-ext-method","slug":"string-variousclass-toclassornull-i-ext-method","link":"#string-variousclass-toclassornull-i-ext-method","children":[]},{"level":2,"title":"String.hasClass - i-ext-method","slug":"string-hasclass-i-ext-method","link":"#string-hasclass-i-ext-method","children":[]},{"level":2,"title":"findClass - method","slug":"findclass-method","link":"#findclass-method","children":[]},{"level":2,"title":"String+Class+VariousClass+HookClass.hook - i-ext-method","slug":"string-class-variousclass-hookclass-hook-i-ext-method","link":"#string-class-variousclass-hookclass-hook-i-ext-method","children":[]},{"level":2,"title":"HookResources.hook - i-ext-method","slug":"hookresources-hook-i-ext-method","link":"#hookresources-hook-i-ext-method","children":[]},{"level":2,"title":"AppLifecycle - class","slug":"applifecycle-class","link":"#applifecycle-class","children":[{"level":3,"title":"attachBaseContext - method","slug":"attachbasecontext-method","link":"#attachbasecontext-method","children":[]},{"level":3,"title":"onCreate - method","slug":"oncreate-method","link":"#oncreate-method","children":[]},{"level":3,"title":"onTerminate - method","slug":"onterminate-method","link":"#onterminate-method","children":[]},{"level":3,"title":"onLowMemory - method","slug":"onlowmemory-method","link":"#onlowmemory-method","children":[]},{"level":3,"title":"onTrimMemory - method","slug":"ontrimmemory-method","link":"#ontrimmemory-method","children":[]},{"level":3,"title":"onConfigurationChanged - method","slug":"onconfigurationchanged-method","link":"#onconfigurationchanged-method","children":[]},{"level":3,"title":"registerReceiver - method","slug":"registerreceiver-method","link":"#registerreceiver-method","children":[]}]}],"git":{"updatedTime":1664837145000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-100b529c","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html","title":"PackageParam - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"appClassLoader - field","slug":"appclassloader-field","link":"#appclassloader-field","children":[]},{"level":2,"title":"appInfo - field","slug":"appinfo-field","link":"#appinfo-field","children":[]},{"level":2,"title":"appUserId - field","slug":"appuserid-field","link":"#appuserid-field","children":[]},{"level":2,"title":"appContext - field","slug":"appcontext-field","link":"#appcontext-field","children":[]},{"level":2,"title":"appResources - field","slug":"appresources-field","link":"#appresources-field","children":[]},{"level":2,"title":"systemContext - field","slug":"systemcontext-field","link":"#systemcontext-field","children":[]},{"level":2,"title":"processName - field","slug":"processname-field","link":"#processname-field","children":[]},{"level":2,"title":"packageName - field","slug":"packagename-field","link":"#packagename-field","children":[]},{"level":2,"title":"isFirstApplication - field","slug":"isfirstapplication-field","link":"#isfirstapplication-field","children":[]},{"level":2,"title":"mainProcessName - field","slug":"mainprocessname-field","link":"#mainprocessname-field","children":[]},{"level":2,"title":"moduleAppFilePath - field","slug":"moduleappfilepath-field","link":"#moduleappfilepath-field","children":[]},{"level":2,"title":"moduleAppResources - field","slug":"moduleappresources-field","link":"#moduleappresources-field","children":[]},{"level":2,"title":"prefs - field","slug":"prefs-field","link":"#prefs-field","children":[]},{"level":2,"title":"prefs - method","slug":"prefs-method","link":"#prefs-method","children":[]},{"level":2,"title":"dataChannel - field","slug":"datachannel-field","link":"#datachannel-field","children":[]},{"level":2,"title":"resources - method","slug":"resources-method","link":"#resources-method","children":[]},{"level":2,"title":"refreshModuleAppResources - method","slug":"refreshmoduleappresources-method","link":"#refreshmoduleappresources-method","children":[]},{"level":2,"title":"onAppLifecycle - method","slug":"onapplifecycle-method","link":"#onapplifecycle-method","children":[]},{"level":2,"title":"loadApp - method","slug":"loadapp-method","link":"#loadapp-method","children":[]},{"level":2,"title":"loadZygote - method","slug":"loadzygote-method","link":"#loadzygote-method","children":[]},{"level":2,"title":"loadSystem - method","slug":"loadsystem-method","link":"#loadsystem-method","children":[]},{"level":2,"title":"withProcess - method","slug":"withprocess-method","link":"#withprocess-method","children":[]},{"level":2,"title":"loadHooker - method","slug":"loadhooker-method","link":"#loadhooker-method","children":[]},{"level":2,"title":"searchClass - method","slug":"searchclass-method","link":"#searchclass-method","children":[]},{"level":2,"title":"String+VariousClass.toClass - i-ext-method","slug":"string-variousclass-toclass-i-ext-method","link":"#string-variousclass-toclass-i-ext-method","children":[]},{"level":2,"title":"String+VariousClass.toClassOrNull - i-ext-method","slug":"string-variousclass-toclassornull-i-ext-method","link":"#string-variousclass-toclassornull-i-ext-method","children":[]},{"level":2,"title":"String.hasClass - i-ext-method","slug":"string-hasclass-i-ext-method","link":"#string-hasclass-i-ext-method","children":[]},{"level":2,"title":"findClass - method","slug":"findclass-method","link":"#findclass-method","children":[]},{"level":2,"title":"String+Class+VariousClass+HookClass.hook - i-ext-method","slug":"string-class-variousclass-hookclass-hook-i-ext-method","link":"#string-class-variousclass-hookclass-hook-i-ext-method","children":[]},{"level":2,"title":"HookResources.hook - i-ext-method","slug":"hookresources-hook-i-ext-method","link":"#hookresources-hook-i-ext-method","children":[]},{"level":2,"title":"AppLifecycle - class","slug":"applifecycle-class","link":"#applifecycle-class","children":[{"level":3,"title":"attachBaseContext - method","slug":"attachbasecontext-method","link":"#attachbasecontext-method","children":[]},{"level":3,"title":"onCreate - method","slug":"oncreate-method","link":"#oncreate-method","children":[]},{"level":3,"title":"onTerminate - method","slug":"onterminate-method","link":"#onterminate-method","children":[]},{"level":3,"title":"onLowMemory - method","slug":"onlowmemory-method","link":"#onlowmemory-method","children":[]},{"level":3,"title":"onTrimMemory - method","slug":"ontrimmemory-method","link":"#ontrimmemory-method","children":[]},{"level":3,"title":"onConfigurationChanged - method","slug":"onconfigurationchanged-method","link":"#onconfigurationchanged-method","children":[]},{"level":3,"title":"registerReceiver - method","slug":"registerreceiver-method","link":"#registerreceiver-method","children":[]}]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":9}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"}');export{e as data}; diff --git a/docs/assets/PackageParam.html.8c9c140e.js b/docs/assets/PackageParam.html.67aefbc0.js similarity index 78% rename from docs/assets/PackageParam.html.8c9c140e.js rename to docs/assets/PackageParam.html.67aefbc0.js index fbf46e881..d9f2ee991 100644 --- a/docs/assets/PackageParam.html.8c9c140e.js +++ b/docs/assets/PackageParam.html.67aefbc0.js @@ -1,6 +1,6 @@ -import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook \u7684\u76EE\u6807 APP \u5165\u53E3\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

    appClassLoader - field

    val appClassLoader\uFF1AClassLoader
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 ClassLoader\u3002

    appInfo - field

    val appInfo: ApplicationInfo
    +import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},l=n(`

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook \u7684\u76EE\u6807 APP \u5165\u53E3\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

    appClassLoader - field

    var appClassLoader\uFF1AClassLoader
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.5 \u4FEE\u6539

    \u53EF\u4EE5\u52A8\u6001\u4FEE\u6539\u6B64\u53D8\u91CF\u7684\u503C

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook APP \u7684 ClassLoader\u3002

    \u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u624B\u52A8\u8BBE\u7F6E\u5F53\u524D Hook APP \u7684 ClassLoader\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4F1A\u81EA\u52A8\u83B7\u53D6\u3002

    \u7279\u522B\u6CE8\u610F

    \u5982\u679C\u8BBE\u7F6E\u4E86\u9519\u8BEF\u6216\u65E0\u6548\u7684 ClassLoader \u4F1A\u9020\u6210\u529F\u80FD\u5F02\u5E38\uFF0C\u8BF7\u8C28\u614E\u64CD\u4F5C\u3002

    appInfo - field

    val appInfo: ApplicationInfo
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 ApplicationInfo\u3002

    appUserId - field

    val appUserId: Int
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684\u7528\u6237 ID\u3002

    \u673A\u4E3B\u4E3A 0\uFF0C\u5E94\u7528\u53CC\u5F00 (\u5206\u8EAB) \u6216\u5DE5\u4F5C\u8D44\u6599\u56E0\u7CFB\u7EDF\u73AF\u5883\u4E0D\u540C ID \u4E5F\u5404\u4E0D\u76F8\u540C\u3002

    appContext - field

    val appContext: Application?
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.72 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    \u52A0\u5165\u53EF\u7A7A\u7C7B\u578B (\u7A7A\u5B89\u5168)

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 Application\u3002

    \u7279\u522B\u6CE8\u610F

    \u9996\u6B21\u88C5\u8F7D\u53EF\u80FD\u662F\u7A7A\u7684\uFF0C\u8BF7\u5EF6\u8FDF\u4E00\u6BB5\u65F6\u95F4\u518D\u83B7\u53D6\u6216\u4F7F\u7528 onAppLifecycle \u76D1\u542C\u6765\u5B8C\u6210\u3002

    appResources - field

    val appResources\uFF1AResources?
    @@ -16,12 +16,15 @@ import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D\u4F7F\u7528\u7684\u5B58\u53D6\u6570\u636E\u5BF9\u8C61\u7F13\u5B58\u5B9E\u4F8B\u3002

    \u4F60\u53EF\u4EE5\u901A\u8FC7 name \u6765\u81EA\u5B9A\u4E49 Sp \u5B58\u50A8\u7684\u540D\u79F0\u3002

    \u7279\u522B\u6CE8\u610F

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u65E0\u6CD5\u4F7F\u7528\uFF0C\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    dataChannel - field

    val dataChannel: YukiHookDataChannel.NameSpace
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D\u4F7F\u7528\u7684\u6570\u636E\u901A\u8BAF\u6865\u547D\u540D\u7A7A\u95F4\u5BF9\u8C61\u3002

    \u7279\u522B\u6CE8\u610F

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u65E0\u6CD5\u4F7F\u7528\uFF0C\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    resources - method

    fun resources(): HookResources
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D Hook APP \u7684 YukiResources \u5BF9\u8C61\u3002

    \u8BF7\u8C03\u7528 HookResources.hook \u65B9\u6CD5\u5F00\u59CB Hook\u3002

    refreshModuleAppResources - method

    fun refreshModuleAppResources()
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.87 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5237\u65B0\u5F53\u524D Xposed \u6A21\u5757\u81EA\u8EAB Resources\u3002

    onAppLifecycle - method

    inline fun onAppLifecycle(initiate: AppLifecycle.() -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u751F\u547D\u5468\u671F\u88C5\u8F7D\u4E8B\u4EF6\u3002

    \u6CE8\u610F

    \u5728 loadZygote \u4E2D\u4E0D\u4F1A\u88AB\u88C5\u8F7D\uFF0C\u4EC5\u4F1A\u5728 loadSystem\u3001loadApp \u4E2D\u88C5\u8F7D\u3002

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Application \u5B9E\u73B0\u751F\u547D\u5468\u671F\u76D1\u542C\u3002

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.87 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5237\u65B0\u5F53\u524D Xposed \u6A21\u5757\u81EA\u8EAB Resources\u3002

    onAppLifecycle - method

    inline fun onAppLifecycle(isOnFailureThrowToApp: Boolean, initiate: AppLifecycle.() -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E isOnFailureThrowToApp \u53C2\u6570\uFF0C\u53EF\u9009\u62E9\u5C06\u5F02\u5E38\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u800C\u4E0D\u662F\u629B\u51FA\u7ED9\u5BBF\u4E3B

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u751F\u547D\u5468\u671F\u88C5\u8F7D\u4E8B\u4EF6\u3002

    \u6CE8\u610F

    \u5728 loadZygote \u4E2D\u4E0D\u4F1A\u88AB\u88C5\u8F7D\uFF0C\u4EC5\u4F1A\u5728 loadSystem\u3001loadApp \u4E2D\u88C5\u8F7D\u3002

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Application \u5B9E\u73B0\u751F\u547D\u5468\u671F\u76D1\u542C\u3002

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, hooker: YukiBaseHooker)
     
    inline fun loadApp(vararg name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, vararg hooker: YukiBaseHooker)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.4 \u4FEE\u6539

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A APP \u4E0E\u5B50 Hooker

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u5305\u540D\u7684 APP\u3002

    name \u4E3A APP \u7684\u5305\u540D\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    \u82E5\u8981\u88C5\u8F7D APP Zygote \u4E8B\u4EF6\uFF0C\u8BF7\u4F7F\u7528 loadZygote\u3002

    \u82E5\u8981 Hook \u7CFB\u7EDF\u6846\u67B6\uFF0C\u8BF7\u4F7F\u7528 loadSystem\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528 loadApp \u7684 lambda \u65B9\u6CD5\u4F53\u5F62\u5F0F\u6216\u76F4\u63A5\u88C5\u8F7D\u4E00\u4E2A Hooker\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528 lambda
    +
    inline fun loadApp(isExcludeSelf: Boolean, initiate: PackageParam.() -> Unit)
    +
    fun loadApp(isExcludeSelf: Boolean, hooker: YukiBaseHooker)
    +
    fun loadApp(isExcludeSelf: Boolean, vararg hooker: YukiBaseHooker)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.4 \u4FEE\u6539

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A APP \u4E0E\u5B50 Hooker

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E\u4E09\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u4F7F\u7528\u53C2\u6570 isExcludeSelf \u6392\u9664\u6A21\u5757\u81EA\u8EAB

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    name \u4E3A APP \u7684\u5305\u540D\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    \u82E5\u8981\u88C5\u8F7D APP Zygote \u4E8B\u4EF6\uFF0C\u8BF7\u4F7F\u7528 loadZygote\u3002

    \u82E5\u8981 Hook \u7CFB\u7EDF\u6846\u67B6\uFF0C\u8BF7\u4F7F\u7528 loadSystem\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528 loadApp \u7684 lambda \u65B9\u6CD5\u4F53\u5F62\u5F0F\u6216\u76F4\u63A5\u88C5\u8F7D\u4E00\u4E2A Hooker\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528 lambda
     loadApp(name = "com.example.test") {
         // Your code here.
     }
    @@ -33,6 +36,12 @@ import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    } // \u4F7F\u7528 Hooker loadApp(hooker = CustomHooker) +

    \u82E5\u8981\u5728\u5168\u90E8\u53EF\u88AB Hook \u7684 APP \u4E2D\u8FC7\u6EE4\u6389\u6A21\u5757\u81EA\u8EAB\uFF0C\u4F60\u53EA\u9700\u52A0\u5165 isExcludeSelf = true\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528 lambda
    +loadApp(isExcludeSelf = true) {
    +    // Your code here.
    +}
    +// \u4F7F\u7528 Hooker
    +loadApp(isExcludeSelf = true, hooker = CustomHooker)
     

    \u82E5\u60F3\u8981\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u9700\u8981 Hook \u7684 APP\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u9700\u8981 Hook \u7684 APP
     loadApp("com.example.test", "com.example.next") {
         // Your code here.
    @@ -51,17 +60,33 @@ import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    fun withProcess(name: String, vararg hooker: YukiBaseHooker)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.1.4 \u4FEE\u6539

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u8FDB\u7A0B\u4E0E\u5B50 Hooker

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D\u5E76 Hook APP \u7684\u6307\u5B9A\u8FDB\u7A0B\u3002

    name \u4E3A APP \u7684\u8FDB\u7A0B\u540D\u79F0\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    loadHooker - method

    fun loadHooker(hooker: YukiBaseHooker)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook \u5B50\u7C7B\u3002

    \u4F60\u53EF\u4EE5\u586B\u5165 hooker \u5728 Hooker \u4E2D\u7EE7\u7EED\u88C5\u8F7D Hooker\u3002

    searchClass - method

    inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7 appClassLoader \u6309\u6307\u5B9A\u6761\u4EF6\u67E5\u627E\u5E76\u5F97\u5230\u5F53\u524D Hook APP Dex \u4E2D\u7684 Class\u3002

    \u7279\u522B\u6CE8\u610F

    \u6B64\u65B9\u6CD5\u5728 Class \u6570\u91CF\u8FC7\u591A\u53CA\u67E5\u627E\u6761\u4EF6\u590D\u6742\u65F6\u4F1A\u975E\u5E38\u8017\u65F6\u3002

    \u5EFA\u8BAE\u542F\u7528 async \u6216\u8BBE\u7F6E name \u53C2\u6570\uFF0Cname \u53C2\u6570\u5C06\u5728 Hook APP (\u5BBF\u4E3B) \u4E0D\u540C\u7248\u672C\u4E2D\u81EA\u52A8\u8FDB\u884C\u672C\u5730\u7F13\u5B58\u4EE5\u63D0\u5347\u6548\u7387\u3002

    \u6B64\u529F\u80FD\u5C1A\u5728\u8BD5\u9A8C\u9636\u6BB5\uFF0C\u6027\u80FD\u4E0E\u7A33\u5B9A\u6027\u53EF\u80FD\u4ECD\u7136\u5B58\u5728\u95EE\u9898\uFF0C\u4F7F\u7528\u8FC7\u7A0B\u9047\u5230\u95EE\u9898\u8BF7\u5411\u6211\u4EEC\u62A5\u544A\u5E76\u5E2E\u52A9\u6211\u4EEC\u6539\u8FDB\u3002

    String+VariousClass.clazz - i-ext-field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 toClass(...) \u65B9\u6CD5

    String.hasClass - i-ext-field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 hasClass(...) \u65B9\u6CD5

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -
    fun VariousClass.toClass(loader: ClassLoader?): Class<*>
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u5C06 String \u7C7B\u578B\u7684 Class \u5305\u540D\u8F6C\u4E3A Class \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.example.demo.DemoClass".toClass()
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7 appClassLoader \u6309\u6307\u5B9A\u6761\u4EF6\u67E5\u627E\u5E76\u5F97\u5230\u5F53\u524D Hook APP Dex \u4E2D\u7684 Class\u3002

    \u7279\u522B\u6CE8\u610F

    \u6B64\u65B9\u6CD5\u5728 Class \u6570\u91CF\u8FC7\u591A\u53CA\u67E5\u627E\u6761\u4EF6\u590D\u6742\u65F6\u4F1A\u975E\u5E38\u8017\u65F6\u3002

    \u5EFA\u8BAE\u542F\u7528 async \u6216\u8BBE\u7F6E name \u53C2\u6570\uFF0Cname \u53C2\u6570\u5C06\u5728 Hook APP (\u5BBF\u4E3B) \u4E0D\u540C\u7248\u672C\u4E2D\u81EA\u52A8\u8FDB\u884C\u672C\u5730\u7F13\u5B58\u4EE5\u63D0\u5347\u6548\u7387\u3002

    \u6B64\u529F\u80FD\u5C1A\u5728\u8BD5\u9A8C\u9636\u6BB5\uFF0C\u6027\u80FD\u4E0E\u7A33\u5B9A\u6027\u53EF\u80FD\u4ECD\u7136\u5B58\u5728\u95EE\u9898\uFF0C\u4F7F\u7528\u8FC7\u7A0B\u9047\u5230\u95EE\u9898\u8BF7\u5411\u6211\u4EEC\u62A5\u544A\u5E76\u5E2E\u52A9\u6211\u4EEC\u6539\u8FDB\u3002

    String+VariousClass.clazz - i-ext-field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 toClass(...) \u65B9\u6CD5

    String.hasClass - i-ext-field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 hasClass(...) \u65B9\u6CD5

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +
    fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u5C06 String \u7C7B\u578B\u7684 Class \u5305\u540D\u8F6C\u4E3A Class \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.example.demo.DemoClass".toClass()
     

    \u4F60\u8FD8\u53EF\u4EE5\u5411 loader \u53C2\u6570\u4F20\u5165\u4F60\u81EA\u5B9A\u4E49\u7684 ClassLoader\u3002

    \u793A\u4F8B\u5982\u4E0B

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    \u4F60\u8FD8\u53EF\u4EE5\u521B\u5EFA\u4E00\u4E2A VariousClass\uFF0C\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    VariousClass \u4F1A\u679A\u4E3E\u6240\u6709\u8BBE\u7F6E\u7684 Class \u5E76\u6700\u7EC8\u83B7\u5F97\u7B2C\u4E00\u4E2A\u5B58\u5728\u7684 Class\u3002

    \u793A\u4F8B\u5982\u4E0B

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u6307\u5B9A Class \u7684\u76EE\u6807\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u6307\u5B9A\u7684 DemoClass \u5FC5\u987B\u5B58\u5728\u6216\u4E3A\u53EF\u8BBF\u95EE\u7684 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u8BBE\u7F6E\u5728\u83B7\u53D6\u5230\u8FD9\u4E2A Class \u65F6\u662F\u5426\u81EA\u52A8\u6267\u884C\u5176\u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u6267\u884C\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u83B7\u53D6\u5E76\u6267\u884C DemoClass \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\u5728 Java \u4E2D\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u5B9A\u4E49\u3002

    \u793A\u4F8B\u5982\u4E0B

    public class DemoClass {
    +
    +    static {
    +        // \u8FD9\u91CC\u662F\u9759\u6001\u65B9\u6CD5\u5757\u7684\u5185\u5BB9
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    \u4F60\u8FD8\u53EF\u4EE5\u521B\u5EFA\u4E00\u4E2A VariousClass\uFF0C\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    VariousClass \u4F1A\u679A\u4E3E\u6240\u6709\u8BBE\u7F6E\u7684 Class \u5E76\u6700\u7EC8\u83B7\u5F97\u7B2C\u4E00\u4E2A\u5B58\u5728\u7684 Class\u3002

    \u793A\u4F8B\u5982\u4E0B

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
     

    \u540C\u6837\u5730\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u5411 loader \u53C2\u6570\u4F20\u5165\u4F60\u81EA\u5B9A\u4E49\u7684 ClassLoader\u3002

    \u793A\u4F8B\u5982\u4E0B

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass(customClassLoader)
    -

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -
    fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    \u529F\u80FD\u793A\u4F8B

    \u7528\u6CD5\u8BF7\u53C2\u8003 String+VariousClass.toClass \u65B9\u6CD5\u3002

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
    +

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +
    fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    \u529F\u80FD\u793A\u4F8B

    \u7528\u6CD5\u8BF7\u53C2\u8003 String+VariousClass.toClass \u65B9\u6CD5\u3002

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u67E5\u627E\u662F\u5426\u5B58\u5728\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u7684\u4F7F\u7528\u6B64\u65B9\u6CD5\u5224\u65AD\u5B57\u7B26\u4E32\u4E2D\u7684\u7C7B\u662F\u5426\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    if("com.example.demo.DemoClass".hasClass()) {
         // Your code here.
     }
    @@ -105,12 +130,12 @@ import{_ as s,o,c as a,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    Hook APP \u7684 Resources\u3002

    \u7279\u522B\u6CE8\u610F

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD\u5F53\u524D Hook Framework \u652F\u6301\u4E14 InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\u3002

    \u529F\u80FD\u793A\u4F8B

    Resources Hook \u4E3A\u56FA\u5B9A\u7528\u6CD5\uFF0C\u83B7\u53D6 resources \u5BF9\u8C61\uFF0C\u7136\u540E\u8C03\u7528 hook \u65B9\u6CD5\u5F00\u59CB Hook\u3002

    \u793A\u4F8B\u5982\u4E0B

    resources().hook {
         // Your code here.
     }
    -

    \u7279\u522B\u6CE8\u610F

    \u8FD9\u662F\u56FA\u5B9A\u7528\u6CD5\uFF0C\u4E3A\u4E86\u9632\u6B62\u53D1\u751F\u95EE\u9898\uFF0C\u4F60\u4E0D\u53EF\u624B\u52A8\u5B9E\u73B0\u4EFB\u4F55 HookResources \u5B9E\u4F8B\u6267\u884C hook \u8C03\u7528\u3002

    \u5C06 Resources \u7684 Hook \u8BBE\u7F6E\u4E3A\u8FD9\u6837\u662F\u4E3A\u4E86\u4E0E findClass(...).hook \u505A\u5230\u7EDF\u4E00\uFF0C\u4F7F\u5F97\u8C03\u7528\u8D77\u6765\u903B\u8F91\u4E0D\u4F1A\u6DF7\u4E71\u3002

    AppLifecycle - class

    inner class AppLifecycle internal constructor()
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Hook APP \u7684\u751F\u547D\u5468\u671F\u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
    +

    \u7279\u522B\u6CE8\u610F

    \u8FD9\u662F\u56FA\u5B9A\u7528\u6CD5\uFF0C\u4E3A\u4E86\u9632\u6B62\u53D1\u751F\u95EE\u9898\uFF0C\u4F60\u4E0D\u53EF\u624B\u52A8\u5B9E\u73B0\u4EFB\u4F55 HookResources \u5B9E\u4F8B\u6267\u884C hook \u8C03\u7528\u3002

    \u5C06 Resources \u7684 Hook \u8BBE\u7F6E\u4E3A\u8FD9\u6837\u662F\u4E3A\u4E86\u4E0E findClass(...).hook \u505A\u5230\u7EDF\u4E00\uFF0C\u4F7F\u5F97\u8C03\u7528\u8D77\u6765\u903B\u8F91\u4E0D\u4F1A\u6DF7\u4E71\u3002

    AppLifecycle - class

    inner class AppLifecycle internal constructor(private val isOnFailureThrowToApp: Boolean)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E isOnFailureThrowToApp \u53C2\u6570\uFF0C\u53EF\u9009\u62E9\u5C06\u5F02\u5E38\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u800C\u4E0D\u662F\u629B\u51FA\u7ED9\u5BBF\u4E3B

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Hook APP \u7684\u751F\u547D\u5468\u671F\u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.attachBaseContext\u3002

    onCreate - method

    fun onCreate(initiate: Application.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onCreate\u3002

    onTerminate - method

    fun onTerminate(initiate: Application.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onTerminate\u3002

    onLowMemory - method

    fun onLowMemory(initiate: Application.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onLowMemory\u3002

    onTrimMemory - method

    fun onTrimMemory(result: (self: Application, level: Int) -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onTrimMemory\u3002

    onConfigurationChanged - method

    fun onConfigurationChanged(result: (self: Application, config: Configuration) -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onConfigurationChanged\u3002

    registerReceiver - method

    fun registerReceiver(vararg action: String, result: (context: Context, intent: Intent) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u76D1\u542C\u3002

    `,400),p=[l];function c(r,t){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","PackageParam.html.vue"]]);export{i as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u76D1\u542C\u3002

    `,433),p=[l];function c(r,t){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","PackageParam.html.vue"]]);export{i as default}; diff --git a/docs/assets/PackageParam.html.5e695f66.js b/docs/assets/PackageParam.html.aaf5b5a4.js similarity index 97% rename from docs/assets/PackageParam.html.5e695f66.js rename to docs/assets/PackageParam.html.aaf5b5a4.js index a7e490756..0ff4e948c 100644 --- a/docs/assets/PackageParam.html.5e695f66.js +++ b/docs/assets/PackageParam.html.aaf5b5a4.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-b381a126","path":"/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html","title":"PackageParam - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"appClassLoader - field","slug":"appclassloader-field","link":"#appclassloader-field","children":[]},{"level":2,"title":"appInfo - field","slug":"appinfo-field","link":"#appinfo-field","children":[]},{"level":2,"title":"appUserId - field","slug":"appuserid-field","link":"#appuserid-field","children":[]},{"level":2,"title":"appContext - field","slug":"appcontext-field","link":"#appcontext-field","children":[]},{"level":2,"title":"appResources - field","slug":"appresources-field","link":"#appresources-field","children":[]},{"level":2,"title":"systemContext - field","slug":"systemcontext-field","link":"#systemcontext-field","children":[]},{"level":2,"title":"processName - field","slug":"processname-field","link":"#processname-field","children":[]},{"level":2,"title":"packageName - field","slug":"packagename-field","link":"#packagename-field","children":[]},{"level":2,"title":"isFirstApplication - field","slug":"isfirstapplication-field","link":"#isfirstapplication-field","children":[]},{"level":2,"title":"mainProcessName - field","slug":"mainprocessname-field","link":"#mainprocessname-field","children":[]},{"level":2,"title":"moduleAppFilePath - field","slug":"moduleappfilepath-field","link":"#moduleappfilepath-field","children":[]},{"level":2,"title":"moduleAppResources - field","slug":"moduleappresources-field","link":"#moduleappresources-field","children":[]},{"level":2,"title":"prefs - field","slug":"prefs-field","link":"#prefs-field","children":[]},{"level":2,"title":"prefs - method","slug":"prefs-method","link":"#prefs-method","children":[]},{"level":2,"title":"dataChannel - field","slug":"datachannel-field","link":"#datachannel-field","children":[]},{"level":2,"title":"resources - method","slug":"resources-method","link":"#resources-method","children":[]},{"level":2,"title":"refreshModuleAppResources - method","slug":"refreshmoduleappresources-method","link":"#refreshmoduleappresources-method","children":[]},{"level":2,"title":"onAppLifecycle - method","slug":"onapplifecycle-method","link":"#onapplifecycle-method","children":[]},{"level":2,"title":"loadApp - method","slug":"loadapp-method","link":"#loadapp-method","children":[]},{"level":2,"title":"loadZygote - method","slug":"loadzygote-method","link":"#loadzygote-method","children":[]},{"level":2,"title":"loadSystem - method","slug":"loadsystem-method","link":"#loadsystem-method","children":[]},{"level":2,"title":"withProcess - method","slug":"withprocess-method","link":"#withprocess-method","children":[]},{"level":2,"title":"loadHooker - method","slug":"loadhooker-method","link":"#loadhooker-method","children":[]},{"level":2,"title":"searchClass - method","slug":"searchclass-method","link":"#searchclass-method","children":[]},{"level":2,"title":"String+VariousClass.toClass - i-ext-method","slug":"string-variousclass-toclass-i-ext-method","link":"#string-variousclass-toclass-i-ext-method","children":[]},{"level":2,"title":"String+VariousClass.toClassOrNull - i-ext-method","slug":"string-variousclass-toclassornull-i-ext-method","link":"#string-variousclass-toclassornull-i-ext-method","children":[]},{"level":2,"title":"String.hasClass - i-ext-method","slug":"string-hasclass-i-ext-method","link":"#string-hasclass-i-ext-method","children":[]},{"level":2,"title":"findClass - method","slug":"findclass-method","link":"#findclass-method","children":[]},{"level":2,"title":"String+Class+VariousClass+HookClass.hook - i-ext-method","slug":"string-class-variousclass-hookclass-hook-i-ext-method","link":"#string-class-variousclass-hookclass-hook-i-ext-method","children":[]},{"level":2,"title":"HookResources.hook - i-ext-method","slug":"hookresources-hook-i-ext-method","link":"#hookresources-hook-i-ext-method","children":[]},{"level":2,"title":"AppLifecycle - class","slug":"applifecycle-class","link":"#applifecycle-class","children":[{"level":3,"title":"attachBaseContext - method","slug":"attachbasecontext-method","link":"#attachbasecontext-method","children":[]},{"level":3,"title":"onCreate - method","slug":"oncreate-method","link":"#oncreate-method","children":[]},{"level":3,"title":"onTerminate - method","slug":"onterminate-method","link":"#onterminate-method","children":[]},{"level":3,"title":"onLowMemory - method","slug":"onlowmemory-method","link":"#onlowmemory-method","children":[]},{"level":3,"title":"onTrimMemory - method","slug":"ontrimmemory-method","link":"#ontrimmemory-method","children":[]},{"level":3,"title":"onConfigurationChanged - method","slug":"onconfigurationchanged-method","link":"#onconfigurationchanged-method","children":[]},{"level":3,"title":"registerReceiver - method","slug":"registerreceiver-method","link":"#registerreceiver-method","children":[]}]}],"git":{"updatedTime":1664837145000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-b381a126","path":"/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html","title":"PackageParam - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"appClassLoader - field","slug":"appclassloader-field","link":"#appclassloader-field","children":[]},{"level":2,"title":"appInfo - field","slug":"appinfo-field","link":"#appinfo-field","children":[]},{"level":2,"title":"appUserId - field","slug":"appuserid-field","link":"#appuserid-field","children":[]},{"level":2,"title":"appContext - field","slug":"appcontext-field","link":"#appcontext-field","children":[]},{"level":2,"title":"appResources - field","slug":"appresources-field","link":"#appresources-field","children":[]},{"level":2,"title":"systemContext - field","slug":"systemcontext-field","link":"#systemcontext-field","children":[]},{"level":2,"title":"processName - field","slug":"processname-field","link":"#processname-field","children":[]},{"level":2,"title":"packageName - field","slug":"packagename-field","link":"#packagename-field","children":[]},{"level":2,"title":"isFirstApplication - field","slug":"isfirstapplication-field","link":"#isfirstapplication-field","children":[]},{"level":2,"title":"mainProcessName - field","slug":"mainprocessname-field","link":"#mainprocessname-field","children":[]},{"level":2,"title":"moduleAppFilePath - field","slug":"moduleappfilepath-field","link":"#moduleappfilepath-field","children":[]},{"level":2,"title":"moduleAppResources - field","slug":"moduleappresources-field","link":"#moduleappresources-field","children":[]},{"level":2,"title":"prefs - field","slug":"prefs-field","link":"#prefs-field","children":[]},{"level":2,"title":"prefs - method","slug":"prefs-method","link":"#prefs-method","children":[]},{"level":2,"title":"dataChannel - field","slug":"datachannel-field","link":"#datachannel-field","children":[]},{"level":2,"title":"resources - method","slug":"resources-method","link":"#resources-method","children":[]},{"level":2,"title":"refreshModuleAppResources - method","slug":"refreshmoduleappresources-method","link":"#refreshmoduleappresources-method","children":[]},{"level":2,"title":"onAppLifecycle - method","slug":"onapplifecycle-method","link":"#onapplifecycle-method","children":[]},{"level":2,"title":"loadApp - method","slug":"loadapp-method","link":"#loadapp-method","children":[]},{"level":2,"title":"loadZygote - method","slug":"loadzygote-method","link":"#loadzygote-method","children":[]},{"level":2,"title":"loadSystem - method","slug":"loadsystem-method","link":"#loadsystem-method","children":[]},{"level":2,"title":"withProcess - method","slug":"withprocess-method","link":"#withprocess-method","children":[]},{"level":2,"title":"loadHooker - method","slug":"loadhooker-method","link":"#loadhooker-method","children":[]},{"level":2,"title":"searchClass - method","slug":"searchclass-method","link":"#searchclass-method","children":[]},{"level":2,"title":"String+VariousClass.toClass - i-ext-method","slug":"string-variousclass-toclass-i-ext-method","link":"#string-variousclass-toclass-i-ext-method","children":[]},{"level":2,"title":"String+VariousClass.toClassOrNull - i-ext-method","slug":"string-variousclass-toclassornull-i-ext-method","link":"#string-variousclass-toclassornull-i-ext-method","children":[]},{"level":2,"title":"String.hasClass - i-ext-method","slug":"string-hasclass-i-ext-method","link":"#string-hasclass-i-ext-method","children":[]},{"level":2,"title":"findClass - method","slug":"findclass-method","link":"#findclass-method","children":[]},{"level":2,"title":"String+Class+VariousClass+HookClass.hook - i-ext-method","slug":"string-class-variousclass-hookclass-hook-i-ext-method","link":"#string-class-variousclass-hookclass-hook-i-ext-method","children":[]},{"level":2,"title":"HookResources.hook - i-ext-method","slug":"hookresources-hook-i-ext-method","link":"#hookresources-hook-i-ext-method","children":[]},{"level":2,"title":"AppLifecycle - class","slug":"applifecycle-class","link":"#applifecycle-class","children":[{"level":3,"title":"attachBaseContext - method","slug":"attachbasecontext-method","link":"#attachbasecontext-method","children":[]},{"level":3,"title":"onCreate - method","slug":"oncreate-method","link":"#oncreate-method","children":[]},{"level":3,"title":"onTerminate - method","slug":"onterminate-method","link":"#onterminate-method","children":[]},{"level":3,"title":"onLowMemory - method","slug":"onlowmemory-method","link":"#onlowmemory-method","children":[]},{"level":3,"title":"onTrimMemory - method","slug":"ontrimmemory-method","link":"#ontrimmemory-method","children":[]},{"level":3,"title":"onConfigurationChanged - method","slug":"onconfigurationchanged-method","link":"#onconfigurationchanged-method","children":[]},{"level":3,"title":"registerReceiver - method","slug":"registerreceiver-method","link":"#registerreceiver-method","children":[]}]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"}');export{e as data}; diff --git a/docs/assets/PackageParam.html.f4ec4919.js b/docs/assets/PackageParam.html.be077ca1.js similarity index 78% rename from docs/assets/PackageParam.html.f4ec4919.js rename to docs/assets/PackageParam.html.be077ca1.js index 0d7e74f28..44ace386d 100644 --- a/docs/assets/PackageParam.html.f4ec4919.js +++ b/docs/assets/PackageParam.html.be077ca1.js @@ -1,6 +1,6 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    -

    Change Records

    v1.0 first

    Function Illustrate

    \u88C5\u8F7D Hook \u7684\u76EE\u6807 APP \u5165\u53E3\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

    appClassLoader - field

    val appClassLoader\uFF1AClassLoader
    -

    Change Records

    v1.0 first

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 ClassLoader\u3002

    appInfo - field

    val appInfo: ApplicationInfo
    +import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const e={},l=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    +

    Change Records

    v1.0 first

    Function Illustrate

    \u88C5\u8F7D Hook \u7684\u76EE\u6807 APP \u5165\u53E3\u5BF9\u8C61\u5B9E\u73B0\u7C7B\u3002

    appClassLoader - field

    var appClassLoader\uFF1AClassLoader
    +

    Change Records

    v1.0 first

    v1.1.5 modified

    \u53EF\u4EE5\u52A8\u6001\u4FEE\u6539\u6B64\u53D8\u91CF\u7684\u503C

    Function Illustrate

    \u83B7\u53D6\u3001\u8BBE\u7F6E\u5F53\u524D Hook APP \u7684 ClassLoader\u3002

    \u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u624B\u52A8\u8BBE\u7F6E\u5F53\u524D Hook APP \u7684 ClassLoader\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4F1A\u81EA\u52A8\u83B7\u53D6\u3002

    Pay Attention

    \u5982\u679C\u8BBE\u7F6E\u4E86\u9519\u8BEF\u6216\u65E0\u6548\u7684 ClassLoader \u4F1A\u9020\u6210\u529F\u80FD\u5F02\u5E38\uFF0C\u8BF7\u8C28\u614E\u64CD\u4F5C\u3002

    appInfo - field

    val appInfo: ApplicationInfo
     

    Change Records

    v1.0 first

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 ApplicationInfo\u3002

    appUserId - field

    val appUserId: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684\u7528\u6237 ID\u3002

    \u673A\u4E3B\u4E3A 0\uFF0C\u5E94\u7528\u53CC\u5F00 (\u5206\u8EAB) \u6216\u5DE5\u4F5C\u8D44\u6599\u56E0\u7CFB\u7EDF\u73AF\u5883\u4E0D\u540C ID \u4E5F\u5404\u4E0D\u76F8\u540C\u3002

    appContext - field

    val appContext: Application?
     

    Change Records

    v1.0.72 added

    v1.1.0 modified

    \u52A0\u5165\u53EF\u7A7A\u7C7B\u578B (\u7A7A\u5B89\u5168)

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook APP \u7684 Application\u3002

    Pay Attention

    \u9996\u6B21\u88C5\u8F7D\u53EF\u80FD\u662F\u7A7A\u7684\uFF0C\u8BF7\u5EF6\u8FDF\u4E00\u6BB5\u65F6\u95F4\u518D\u83B7\u53D6\u6216\u4F7F\u7528 onAppLifecycle \u76D1\u542C\u6765\u5B8C\u6210\u3002

    appResources - field

    val appResources\uFF1AResources?
    @@ -16,12 +16,15 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D\u4F7F\u7528\u7684\u5B58\u53D6\u6570\u636E\u5BF9\u8C61\u7F13\u5B58\u5B9E\u4F8B\u3002

    \u4F60\u53EF\u4EE5\u901A\u8FC7 name \u6765\u81EA\u5B9A\u4E49 Sp \u5B58\u50A8\u7684\u540D\u79F0\u3002

    Pay Attention

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u65E0\u6CD5\u4F7F\u7528\uFF0C\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    dataChannel - field

    val dataChannel: YukiHookDataChannel.NameSpace
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D\u4F7F\u7528\u7684\u6570\u636E\u901A\u8BAF\u6865\u547D\u540D\u7A7A\u95F4\u5BF9\u8C61\u3002

    Pay Attention

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u65E0\u6CD5\u4F7F\u7528\uFF0C\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    resources - method

    fun resources(): HookResources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D Hook APP \u7684 YukiResources \u5BF9\u8C61\u3002

    \u8BF7\u8C03\u7528 HookResources.hook \u65B9\u6CD5\u5F00\u59CB Hook\u3002

    refreshModuleAppResources - method

    fun refreshModuleAppResources()
    -

    Change Records

    v1.0.87 added

    Function Illustrate

    \u5237\u65B0\u5F53\u524D Xposed \u6A21\u5757\u81EA\u8EAB Resources\u3002

    onAppLifecycle - method

    inline fun onAppLifecycle(initiate: AppLifecycle.() -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u751F\u547D\u5468\u671F\u88C5\u8F7D\u4E8B\u4EF6\u3002

    Notice

    \u5728 loadZygote \u4E2D\u4E0D\u4F1A\u88AB\u88C5\u8F7D\uFF0C\u4EC5\u4F1A\u5728 loadSystem\u3001loadApp \u4E2D\u88C5\u8F7D\u3002

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Application \u5B9E\u73B0\u751F\u547D\u5468\u671F\u76D1\u542C\u3002

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
    +

    Change Records

    v1.0.87 added

    Function Illustrate

    \u5237\u65B0\u5F53\u524D Xposed \u6A21\u5757\u81EA\u8EAB Resources\u3002

    onAppLifecycle - method

    inline fun onAppLifecycle(isOnFailureThrowToApp: Boolean, initiate: AppLifecycle.() -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    \u65B0\u589E isOnFailureThrowToApp \u53C2\u6570\uFF0C\u53EF\u9009\u62E9\u5C06\u5F02\u5E38\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u800C\u4E0D\u662F\u629B\u51FA\u7ED9\u5BBF\u4E3B

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u751F\u547D\u5468\u671F\u88C5\u8F7D\u4E8B\u4EF6\u3002

    Notice

    \u5728 loadZygote \u4E2D\u4E0D\u4F1A\u88AB\u88C5\u8F7D\uFF0C\u4EC5\u4F1A\u5728 loadSystem\u3001loadApp \u4E2D\u88C5\u8F7D\u3002

    \u4F5C\u4E3A Hook API \u88C5\u8F7D\u65F6\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Application \u5B9E\u73B0\u751F\u547D\u5468\u671F\u76D1\u542C\u3002

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, hooker: YukiBaseHooker)
     
    inline fun loadApp(vararg name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, vararg hooker: YukiBaseHooker)
    -

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.4 modified

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A APP \u4E0E\u5B50 Hooker

    Function Illustrate

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u5305\u540D\u7684 APP\u3002

    name \u4E3A APP \u7684\u5305\u540D\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    \u82E5\u8981\u88C5\u8F7D APP Zygote \u4E8B\u4EF6\uFF0C\u8BF7\u4F7F\u7528 loadZygote\u3002

    \u82E5\u8981 Hook \u7CFB\u7EDF\u6846\u67B6\uFF0C\u8BF7\u4F7F\u7528 loadSystem\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528 loadApp \u7684 lambda \u65B9\u6CD5\u4F53\u5F62\u5F0F\u6216\u76F4\u63A5\u88C5\u8F7D\u4E00\u4E2A Hooker\u3002

    The following example

    // \u4F7F\u7528 lambda
    +
    inline fun loadApp(isExcludeSelf: Boolean, initiate: PackageParam.() -> Unit)
    +
    fun loadApp(isExcludeSelf: Boolean, hooker: YukiBaseHooker)
    +
    fun loadApp(isExcludeSelf: Boolean, vararg hooker: YukiBaseHooker)
    +

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.4 modified

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A APP \u4E0E\u5B50 Hooker

    v1.1.5 modified

    \u65B0\u589E\u4E09\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u4F7F\u7528\u53C2\u6570 isExcludeSelf \u6392\u9664\u6A21\u5757\u81EA\u8EAB

    Function Illustrate

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    name \u4E3A APP \u7684\u5305\u540D\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    \u88C5\u8F7D\u5E76 Hook \u6307\u5B9A\u3001\u5168\u90E8\u5305\u540D\u7684 APP\u3002

    \u82E5\u8981\u88C5\u8F7D APP Zygote \u4E8B\u4EF6\uFF0C\u8BF7\u4F7F\u7528 loadZygote\u3002

    \u82E5\u8981 Hook \u7CFB\u7EDF\u6846\u67B6\uFF0C\u8BF7\u4F7F\u7528 loadSystem\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528 loadApp \u7684 lambda \u65B9\u6CD5\u4F53\u5F62\u5F0F\u6216\u76F4\u63A5\u88C5\u8F7D\u4E00\u4E2A Hooker\u3002

    The following example

    // \u4F7F\u7528 lambda
     loadApp(name = "com.example.test") {
         // Your code here.
     }
    @@ -33,6 +36,12 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`
    } // \u4F7F\u7528 Hooker loadApp(hooker = CustomHooker) +

    \u82E5\u8981\u5728\u5168\u90E8\u53EF\u88AB Hook \u7684 APP \u4E2D\u8FC7\u6EE4\u6389\u6A21\u5757\u81EA\u8EAB\uFF0C\u4F60\u53EA\u9700\u52A0\u5165 isExcludeSelf = true\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528 lambda
    +loadApp(isExcludeSelf = true) {
    +    // Your code here.
    +}
    +// \u4F7F\u7528 Hooker
    +loadApp(isExcludeSelf = true, hooker = CustomHooker)
     

    \u82E5\u60F3\u8981\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u9700\u8981 Hook \u7684 APP\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u3002

    The following example

    // \u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u9700\u8981 Hook \u7684 APP
     loadApp("com.example.test", "com.example.next") {
         // Your code here.
    @@ -51,17 +60,33 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`
    fun withProcess(name: String, vararg hooker: YukiBaseHooker)
     

    Change Records

    v1.0.70 added

    v1.1.4 modified

    \u65B0\u589E\u4E24\u4E2A\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u540C\u65F6\u88C5\u8F7D\u591A\u4E2A\u8FDB\u7A0B\u4E0E\u5B50 Hooker

    Function Illustrate

    \u88C5\u8F7D\u5E76 Hook APP \u7684\u6307\u5B9A\u8FDB\u7A0B\u3002

    name \u4E3A APP \u7684\u8FDB\u7A0B\u540D\u79F0\uFF0C\u540E\u65B9\u7684\u4E24\u4E2A\u53C2\u6570\u4E00\u4E2A\u53EF\u4F5C\u4E3A lambda \u65B9\u6CD5\u4F53\u4F7F\u7528\uFF0C\u4E00\u4E2A\u53EF\u4EE5\u76F4\u63A5\u88C5\u8F7D\u5B50 Hooker\u3002

    loadHooker - method

    fun loadHooker(hooker: YukiBaseHooker)
     

    Change Records

    v1.0 first

    Function Illustrate

    \u88C5\u8F7D Hook \u5B50\u7C7B\u3002

    \u4F60\u53EF\u4EE5\u586B\u5165 hooker \u5728 Hooker \u4E2D\u7EE7\u7EED\u88C5\u8F7D Hooker\u3002

    searchClass - method

    inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7 appClassLoader \u6309\u6307\u5B9A\u6761\u4EF6\u67E5\u627E\u5E76\u5F97\u5230\u5F53\u524D Hook APP Dex \u4E2D\u7684 Class\u3002

    Pay Attention

    \u6B64\u65B9\u6CD5\u5728 Class \u6570\u91CF\u8FC7\u591A\u53CA\u67E5\u627E\u6761\u4EF6\u590D\u6742\u65F6\u4F1A\u975E\u5E38\u8017\u65F6\u3002

    \u5EFA\u8BAE\u542F\u7528 async \u6216\u8BBE\u7F6E name \u53C2\u6570\uFF0Cname \u53C2\u6570\u5C06\u5728 Hook APP (\u5BBF\u4E3B) \u4E0D\u540C\u7248\u672C\u4E2D\u81EA\u52A8\u8FDB\u884C\u672C\u5730\u7F13\u5B58\u4EE5\u63D0\u5347\u6548\u7387\u3002

    \u6B64\u529F\u80FD\u5C1A\u5728\u8BD5\u9A8C\u9636\u6BB5\uFF0C\u6027\u80FD\u4E0E\u7A33\u5B9A\u6027\u53EF\u80FD\u4ECD\u7136\u5B58\u5728\u95EE\u9898\uFF0C\u4F7F\u7528\u8FC7\u7A0B\u9047\u5230\u95EE\u9898\u8BF7\u5411\u6211\u4EEC\u62A5\u544A\u5E76\u5E2E\u52A9\u6211\u4EEC\u6539\u8FDB\u3002

    String+VariousClass.clazz - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 toClass(...) \u65B9\u6CD5

    String.hasClass - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 hasClass(...) \u65B9\u6CD5

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -
    fun VariousClass.toClass(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u5C06 String \u7C7B\u578B\u7684 Class \u5305\u540D\u8F6C\u4E3A Class \u5B9E\u4F8B\u3002

    The following example

    "com.example.demo.DemoClass".toClass()
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7 appClassLoader \u6309\u6307\u5B9A\u6761\u4EF6\u67E5\u627E\u5E76\u5F97\u5230\u5F53\u524D Hook APP Dex \u4E2D\u7684 Class\u3002

    Pay Attention

    \u6B64\u65B9\u6CD5\u5728 Class \u6570\u91CF\u8FC7\u591A\u53CA\u67E5\u627E\u6761\u4EF6\u590D\u6742\u65F6\u4F1A\u975E\u5E38\u8017\u65F6\u3002

    \u5EFA\u8BAE\u542F\u7528 async \u6216\u8BBE\u7F6E name \u53C2\u6570\uFF0Cname \u53C2\u6570\u5C06\u5728 Hook APP (\u5BBF\u4E3B) \u4E0D\u540C\u7248\u672C\u4E2D\u81EA\u52A8\u8FDB\u884C\u672C\u5730\u7F13\u5B58\u4EE5\u63D0\u5347\u6548\u7387\u3002

    \u6B64\u529F\u80FD\u5C1A\u5728\u8BD5\u9A8C\u9636\u6BB5\uFF0C\u6027\u80FD\u4E0E\u7A33\u5B9A\u6027\u53EF\u80FD\u4ECD\u7136\u5B58\u5728\u95EE\u9898\uFF0C\u4F7F\u7528\u8FC7\u7A0B\u9047\u5230\u95EE\u9898\u8BF7\u5411\u6211\u4EEC\u62A5\u544A\u5E76\u5E2E\u52A9\u6211\u4EEC\u6539\u8FDB\u3002

    String+VariousClass.clazz - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 toClass(...) \u65B9\u6CD5

    String.hasClass - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 hasClass(...) \u65B9\u6CD5

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +
    fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u5C06 String \u7C7B\u578B\u7684 Class \u5305\u540D\u8F6C\u4E3A Class \u5B9E\u4F8B\u3002

    The following example

    "com.example.demo.DemoClass".toClass()
     

    \u4F60\u8FD8\u53EF\u4EE5\u5411 loader \u53C2\u6570\u4F20\u5165\u4F60\u81EA\u5B9A\u4E49\u7684 ClassLoader\u3002

    The following example

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    \u4F60\u8FD8\u53EF\u4EE5\u521B\u5EFA\u4E00\u4E2A VariousClass\uFF0C\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    VariousClass \u4F1A\u679A\u4E3E\u6240\u6709\u8BBE\u7F6E\u7684 Class \u5E76\u6700\u7EC8\u83B7\u5F97\u7B2C\u4E00\u4E2A\u5B58\u5728\u7684 Class\u3002

    The following example

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u6307\u5B9A Class \u7684\u76EE\u6807\u7C7B\u578B\u3002

    The following example

    // \u6307\u5B9A\u7684 DemoClass \u5FC5\u987B\u5B58\u5728\u6216\u4E3A\u53EF\u8BBF\u95EE\u7684 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u8BBE\u7F6E\u5728\u83B7\u53D6\u5230\u8FD9\u4E2A Class \u65F6\u662F\u5426\u81EA\u52A8\u6267\u884C\u5176\u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u6267\u884C\u3002

    The following example

    // \u83B7\u53D6\u5E76\u6267\u884C DemoClass \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\u5728 Java \u4E2D\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u5B9A\u4E49\u3002

    The following example

    public class DemoClass {
    +
    +    static {
    +        // \u8FD9\u91CC\u662F\u9759\u6001\u65B9\u6CD5\u5757\u7684\u5185\u5BB9
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    \u4F60\u8FD8\u53EF\u4EE5\u521B\u5EFA\u4E00\u4E2A VariousClass\uFF0C\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    VariousClass \u4F1A\u679A\u4E3E\u6240\u6709\u8BBE\u7F6E\u7684 Class \u5E76\u6700\u7EC8\u83B7\u5F97\u7B2C\u4E00\u4E2A\u5B58\u5728\u7684 Class\u3002

    The following example

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
     

    \u540C\u6837\u5730\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u5411 loader \u53C2\u6570\u4F20\u5165\u4F60\u81EA\u5B9A\u4E49\u7684 ClassLoader\u3002

    The following example

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass(customClassLoader)
    -

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -
    fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    Function Example

    \u7528\u6CD5\u8BF7\u53C2\u8003 String+VariousClass.toClass \u65B9\u6CD5\u3002

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
    +

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +
    fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u3001VariousClass \u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    Function Example

    \u7528\u6CD5\u8BF7\u53C2\u8003 String+VariousClass.toClass \u65B9\u6CD5\u3002

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u67E5\u627E\u662F\u5426\u5B58\u5728\u3002

    \u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D appClassLoader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u8F7B\u677E\u7684\u4F7F\u7528\u6B64\u65B9\u6CD5\u5224\u65AD\u5B57\u7B26\u4E32\u4E2D\u7684\u7C7B\u662F\u5426\u5B58\u5728\u3002

    The following example

    if("com.example.demo.DemoClass".hasClass()) {
         // Your code here.
     }
    @@ -105,12 +130,12 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    Change Records

    v1.0.80 added

    Function Illustrate

    Hook APP \u7684 Resources\u3002

    Pay Attention

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD\u5F53\u524D Hook Framework \u652F\u6301\u4E14 InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\u3002

    Function Example

    Resources Hook \u4E3A\u56FA\u5B9A\u7528\u6CD5\uFF0C\u83B7\u53D6 resources \u5BF9\u8C61\uFF0C\u7136\u540E\u8C03\u7528 hook \u65B9\u6CD5\u5F00\u59CB Hook\u3002

    The following example

    resources().hook {
         // Your code here.
     }
    -

    Pay Attention

    \u8FD9\u662F\u56FA\u5B9A\u7528\u6CD5\uFF0C\u4E3A\u4E86\u9632\u6B62\u53D1\u751F\u95EE\u9898\uFF0C\u4F60\u4E0D\u53EF\u624B\u52A8\u5B9E\u73B0\u4EFB\u4F55 HookResources \u5B9E\u4F8B\u6267\u884C hook \u8C03\u7528\u3002

    \u5C06 Resources \u7684 Hook \u8BBE\u7F6E\u4E3A\u8FD9\u6837\u662F\u4E3A\u4E86\u4E0E findClass(...).hook \u505A\u5230\u7EDF\u4E00\uFF0C\u4F7F\u5F97\u8C03\u7528\u8D77\u6765\u903B\u8F91\u4E0D\u4F1A\u6DF7\u4E71\u3002

    AppLifecycle - class

    inner class AppLifecycle internal constructor()
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u5F53\u524D Hook APP \u7684\u751F\u547D\u5468\u671F\u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
    +

    Pay Attention

    \u8FD9\u662F\u56FA\u5B9A\u7528\u6CD5\uFF0C\u4E3A\u4E86\u9632\u6B62\u53D1\u751F\u95EE\u9898\uFF0C\u4F60\u4E0D\u53EF\u624B\u52A8\u5B9E\u73B0\u4EFB\u4F55 HookResources \u5B9E\u4F8B\u6267\u884C hook \u8C03\u7528\u3002

    \u5C06 Resources \u7684 Hook \u8BBE\u7F6E\u4E3A\u8FD9\u6837\u662F\u4E3A\u4E86\u4E0E findClass(...).hook \u505A\u5230\u7EDF\u4E00\uFF0C\u4F7F\u5F97\u8C03\u7528\u8D77\u6765\u903B\u8F91\u4E0D\u4F1A\u6DF7\u4E71\u3002

    AppLifecycle - class

    inner class AppLifecycle internal constructor(private val isOnFailureThrowToApp: Boolean)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    \u65B0\u589E isOnFailureThrowToApp \u53C2\u6570\uFF0C\u53EF\u9009\u62E9\u5C06\u5F02\u5E38\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u6253\u5370\u800C\u4E0D\u662F\u629B\u51FA\u7ED9\u5BBF\u4E3B

    Function Illustrate

    \u5F53\u524D Hook APP \u7684\u751F\u547D\u5468\u671F\u5B9E\u4F8B\u5904\u7406\u7C7B\u3002

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.attachBaseContext\u3002

    onCreate - method

    fun onCreate(initiate: Application.() -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onCreate\u3002

    onTerminate - method

    fun onTerminate(initiate: Application.() -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onTerminate\u3002

    onLowMemory - method

    fun onLowMemory(initiate: Application.() -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onLowMemory\u3002

    onTrimMemory - method

    fun onTrimMemory(result: (self: Application, level: Int) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onTrimMemory\u3002

    onConfigurationChanged - method

    fun onConfigurationChanged(result: (self: Application, config: Configuration) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u76D1\u542C\u5F53\u524D Hook APP \u88C5\u8F7D Application.onConfigurationChanged\u3002

    registerReceiver - method

    fun registerReceiver(vararg action: String, result: (context: Context, intent: Intent) -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u76D1\u542C\u3002

    `,401),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(n,[["render",c],["__file","PackageParam.html.vue"]]);export{i as default}; +

    Change Records

    v1.0.88 added

    Function Illustrate

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u76D1\u542C\u3002

    `,434),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","PackageParam.html.vue"]]);export{i as default}; diff --git a/docs/assets/PrefsData.html.dfd7c23c.js b/docs/assets/PrefsData.html.3061ee5b.js similarity index 72% rename from docs/assets/PrefsData.html.dfd7c23c.js rename to docs/assets/PrefsData.html.3061ee5b.js index 2adde194b..742583582 100644 --- a/docs/assets/PrefsData.html.dfd7c23c.js +++ b/docs/assets/PrefsData.html.3061ee5b.js @@ -1 +1 @@ -const a=JSON.parse('{"key":"v-58ed8298","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html","title":"PrefsData - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"}');export{a as data}; +const a=JSON.parse('{"key":"v-58ed8298","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html","title":"PrefsData - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672837223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"}');export{a as data}; diff --git a/docs/assets/PrefsData.html.d3cf97f9.js b/docs/assets/PrefsData.html.40b2fabe.js similarity index 73% rename from docs/assets/PrefsData.html.d3cf97f9.js rename to docs/assets/PrefsData.html.40b2fabe.js index 756e7e6c2..ee362540e 100644 --- a/docs/assets/PrefsData.html.d3cf97f9.js +++ b/docs/assets/PrefsData.html.40b2fabe.js @@ -1 +1 @@ -const a=JSON.parse('{"key":"v-d99f7f36","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html","title":"PrefsData - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"}');export{a as data}; +const a=JSON.parse('{"key":"v-d99f7f36","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html","title":"PrefsData - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[],"git":{"updatedTime":1672837223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"}');export{a as data}; diff --git a/docs/assets/PrefsData.html.ca16253d.js b/docs/assets/PrefsData.html.872ef9db.js similarity index 87% rename from docs/assets/PrefsData.html.ca16253d.js rename to docs/assets/PrefsData.html.872ef9db.js index 52c99a265..e879161eb 100644 --- a/docs/assets/PrefsData.html.ca16253d.js +++ b/docs/assets/PrefsData.html.872ef9db.js @@ -1,5 +1,5 @@ -import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const o={},e=l(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T)
    -

    Change Records

    v1.0.67 added

    Function Illustrate

    \u952E\u503C\u5BF9\u5B58\u50A8\u6784\u9020\u7C7B\u3002

    \u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookModulePrefs \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

    Function Example

    \u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4F7F\u7528\u7684\u952E\u503C\u6570\u636E\u3002

    The following example

    object DataConst {
    +import{_ as s,o as a,c as n,a as l}from"./app.6074a838.js";const o={},e=l(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T) : Serializable
    +

    Change Records

    v1.0.67 added

    v1.1.5 modified

    \u5B9E\u73B0\u4E86 Serializable \u63A5\u53E3

    Function Illustrate

    \u952E\u503C\u5BF9\u5B58\u50A8\u6784\u9020\u7C7B\u3002

    \u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookModulePrefs \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

    Function Example

    \u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4F7F\u7528\u7684\u952E\u503C\u6570\u636E\u3002

    The following example

    object DataConst {
     
         val TEST_KV_DATA_1 = PrefsData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = PrefsData("test_data_2", false)
    @@ -15,4 +15,4 @@ import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const o={},e=l(`
    val dataBoolean = prefs.get(DataConst.TEST_KV_DATA_2)

    \u4F60\u4F9D\u7136\u53EF\u4EE5\u4E0D\u4F7F\u7528\u6A21\u677F\u5B9A\u4E49\u7684\u9ED8\u8BA4\u503C\uFF0C\u968F\u65F6\u4FEE\u6539\u4F60\u7684\u9ED8\u8BA4\u503C\u3002

    The following example

    // \u8BFB\u53D6 - \u6B64\u65F6 data \u53D6\u5230\u7684\u9ED8\u8BA4\u503C\u5C06\u4F1A\u662F 2 - \u5E76\u4E0D\u662F\u6A21\u677F\u63D0\u4F9B\u7684 0
     val data = prefs.get(DataConst.TEST_KV_DATA_3, 2)
    -
    `,20),p=[e];function t(c,r){return a(),n("div",null,p)}const A=s(o,[["render",t],["__file","PrefsData.html.vue"]]);export{A as default}; +
    `,22),p=[e];function t(c,r){return a(),n("div",null,p)}const A=s(o,[["render",t],["__file","PrefsData.html.vue"]]);export{A as default}; diff --git a/docs/assets/PrefsData.html.fc0793be.js b/docs/assets/PrefsData.html.96712a80.js similarity index 86% rename from docs/assets/PrefsData.html.fc0793be.js rename to docs/assets/PrefsData.html.96712a80.js index a163887ae..578816978 100644 --- a/docs/assets/PrefsData.html.fc0793be.js +++ b/docs/assets/PrefsData.html.96712a80.js @@ -1,5 +1,5 @@ -import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const o={},p=l(`

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.67 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u952E\u503C\u5BF9\u5B58\u50A8\u6784\u9020\u7C7B\u3002

    \u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookModulePrefs \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

    \u529F\u80FD\u793A\u4F8B

    \u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4F7F\u7528\u7684\u952E\u503C\u6570\u636E\u3002

    \u793A\u4F8B\u5982\u4E0B

    object DataConst {
    +import{_ as s,o as a,c as n,a as l}from"./app.6074a838.js";const o={},p=l(`

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T) : Serializable
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.67 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u5B9E\u73B0\u4E86 Serializable \u63A5\u53E3

    \u529F\u80FD\u63CF\u8FF0

    \u952E\u503C\u5BF9\u5B58\u50A8\u6784\u9020\u7C7B\u3002

    \u8FD9\u4E2A\u7C7B\u662F\u5BF9 YukiHookModulePrefs \u7684\u4E00\u4E2A\u6269\u5C55\u7528\u6CD5\u3002

    \u529F\u80FD\u793A\u4F8B

    \u5EFA\u7ACB\u4E00\u4E2A\u6A21\u677F\u7C7B\u5B9A\u4E49\u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4F7F\u7528\u7684\u952E\u503C\u6570\u636E\u3002

    \u793A\u4F8B\u5982\u4E0B

    object DataConst {
     
         val TEST_KV_DATA_1 = PrefsData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = PrefsData("test_data_2", false)
    @@ -15,4 +15,4 @@ import{_ as s,o as a,c as n,a as l}from"./app.99fcdd51.js";const o={},p=l(`

    val dataBoolean = prefs.get(DataConst.TEST_KV_DATA_2)

    \u4F60\u4F9D\u7136\u53EF\u4EE5\u4E0D\u4F7F\u7528\u6A21\u677F\u5B9A\u4E49\u7684\u9ED8\u8BA4\u503C\uFF0C\u968F\u65F6\u4FEE\u6539\u4F60\u7684\u9ED8\u8BA4\u503C\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u8BFB\u53D6 - \u6B64\u65F6 data \u53D6\u5230\u7684\u9ED8\u8BA4\u503C\u5C06\u4F1A\u662F 2 - \u5E76\u4E0D\u662F\u6A21\u677F\u63D0\u4F9B\u7684 0
     val data = prefs.get(DataConst.TEST_KV_DATA_3, 2)
    -
    `,19),e=[p];function t(c,r){return a(),n("div",null,e)}const A=s(o,[["render",t],["__file","PrefsData.html.vue"]]);export{A as default}; +
    `,21),e=[p];function t(c,r){return a(),n("div",null,e)}const A=s(o,[["render",t],["__file","PrefsData.html.vue"]]);export{A as default}; diff --git a/docs/assets/ReflectionFactory.html.b1a986a7.js b/docs/assets/ReflectionFactory.html.01f072ba.js similarity index 60% rename from docs/assets/ReflectionFactory.html.b1a986a7.js rename to docs/assets/ReflectionFactory.html.01f072ba.js index ce684c534..78e8b369c 100644 --- a/docs/assets/ReflectionFactory.html.b1a986a7.js +++ b/docs/assets/ReflectionFactory.html.01f072ba.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    ReflectionFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u81EA\u5B9A\u4E49 Member \u548C Class \u76F8\u5173\u529F\u80FD\u7684\u67E5\u627E\u5339\u914D\u4EE5\u53CA invoke \u7684\u5C01\u88C5\u7C7B\u3002

    MembersType - class

    enum class MembersType
    +import{_ as s,o,c as a,a as n}from"./app.6074a838.js";const l={},e=n(`

    ReflectionFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u81EA\u5B9A\u4E49 Member \u548C Class \u76F8\u5173\u529F\u80FD\u7684\u67E5\u627E\u5339\u914D\u4EE5\u53CA invoke \u7684\u5C01\u88C5\u7C7B\u3002

    MembersType - class

    enum class MembersType
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5B9A\u4E49\u4E00\u4E2A Class \u4E2D\u7684 Member \u7C7B\u578B

    ALL - enum

    ALL
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5168\u90E8 Method \u4E0E Constructor\u3002

    METHOD - enum

    METHOD
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5168\u90E8 Method\u3002

    CONSTRUCTOR - enum

    CONSTRUCTOR
    @@ -22,13 +22,62 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    } }

    hookClass - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u79FB\u9664

    HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

    normalClass - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u79FB\u9664

    HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

    hasClass - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u79FB\u9664

    \u8BF7\u76F4\u63A5\u4F7F\u7528 hasClass() \u65E0\u53C2\u65B9\u6CD5

    Class.hasExtends - ext-field

    val Class<*>.hasExtends: Boolean
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB\uFF0C\u7236\u7C7B\u662F Any \u5C06\u88AB\u8BA4\u4E3A\u6CA1\u6709\u7EE7\u627F\u5173\u7CFB\u3002

    classOf - method

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u5230 toClass(...) \u65B9\u6CD5

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u76F4\u63A5\u586B\u5199\u4F60\u8981\u67E5\u627E\u7684\u76EE\u6807 Class\uFF0C\u5FC5\u987B\u5728\u9ED8\u8BA4 ClassLoader \u4E0B\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.example.demo.DemoClass".toClass()
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB\uFF0C\u7236\u7C7B\u662F Any \u5C06\u88AB\u8BA4\u4E3A\u6CA1\u6709\u7EE7\u627F\u5173\u7CFB\u3002

    Class?.extends - ext-method

    infix fun Class<*>?.extends(other: Class<*>?): Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u7EE7\u627F\u4E8E other\u3002

    \u5982\u679C\u5F53\u524D Class \u5C31\u662F other \u4E5F\u4F1A\u8FD4\u56DE true\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A null \u6216 other \u4E3A null \u4F1A\u8FD4\u56DE false\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u5B58\u5728\u7EE7\u627F\u5173\u7CFB\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u7EE7\u627F\u4E8E B
    +if (classA extends classB) {
    +    // Your code here.
    +}
    +

    Class?.notExtends - ext-method

    infix fun Class<*>?.notExtends(other: Class<*>?): Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u4E0D\u7EE7\u627F\u4E8E other\u3002

    \u6B64\u65B9\u6CD5\u76F8\u5F53\u4E8E extends \u7684\u53CD\u5411\u5224\u65AD\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u4E0D\u5B58\u5728\u7EE7\u627F\u5173\u7CFB\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u4E0D\u7EE7\u627F\u4E8E B
    +if (classA notExtends classB) {
    +    // Your code here.
    +}
    +

    Class?.implements - ext-method

    infix fun Class<*>?.implements(other: Class<*>?): Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u5B9E\u73B0\u4E86 other \u63A5\u53E3\u7C7B\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A null \u6216 other \u4E3A null \u4F1A\u8FD4\u56DE false\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u5B58\u5728\u4F9D\u8D56\u5173\u7CFB\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u5B9E\u73B0\u4E86 B \u63A5\u53E3\u7C7B
    +if (classA implements classB) {
    +    // Your code here.
    +}
    +

    Class?.notImplements - ext-method

    infix fun Class<*>?.notImplements(other: Class<*>?): Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D Class \u662F\u5426\u672A\u5B9E\u73B0 other \u63A5\u53E3\u7C7B\u3002

    \u6B64\u65B9\u6CD5\u76F8\u5F53\u4E8E implements \u7684\u53CD\u5411\u5224\u65AD\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u4E0D\u5B58\u5728\u4F9D\u8D56\u5173\u7CFB\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u672A\u5B9E\u73B0 B \u63A5\u53E3\u7C7B
    +if (classA notImplements classB) {
    +    // Your code here.
    +}
    +

    Class.toJavaPrimitiveType - ext-method

    fun Class<*>.toJavaPrimitiveType(): Class<*>
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u81EA\u52A8\u8F6C\u6362\u5F53\u524D Class \u4E3A Java \u539F\u59CB\u7C7B\u578B (Primitive Type)\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A Java \u6216 Kotlin \u57FA\u672C\u7C7B\u578B\u5C06\u81EA\u52A8\u6267\u884C\u7C7B\u578B\u8F6C\u6362\u3002

    \u5F53\u524D\u80FD\u591F\u81EA\u52A8\u8F6C\u6362\u7684\u57FA\u672C\u7C7B\u578B\u5982\u4E0B\u3002

    • kotlin.Unit
    • java.lang.Void
    • java.lang.Boolean
    • java.lang.Integer
    • java.lang.Float
    • java.lang.Double
    • java.lang.Long
    • java.lang.Short
    • java.lang.Character
    • java.lang.Byte

    classOf - method

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u5230 toClass(...) \u65B9\u6CD5

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u76F4\u63A5\u586B\u5199\u4F60\u8981\u67E5\u627E\u7684\u76EE\u6807 Class\uFF0C\u5FC5\u987B\u5728\u9ED8\u8BA4 ClassLoader \u4E0B\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.example.demo.DemoClass".toClass()
     

    \u4F60\u8FD8\u53EF\u4EE5\u81EA\u5B9A\u4E49 Class \u6240\u5728\u7684 ClassLoader\u3002

    \u793A\u4F8B\u5982\u4E0B

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    \u529F\u80FD\u793A\u4F8B

    \u7528\u6CD5\u8BF7\u53C2\u8003 String.toClass \u65B9\u6CD5\u3002

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?): Class<*>
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7 T \u5F97\u5230\u5176 Class \u5B9E\u4F8B\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    \u529F\u80FD\u793A\u4F8B

    \u6211\u4EEC\u8981\u83B7\u53D6\u4E00\u4E2A Class \u5728 Kotlin \u4E0B\u4E0D\u901A\u8FC7\u53CD\u5C04\u65F6\u5E94\u8BE5\u8FD9\u6837\u505A\u3002

    \u793A\u4F8B\u5982\u4E0B

    DemoClass::class.java
    +

    \u4F60\u8FD8\u53EF\u4EE5\u6307\u5B9A Class \u7684\u76EE\u6807\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u6307\u5B9A\u7684 DemoClass \u5FC5\u987B\u5B58\u5728\u6216\u4E3A\u53EF\u8BBF\u95EE\u7684 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u8BBE\u7F6E\u5728\u83B7\u53D6\u5230\u8FD9\u4E2A Class \u65F6\u662F\u5426\u81EA\u52A8\u6267\u884C\u5176\u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u6267\u884C\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u83B7\u53D6\u5E76\u6267\u884C DemoClass \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\u5728 Java \u4E2D\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u5B9A\u4E49\u3002

    \u793A\u4F8B\u5982\u4E0B

    public class DemoClass {
    +
    +    static {
    +        // \u8FD9\u91CC\u662F\u9759\u6001\u65B9\u6CD5\u5757\u7684\u5185\u5BB9
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    \u529F\u80FD\u793A\u4F8B

    \u7528\u6CD5\u8BF7\u53C2\u8003 String.toClass \u65B9\u6CD5\u3002

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u5C06\u8FD4\u56DE\u7C7B\u578B\u7531 Class<*> cast \u4E3A Class<T>

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7 T \u5F97\u5230\u5176 Class \u5B9E\u4F8B\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    \u529F\u80FD\u793A\u4F8B

    \u6211\u4EEC\u8981\u83B7\u53D6\u4E00\u4E2A Class \u5728 Kotlin \u4E0B\u4E0D\u901A\u8FC7\u53CD\u5C04\u65F6\u5E94\u8BE5\u8FD9\u6837\u505A\u3002

    \u793A\u4F8B\u5982\u4E0B

    DemoClass::class.java
     

    \u73B0\u5728\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5 cast \u4E00\u4E2A\u5B9E\u4F8B\u5E76\u83B7\u53D6\u5B83\u7684 Class \u5BF9\u8C61\uFF0C\u5FC5\u987B\u5728\u5F53\u524D ClassLoader \u4E0B\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    classOf<DemoClass>()
     

    \u82E5\u76EE\u6807\u5B58\u5728\u7684 Class \u4E3A stub\uFF0C\u901A\u8FC7\u8FD9\u79CD\u65B9\u5F0F\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u81EA\u5B9A\u4E49 Class \u6240\u5728\u7684 ClassLoader\u3002

    \u793A\u4F8B\u5982\u4E0B

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     classOf<DemoClass>(customClassLoader)
    @@ -54,7 +103,7 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    inline fun <reified T : Any> T.current(ignored: Boolean, initiate: CurrentClass.() -> Unit): T
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.1.0 \u65B0\u589E

    \u65B0\u589E ignored \u53C2\u6570\uFF0C\u53EF\u4EE5\u5FFD\u7565\u5728 CurrentClass \u4E2D\u51FA\u73B0\u7684\u5F02\u5E38

    \u65B0\u589E\u4E0D\u4F7F\u7528 current { ... } \u8C03\u7528\u57DF\u76F4\u63A5\u4F7F\u7528 current() \u5F97\u5230\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

    Class.buildOfAny - ext-method

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 buildOf \u65B9\u6CD5

    Class.buildOf - ext-method

    inline fun Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): Any?
     
    inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): T?
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 \u4FEE\u6539

    \u52A0\u5165\u65E0\u6CDB\u578B\u65B9\u6CD5 buildOf

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5B9E\u4F8B\uFF0C\u6307\u5B9A\u7C7B\u578B T \u6216\u4EFB\u610F\u7C7B\u578B Any\u3002

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(result: (index: Int, method: Method) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u65B9\u6CD5\u3002

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(result: (index: Int, constructor: Constructor<*>) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u6784\u9020\u65B9\u6CD5\u3002

    Class.allFields - ext-method

    inline fun Class<*>.allFields(result: (index: Int, field: Field) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u53D8\u91CF\u3002

    `,316),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(n,[["render",c],["__file","ReflectionFactory.html.vue"]]);export{i as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 \u4FEE\u6539

    \u52A0\u5165\u65E0\u6CDB\u578B\u65B9\u6CD5 buildOf

    \u529F\u80FD\u63CF\u8FF0

    \u901A\u8FC7\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5B9E\u4F8B\uFF0C\u6307\u5B9A\u7C7B\u578B T \u6216\u4EFB\u610F\u7C7B\u578B Any\u3002

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E isAccessible \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u65B9\u6CD5\u3002

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E isAccessible \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u6784\u9020\u65B9\u6CD5\u3002

    Class.allFields - ext-method

    inline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E isAccessible \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u53D8\u91CF\u3002

    `,396),p=[e];function c(t,r){return o(),a("div",null,p)}const i=s(l,[["render",c],["__file","ReflectionFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/ReflectionFactory.html.0b0fdaba.js b/docs/assets/ReflectionFactory.html.625f54f2.js similarity index 58% rename from docs/assets/ReflectionFactory.html.0b0fdaba.js rename to docs/assets/ReflectionFactory.html.625f54f2.js index 6b648f968..f9af54e96 100644 --- a/docs/assets/ReflectionFactory.html.0b0fdaba.js +++ b/docs/assets/ReflectionFactory.html.625f54f2.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ReflectionFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u81EA\u5B9A\u4E49 Member \u548C Class \u76F8\u5173\u529F\u80FD\u7684\u67E5\u627E\u5339\u914D\u4EE5\u53CA invoke \u7684\u5C01\u88C5\u7C7B\u3002

    MembersType - class

    enum class MembersType
    +import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ReflectionFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u81EA\u5B9A\u4E49 Member \u548C Class \u76F8\u5173\u529F\u80FD\u7684\u67E5\u627E\u5339\u914D\u4EE5\u53CA invoke \u7684\u5C01\u88C5\u7C7B\u3002

    MembersType - class

    enum class MembersType
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5B9A\u4E49\u4E00\u4E2A Class \u4E2D\u7684 Member \u7C7B\u578B

    ALL - enum

    ALL
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5168\u90E8 Method \u4E0E Constructor\u3002

    METHOD - enum

    METHOD
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5168\u90E8 Method\u3002

    CONSTRUCTOR - enum

    CONSTRUCTOR
    @@ -22,13 +22,62 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`
    } }

    hookClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

    normalClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    HookClass \u76F8\u5173\u529F\u80FD\u4E0D\u518D\u5BF9\u5916\u5F00\u653E

    hasClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    \u8BF7\u76F4\u63A5\u4F7F\u7528 hasClass() \u65E0\u53C2\u65B9\u6CD5

    Class.hasExtends - ext-field

    val Class<*>.hasExtends: Boolean
    -

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB\uFF0C\u7236\u7C7B\u662F Any \u5C06\u88AB\u8BA4\u4E3A\u6CA1\u6709\u7EE7\u627F\u5173\u7CFB\u3002

    classOf - method

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u5230 toClass(...) \u65B9\u6CD5

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u76F4\u63A5\u586B\u5199\u4F60\u8981\u67E5\u627E\u7684\u76EE\u6807 Class\uFF0C\u5FC5\u987B\u5728\u9ED8\u8BA4 ClassLoader \u4E0B\u5B58\u5728\u3002

    The following example

    "com.example.demo.DemoClass".toClass()
    +

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB\uFF0C\u7236\u7C7B\u662F Any \u5C06\u88AB\u8BA4\u4E3A\u6CA1\u6709\u7EE7\u627F\u5173\u7CFB\u3002

    Class?.extends - ext-method

    infix fun Class<*>?.extends(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u7EE7\u627F\u4E8E other\u3002

    \u5982\u679C\u5F53\u524D Class \u5C31\u662F other \u4E5F\u4F1A\u8FD4\u56DE true\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A null \u6216 other \u4E3A null \u4F1A\u8FD4\u56DE false\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u5B58\u5728\u7EE7\u627F\u5173\u7CFB\u3002

    The following example

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u7EE7\u627F\u4E8E B
    +if (classA extends classB) {
    +    // Your code here.
    +}
    +

    Class?.notExtends - ext-method

    infix fun Class<*>?.notExtends(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u4E0D\u7EE7\u627F\u4E8E other\u3002

    \u6B64\u65B9\u6CD5\u76F8\u5F53\u4E8E extends \u7684\u53CD\u5411\u5224\u65AD\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u4E0D\u5B58\u5728\u7EE7\u627F\u5173\u7CFB\u3002

    The following example

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u4E0D\u7EE7\u627F\u4E8E B
    +if (classA notExtends classB) {
    +    // Your code here.
    +}
    +

    Class?.implements - ext-method

    infix fun Class<*>?.implements(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u5B9E\u73B0\u4E86 other \u63A5\u53E3\u7C7B\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A null \u6216 other \u4E3A null \u4F1A\u8FD4\u56DE false\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u5B58\u5728\u4F9D\u8D56\u5173\u7CFB\u3002

    The following example

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u5B9E\u73B0\u4E86 B \u63A5\u53E3\u7C7B
    +if (classA implements classB) {
    +    // Your code here.
    +}
    +

    Class?.notImplements - ext-method

    infix fun Class<*>?.notImplements(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u5F53\u524D Class \u662F\u5426\u672A\u5B9E\u73B0 other \u63A5\u53E3\u7C7B\u3002

    \u6B64\u65B9\u6CD5\u76F8\u5F53\u4E8E implements \u7684\u53CD\u5411\u5224\u65AD\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u4F7F\u7528\u6B64\u65B9\u6CD5\u6765\u5224\u65AD\u4E24\u4E2A Class \u662F\u5426\u4E0D\u5B58\u5728\u4F9D\u8D56\u5173\u7CFB\u3002

    The following example

    // \u5047\u8BBE\u4E0B\u9762\u8FD9\u4E24\u4E2A Class \u5C31\u662F\u4F60\u9700\u8981\u5224\u65AD\u7684 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// \u5224\u65AD A \u662F\u5426\u672A\u5B9E\u73B0 B \u63A5\u53E3\u7C7B
    +if (classA notImplements classB) {
    +    // Your code here.
    +}
    +

    Class.toJavaPrimitiveType - ext-method

    fun Class<*>.toJavaPrimitiveType(): Class<*>
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u81EA\u52A8\u8F6C\u6362\u5F53\u524D Class \u4E3A Java \u539F\u59CB\u7C7B\u578B (Primitive Type)\u3002

    \u5982\u679C\u5F53\u524D Class \u4E3A Java \u6216 Kotlin \u57FA\u672C\u7C7B\u578B\u5C06\u81EA\u52A8\u6267\u884C\u7C7B\u578B\u8F6C\u6362\u3002

    \u5F53\u524D\u80FD\u591F\u81EA\u52A8\u8F6C\u6362\u7684\u57FA\u672C\u7C7B\u578B\u5982\u4E0B\u3002

    • kotlin.Unit
    • java.lang.Void
    • java.lang.Boolean
    • java.lang.Integer
    • java.lang.Float
    • java.lang.Double
    • java.lang.Long
    • java.lang.Short
    • java.lang.Character
    • java.lang.Byte

    classOf - method

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u5230 toClass(...) \u65B9\u6CD5

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u76F4\u63A5\u586B\u5199\u4F60\u8981\u67E5\u627E\u7684\u76EE\u6807 Class\uFF0C\u5FC5\u987B\u5728\u9ED8\u8BA4 ClassLoader \u4E0B\u5B58\u5728\u3002

    The following example

    "com.example.demo.DemoClass".toClass()
     

    \u4F60\u8FD8\u53EF\u4EE5\u81EA\u5B9A\u4E49 Class \u6240\u5728\u7684 ClassLoader\u3002

    The following example

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    Function Example

    \u7528\u6CD5\u8BF7\u53C2\u8003 String.toClass \u65B9\u6CD5\u3002

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u901A\u8FC7 T \u5F97\u5230\u5176 Class \u5B9E\u4F8B\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    Function Example

    \u6211\u4EEC\u8981\u83B7\u53D6\u4E00\u4E2A Class \u5728 Kotlin \u4E0B\u4E0D\u901A\u8FC7\u53CD\u5C04\u65F6\u5E94\u8BE5\u8FD9\u6837\u505A\u3002

    The following example

    DemoClass::class.java
    +

    \u4F60\u8FD8\u53EF\u4EE5\u6307\u5B9A Class \u7684\u76EE\u6807\u7C7B\u578B\u3002

    The following example

    // \u6307\u5B9A\u7684 DemoClass \u5FC5\u987B\u5B58\u5728\u6216\u4E3A\u53EF\u8BBF\u95EE\u7684 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    \u4F60\u8FD8\u53EF\u4EE5\u8BBE\u7F6E\u5728\u83B7\u53D6\u5230\u8FD9\u4E2A Class \u65F6\u662F\u5426\u81EA\u52A8\u6267\u884C\u5176\u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\uFF0C\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u6267\u884C\u3002

    The following example

    // \u83B7\u53D6\u5E76\u6267\u884C DemoClass \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    \u9ED8\u8BA4\u7684\u9759\u6001\u65B9\u6CD5\u5757\u5728 Java \u4E2D\u4F7F\u7528\u5982\u4E0B\u65B9\u5F0F\u5B9A\u4E49\u3002

    The following example

    public class DemoClass {
    +
    +    static {
    +        // \u8FD9\u91CC\u662F\u9759\u6001\u65B9\u6CD5\u5757\u7684\u5185\u5BB9
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u65B0\u589E\u6CDB\u578B\u8FD4\u56DE\u503C Class<T> \u65B9\u6CD5

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u901A\u8FC7\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A loader \u4E2D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u627E\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    Function Example

    \u7528\u6CD5\u8BF7\u53C2\u8003 String.toClass \u65B9\u6CD5\u3002

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u5C06\u8FD4\u56DE\u7C7B\u578B\u7531 Class<*> cast \u4E3A Class<T>

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u901A\u8FC7 T \u5F97\u5230\u5176 Class \u5B9E\u4F8B\u5E76\u8F6C\u6362\u4E3A\u5B9E\u4F53\u7C7B\u3002

    Function Example

    \u6211\u4EEC\u8981\u83B7\u53D6\u4E00\u4E2A Class \u5728 Kotlin \u4E0B\u4E0D\u901A\u8FC7\u53CD\u5C04\u65F6\u5E94\u8BE5\u8FD9\u6837\u505A\u3002

    The following example

    DemoClass::class.java
     

    \u73B0\u5728\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5 cast \u4E00\u4E2A\u5B9E\u4F8B\u5E76\u83B7\u53D6\u5B83\u7684 Class \u5BF9\u8C61\uFF0C\u5FC5\u987B\u5728\u5F53\u524D ClassLoader \u4E0B\u5B58\u5728\u3002

    The following example

    classOf<DemoClass>()
     

    \u82E5\u76EE\u6807\u5B58\u5728\u7684 Class \u4E3A stub\uFF0C\u901A\u8FC7\u8FD9\u79CD\u65B9\u5F0F\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u81EA\u5B9A\u4E49 Class \u6240\u5728\u7684 ClassLoader\u3002

    The following example

    val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
     classOf<DemoClass>(customClassLoader)
    @@ -54,7 +103,7 @@ import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`
    inline fun <reified T : Any> T.current(ignored: Boolean, initiate: CurrentClass.() -> Unit): T
     

    Change Records

    v1.0.70 added

    v1.1.0 added

    \u65B0\u589E ignored \u53C2\u6570\uFF0C\u53EF\u4EE5\u5FFD\u7565\u5728 CurrentClass \u4E2D\u51FA\u73B0\u7684\u5F02\u5E38

    \u65B0\u589E\u4E0D\u4F7F\u7528 current { ... } \u8C03\u7528\u57DF\u76F4\u63A5\u4F7F\u7528 current() \u5F97\u5230\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u64CD\u4F5C\u5BF9\u8C61\u3002

    Class.buildOfAny - ext-method

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 buildOf \u65B9\u6CD5

    Class.buildOf - ext-method

    inline fun Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): Any?
     
    inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): T?
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 modified

    \u52A0\u5165\u65E0\u6CDB\u578B\u65B9\u6CD5 buildOf

    Function Illustrate

    \u901A\u8FC7\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5B9E\u4F8B\uFF0C\u6307\u5B9A\u7C7B\u578B T \u6216\u4EFB\u610F\u7C7B\u578B Any\u3002

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(result: (index: Int, method: Method) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u65B9\u6CD5\u3002

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(result: (index: Int, constructor: Constructor<*>) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u6784\u9020\u65B9\u6CD5\u3002

    Class.allFields - ext-method

    inline fun Class<*>.allFields(result: (index: Int, field: Field) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u53D8\u91CF\u3002

    `,317),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(n,[["render",c],["__file","ReflectionFactory.html.vue"]]);export{i as default}; +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.0 modified

    \u52A0\u5165\u65E0\u6CDB\u578B\u65B9\u6CD5 buildOf

    Function Illustrate

    \u901A\u8FC7\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5B9E\u4F8B\uFF0C\u6307\u5B9A\u7C7B\u578B T \u6216\u4EFB\u610F\u7C7B\u578B Any\u3002

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 modified

    \u65B0\u589E isAccessible \u53C2\u6570

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u65B9\u6CD5\u3002

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 modified

    \u65B0\u589E isAccessible \u53C2\u6570

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u6784\u9020\u65B9\u6CD5\u3002

    Class.allFields - ext-method

    inline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    v1.1.5 modified

    \u65B0\u589E isAccessible \u53C2\u6570

    Function Illustrate

    \u904D\u5386\u5F53\u524D\u7C7B\u4E2D\u7684\u6240\u6709\u53D8\u91CF\u3002

    `,397),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(n,[["render",c],["__file","ReflectionFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/ReflectionFactory.html.7c031771.js b/docs/assets/ReflectionFactory.html.7c031771.js deleted file mode 100644 index e031ab95d..000000000 --- a/docs/assets/ReflectionFactory.html.7c031771.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-0d0fcec2","path":"/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html","title":"ReflectionFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"MembersType - class","slug":"memberstype-class","link":"#memberstype-class","children":[{"level":3,"title":"ALL - enum","slug":"all-enum","link":"#all-enum","children":[]},{"level":3,"title":"METHOD - enum","slug":"method-enum","link":"#method-enum","children":[]},{"level":3,"title":"CONSTRUCTOR - enum","slug":"constructor-enum","link":"#constructor-enum","children":[]}]},{"level":2,"title":"ClassLoader.listOfClasses - ext-method","slug":"classloader-listofclasses-ext-method","link":"#classloader-listofclasses-ext-method","children":[]},{"level":2,"title":"ClassLoader.searchClass - ext-method","slug":"classloader-searchclass-ext-method","link":"#classloader-searchclass-ext-method","children":[]},{"level":2,"title":"ClassLoader.onLoadClass - ext-method","slug":"classloader-onloadclass-ext-method","link":"#classloader-onloadclass-ext-method","children":[]},{"level":2,"title":"Class.hasExtends - ext-field","slug":"class-hasextends-ext-field","link":"#class-hasextends-ext-field","children":[]},{"level":2,"title":"String.toClass - ext-method","slug":"string-toclass-ext-method","link":"#string-toclass-ext-method","children":[]},{"level":2,"title":"String.toClassOrNull - ext-method","slug":"string-toclassornull-ext-method","link":"#string-toclassornull-ext-method","children":[]},{"level":2,"title":"classOf - method","slug":"classof-method","link":"#classof-method","children":[]},{"level":2,"title":"String.hasClass - ext-method","slug":"string-hasclass-ext-method","link":"#string-hasclass-ext-method","children":[]},{"level":2,"title":"Class.hasField - ext-method","slug":"class-hasfield-ext-method","link":"#class-hasfield-ext-method","children":[]},{"level":2,"title":"Class.hasMethod - ext-method","slug":"class-hasmethod-ext-method","link":"#class-hasmethod-ext-method","children":[]},{"level":2,"title":"Class.hasConstructor - ext-method","slug":"class-hasconstructor-ext-method","link":"#class-hasconstructor-ext-method","children":[]},{"level":2,"title":"Member.hasModifiers - ext-method","slug":"member-hasmodifiers-ext-method","link":"#member-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.hasModifiers - ext-method","slug":"class-hasmodifiers-ext-method","link":"#class-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.field - ext-method","slug":"class-field-ext-method","link":"#class-field-ext-method","children":[]},{"level":2,"title":"Class.method - ext-method","slug":"class-method-ext-method","link":"#class-method-ext-method","children":[]},{"level":2,"title":"Class.constructor - ext-method","slug":"class-constructor-ext-method","link":"#class-constructor-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method","link":"#class-generic-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method-1","link":"#class-generic-ext-method-1","children":[]},{"level":2,"title":"Any.current - ext-method","slug":"any-current-ext-method","link":"#any-current-ext-method","children":[]},{"level":2,"title":"Class.buildOf - ext-method","slug":"class-buildof-ext-method","link":"#class-buildof-ext-method","children":[]},{"level":2,"title":"Class.allMethods - ext-method","slug":"class-allmethods-ext-method","link":"#class-allmethods-ext-method","children":[]},{"level":2,"title":"Class.allConstructors - ext-method","slug":"class-allconstructors-ext-method","link":"#class-allconstructors-ext-method","children":[]},{"level":2,"title":"Class.allFields - ext-method","slug":"class-allfields-ext-method","link":"#class-allfields-ext-method","children":[]}],"git":{"updatedTime":1664478551000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"}');export{e as data}; diff --git a/docs/assets/ReflectionFactory.html.a7379f4b.js b/docs/assets/ReflectionFactory.html.a7379f4b.js deleted file mode 100644 index 17e0d89f3..000000000 --- a/docs/assets/ReflectionFactory.html.a7379f4b.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-213d88b3","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html","title":"ReflectionFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"MembersType - class","slug":"memberstype-class","link":"#memberstype-class","children":[{"level":3,"title":"ALL - enum","slug":"all-enum","link":"#all-enum","children":[]},{"level":3,"title":"METHOD - enum","slug":"method-enum","link":"#method-enum","children":[]},{"level":3,"title":"CONSTRUCTOR - enum","slug":"constructor-enum","link":"#constructor-enum","children":[]}]},{"level":2,"title":"ClassLoader.listOfClasses - ext-method","slug":"classloader-listofclasses-ext-method","link":"#classloader-listofclasses-ext-method","children":[]},{"level":2,"title":"ClassLoader.searchClass - ext-method","slug":"classloader-searchclass-ext-method","link":"#classloader-searchclass-ext-method","children":[]},{"level":2,"title":"ClassLoader.onLoadClass - ext-method","slug":"classloader-onloadclass-ext-method","link":"#classloader-onloadclass-ext-method","children":[]},{"level":2,"title":"Class.hasExtends - ext-field","slug":"class-hasextends-ext-field","link":"#class-hasextends-ext-field","children":[]},{"level":2,"title":"String.toClass - ext-method","slug":"string-toclass-ext-method","link":"#string-toclass-ext-method","children":[]},{"level":2,"title":"String.toClassOrNull - ext-method","slug":"string-toclassornull-ext-method","link":"#string-toclassornull-ext-method","children":[]},{"level":2,"title":"classOf - method","slug":"classof-method","link":"#classof-method","children":[]},{"level":2,"title":"String.hasClass - ext-method","slug":"string-hasclass-ext-method","link":"#string-hasclass-ext-method","children":[]},{"level":2,"title":"Class.hasField - ext-method","slug":"class-hasfield-ext-method","link":"#class-hasfield-ext-method","children":[]},{"level":2,"title":"Class.hasMethod - ext-method","slug":"class-hasmethod-ext-method","link":"#class-hasmethod-ext-method","children":[]},{"level":2,"title":"Class.hasConstructor - ext-method","slug":"class-hasconstructor-ext-method","link":"#class-hasconstructor-ext-method","children":[]},{"level":2,"title":"Member.hasModifiers - ext-method","slug":"member-hasmodifiers-ext-method","link":"#member-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.hasModifiers - ext-method","slug":"class-hasmodifiers-ext-method","link":"#class-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.field - ext-method","slug":"class-field-ext-method","link":"#class-field-ext-method","children":[]},{"level":2,"title":"Class.method - ext-method","slug":"class-method-ext-method","link":"#class-method-ext-method","children":[]},{"level":2,"title":"Class.constructor - ext-method","slug":"class-constructor-ext-method","link":"#class-constructor-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method","link":"#class-generic-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method-1","link":"#class-generic-ext-method-1","children":[]},{"level":2,"title":"Any.current - ext-method","slug":"any-current-ext-method","link":"#any-current-ext-method","children":[]},{"level":2,"title":"Class.buildOf - ext-method","slug":"class-buildof-ext-method","link":"#class-buildof-ext-method","children":[]},{"level":2,"title":"Class.allMethods - ext-method","slug":"class-allmethods-ext-method","link":"#class-allmethods-ext-method","children":[]},{"level":2,"title":"Class.allConstructors - ext-method","slug":"class-allconstructors-ext-method","link":"#class-allconstructors-ext-method","children":[]},{"level":2,"title":"Class.allFields - ext-method","slug":"class-allfields-ext-method","link":"#class-allfields-ext-method","children":[]}],"git":{"updatedTime":1664478551000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"}');export{e as data}; diff --git a/docs/assets/ReflectionFactory.html.b0131cbd.js b/docs/assets/ReflectionFactory.html.b0131cbd.js new file mode 100644 index 000000000..d443d9421 --- /dev/null +++ b/docs/assets/ReflectionFactory.html.b0131cbd.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-0d0fcec2","path":"/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html","title":"ReflectionFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"MembersType - class","slug":"memberstype-class","link":"#memberstype-class","children":[{"level":3,"title":"ALL - enum","slug":"all-enum","link":"#all-enum","children":[]},{"level":3,"title":"METHOD - enum","slug":"method-enum","link":"#method-enum","children":[]},{"level":3,"title":"CONSTRUCTOR - enum","slug":"constructor-enum","link":"#constructor-enum","children":[]}]},{"level":2,"title":"ClassLoader.listOfClasses - ext-method","slug":"classloader-listofclasses-ext-method","link":"#classloader-listofclasses-ext-method","children":[]},{"level":2,"title":"ClassLoader.searchClass - ext-method","slug":"classloader-searchclass-ext-method","link":"#classloader-searchclass-ext-method","children":[]},{"level":2,"title":"ClassLoader.onLoadClass - ext-method","slug":"classloader-onloadclass-ext-method","link":"#classloader-onloadclass-ext-method","children":[]},{"level":2,"title":"Class.hasExtends - ext-field","slug":"class-hasextends-ext-field","link":"#class-hasextends-ext-field","children":[]},{"level":2,"title":"Class?.extends - ext-method","slug":"class-extends-ext-method","link":"#class-extends-ext-method","children":[]},{"level":2,"title":"Class?.notExtends - ext-method","slug":"class-notextends-ext-method","link":"#class-notextends-ext-method","children":[]},{"level":2,"title":"Class?.implements - ext-method","slug":"class-implements-ext-method","link":"#class-implements-ext-method","children":[]},{"level":2,"title":"Class?.notImplements - ext-method","slug":"class-notimplements-ext-method","link":"#class-notimplements-ext-method","children":[]},{"level":2,"title":"Class.toJavaPrimitiveType - ext-method","slug":"class-tojavaprimitivetype-ext-method","link":"#class-tojavaprimitivetype-ext-method","children":[]},{"level":2,"title":"String.toClass - ext-method","slug":"string-toclass-ext-method","link":"#string-toclass-ext-method","children":[]},{"level":2,"title":"String.toClassOrNull - ext-method","slug":"string-toclassornull-ext-method","link":"#string-toclassornull-ext-method","children":[]},{"level":2,"title":"classOf - method","slug":"classof-method","link":"#classof-method","children":[]},{"level":2,"title":"String.hasClass - ext-method","slug":"string-hasclass-ext-method","link":"#string-hasclass-ext-method","children":[]},{"level":2,"title":"Class.hasField - ext-method","slug":"class-hasfield-ext-method","link":"#class-hasfield-ext-method","children":[]},{"level":2,"title":"Class.hasMethod - ext-method","slug":"class-hasmethod-ext-method","link":"#class-hasmethod-ext-method","children":[]},{"level":2,"title":"Class.hasConstructor - ext-method","slug":"class-hasconstructor-ext-method","link":"#class-hasconstructor-ext-method","children":[]},{"level":2,"title":"Member.hasModifiers - ext-method","slug":"member-hasmodifiers-ext-method","link":"#member-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.hasModifiers - ext-method","slug":"class-hasmodifiers-ext-method","link":"#class-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.field - ext-method","slug":"class-field-ext-method","link":"#class-field-ext-method","children":[]},{"level":2,"title":"Class.method - ext-method","slug":"class-method-ext-method","link":"#class-method-ext-method","children":[]},{"level":2,"title":"Class.constructor - ext-method","slug":"class-constructor-ext-method","link":"#class-constructor-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method","link":"#class-generic-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method-1","link":"#class-generic-ext-method-1","children":[]},{"level":2,"title":"Any.current - ext-method","slug":"any-current-ext-method","link":"#any-current-ext-method","children":[]},{"level":2,"title":"Class.buildOf - ext-method","slug":"class-buildof-ext-method","link":"#class-buildof-ext-method","children":[]},{"level":2,"title":"Class.allMethods - ext-method","slug":"class-allmethods-ext-method","link":"#class-allmethods-ext-method","children":[]},{"level":2,"title":"Class.allConstructors - ext-method","slug":"class-allconstructors-ext-method","link":"#class-allconstructors-ext-method","children":[]},{"level":2,"title":"Class.allFields - ext-method","slug":"class-allfields-ext-method","link":"#class-allfields-ext-method","children":[]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"}');export{e as data}; diff --git a/docs/assets/ReflectionFactory.html.fc39b155.js b/docs/assets/ReflectionFactory.html.fc39b155.js new file mode 100644 index 000000000..409c2b1d7 --- /dev/null +++ b/docs/assets/ReflectionFactory.html.fc39b155.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-213d88b3","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html","title":"ReflectionFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"MembersType - class","slug":"memberstype-class","link":"#memberstype-class","children":[{"level":3,"title":"ALL - enum","slug":"all-enum","link":"#all-enum","children":[]},{"level":3,"title":"METHOD - enum","slug":"method-enum","link":"#method-enum","children":[]},{"level":3,"title":"CONSTRUCTOR - enum","slug":"constructor-enum","link":"#constructor-enum","children":[]}]},{"level":2,"title":"ClassLoader.listOfClasses - ext-method","slug":"classloader-listofclasses-ext-method","link":"#classloader-listofclasses-ext-method","children":[]},{"level":2,"title":"ClassLoader.searchClass - ext-method","slug":"classloader-searchclass-ext-method","link":"#classloader-searchclass-ext-method","children":[]},{"level":2,"title":"ClassLoader.onLoadClass - ext-method","slug":"classloader-onloadclass-ext-method","link":"#classloader-onloadclass-ext-method","children":[]},{"level":2,"title":"Class.hasExtends - ext-field","slug":"class-hasextends-ext-field","link":"#class-hasextends-ext-field","children":[]},{"level":2,"title":"Class?.extends - ext-method","slug":"class-extends-ext-method","link":"#class-extends-ext-method","children":[]},{"level":2,"title":"Class?.notExtends - ext-method","slug":"class-notextends-ext-method","link":"#class-notextends-ext-method","children":[]},{"level":2,"title":"Class?.implements - ext-method","slug":"class-implements-ext-method","link":"#class-implements-ext-method","children":[]},{"level":2,"title":"Class?.notImplements - ext-method","slug":"class-notimplements-ext-method","link":"#class-notimplements-ext-method","children":[]},{"level":2,"title":"Class.toJavaPrimitiveType - ext-method","slug":"class-tojavaprimitivetype-ext-method","link":"#class-tojavaprimitivetype-ext-method","children":[]},{"level":2,"title":"String.toClass - ext-method","slug":"string-toclass-ext-method","link":"#string-toclass-ext-method","children":[]},{"level":2,"title":"String.toClassOrNull - ext-method","slug":"string-toclassornull-ext-method","link":"#string-toclassornull-ext-method","children":[]},{"level":2,"title":"classOf - method","slug":"classof-method","link":"#classof-method","children":[]},{"level":2,"title":"String.hasClass - ext-method","slug":"string-hasclass-ext-method","link":"#string-hasclass-ext-method","children":[]},{"level":2,"title":"Class.hasField - ext-method","slug":"class-hasfield-ext-method","link":"#class-hasfield-ext-method","children":[]},{"level":2,"title":"Class.hasMethod - ext-method","slug":"class-hasmethod-ext-method","link":"#class-hasmethod-ext-method","children":[]},{"level":2,"title":"Class.hasConstructor - ext-method","slug":"class-hasconstructor-ext-method","link":"#class-hasconstructor-ext-method","children":[]},{"level":2,"title":"Member.hasModifiers - ext-method","slug":"member-hasmodifiers-ext-method","link":"#member-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.hasModifiers - ext-method","slug":"class-hasmodifiers-ext-method","link":"#class-hasmodifiers-ext-method","children":[]},{"level":2,"title":"Class.field - ext-method","slug":"class-field-ext-method","link":"#class-field-ext-method","children":[]},{"level":2,"title":"Class.method - ext-method","slug":"class-method-ext-method","link":"#class-method-ext-method","children":[]},{"level":2,"title":"Class.constructor - ext-method","slug":"class-constructor-ext-method","link":"#class-constructor-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method","link":"#class-generic-ext-method","children":[]},{"level":2,"title":"Class.generic - ext-method","slug":"class-generic-ext-method-1","link":"#class-generic-ext-method-1","children":[]},{"level":2,"title":"Any.current - ext-method","slug":"any-current-ext-method","link":"#any-current-ext-method","children":[]},{"level":2,"title":"Class.buildOf - ext-method","slug":"class-buildof-ext-method","link":"#class-buildof-ext-method","children":[]},{"level":2,"title":"Class.allMethods - ext-method","slug":"class-allmethods-ext-method","link":"#class-allmethods-ext-method","children":[]},{"level":2,"title":"Class.allConstructors - ext-method","slug":"class-allconstructors-ext-method","link":"#class-allconstructors-ext-method","children":[]},{"level":2,"title":"Class.allFields - ext-method","slug":"class-allfields-ext-method","link":"#class-allfields-ext-method","children":[]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":11}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"}');export{e as data}; diff --git a/docs/assets/VariableTypeFactory.html.9fceba3f.js b/docs/assets/VariableTypeFactory.html.31f26ece.js similarity index 95% rename from docs/assets/VariableTypeFactory.html.9fceba3f.js rename to docs/assets/VariableTypeFactory.html.31f26ece.js index 3ae89d630..89075ca19 100644 --- a/docs/assets/VariableTypeFactory.html.9fceba3f.js +++ b/docs/assets/VariableTypeFactory.html.31f26ece.js @@ -1 +1 @@ -import{_ as a,r as n,o as r,c as s,b as o,d as c,a as i,e}from"./app.99fcdd51.js";const l={},p=i('

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariableTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Java \u76F8\u5173\u57FA\u672C\u53D8\u91CF\u7C7B\u578B\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',6),d=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(b,f){const t=n("ExternalLinkIcon");return r(),s("div",null,[p,o("p",null,[d,o("a",h,[_,c(t)]),u])])}const y=a(l,[["render",k],["__file","VariableTypeFactory.html.vue"]]);export{y as default}; +import{_ as a,r as n,o as r,c as s,b as o,d as c,a as i,e}from"./app.6074a838.js";const l={},p=i('

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariableTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Java \u76F8\u5173\u57FA\u672C\u53D8\u91CF\u7C7B\u578B\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',6),d=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(b,f){const t=n("ExternalLinkIcon");return r(),s("div",null,[p,o("p",null,[d,o("a",h,[_,c(t)]),u])])}const y=a(l,[["render",k],["__file","VariableTypeFactory.html.vue"]]);export{y as default}; diff --git a/docs/assets/VariableTypeFactory.html.b28309cb.js b/docs/assets/VariableTypeFactory.html.58ffcfc1.js similarity index 94% rename from docs/assets/VariableTypeFactory.html.b28309cb.js rename to docs/assets/VariableTypeFactory.html.58ffcfc1.js index 4a362983d..ab207f23d 100644 --- a/docs/assets/VariableTypeFactory.html.b28309cb.js +++ b/docs/assets/VariableTypeFactory.html.58ffcfc1.js @@ -1 +1 @@ -import{_ as t,r as c,o as r,c as s,b as o,d as n,a as i,e}from"./app.99fcdd51.js";const l={},p=i('

    VariableTypeFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Java \u76F8\u5173\u57FA\u672C\u53D8\u91CF\u7C7B\u578B\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',5),d=e("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function b(y,f){const a=c("ExternalLinkIcon");return r(),s("div",null,[p,o("p",null,[d,o("a",_,[h,n(a)]),k])])}const m=t(l,[["render",b],["__file","VariableTypeFactory.html.vue"]]);export{m as default}; +import{_ as t,r as c,o as r,c as s,b as o,d as n,a as i,e}from"./app.6074a838.js";const l={},p=i('

    VariableTypeFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Java \u76F8\u5173\u57FA\u672C\u53D8\u91CF\u7C7B\u578B\u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',5),d=e("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function b(y,f){const a=c("ExternalLinkIcon");return r(),s("div",null,[p,o("p",null,[d,o("a",_,[h,n(a)]),k])])}const m=t(l,[["render",b],["__file","VariableTypeFactory.html.vue"]]);export{m as default}; diff --git a/docs/assets/VariousClass.html.07a6fda6.js b/docs/assets/VariousClass.html.07a6fda6.js new file mode 100644 index 000000000..6e59ecbc7 --- /dev/null +++ b/docs/assets/VariousClass.html.07a6fda6.js @@ -0,0 +1,4 @@ +import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariousClass - class

    class VariousClass(private vararg val name: String)
    +

    Change Records

    v1.0 first

    v1.1.5 modified

    \u79C1\u6709\u5316 name \u53C2\u6570\u5E76\u8BBE\u7F6E\u4E3A\u4E0D\u53EF\u4FEE\u6539

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u4E0D\u786E\u5B9A\u6027 Class \u7C7B\u540D\u88C5\u8F7D\u5668\uFF0C\u901A\u8FC7 name \u88C5\u8F7D Class \u540D\u79F0\u6570\u7EC4\u3002

    get - method

    fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*>
    +

    Change Records

    v1.0.70 added

    v1.1.5 modified

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u65B0\u589E initialize \u53C2\u6570

    Function Illustrate

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u5339\u914D\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    `,28),p=[l];function c(t,r){return o(),a("div",null,p)}const i=s(n,[["render",c],["__file","VariousClass.html.vue"]]);export{i as default}; diff --git a/docs/assets/VariousClass.html.bd237fa4.js b/docs/assets/VariousClass.html.153f4c39.js similarity index 80% rename from docs/assets/VariousClass.html.bd237fa4.js rename to docs/assets/VariousClass.html.153f4c39.js index c1fc99683..b91565c9e 100644 --- a/docs/assets/VariousClass.html.bd237fa4.js +++ b/docs/assets/VariousClass.html.153f4c39.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-032b1710","path":"/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html","title":"VariousClass - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"getOrNull - method","slug":"getornull-method","link":"#getornull-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-032b1710","path":"/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html","title":"VariousClass - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"getOrNull - method","slug":"getornull-method","link":"#getornull-method","children":[]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"}');export{e as data}; diff --git a/docs/assets/VariousClass.html.26df03a1.js b/docs/assets/VariousClass.html.26df03a1.js deleted file mode 100644 index d4da67bf2..000000000 --- a/docs/assets/VariousClass.html.26df03a1.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as s,o as a,c as o,a as l}from"./app.99fcdd51.js";const e={},n=l(`

    VariousClass - class

    class VariousClass(vararg var name: String)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u4E0D\u786E\u5B9A\u6027 Class \u7C7B\u540D\u88C5\u8F7D\u5668\uFF0C\u901A\u8FC7 name \u88C5\u8F7D Class \u540D\u79F0\u6570\u7EC4\u3002

    get - method

    fun get(loader: ClassLoader? = null): Class<*>
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null): Class<*>?
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u5339\u914D\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    `,21),p=[n];function c(t,r){return a(),o("div",null,p)}const y=s(e,[["render",c],["__file","VariousClass.html.vue"]]);export{y as default}; diff --git a/docs/assets/VariousClass.html.40fd0a28.js b/docs/assets/VariousClass.html.40fd0a28.js deleted file mode 100644 index 5ca865866..000000000 --- a/docs/assets/VariousClass.html.40fd0a28.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariousClass - class

    class VariousClass(vararg var name: String)
    -

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u4E0D\u786E\u5B9A\u6027 Class \u7C7B\u540D\u88C5\u8F7D\u5668\uFF0C\u901A\u8FC7 name \u88C5\u8F7D Class \u540D\u79F0\u6570\u7EC4\u3002

    get - method

    fun get(loader: ClassLoader? = null): Class<*>
    -

    Change Records

    v1.0.70 added

    Function Illustrate

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u5339\u914D\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    `,22),p=[l];function t(c,r){return o(),a("div",null,p)}const i=s(n,[["render",t],["__file","VariousClass.html.vue"]]);export{i as default}; diff --git a/docs/assets/VariousClass.html.417bf33b.js b/docs/assets/VariousClass.html.417bf33b.js new file mode 100644 index 000000000..af21819ce --- /dev/null +++ b/docs/assets/VariousClass.html.417bf33b.js @@ -0,0 +1,4 @@ +import{_ as s,o,c as a,a as l}from"./app.6074a838.js";const e={},n=l(`

    VariousClass - class

    class VariousClass(private vararg val name: String)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.5 \u4FEE\u6539

    \u79C1\u6709\u5316 name \u53C2\u6570\u5E76\u8BBE\u7F6E\u4E3A\u4E0D\u53EF\u4FEE\u6539

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u4E0D\u786E\u5B9A\u6027 Class \u7C7B\u540D\u88C5\u8F7D\u5668\uFF0C\u901A\u8FC7 name \u88C5\u8F7D Class \u540D\u79F0\u6570\u7EC4\u3002

    get - method

    fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*>
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>?
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E initialize \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5339\u914D\u7684\u5B9E\u4F53\u7C7B\u3002

    \u4F7F\u7528\u5F53\u524D loader \u88C5\u8F7D\u76EE\u6807 Class\u3002

    \u5339\u914D\u4E0D\u5230 Class \u4F1A\u8FD4\u56DE null\uFF0C\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u3002

    `,27),p=[n];function c(t,r){return o(),a("div",null,p)}const i=s(e,[["render",c],["__file","VariousClass.html.vue"]]);export{i as default}; diff --git a/docs/assets/VariousClass.html.7c81aa10.js b/docs/assets/VariousClass.html.a490557a.js similarity index 80% rename from docs/assets/VariousClass.html.7c81aa10.js rename to docs/assets/VariousClass.html.a490557a.js index ca110519b..aed608a95 100644 --- a/docs/assets/VariousClass.html.7c81aa10.js +++ b/docs/assets/VariousClass.html.a490557a.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-66735bfe","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html","title":"VariousClass - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"getOrNull - method","slug":"getornull-method","link":"#getornull-method","children":[]}],"git":{"updatedTime":1664278073000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-66735bfe","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html","title":"VariousClass - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"getOrNull - method","slug":"getornull-method","link":"#getornull-method","children":[]}],"git":{"updatedTime":1672581903000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"}');export{e as data}; diff --git a/docs/assets/ViewTypeFactory.html.b429be07.js b/docs/assets/ViewTypeFactory.html.1bc07f15.js similarity index 95% rename from docs/assets/ViewTypeFactory.html.b429be07.js rename to docs/assets/ViewTypeFactory.html.1bc07f15.js index b0d79e545..a0c99df17 100644 --- a/docs/assets/ViewTypeFactory.html.b429be07.js +++ b/docs/assets/ViewTypeFactory.html.1bc07f15.js @@ -1 +1 @@ -import{_ as a,r as n,o as c,c as s,b as o,d as r,a as i,e}from"./app.99fcdd51.js";const p={},d=i('

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ViewTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Widget \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',6),l=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(f,m){const t=n("ExternalLinkIcon");return c(),s("div",null,[d,o("p",null,[l,o("a",h,[_,r(t)]),u])])}const g=a(p,[["render",k],["__file","ViewTypeFactory.html.vue"]]);export{g as default}; +import{_ as a,r as n,o as c,c as s,b as o,d as r,a as i,e}from"./app.6074a838.js";const p={},d=i('

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ViewTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Widget \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',6),l=e("\u8BE6\u60C5\u53EF "),h={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},_=e("\u70B9\u51FB\u8FD9\u91CC"),u=e(" \u8FDB\u884C\u67E5\u770B\u3002");function k(f,m){const t=n("ExternalLinkIcon");return c(),s("div",null,[d,o("p",null,[l,o("a",h,[_,r(t)]),u])])}const g=a(p,[["render",k],["__file","ViewTypeFactory.html.vue"]]);export{g as default}; diff --git a/docs/assets/ViewTypeFactory.html.52d860fb.js b/docs/assets/ViewTypeFactory.html.fd7c5504.js similarity index 94% rename from docs/assets/ViewTypeFactory.html.52d860fb.js rename to docs/assets/ViewTypeFactory.html.fd7c5504.js index 4d0f920f1..27830949d 100644 --- a/docs/assets/ViewTypeFactory.html.52d860fb.js +++ b/docs/assets/ViewTypeFactory.html.fd7c5504.js @@ -1 +1 @@ -import{_ as c,r as a,o as r,c as n,b as o,d as s,a as i,e}from"./app.99fcdd51.js";const d={},p=i('

    ViewTypeFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Widget \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',5),l=e("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function y(f,u){const t=a("ExternalLinkIcon");return r(),n("div",null,[p,o("p",null,[l,o("a",_,[h,s(t)]),k])])}const b=c(d,[["render",y],["__file","ViewTypeFactory.html.vue"]]);export{b as default}; +import{_ as c,r as a,o as r,c as n,b as o,d as s,a as i,e}from"./app.6074a838.js";const d={},p=i('

    ViewTypeFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F\u4E00\u4E2A\u9884\u7F6E Hook \u7C7B\u578B\u7684\u5E38\u91CF\u7C7B\uFF0C\u4E3B\u8981\u4E3A Android \u76F8\u5173 Widget \u7684 Class \u5185\u5BB9\uFF0C\u8DDF\u968F\u7248\u672C\u66F4\u65B0\u4F1A\u9010\u4E00\u8FDB\u884C\u589E\u52A0\u3002

    ',5),l=e("\u8BE6\u60C5\u53EF "),_={href:"https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt",target:"_blank",rel:"noopener noreferrer"},h=e("\u70B9\u51FB\u8FD9\u91CC"),k=e(" \u8FDB\u884C\u67E5\u770B\u3002");function y(f,u){const t=a("ExternalLinkIcon");return r(),n("div",null,[p,o("p",null,[l,o("a",_,[h,s(t)]),k])])}const b=c(d,[["render",y],["__file","ViewTypeFactory.html.vue"]]);export{b as default}; diff --git a/docs/assets/YukiBaseHooker.html.d407e53d.js b/docs/assets/YukiBaseHooker.html.0b3489b9.js similarity index 96% rename from docs/assets/YukiBaseHooker.html.d407e53d.js rename to docs/assets/YukiBaseHooker.html.0b3489b9.js index 9fdc5c873..0989c6182 100644 --- a/docs/assets/YukiBaseHooker.html.d407e53d.js +++ b/docs/assets/YukiBaseHooker.html.0b3489b9.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},c=e(`

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
    +import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},c=e(`

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    YukiHookAPI \u7684\u5B50\u7C7B Hooker \u5B9E\u73B0\u3002

    onHook - method

    fun onHook()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5B50\u7C7B Hook \u5F00\u59CB\u3002

    `,12),l=[c];function p(t,r){return o(),a("div",null,l)}const i=s(n,[["render",p],["__file","YukiBaseHooker.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiBaseHooker.html.ade84104.js b/docs/assets/YukiBaseHooker.html.e8ae1b4e.js similarity index 97% rename from docs/assets/YukiBaseHooker.html.ade84104.js rename to docs/assets/YukiBaseHooker.html.e8ae1b4e.js index 38642a235..b1c413052 100644 --- a/docs/assets/YukiBaseHooker.html.ade84104.js +++ b/docs/assets/YukiBaseHooker.html.e8ae1b4e.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},t=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
    +import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},t=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
     

    Change Records

    v1.0 first

    Function Illustrate

    YukiHookAPI \u7684\u5B50\u7C7B Hooker \u5B9E\u73B0\u3002

    onHook - method

    fun onHook()
     

    Change Records

    v1.0 first

    Function Illustrate

    \u5B50\u7C7B Hook \u5F00\u59CB\u3002

    `,13),c=[t];function l(r,p){return o(),e("div",null,c)}const d=s(n,[["render",l],["__file","YukiBaseHooker.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiHookAPI.html.423ff5d5.js b/docs/assets/YukiHookAPI.html.3732de64.js similarity index 85% rename from docs/assets/YukiHookAPI.html.423ff5d5.js rename to docs/assets/YukiHookAPI.html.3732de64.js index c31777068..e73027398 100644 --- a/docs/assets/YukiHookAPI.html.423ff5d5.js +++ b/docs/assets/YukiHookAPI.html.3732de64.js @@ -1,16 +1,19 @@ -import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookAPI - object

    object YukiHookAPI
    +import{_ as s,o as n,c as o,a as e}from"./app.6074a838.js";const a={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookAPI - object

    object YukiHookAPI
     

    Change Records

    v1.0 first

    Function Illustrate

    \u8FD9\u662F YukiHookAPI \u7684 API \u8C03\u7528\u603B\u7C7B\uFF0CHook \u76F8\u5173\u529F\u80FD\u7684\u5F00\u59CB\u3001Hook \u76F8\u5173\u529F\u80FD\u7684\u914D\u7F6E\u90FD\u5728\u8FD9\u91CC\u3002

    API_VERSION_NAME - field

    const val API_VERSION_NAME: String
     

    Change Records

    v1.0.4 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u3002

    API_VERSION_CODE - field

    const val API_VERSION_CODE: Int
    -

    Change Records

    v1.0.4 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u53F7\u3002

    executorName - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 Status.executorName

    executorVersion - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 Status.executorVersion

    Status - object

    object Status
    +

    Change Records

    v1.0.4 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u53F7\u3002

    executorName - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 Status.Executor.name

    executorVersion - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 Status.Executor.apiLevel\u3001Status.Executor.versionName\u3001Status.Executor.versionCode

    Status - object

    object Status
     

    Change Records

    v1.0.91 added

    Function Illustrate

    \u5F53\u524D YukiHookAPI \u7684\u72B6\u6001\u3002

    compiledTimestamp - field

    val compiledTimestamp: Long
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u83B7\u53D6\u9879\u76EE\u7F16\u8BD1\u5B8C\u6210\u7684\u65F6\u95F4\u6233 (\u5F53\u524D\u672C\u5730\u65F6\u95F4)\u3002

    isXposedEnvironment - field

    val isXposedEnvironment: Boolean
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D\u662F\u5426\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u3002

    executorName - field

    val executorName: String
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook \u6846\u67B6\u7684\u540D\u79F0\u3002

    \u65E0\u6CD5\u83B7\u53D6\u4F1A\u8FD4\u56DE unknown\uFF0CXposedBridge \u4E0D\u5B58\u5728\u4F1A\u8FD4\u56DE invalid\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    executorVersion - field

    val executorVersion: Int
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook \u6846\u67B6\u7684\u7248\u672C\u3002

    \u65E0\u6CD5\u83B7\u53D6\u4F1A\u8FD4\u56DE -1\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    isModuleActive - field

    val isModuleActive: Boolean
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D\u662F\u5426\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u3002

    executorName - field

    Change Records

    v1.0.91 added

    v1.1.5 deprecated

    \u8BF7\u8F6C\u79FB\u5230 Executor.name

    executorVersion - field

    Change Records

    v1.0.91 added

    v1.1.5 deprecated

    \u8BF7\u8F6C\u79FB\u5230 Executor.apiLevel\u3001Executor.versionName\u3001Executor.versionCode

    isModuleActive - field

    val isModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    \u5224\u65AD\u6A21\u5757\u662F\u5426\u5728 Xposed \u6216\u592A\u6781\u3001\u65E0\u6781\u4E2D\u6FC0\u6D3B\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F60\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication\u3002

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4EC5\u8FD4\u56DE\u975E isTaiChiModuleActive \u7684\u6FC0\u6D3B\u72B6\u6001\u3002

    isXposedModuleActive - field

    val isXposedModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    \u4EC5\u5224\u65AD\u6A21\u5757\u662F\u5426\u5728 Xposed \u4E2D\u6FC0\u6D3B\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE true\u3002

    isTaiChiModuleActive - field

    val isTaiChiModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    \u4EC5\u5224\u65AD\u6A21\u5757\u662F\u5426\u5728\u592A\u6781\u3001\u65E0\u6781\u4E2D\u6FC0\u6D3B\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F60\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    isSupportResourcesHook - field

    val isSupportResourcesHook: Boolean
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    \u5224\u65AD\u5F53\u524D Hook Framework \u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u53EF\u80FD\u4F1A\u5EF6\u8FDF\u7B49\u5F85\u4E8B\u4EF6\u56DE\u8C03\u540E\u624D\u4F1A\u8FD4\u56DE true\u3002

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\uFF0C\u5426\u5219\u59CB\u7EC8\u8FD4\u56DE false\u3002

    Configs - object

    object Configs
    +

    Change Records

    v1.0.91 added

    Function Illustrate

    \u5224\u65AD\u5F53\u524D Hook Framework \u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u53EF\u80FD\u4F1A\u5EF6\u8FDF\u7B49\u5F85\u4E8B\u4EF6\u56DE\u8C03\u540E\u624D\u4F1A\u8FD4\u56DE true\u3002

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\uFF0C\u5426\u5219\u59CB\u7EC8\u8FD4\u56DE false\u3002

    Executor - object

    object Executor
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u5F53\u524D YukiHookAPI \u4F7F\u7528\u7684 Hook Framework \u76F8\u5173\u4FE1\u606F\u3002

    name - field

    val name: String
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook Framework \u540D\u79F0\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    apiLevel - field

    val apiLevel: Int
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7684 API \u7248\u672C\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    versionName - field

    val versionName: String
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7248\u672C\u540D\u79F0\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    versionCode - field

    val versionCode: Int
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7248\u672C\u53F7\u3002

    Notice

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    Configs - object

    object Configs
     

    Change Records

    v1.0 first

    Function Illustrate

    \u5BF9 API \u76F8\u5173\u529F\u80FD\u7684\u914D\u7F6E\u7C7B\u3002

    debugLog - method

    inline fun debugLog(initiate: YukiHookLogger.Configs.() -> Unit)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u914D\u7F6E YukiHookLogger.Configs \u76F8\u5173\u53C2\u6570\u3002

    debugTag - field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 YukiHookLogger.Configs.tag

    isDebug - field

    var isDebug: Boolean
     

    Change Records

    v1.0 first

    Function Illustrate

    \u662F\u5426\u542F\u7528 DEBUG \u6A21\u5F0F\u3002

    \u9ED8\u8BA4\u4E3A\u5F00\u542F\u72B6\u6001\uFF0C\u5F00\u542F\u540E\u6A21\u5757\u5C06\u4F1A\u5411 Logcat \u548C XposedBridge.log \u6253\u5370\u8BE6\u7EC6\u7684 Hook \u65E5\u5FD7\uFF0C\u5173\u95ED\u540E\u4EC5\u4F1A\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\u3002

    isAllowPrintingLogs - field

    Change Records

    v1.0.4 added

    v1.1.0 deprecated

    \u8BF7\u8F6C\u79FB\u5230 YukiHookLogger.Configs.isEnable

    isEnableModulePrefsCache - field

    var isEnableModulePrefsCache: Boolean
    @@ -95,4 +98,4 @@ import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`
    fun encase(vararg hooker: YukiBaseHooker)
     
    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     
    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
    -

    Change Records

    v1.0 first

    Function Illustrate

    \u88C5\u8F7D Hook \u5165\u53E3\u7684\u6838\u5FC3\u65B9\u6CD5\u3002

    Function Example

    \u8BE6\u60C5\u8BF7\u53C2\u8003

    `,203),p=[l];function c(r,t){return n(),o("div",null,p)}const d=s(e,[["render",c],["__file","YukiHookAPI.html.vue"]]);export{d as default}; +

    Change Records

    v1.0 first

    Function Illustrate

    \u88C5\u8F7D Hook \u5165\u53E3\u7684\u6838\u5FC3\u65B9\u6CD5\u3002

    Function Example

    \u8BE6\u60C5\u8BF7\u53C2\u8003

    `,231),p=[l];function c(r,t){return n(),o("div",null,p)}const d=s(a,[["render",c],["__file","YukiHookAPI.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiHookAPI.html.476693ca.js b/docs/assets/YukiHookAPI.html.476693ca.js deleted file mode 100644 index 6e2936e12..000000000 --- a/docs/assets/YukiHookAPI.html.476693ca.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-6931cb54","path":"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html","title":"YukiHookAPI - object","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"API_VERSION_NAME - field","slug":"api-version-name-field","link":"#api-version-name-field","children":[]},{"level":2,"title":"API_VERSION_CODE - field","slug":"api-version-code-field","link":"#api-version-code-field","children":[]},{"level":2,"title":"Status - object","slug":"status-object","link":"#status-object","children":[{"level":3,"title":"compiledTimestamp - field","slug":"compiledtimestamp-field","link":"#compiledtimestamp-field","children":[]},{"level":3,"title":"isXposedEnvironment - field","slug":"isxposedenvironment-field","link":"#isxposedenvironment-field","children":[]},{"level":3,"title":"executorName - field","slug":"executorname-field","link":"#executorname-field","children":[]},{"level":3,"title":"executorVersion - field","slug":"executorversion-field","link":"#executorversion-field","children":[]},{"level":3,"title":"isModuleActive - field","slug":"ismoduleactive-field","link":"#ismoduleactive-field","children":[]},{"level":3,"title":"isXposedModuleActive - field","slug":"isxposedmoduleactive-field","link":"#isxposedmoduleactive-field","children":[]},{"level":3,"title":"isTaiChiModuleActive - field","slug":"istaichimoduleactive-field","link":"#istaichimoduleactive-field","children":[]},{"level":3,"title":"isSupportResourcesHook - field","slug":"issupportresourceshook-field","link":"#issupportresourceshook-field","children":[]}]},{"level":2,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[{"level":3,"title":"debugLog - method","slug":"debuglog-method","link":"#debuglog-method","children":[]},{"level":3,"title":"isDebug - field","slug":"isdebug-field","link":"#isdebug-field","children":[]},{"level":3,"title":"isEnableModulePrefsCache - field","slug":"isenablemoduleprefscache-field","link":"#isenablemoduleprefscache-field","children":[]},{"level":3,"title":"isEnableModuleAppResourcesCache - field","slug":"isenablemoduleappresourcescache-field","link":"#isenablemoduleappresourcescache-field","children":[]},{"level":3,"title":"isEnableHookModuleStatus - field","slug":"isenablehookmodulestatus-field","link":"#isenablehookmodulestatus-field","children":[]},{"level":3,"title":"isEnableHookSharedPreferences - field","slug":"isenablehooksharedpreferences-field","link":"#isenablehooksharedpreferences-field","children":[]},{"level":3,"title":"isEnableDataChannel - field","slug":"isenabledatachannel-field","link":"#isenabledatachannel-field","children":[]},{"level":3,"title":"isEnableMemberCache - field","slug":"isenablemembercache-field","link":"#isenablemembercache-field","children":[]}]},{"level":2,"title":"configs - method","slug":"configs-method","link":"#configs-method","children":[]},{"level":2,"title":"encase - method","slug":"encase-method","link":"#encase-method","children":[]}],"git":{"updatedTime":1664200621000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"}');export{e as data}; diff --git a/docs/assets/YukiHookAPI.html.77b2a461.js b/docs/assets/YukiHookAPI.html.77b2a461.js deleted file mode 100644 index 12c4307ce..000000000 --- a/docs/assets/YukiHookAPI.html.77b2a461.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-053599a5","path":"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html","title":"YukiHookAPI - object","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"API_VERSION_NAME - field","slug":"api-version-name-field","link":"#api-version-name-field","children":[]},{"level":2,"title":"API_VERSION_CODE - field","slug":"api-version-code-field","link":"#api-version-code-field","children":[]},{"level":2,"title":"Status - object","slug":"status-object","link":"#status-object","children":[{"level":3,"title":"compiledTimestamp - field","slug":"compiledtimestamp-field","link":"#compiledtimestamp-field","children":[]},{"level":3,"title":"isXposedEnvironment - field","slug":"isxposedenvironment-field","link":"#isxposedenvironment-field","children":[]},{"level":3,"title":"executorName - field","slug":"executorname-field","link":"#executorname-field","children":[]},{"level":3,"title":"executorVersion - field","slug":"executorversion-field","link":"#executorversion-field","children":[]},{"level":3,"title":"isModuleActive - field","slug":"ismoduleactive-field","link":"#ismoduleactive-field","children":[]},{"level":3,"title":"isXposedModuleActive - field","slug":"isxposedmoduleactive-field","link":"#isxposedmoduleactive-field","children":[]},{"level":3,"title":"isTaiChiModuleActive - field","slug":"istaichimoduleactive-field","link":"#istaichimoduleactive-field","children":[]},{"level":3,"title":"isSupportResourcesHook - field","slug":"issupportresourceshook-field","link":"#issupportresourceshook-field","children":[]}]},{"level":2,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[{"level":3,"title":"debugLog - method","slug":"debuglog-method","link":"#debuglog-method","children":[]},{"level":3,"title":"isDebug - field","slug":"isdebug-field","link":"#isdebug-field","children":[]},{"level":3,"title":"isEnableModulePrefsCache - field","slug":"isenablemoduleprefscache-field","link":"#isenablemoduleprefscache-field","children":[]},{"level":3,"title":"isEnableModuleAppResourcesCache - field","slug":"isenablemoduleappresourcescache-field","link":"#isenablemoduleappresourcescache-field","children":[]},{"level":3,"title":"isEnableHookModuleStatus - field","slug":"isenablehookmodulestatus-field","link":"#isenablehookmodulestatus-field","children":[]},{"level":3,"title":"isEnableHookSharedPreferences - field","slug":"isenablehooksharedpreferences-field","link":"#isenablehooksharedpreferences-field","children":[]},{"level":3,"title":"isEnableDataChannel - field","slug":"isenabledatachannel-field","link":"#isenabledatachannel-field","children":[]},{"level":3,"title":"isEnableMemberCache - field","slug":"isenablemembercache-field","link":"#isenablemembercache-field","children":[]}]},{"level":2,"title":"configs - method","slug":"configs-method","link":"#configs-method","children":[]},{"level":2,"title":"encase - method","slug":"encase-method","link":"#encase-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"}');export{e as data}; diff --git a/docs/assets/YukiHookAPI.html.52aa5899.js b/docs/assets/YukiHookAPI.html.bf694837.js similarity index 86% rename from docs/assets/YukiHookAPI.html.52aa5899.js rename to docs/assets/YukiHookAPI.html.bf694837.js index 9cd3b63a4..e307601b5 100644 --- a/docs/assets/YukiHookAPI.html.52aa5899.js +++ b/docs/assets/YukiHookAPI.html.bf694837.js @@ -1,16 +1,19 @@ -import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

    YukiHookAPI - object

    object YukiHookAPI
    +import{_ as s,o as n,c as o,a}from"./app.6074a838.js";const e={},l=a(`

    YukiHookAPI - object

    object YukiHookAPI
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F YukiHookAPI \u7684 API \u8C03\u7528\u603B\u7C7B\uFF0CHook \u76F8\u5173\u529F\u80FD\u7684\u5F00\u59CB\u3001Hook \u76F8\u5173\u529F\u80FD\u7684\u914D\u7F6E\u90FD\u5728\u8FD9\u91CC\u3002

    API_VERSION_NAME - field

    const val API_VERSION_NAME: String
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.4 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u3002

    API_VERSION_CODE - field

    const val API_VERSION_CODE: Int
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.4 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u53F7\u3002

    executorName - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 Status.executorName

    executorVersion - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 Status.executorVersion

    Status - object

    object Status
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.4 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D YukiHookAPI \u7684\u7248\u672C\u53F7\u3002

    executorName - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 Status.Executor.name

    executorVersion - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 Status.Executor.apiLevel\u3001Status.Executor.versionName\u3001Status.Executor.versionCode

    Status - object

    object Status
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D YukiHookAPI \u7684\u72B6\u6001\u3002

    compiledTimestamp - field

    val compiledTimestamp: Long
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u9879\u76EE\u7F16\u8BD1\u5B8C\u6210\u7684\u65F6\u95F4\u6233 (\u5F53\u524D\u672C\u5730\u65F6\u95F4)\u3002

    isXposedEnvironment - field

    val isXposedEnvironment: Boolean
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D\u662F\u5426\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u3002

    executorName - field

    val executorName: String
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook \u6846\u67B6\u7684\u540D\u79F0\u3002

    \u65E0\u6CD5\u83B7\u53D6\u4F1A\u8FD4\u56DE unknown\uFF0CXposedBridge \u4E0D\u5B58\u5728\u4F1A\u8FD4\u56DE invalid\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    executorVersion - field

    val executorVersion: Int
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook \u6846\u67B6\u7684\u7248\u672C\u3002

    \u65E0\u6CD5\u83B7\u53D6\u4F1A\u8FD4\u56DE -1\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    isModuleActive - field

    val isModuleActive: Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D\u662F\u5426\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u3002

    executorName - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    v1.1.5 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 Executor.name

    executorVersion - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    v1.1.5 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 Executor.apiLevel\u3001Executor.versionName\u3001Executor.versionCode

    isModuleActive - field

    val isModuleActive: Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5224\u65AD\u6A21\u5757\u662F\u5426\u5728 Xposed \u6216\u592A\u6781\u3001\u65E0\u6781\u4E2D\u6FC0\u6D3B\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F60\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication\u3002

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4EC5\u8FD4\u56DE\u975E isTaiChiModuleActive \u7684\u6FC0\u6D3B\u72B6\u6001\u3002

    isXposedModuleActive - field

    val isXposedModuleActive: Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u5224\u65AD\u6A21\u5757\u662F\u5426\u5728 Xposed \u4E2D\u6FC0\u6D3B\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE true\u3002

    isTaiChiModuleActive - field

    val isTaiChiModuleActive: Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u5224\u65AD\u6A21\u5757\u662F\u5426\u5728\u592A\u6781\u3001\u65E0\u6781\u4E2D\u6FC0\u6D3B\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F60\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    isSupportResourcesHook - field

    val isSupportResourcesHook: Boolean
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5224\u65AD\u5F53\u524D Hook Framework \u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u53EF\u80FD\u4F1A\u5EF6\u8FDF\u7B49\u5F85\u4E8B\u4EF6\u56DE\u8C03\u540E\u624D\u4F1A\u8FD4\u56DE true\u3002

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\uFF0C\u5426\u5219\u59CB\u7EC8\u8FD4\u56DE false\u3002

    Configs - object

    object Configs
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.91 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5224\u65AD\u5F53\u524D Hook Framework \u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u53EF\u80FD\u4F1A\u5EF6\u8FDF\u7B49\u5F85\u4E8B\u4EF6\u56DE\u8C03\u540E\u624D\u4F1A\u8FD4\u56DE true\u3002

    \u8BF7\u6CE8\u610F\u4F60\u9700\u8981\u786E\u4FDD InjectYukiHookWithXposed.isUsingResourcesHook \u5DF2\u542F\u7528\uFF0C\u5426\u5219\u59CB\u7EC8\u8FD4\u56DE false\u3002

    Executor - object

    object Executor
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5F53\u524D YukiHookAPI \u4F7F\u7528\u7684 Hook Framework \u76F8\u5173\u4FE1\u606F\u3002

    name - field

    val name: String
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook Framework \u540D\u79F0\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    apiLevel - field

    val apiLevel: Int
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7684 API \u7248\u672C\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    versionName - field

    val versionName: String
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7248\u672C\u540D\u79F0\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    versionCode - field

    val versionCode: Int
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D Hook Framework \u7248\u672C\u53F7\u3002

    \u6CE8\u610F

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u9700\u8981\u542F\u7528 Configs.isEnableHookModuleStatus\u3002

    Configs - object

    object Configs
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9 API \u76F8\u5173\u529F\u80FD\u7684\u914D\u7F6E\u7C7B\u3002

    debugLog - method

    inline fun debugLog(initiate: YukiHookLogger.Configs.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u914D\u7F6E YukiHookLogger.Configs \u76F8\u5173\u53C2\u6570\u3002

    debugTag - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 YukiHookLogger.Configs.tag

    isDebug - field

    var isDebug: Boolean
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u662F\u5426\u542F\u7528 DEBUG \u6A21\u5F0F\u3002

    \u9ED8\u8BA4\u4E3A\u5F00\u542F\u72B6\u6001\uFF0C\u5F00\u542F\u540E\u6A21\u5757\u5C06\u4F1A\u5411 Logcat \u548C XposedBridge.log \u6253\u5370\u8BE6\u7EC6\u7684 Hook \u65E5\u5FD7\uFF0C\u5173\u95ED\u540E\u4EC5\u4F1A\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\u3002

    isAllowPrintingLogs - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.4 \u65B0\u589E

    v1.1.0 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 YukiHookLogger.Configs.isEnable

    isEnableModulePrefsCache - field

    var isEnableModulePrefsCache: Boolean
    @@ -95,4 +98,4 @@ import{_ as s,o as n,c as o,a}from"./app.99fcdd51.js";const e={},l=a(`

    fun encase(vararg hooker: YukiBaseHooker)
     
    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     
    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook \u5165\u53E3\u7684\u6838\u5FC3\u65B9\u6CD5\u3002

    \u529F\u80FD\u793A\u4F8B

    \u8BE6\u60C5\u8BF7\u53C2\u8003

    `,202),p=[l];function c(r,t){return n(),o("div",null,p)}const d=s(e,[["render",c],["__file","YukiHookAPI.html.vue"]]);export{d as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook \u5165\u53E3\u7684\u6838\u5FC3\u65B9\u6CD5\u3002

    \u529F\u80FD\u793A\u4F8B

    \u8BE6\u60C5\u8BF7\u53C2\u8003

    `,230),p=[l];function c(r,t){return n(),o("div",null,p)}const d=s(e,[["render",c],["__file","YukiHookAPI.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiHookAPI.html.bf9903b0.js b/docs/assets/YukiHookAPI.html.bf9903b0.js new file mode 100644 index 000000000..cb6b0c70e --- /dev/null +++ b/docs/assets/YukiHookAPI.html.bf9903b0.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-6931cb54","path":"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html","title":"YukiHookAPI - object","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"API_VERSION_NAME - field","slug":"api-version-name-field","link":"#api-version-name-field","children":[]},{"level":2,"title":"API_VERSION_CODE - field","slug":"api-version-code-field","link":"#api-version-code-field","children":[]},{"level":2,"title":"Status - object","slug":"status-object","link":"#status-object","children":[{"level":3,"title":"compiledTimestamp - field","slug":"compiledtimestamp-field","link":"#compiledtimestamp-field","children":[]},{"level":3,"title":"isXposedEnvironment - field","slug":"isxposedenvironment-field","link":"#isxposedenvironment-field","children":[]},{"level":3,"title":"isModuleActive - field","slug":"ismoduleactive-field","link":"#ismoduleactive-field","children":[]},{"level":3,"title":"isXposedModuleActive - field","slug":"isxposedmoduleactive-field","link":"#isxposedmoduleactive-field","children":[]},{"level":3,"title":"isTaiChiModuleActive - field","slug":"istaichimoduleactive-field","link":"#istaichimoduleactive-field","children":[]},{"level":3,"title":"isSupportResourcesHook - field","slug":"issupportresourceshook-field","link":"#issupportresourceshook-field","children":[]},{"level":3,"title":"Executor - object","slug":"executor-object","link":"#executor-object","children":[]}]},{"level":2,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[{"level":3,"title":"debugLog - method","slug":"debuglog-method","link":"#debuglog-method","children":[]},{"level":3,"title":"isDebug - field","slug":"isdebug-field","link":"#isdebug-field","children":[]},{"level":3,"title":"isEnableModulePrefsCache - field","slug":"isenablemoduleprefscache-field","link":"#isenablemoduleprefscache-field","children":[]},{"level":3,"title":"isEnableModuleAppResourcesCache - field","slug":"isenablemoduleappresourcescache-field","link":"#isenablemoduleappresourcescache-field","children":[]},{"level":3,"title":"isEnableHookModuleStatus - field","slug":"isenablehookmodulestatus-field","link":"#isenablehookmodulestatus-field","children":[]},{"level":3,"title":"isEnableHookSharedPreferences - field","slug":"isenablehooksharedpreferences-field","link":"#isenablehooksharedpreferences-field","children":[]},{"level":3,"title":"isEnableDataChannel - field","slug":"isenabledatachannel-field","link":"#isenabledatachannel-field","children":[]},{"level":3,"title":"isEnableMemberCache - field","slug":"isenablemembercache-field","link":"#isenablemembercache-field","children":[]}]},{"level":2,"title":"configs - method","slug":"configs-method","link":"#configs-method","children":[]},{"level":2,"title":"encase - method","slug":"encase-method","link":"#encase-method","children":[]}],"git":{"updatedTime":1673456451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"}');export{e as data}; diff --git a/docs/assets/YukiHookAPI.html.e73ead3a.js b/docs/assets/YukiHookAPI.html.e73ead3a.js new file mode 100644 index 000000000..ec73ed466 --- /dev/null +++ b/docs/assets/YukiHookAPI.html.e73ead3a.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-053599a5","path":"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html","title":"YukiHookAPI - object","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"API_VERSION_NAME - field","slug":"api-version-name-field","link":"#api-version-name-field","children":[]},{"level":2,"title":"API_VERSION_CODE - field","slug":"api-version-code-field","link":"#api-version-code-field","children":[]},{"level":2,"title":"Status - object","slug":"status-object","link":"#status-object","children":[{"level":3,"title":"compiledTimestamp - field","slug":"compiledtimestamp-field","link":"#compiledtimestamp-field","children":[]},{"level":3,"title":"isXposedEnvironment - field","slug":"isxposedenvironment-field","link":"#isxposedenvironment-field","children":[]},{"level":3,"title":"isModuleActive - field","slug":"ismoduleactive-field","link":"#ismoduleactive-field","children":[]},{"level":3,"title":"isXposedModuleActive - field","slug":"isxposedmoduleactive-field","link":"#isxposedmoduleactive-field","children":[]},{"level":3,"title":"isTaiChiModuleActive - field","slug":"istaichimoduleactive-field","link":"#istaichimoduleactive-field","children":[]},{"level":3,"title":"isSupportResourcesHook - field","slug":"issupportresourceshook-field","link":"#issupportresourceshook-field","children":[]},{"level":3,"title":"Executor - object","slug":"executor-object","link":"#executor-object","children":[]}]},{"level":2,"title":"Configs - object","slug":"configs-object","link":"#configs-object","children":[{"level":3,"title":"debugLog - method","slug":"debuglog-method","link":"#debuglog-method","children":[]},{"level":3,"title":"isDebug - field","slug":"isdebug-field","link":"#isdebug-field","children":[]},{"level":3,"title":"isEnableModulePrefsCache - field","slug":"isenablemoduleprefscache-field","link":"#isenablemoduleprefscache-field","children":[]},{"level":3,"title":"isEnableModuleAppResourcesCache - field","slug":"isenablemoduleappresourcescache-field","link":"#isenablemoduleappresourcescache-field","children":[]},{"level":3,"title":"isEnableHookModuleStatus - field","slug":"isenablehookmodulestatus-field","link":"#isenablehookmodulestatus-field","children":[]},{"level":3,"title":"isEnableHookSharedPreferences - field","slug":"isenablehooksharedpreferences-field","link":"#isenablehooksharedpreferences-field","children":[]},{"level":3,"title":"isEnableDataChannel - field","slug":"isenabledatachannel-field","link":"#isenabledatachannel-field","children":[]},{"level":3,"title":"isEnableMemberCache - field","slug":"isenablemembercache-field","link":"#isenablemembercache-field","children":[]}]},{"level":2,"title":"configs - method","slug":"configs-method","link":"#configs-method","children":[]},{"level":2,"title":"encase - method","slug":"encase-method","link":"#encase-method","children":[]}],"git":{"updatedTime":1673456451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"}');export{e as data}; diff --git a/docs/assets/YukiHookDataChannel.html.14b03350.js b/docs/assets/YukiHookDataChannel.html.14b03350.js new file mode 100644 index 000000000..cc44815e8 --- /dev/null +++ b/docs/assets/YukiHookDataChannel.html.14b03350.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-632be8ee","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html","title":"YukiHookDataChannel - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"NameSpace - class","slug":"namespace-class","link":"#namespace-class","children":[{"level":3,"title":"with - method","slug":"with-method","link":"#with-method","children":[]},{"level":3,"title":"allowSendTooLargeData - method","slug":"allowsendtoolargedata-method","link":"#allowsendtoolargedata-method","children":[]},{"level":3,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":3,"title":"put - method","slug":"put-method-1","link":"#put-method-1","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method-1","link":"#wait-method-1","children":[]},{"level":3,"title":"checkingVersionEquals - method","slug":"checkingversionequals-method","link":"#checkingversionequals-method","children":[]},{"level":3,"title":"obtainLoggerInMemoryData - method","slug":"obtainloggerinmemorydata-method","link":"#obtainloggerinmemorydata-method","children":[]}]}],"git":{"updatedTime":1673114223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"}');export{e as data}; diff --git a/docs/assets/YukiHookDataChannel.html.3b0eec14.js b/docs/assets/YukiHookDataChannel.html.3b0eec14.js deleted file mode 100644 index 446b6e8f1..000000000 --- a/docs/assets/YukiHookDataChannel.html.3b0eec14.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-632be8ee","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html","title":"YukiHookDataChannel - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"NameSpace - class","slug":"namespace-class","link":"#namespace-class","children":[{"level":3,"title":"with - method","slug":"with-method","link":"#with-method","children":[]},{"level":3,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":3,"title":"put - method","slug":"put-method-1","link":"#put-method-1","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method-1","link":"#wait-method-1","children":[]},{"level":3,"title":"checkingVersionEquals - method","slug":"checkingversionequals-method","link":"#checkingversionequals-method","children":[]},{"level":3,"title":"obtainLoggerInMemoryData - method","slug":"obtainloggerinmemorydata-method","link":"#obtainloggerinmemorydata-method","children":[]}]}],"git":{"updatedTime":1664833809000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"}');export{e as data}; diff --git a/docs/assets/YukiHookDataChannel.html.6f5cc6e1.js b/docs/assets/YukiHookDataChannel.html.6f5cc6e1.js deleted file mode 100644 index 88a319cb9..000000000 --- a/docs/assets/YukiHookDataChannel.html.6f5cc6e1.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-7414265a","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html","title":"YukiHookDataChannel - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"NameSpace - class","slug":"namespace-class","link":"#namespace-class","children":[{"level":3,"title":"with - method","slug":"with-method","link":"#with-method","children":[]},{"level":3,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":3,"title":"put - method","slug":"put-method-1","link":"#put-method-1","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method-1","link":"#wait-method-1","children":[]},{"level":3,"title":"checkingVersionEquals - method","slug":"checkingversionequals-method","link":"#checkingversionequals-method","children":[]},{"level":3,"title":"obtainLoggerInMemoryData - method","slug":"obtainloggerinmemorydata-method","link":"#obtainloggerinmemorydata-method","children":[]}]}],"git":{"updatedTime":1664833809000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"}');export{e as data}; diff --git a/docs/assets/YukiHookDataChannel.html.85591c3b.js b/docs/assets/YukiHookDataChannel.html.85591c3b.js new file mode 100644 index 000000000..51b5227ca --- /dev/null +++ b/docs/assets/YukiHookDataChannel.html.85591c3b.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-7414265a","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html","title":"YukiHookDataChannel - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"NameSpace - class","slug":"namespace-class","link":"#namespace-class","children":[{"level":3,"title":"with - method","slug":"with-method","link":"#with-method","children":[]},{"level":3,"title":"allowSendTooLargeData - method","slug":"allowsendtoolargedata-method","link":"#allowsendtoolargedata-method","children":[]},{"level":3,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":3,"title":"put - method","slug":"put-method-1","link":"#put-method-1","children":[]},{"level":3,"title":"wait - method","slug":"wait-method","link":"#wait-method","children":[]},{"level":3,"title":"wait - method","slug":"wait-method-1","link":"#wait-method-1","children":[]},{"level":3,"title":"checkingVersionEquals - method","slug":"checkingversionequals-method","link":"#checkingversionequals-method","children":[]},{"level":3,"title":"obtainLoggerInMemoryData - method","slug":"obtainloggerinmemorydata-method","link":"#obtainloggerinmemorydata-method","children":[]}]}],"git":{"updatedTime":1673114223000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"}');export{e as data}; diff --git a/docs/assets/YukiHookDataChannel.html.edaeb594.js b/docs/assets/YukiHookDataChannel.html.98585d6e.js similarity index 51% rename from docs/assets/YukiHookDataChannel.html.edaeb594.js rename to docs/assets/YukiHookDataChannel.html.98585d6e.js index b99e39750..dcc1b6bda 100644 --- a/docs/assets/YukiHookDataChannel.html.edaeb594.js +++ b/docs/assets/YukiHookDataChannel.html.98585d6e.js @@ -1,13 +1,14 @@ -import{_ as s,o as a,c as o,a as n}from"./app.99fcdd51.js";const l={},e=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
    +import{_ as s,o as a,c as o,a as n}from"./app.6074a838.js";const e={},l=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u901A\u8BAF\u6865\u3002

    \u901A\u8FC7\u6A21\u5757\u4E0E\u5BBF\u4E3B\u76F8\u4E92\u6CE8\u518C BroadcastReceiver \u6765\u5B9E\u73B0\u6570\u636E\u7684\u4EA4\u4E92\u3002

    \u6A21\u5757\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication \u6765\u5B9E\u73B0\u6B64\u529F\u80FD\u3002

    Pay Attention

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5426\u5219\u65E0\u6CD5\u5EFA\u7ACB\u901A\u8BAF\u3002

    NameSpace - class

    inner class NameSpace internal constructor(private val context: Context?, private val packageName: String, private val isSecure: Boolean)
     

    Change Records

    v1.0.88 added

    v1.0.90 modified

    \u65B0\u589E isSecure \u53C2\u6570

    Function Illustrate

    YukiHookDataChannel \u547D\u540D\u7A7A\u95F4\u3002

    with - method

    inline fun with(initiate: NameSpace.() -> Unit): NameSpace
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u521B\u5EFA\u4E00\u4E2A\u8C03\u7528\u7A7A\u95F4\u3002

    put - method

    fun <T> put(key: String, value: T)
    +

    Change Records

    v1.0.88 added

    Function Illustrate

    \u521B\u5EFA\u4E00\u4E2A\u8C03\u7528\u7A7A\u95F4\u3002

    allowSendTooLargeData - method

    fun allowSendTooLargeData(): NameSpace
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 added

    \u529F\u80FD\u63CF\u8FF0

    \u89E3\u9664\u53D1\u9001\u6570\u636E\u7684\u5927\u5C0F\u9650\u5236\u5E76\u7981\u6B62\u5F00\u542F\u5206\u6BB5\u53D1\u9001\u529F\u80FD\u3002

    \u4EC5\u4F1A\u5728\u6BCF\u6B21\u8C03\u7528\u65F6\u751F\u6548\uFF0C\u4E0B\u4E00\u6B21\u6CA1\u6709\u8C03\u7528\u6B64\u65B9\u6CD5\u5219\u6B64\u529F\u80FD\u5C06\u88AB\u81EA\u52A8\u5173\u95ED\u3002

    \u4F60\u8FD8\u9700\u8981\u5728\u6574\u4E2A\u8C03\u7528\u57DF\u4E2D\u58F0\u660E\u6CE8\u89E3 CauseProblemsApi \u4EE5\u6D88\u9664\u8B66\u544A\u3002

    Pay Attention

    \u82E5\u4F60\u4E0D\u77E5\u9053\u5141\u8BB8\u6B64\u529F\u80FD\u4F1A\u5E26\u6765\u4F55\u79CD\u540E\u679C\uFF0C\u8BF7\u52FF\u4F7F\u7528\u3002

    put - method

    fun <T> put(key: String, value: T)
     
    fun <T> put(data: ChannelData<T>, value: T?)
     
    fun put(vararg data: ChannelData<*>)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    put - method

    fun put(key: String)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u4EC5\u53D1\u9001\u952E\u503C\u76D1\u542C\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun <T> wait(key: String, result: (value: T) -> Unit)
    -
    fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
    -

    Change Records

    v1.0.88 added

    v1.0.90 modified

    \u79FB\u9664\u9ED8\u8BA4\u503C value

    Function Illustrate

    \u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun wait(key: String, callback: () -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u4EC5\u83B7\u53D6\u76D1\u542C\u7ED3\u679C\uFF0C\u4E0D\u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    Pay Attention

    \u4EC5\u9650\u4F7F\u7528 VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u7684\u76D1\u542C\u624D\u80FD\u88AB\u63A5\u6536\u3002

    checkingVersionEquals - method

    fun checkingVersionEquals(result: (Boolean) -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7684\u7248\u672C\u662F\u5426\u5339\u914D\u3002

    \u901A\u8FC7\u6B64\u65B9\u6CD5\u53EF\u539F\u751F\u5224\u65AD Xposed \u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u91CD\u65B0\u88C5\u8F7D\u9020\u6210\u4E24\u8005\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u3002

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
    -

    Change Records

    v1.1.4 added

    Function Illustrate

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684 ArrayList<YukiLoggerData> \u6570\u636E\u3002

    \u7531\u4E8E\u6A21\u5757\u4E0E\u5BBF\u4E3B\u5904\u4E8E\u4E0D\u540C\u7684\u8FDB\u7A0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6570\u636E\u901A\u8BAF\u6865\u8BBF\u95EE\u5404\u81EA\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    Pay Attention

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u5FC5\u987B\u542F\u7528 YukiHookLogger.Configs.isRecord \u624D\u80FD\u83B7\u53D6\u5230\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7531\u4E8E Android \u9650\u5236\u4E86\u6570\u636E\u4F20\u8F93\u5927\u5C0F\u7684\u6700\u5927\u503C\uFF0C\u5982\u679C\u8C03\u8BD5\u65E5\u5FD7\u8FC7\u591A\u53EF\u80FD\u4F1A\u9020\u6210 TransactionTooLargeException \u5F02\u5E38\u3002

    `,69),p=[e];function t(c,r){return a(),o("div",null,p)}const i=s(l,[["render",t],["__file","YukiHookDataChannel.html.vue"]]);export{i as default}; +

    Change Records

    v1.0.88 added

    Function Illustrate

    \u4EC5\u53D1\u9001\u952E\u503C\u76D1\u542C\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
    +
    fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.0.90 modified

    \u79FB\u9664\u9ED8\u8BA4\u503C value

    v1.1.5 modified

    \u65B0\u589E priority \u53C2\u6570

    Function Illustrate

    \u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    \u65B0\u589E priority \u53C2\u6570

    Function Illustrate

    \u4EC5\u83B7\u53D6\u76D1\u542C\u7ED3\u679C\uFF0C\u4E0D\u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    Pay Attention

    \u4EC5\u9650\u4F7F\u7528 VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u7684\u76D1\u542C\u624D\u80FD\u88AB\u63A5\u6536\u3002

    checkingVersionEquals - method

    fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    \u65B0\u589E priority \u53C2\u6570

    Function Illustrate

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7684\u7248\u672C\u662F\u5426\u5339\u914D\u3002

    \u901A\u8FC7\u6B64\u65B9\u6CD5\u53EF\u539F\u751F\u5224\u65AD Xposed \u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u91CD\u65B0\u88C5\u8F7D\u9020\u6210\u4E24\u8005\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u3002

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
    +

    Change Records

    v1.1.4 added

    v1.1.5 modified

    \u65B0\u589E priority \u53C2\u6570

    Function Illustrate

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684 ArrayList<YukiLoggerData> \u6570\u636E\u3002

    \u7531\u4E8E\u6A21\u5757\u4E0E\u5BBF\u4E3B\u5904\u4E8E\u4E0D\u540C\u7684\u8FDB\u7A0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6570\u636E\u901A\u8BAF\u6865\u8BBF\u95EE\u5404\u81EA\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    Pay Attention

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u5FC5\u987B\u542F\u7528 YukiHookLogger.Configs.isRecord \u624D\u80FD\u83B7\u53D6\u5230\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7531\u4E8E Android \u9650\u5236\u4E86\u6570\u636E\u4F20\u8F93\u5927\u5C0F\u7684\u6700\u5927\u503C\uFF0C\u5982\u679C\u8C03\u8BD5\u65E5\u5FD7\u8FC7\u591A\u53EF\u80FD\u4F1A\u9020\u6210 TransactionTooLargeException \u5F02\u5E38\u3002

    `,86),p=[l];function t(c,r){return a(),o("div",null,p)}const i=s(e,[["render",t],["__file","YukiHookDataChannel.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiHookDataChannel.html.3db91b76.js b/docs/assets/YukiHookDataChannel.html.a56de5c2.js similarity index 52% rename from docs/assets/YukiHookDataChannel.html.3db91b76.js rename to docs/assets/YukiHookDataChannel.html.a56de5c2.js index 20a2014ef..0fc59448e 100644 --- a/docs/assets/YukiHookDataChannel.html.3db91b76.js +++ b/docs/assets/YukiHookDataChannel.html.a56de5c2.js @@ -1,13 +1,14 @@ -import{_ as s,o as a,c as o,a as n}from"./app.99fcdd51.js";const l={},p=n(`

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
    +import{_ as s,o as a,c as o,a as n}from"./app.6074a838.js";const p={},l=n(`

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u901A\u8BAF\u6865\u3002

    \u901A\u8FC7\u6A21\u5757\u4E0E\u5BBF\u4E3B\u76F8\u4E92\u6CE8\u518C BroadcastReceiver \u6765\u5B9E\u73B0\u6570\u636E\u7684\u4EA4\u4E92\u3002

    \u6A21\u5757\u9700\u8981\u5C06 Application \u7EE7\u627F\u4E8E ModuleApplication \u6765\u5B9E\u73B0\u6B64\u529F\u80FD\u3002

    \u7279\u522B\u6CE8\u610F

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5426\u5219\u65E0\u6CD5\u5EFA\u7ACB\u901A\u8BAF\u3002

    NameSpace - class

    inner class NameSpace internal constructor(private val context: Context?, private val packageName: String, private val isSecure: Boolean)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.0.90 \u4FEE\u6539

    \u65B0\u589E isSecure \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    YukiHookDataChannel \u547D\u540D\u7A7A\u95F4\u3002

    with - method

    inline fun with(initiate: NameSpace.() -> Unit): NameSpace
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u521B\u5EFA\u4E00\u4E2A\u8C03\u7528\u7A7A\u95F4\u3002

    put - method

    fun <T> put(key: String, value: T)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u521B\u5EFA\u4E00\u4E2A\u8C03\u7528\u7A7A\u95F4\u3002

    allowSendTooLargeData - method

    fun allowSendTooLargeData(): NameSpace
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u89E3\u9664\u53D1\u9001\u6570\u636E\u7684\u5927\u5C0F\u9650\u5236\u5E76\u7981\u6B62\u5F00\u542F\u5206\u6BB5\u53D1\u9001\u529F\u80FD\u3002

    \u4EC5\u4F1A\u5728\u6BCF\u6B21\u8C03\u7528\u65F6\u751F\u6548\uFF0C\u4E0B\u4E00\u6B21\u6CA1\u6709\u8C03\u7528\u6B64\u65B9\u6CD5\u5219\u6B64\u529F\u80FD\u5C06\u88AB\u81EA\u52A8\u5173\u95ED\u3002

    \u4F60\u8FD8\u9700\u8981\u5728\u6574\u4E2A\u8C03\u7528\u57DF\u4E2D\u58F0\u660E\u6CE8\u89E3 CauseProblemsApi \u4EE5\u6D88\u9664\u8B66\u544A\u3002

    \u7279\u522B\u6CE8\u610F

    \u82E5\u4F60\u4E0D\u77E5\u9053\u5141\u8BB8\u6B64\u529F\u80FD\u4F1A\u5E26\u6765\u4F55\u79CD\u540E\u679C\uFF0C\u8BF7\u52FF\u4F7F\u7528\u3002

    put - method

    fun <T> put(key: String, value: T)
     
    fun <T> put(data: ChannelData<T>, value: T?)
     
    fun put(vararg data: ChannelData<*>)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    put - method

    fun put(key: String)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u53D1\u9001\u952E\u503C\u76D1\u542C\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun <T> wait(key: String, result: (value: T) -> Unit)
    -
    fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.0.90 \u4FEE\u6539

    \u79FB\u9664\u9ED8\u8BA4\u503C value

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun wait(key: String, callback: () -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u83B7\u53D6\u76D1\u542C\u7ED3\u679C\uFF0C\u4E0D\u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    \u7279\u522B\u6CE8\u610F

    \u4EC5\u9650\u4F7F\u7528 VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u7684\u76D1\u542C\u624D\u80FD\u88AB\u63A5\u6536\u3002

    checkingVersionEquals - method

    fun checkingVersionEquals(result: (Boolean) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7684\u7248\u672C\u662F\u5426\u5339\u914D\u3002

    \u901A\u8FC7\u6B64\u65B9\u6CD5\u53EF\u539F\u751F\u5224\u65AD Xposed \u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u91CD\u65B0\u88C5\u8F7D\u9020\u6210\u4E24\u8005\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u3002

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.4 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684 ArrayList<YukiLoggerData> \u6570\u636E\u3002

    \u7531\u4E8E\u6A21\u5757\u4E0E\u5BBF\u4E3B\u5904\u4E8E\u4E0D\u540C\u7684\u8FDB\u7A0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6570\u636E\u901A\u8BAF\u6865\u8BBF\u95EE\u5404\u81EA\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7279\u522B\u6CE8\u610F

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u5FC5\u987B\u542F\u7528 YukiHookLogger.Configs.isRecord \u624D\u80FD\u83B7\u53D6\u5230\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7531\u4E8E Android \u9650\u5236\u4E86\u6570\u636E\u4F20\u8F93\u5927\u5C0F\u7684\u6700\u5927\u503C\uFF0C\u5982\u679C\u8C03\u8BD5\u65E5\u5FD7\u8FC7\u591A\u53EF\u80FD\u4F1A\u9020\u6210 TransactionTooLargeException \u5F02\u5E38\u3002

    `,68),e=[p];function t(c,r){return a(),o("div",null,e)}const d=s(l,[["render",t],["__file","YukiHookDataChannel.html.vue"]]);export{d as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u53D1\u9001\u952E\u503C\u76D1\u542C\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
    +
    fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.0.90 \u4FEE\u6539

    \u79FB\u9664\u9ED8\u8BA4\u503C value

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E priority \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    wait - method

    fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E priority \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u4EC5\u83B7\u53D6\u76D1\u542C\u7ED3\u679C\uFF0C\u4E0D\u83B7\u53D6\u952E\u503C\u6570\u636E\u3002

    \u7279\u522B\u6CE8\u610F

    \u4EC5\u9650\u4F7F\u7528 VALUE_WAIT_FOR_LISTENER \u53D1\u9001\u7684\u76D1\u542C\u624D\u80FD\u88AB\u63A5\u6536\u3002

    checkingVersionEquals - method

    fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.88 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E priority \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7684\u7248\u672C\u662F\u5426\u5339\u914D\u3002

    \u901A\u8FC7\u6B64\u65B9\u6CD5\u53EF\u539F\u751F\u5224\u65AD Xposed \u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u91CD\u65B0\u88C5\u8F7D\u9020\u6210\u4E24\u8005\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u3002

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.4 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u65B0\u589E priority \u53C2\u6570

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684 ArrayList<YukiLoggerData> \u6570\u636E\u3002

    \u7531\u4E8E\u6A21\u5757\u4E0E\u5BBF\u4E3B\u5904\u4E8E\u4E0D\u540C\u7684\u8FDB\u7A0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6570\u636E\u901A\u8BAF\u6865\u8BBF\u95EE\u5404\u81EA\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7279\u522B\u6CE8\u610F

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u5FC5\u987B\u542F\u7528 YukiHookLogger.Configs.isRecord \u624D\u80FD\u83B7\u53D6\u5230\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u3002

    \u7531\u4E8E Android \u9650\u5236\u4E86\u6570\u636E\u4F20\u8F93\u5927\u5C0F\u7684\u6700\u5927\u503C\uFF0C\u5982\u679C\u8C03\u8BD5\u65E5\u5FD7\u8FC7\u591A\u53EF\u80FD\u4F1A\u9020\u6210 TransactionTooLargeException \u5F02\u5E38\u3002

    `,85),e=[l];function t(c,r){return a(),o("div",null,e)}const d=s(p,[["render",t],["__file","YukiHookDataChannel.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiHookFactory.html.64f654a6.js b/docs/assets/YukiHookFactory.html.09287903.js similarity index 93% rename from docs/assets/YukiHookFactory.html.64f654a6.js rename to docs/assets/YukiHookFactory.html.09287903.js index 6458dd023..e78f1e4ab 100644 --- a/docs/assets/YukiHookFactory.html.64f654a6.js +++ b/docs/assets/YukiHookFactory.html.09287903.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-448e9585","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html","title":"YukiHookFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"IYukiHookXposedInit.configs - ext-method","slug":"iyukihookxposedinit-configs-ext-method","link":"#iyukihookxposedinit-configs-ext-method","children":[]},{"level":2,"title":"IYukiHookXposedInit.encase - ext-method","slug":"iyukihookxposedinit-encase-ext-method","link":"#iyukihookxposedinit-encase-ext-method","children":[]},{"level":2,"title":"Context.modulePrefs - ext-field","slug":"context-moduleprefs-ext-field","link":"#context-moduleprefs-ext-field","children":[]},{"level":2,"title":"Context.modulePrefs - ext-method","slug":"context-moduleprefs-ext-method","link":"#context-moduleprefs-ext-method","children":[]},{"level":2,"title":"Context.dataChannel - ext-method","slug":"context-datachannel-ext-method","link":"#context-datachannel-ext-method","children":[]},{"level":2,"title":"Context.processName - ext-field","slug":"context-processname-ext-field","link":"#context-processname-ext-field","children":[]},{"level":2,"title":"Context+Resources.injectModuleAppResources - ext-method","slug":"context-resources-injectmoduleappresources-ext-method","link":"#context-resources-injectmoduleappresources-ext-method","children":[]},{"level":2,"title":"Context.registerModuleAppActivities - ext-method","slug":"context-registermoduleappactivities-ext-method","link":"#context-registermoduleappactivities-ext-method","children":[]},{"level":2,"title":"Context.applyModuleTheme - ext-method","slug":"context-applymoduletheme-ext-method","link":"#context-applymoduletheme-ext-method","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-448e9585","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html","title":"YukiHookFactory - kt","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"IYukiHookXposedInit.configs - ext-method","slug":"iyukihookxposedinit-configs-ext-method","link":"#iyukihookxposedinit-configs-ext-method","children":[]},{"level":2,"title":"IYukiHookXposedInit.encase - ext-method","slug":"iyukihookxposedinit-encase-ext-method","link":"#iyukihookxposedinit-encase-ext-method","children":[]},{"level":2,"title":"Context.modulePrefs - ext-field","slug":"context-moduleprefs-ext-field","link":"#context-moduleprefs-ext-field","children":[]},{"level":2,"title":"Context.modulePrefs - ext-method","slug":"context-moduleprefs-ext-method","link":"#context-moduleprefs-ext-method","children":[]},{"level":2,"title":"Context.dataChannel - ext-method","slug":"context-datachannel-ext-method","link":"#context-datachannel-ext-method","children":[]},{"level":2,"title":"Context.processName - ext-field","slug":"context-processname-ext-field","link":"#context-processname-ext-field","children":[]},{"level":2,"title":"Context+Resources.injectModuleAppResources - ext-method","slug":"context-resources-injectmoduleappresources-ext-method","link":"#context-resources-injectmoduleappresources-ext-method","children":[]},{"level":2,"title":"Context.registerModuleAppActivities - ext-method","slug":"context-registermoduleappactivities-ext-method","link":"#context-registermoduleappactivities-ext-method","children":[]},{"level":2,"title":"Context.applyModuleTheme - ext-method","slug":"context-applymoduletheme-ext-method","link":"#context-applymoduletheme-ext-method","children":[]}],"git":{"updatedTime":1672335901000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"}');export{e as data}; diff --git a/docs/assets/YukiHookFactory.html.233ed606.js b/docs/assets/YukiHookFactory.html.1e9cdab5.js similarity index 84% rename from docs/assets/YukiHookFactory.html.233ed606.js rename to docs/assets/YukiHookFactory.html.1e9cdab5.js index 070666ddb..3c8455cdd 100644 --- a/docs/assets/YukiHookFactory.html.233ed606.js +++ b/docs/assets/YukiHookFactory.html.1e9cdab5.js @@ -1,4 +1,4 @@ -import{_ as e,o,c as s,a as n}from"./app.99fcdd51.js";const a={},t=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookFactory - kt

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5408\u5E76\u5230 IYukiHookXposedInit\uFF0C\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u8FD9\u662F YukiHookAPI \u76F8\u5173 lambda \u65B9\u6CD5\u7684\u5C01\u88C5\u7C7B\u4EE5\u53CA\u90E8\u5206 API \u7528\u6CD5\u3002

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
    +import{_ as e,o,c as s,a as n}from"./app.6074a838.js";const a={},t=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookFactory - kt

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5408\u5E76\u5230 IYukiHookXposedInit\uFF0C\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u8FD9\u662F YukiHookAPI \u76F8\u5173 lambda \u65B9\u6CD5\u7684\u5C01\u88C5\u7C7B\u4EE5\u53CA\u90E8\u5206 API \u7528\u6CD5\u3002

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
     

    Change Records

    v1.0.1 added

    v1.0.80 modified

    \u5408\u5E76\u5230 IYukiHookXposedInit

    Function Illustrate

    \u5728 IYukiHookXposedInit \u4E2D\u914D\u7F6E Configs\u3002

    IYukiHookXposedInit.encase - ext-method

    fun IYukiHookXposedInit.encase(initiate: PackageParam.() -> Unit)
     
    fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
     

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5408\u5E76\u5230 IYukiHookXposedInit

    Function Illustrate

    \u5728 IYukiHookXposedInit \u4E2D\u8C03\u7528 YukiHookAPI\u3002

    Context.modulePrefs - ext-field

    val Context.modulePrefs: YukiHookModulePrefs
    @@ -8,5 +8,5 @@ import{_ as e,o,c as s,a as n}from"./app.99fcdd51.js";const a={},t=n(`

    Change Records

    v1.0 first

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D\u8FDB\u7A0B\u540D\u79F0\u3002

    Context+Resources.injectModuleAppResources - ext-method

    fun Context.injectModuleAppResources()
     
    fun Resources.injectModuleAppResources()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5411 Hook APP (\u5BBF\u4E3B) Context \u6216 Resources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u6CE8\u5165\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u4F8B\u5982 ImageView.setImageResource \u6216 Resources.getString \u88C5\u8F7D\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90 ID\u3002

    \u6CE8\u5165\u7684\u8D44\u6E90\u4F5C\u7528\u57DF\u4EC5\u9650\u5F53\u524D Context \u6216 Resources\uFF0C\u4F60\u9700\u8981\u5728\u6BCF\u4E2A\u7528\u5230\u5BBF\u4E3B Context \u6216 Resources \u7684\u5730\u65B9\u91CD\u590D\u8C03\u7528\u6B64\u65B9\u6CD5\u8FDB\u884C\u6CE8\u5165\u624D\u80FD\u4F7F\u7528\u3002

    Pay Attention

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    Context.registerModuleAppActivities - ext-method

    fun Context.registerModuleAppActivities(proxy: Any?)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5411 Hook APP (\u5BBF\u4E3B) \u6CE8\u518C\u5F53\u524D Xposed \u6A21\u5757\u7684 Activity\u3002

    \u6CE8\u518C\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 Context.startActivity \u6765\u542F\u52A8\u672A\u5728\u5BBF\u4E3B\u4E2D\u6CE8\u518C\u7684 Activity\u3002

    \u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u5728\u672A\u6CE8\u518C\u7684 Activity \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u542F\u52A8\u65F6\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u4F60\u8981\u5C06\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u7684 Activity \u7EE7\u627F\u4E8E ModuleAppActivity \u6216 ModuleAppCompatActivity\u3002

    Pay Attention

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    \u751F\u6210\u4E00\u4E2A ContextThemeWrapper \u4EE3\u7406\u4EE5\u5E94\u7528\u5F53\u524D Xposed \u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u5982\u679C\u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u53D1\u751F ClassCastException\uFF0C\u8BF7\u624B\u52A8\u8BBE\u7F6E configuration\u3002

    isSupportResourcesHook - field

    Change Records

    v1.0.80 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    Change Records

    v1.0 first

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    Change Records

    v1.0 first

    v1.0.91 deprecated

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status

    `,103),c=[t];function p(l,d){return o(),s("div",null,c)}const i=e(a,[["render",p],["__file","YukiHookFactory.html.vue"]]);export{i as default}; +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    \u52A0\u5165\u6700\u4F4E API \u7248\u672C\u9650\u5236

    Function Illustrate

    \u5411 Hook APP (\u5BBF\u4E3B) \u6CE8\u518C\u5F53\u524D Xposed \u6A21\u5757\u7684 Activity\u3002

    \u6CE8\u518C\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 Context.startActivity \u6765\u542F\u52A8\u672A\u5728\u5BBF\u4E3B\u4E2D\u6CE8\u518C\u7684 Activity\u3002

    \u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u5728\u672A\u6CE8\u518C\u7684 Activity \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u542F\u52A8\u65F6\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u4F60\u8981\u5C06\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u7684 Activity \u7EE7\u627F\u4E8E ModuleAppActivity \u6216 ModuleAppCompatActivity\u3002

    Pay Attention

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    \u6700\u4F4E\u652F\u6301 Android 7.0 (API 24)\u3002

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    \u751F\u6210\u4E00\u4E2A ContextThemeWrapper \u4EE3\u7406\u4EE5\u5E94\u7528\u5F53\u524D Xposed \u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u5982\u679C\u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u53D1\u751F ClassCastException\uFF0C\u8BF7\u624B\u52A8\u8BBE\u7F6E configuration\u3002

    isSupportResourcesHook - field

    Change Records

    v1.0.80 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    Change Records

    v1.0 first

    v1.0.91 removed

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    Change Records

    v1.0 first

    v1.0.91 deprecated

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status

    `,105),c=[t];function p(l,d){return o(),s("div",null,c)}const i=e(a,[["render",p],["__file","YukiHookFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiHookFactory.html.61db5860.js b/docs/assets/YukiHookFactory.html.bfbfbca6.js similarity index 93% rename from docs/assets/YukiHookFactory.html.61db5860.js rename to docs/assets/YukiHookFactory.html.bfbfbca6.js index e95660b06..793567846 100644 --- a/docs/assets/YukiHookFactory.html.61db5860.js +++ b/docs/assets/YukiHookFactory.html.bfbfbca6.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-65091354","path":"/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html","title":"YukiHookFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"IYukiHookXposedInit.configs - ext-method","slug":"iyukihookxposedinit-configs-ext-method","link":"#iyukihookxposedinit-configs-ext-method","children":[]},{"level":2,"title":"IYukiHookXposedInit.encase - ext-method","slug":"iyukihookxposedinit-encase-ext-method","link":"#iyukihookxposedinit-encase-ext-method","children":[]},{"level":2,"title":"Context.modulePrefs - ext-field","slug":"context-moduleprefs-ext-field","link":"#context-moduleprefs-ext-field","children":[]},{"level":2,"title":"Context.modulePrefs - ext-method","slug":"context-moduleprefs-ext-method","link":"#context-moduleprefs-ext-method","children":[]},{"level":2,"title":"Context.dataChannel - ext-method","slug":"context-datachannel-ext-method","link":"#context-datachannel-ext-method","children":[]},{"level":2,"title":"Context.processName - ext-field","slug":"context-processname-ext-field","link":"#context-processname-ext-field","children":[]},{"level":2,"title":"Context+Resources.injectModuleAppResources - ext-method","slug":"context-resources-injectmoduleappresources-ext-method","link":"#context-resources-injectmoduleappresources-ext-method","children":[]},{"level":2,"title":"Context.registerModuleAppActivities - ext-method","slug":"context-registermoduleappactivities-ext-method","link":"#context-registermoduleappactivities-ext-method","children":[]},{"level":2,"title":"Context.applyModuleTheme - ext-method","slug":"context-applymoduletheme-ext-method","link":"#context-applymoduletheme-ext-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-65091354","path":"/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html","title":"YukiHookFactory - kt","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"IYukiHookXposedInit.configs - ext-method","slug":"iyukihookxposedinit-configs-ext-method","link":"#iyukihookxposedinit-configs-ext-method","children":[]},{"level":2,"title":"IYukiHookXposedInit.encase - ext-method","slug":"iyukihookxposedinit-encase-ext-method","link":"#iyukihookxposedinit-encase-ext-method","children":[]},{"level":2,"title":"Context.modulePrefs - ext-field","slug":"context-moduleprefs-ext-field","link":"#context-moduleprefs-ext-field","children":[]},{"level":2,"title":"Context.modulePrefs - ext-method","slug":"context-moduleprefs-ext-method","link":"#context-moduleprefs-ext-method","children":[]},{"level":2,"title":"Context.dataChannel - ext-method","slug":"context-datachannel-ext-method","link":"#context-datachannel-ext-method","children":[]},{"level":2,"title":"Context.processName - ext-field","slug":"context-processname-ext-field","link":"#context-processname-ext-field","children":[]},{"level":2,"title":"Context+Resources.injectModuleAppResources - ext-method","slug":"context-resources-injectmoduleappresources-ext-method","link":"#context-resources-injectmoduleappresources-ext-method","children":[]},{"level":2,"title":"Context.registerModuleAppActivities - ext-method","slug":"context-registermoduleappactivities-ext-method","link":"#context-registermoduleappactivities-ext-method","children":[]},{"level":2,"title":"Context.applyModuleTheme - ext-method","slug":"context-applymoduletheme-ext-method","link":"#context-applymoduletheme-ext-method","children":[]}],"git":{"updatedTime":1672335901000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"}');export{e as data}; diff --git a/docs/assets/YukiHookFactory.html.b68c21d1.js b/docs/assets/YukiHookFactory.html.e4062578.js similarity index 84% rename from docs/assets/YukiHookFactory.html.b68c21d1.js rename to docs/assets/YukiHookFactory.html.e4062578.js index 41ff97ff1..725e100a3 100644 --- a/docs/assets/YukiHookFactory.html.b68c21d1.js +++ b/docs/assets/YukiHookFactory.html.e4062578.js @@ -1,4 +1,4 @@ -import{_ as o,o as e,c as s,a as n}from"./app.99fcdd51.js";const a={},p=n(`

    YukiHookFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5408\u5E76\u5230 IYukiHookXposedInit\uFF0C\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F YukiHookAPI \u76F8\u5173 lambda \u65B9\u6CD5\u7684\u5C01\u88C5\u7C7B\u4EE5\u53CA\u90E8\u5206 API \u7528\u6CD5\u3002

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
    +import{_ as o,o as e,c as s,a as n}from"./app.6074a838.js";const a={},p=n(`

    YukiHookFactory - kt

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5408\u5E76\u5230 IYukiHookXposedInit\uFF0C\u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u8FD9\u662F YukiHookAPI \u76F8\u5173 lambda \u65B9\u6CD5\u7684\u5C01\u88C5\u7C7B\u4EE5\u53CA\u90E8\u5206 API \u7528\u6CD5\u3002

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.1 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5408\u5E76\u5230 IYukiHookXposedInit

    \u529F\u80FD\u63CF\u8FF0

    \u5728 IYukiHookXposedInit \u4E2D\u914D\u7F6E Configs\u3002

    IYukiHookXposedInit.encase - ext-method

    fun IYukiHookXposedInit.encase(initiate: PackageParam.() -> Unit)
     
    fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5408\u5E76\u5230 IYukiHookXposedInit

    \u529F\u80FD\u63CF\u8FF0

    \u5728 IYukiHookXposedInit \u4E2D\u8C03\u7528 YukiHookAPI\u3002

    Context.modulePrefs - ext-field

    val Context.modulePrefs: YukiHookModulePrefs
    @@ -8,5 +8,5 @@ import{_ as o,o as e,c as s,a as n}from"./app.99fcdd51.js";const a={},p=n(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D\u8FDB\u7A0B\u540D\u79F0\u3002

    Context+Resources.injectModuleAppResources - ext-method

    fun Context.injectModuleAppResources()
     
    fun Resources.injectModuleAppResources()
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5411 Hook APP (\u5BBF\u4E3B) Context \u6216 Resources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u6CE8\u5165\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\u4F8B\u5982 ImageView.setImageResource \u6216 Resources.getString \u88C5\u8F7D\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90 ID\u3002

    \u6CE8\u5165\u7684\u8D44\u6E90\u4F5C\u7528\u57DF\u4EC5\u9650\u5F53\u524D Context \u6216 Resources\uFF0C\u4F60\u9700\u8981\u5728\u6BCF\u4E2A\u7528\u5230\u5BBF\u4E3B Context \u6216 Resources \u7684\u5730\u65B9\u91CD\u590D\u8C03\u7528\u6B64\u65B9\u6CD5\u8FDB\u884C\u6CE8\u5165\u624D\u80FD\u4F7F\u7528\u3002

    \u7279\u522B\u6CE8\u610F

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    Context.registerModuleAppActivities - ext-method

    fun Context.registerModuleAppActivities(proxy: Any?)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5411 Hook APP (\u5BBF\u4E3B) \u6CE8\u518C\u5F53\u524D Xposed \u6A21\u5757\u7684 Activity\u3002

    \u6CE8\u518C\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 Context.startActivity \u6765\u542F\u52A8\u672A\u5728\u5BBF\u4E3B\u4E2D\u6CE8\u518C\u7684 Activity\u3002

    \u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u5728\u672A\u6CE8\u518C\u7684 Activity \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u542F\u52A8\u65F6\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u4F60\u8981\u5C06\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u7684 Activity \u7EE7\u627F\u4E8E ModuleAppActivity \u6216 ModuleAppCompatActivity\u3002

    \u7279\u522B\u6CE8\u610F

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u751F\u6210\u4E00\u4E2A ContextThemeWrapper \u4EE3\u7406\u4EE5\u5E94\u7528\u5F53\u524D Xposed \u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u5982\u679C\u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u53D1\u751F ClassCastException\uFF0C\u8BF7\u624B\u52A8\u8BBE\u7F6E configuration\u3002

    isSupportResourcesHook - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.6 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.6 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.91 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status

    `,102),c=[p];function t(l,d){return e(),s("div",null,c)}const i=o(a,[["render",t],["__file","YukiHookFactory.html.vue"]]);export{i as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    v1.1.5 \u4FEE\u6539

    \u52A0\u5165\u6700\u4F4E API \u7248\u672C\u9650\u5236

    \u529F\u80FD\u63CF\u8FF0

    \u5411 Hook APP (\u5BBF\u4E3B) \u6CE8\u518C\u5F53\u524D Xposed \u6A21\u5757\u7684 Activity\u3002

    \u6CE8\u518C\u6210\u529F\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 Context.startActivity \u6765\u542F\u52A8\u672A\u5728\u5BBF\u4E3B\u4E2D\u6CE8\u518C\u7684 Activity\u3002

    \u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u5728\u672A\u6CE8\u518C\u7684 Activity \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u542F\u52A8\u65F6\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u4F60\u8981\u5C06\u9700\u8981\u5728\u5BBF\u4E3B\u542F\u52A8\u7684 Activity \u7EE7\u627F\u4E8E ModuleAppActivity \u6216 ModuleAppCompatActivity\u3002

    \u7279\u522B\u6CE8\u610F

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u5176\u5B83\u73AF\u5883\u4E0B\u4F7F\u7528\u5C06\u4E0D\u751F\u6548\u4E14\u4F1A\u6253\u5370\u8B66\u544A\u4FE1\u606F\u3002

    \u6700\u4F4E\u652F\u6301 Android 7.0 (API 24)\u3002

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u751F\u6210\u4E00\u4E2A ContextThemeWrapper \u4EE3\u7406\u4EE5\u5E94\u7528\u5F53\u524D Xposed \u6A21\u5757\u7684\u4E3B\u9898\u8D44\u6E90\u3002

    \u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u4F1A\u81EA\u52A8\u8C03\u7528 injectModuleAppResources \u6CE8\u5165\u5F53\u524D Xposed \u6A21\u5757\u7684\u8D44\u6E90\u3002

    \u5982\u679C\u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u4F7F\u7528\u6B64\u65B9\u6CD5\u53D1\u751F ClassCastException\uFF0C\u8BF7\u624B\u52A8\u8BBE\u7F6E configuration\u3002

    isSupportResourcesHook - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.6 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.6 \u65B0\u589E

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.91 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.91 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status

    `,104),c=[p];function t(l,d){return e(),s("div",null,c)}const i=o(a,[["render",t],["__file","YukiHookFactory.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiHookModulePrefs.html.198e73d3.js b/docs/assets/YukiHookModulePrefs.html.198e73d3.js new file mode 100644 index 000000000..1264f8b09 --- /dev/null +++ b/docs/assets/YukiHookModulePrefs.html.198e73d3.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-003862c2","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html","title":"YukiHookModulePrefs - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"isPreferencesAvailable - field","slug":"ispreferencesavailable-field","link":"#ispreferencesavailable-field","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"direct - method","slug":"direct-method","link":"#direct-method","children":[]},{"level":2,"title":"getString - method","slug":"getstring-method","link":"#getstring-method","children":[]},{"level":2,"title":"getStringSet - method","slug":"getstringset-method","link":"#getstringset-method","children":[]},{"level":2,"title":"getBoolean - method","slug":"getboolean-method","link":"#getboolean-method","children":[]},{"level":2,"title":"getInt - method","slug":"getint-method","link":"#getint-method","children":[]},{"level":2,"title":"getLong - method","slug":"getlong-method","link":"#getlong-method","children":[]},{"level":2,"title":"getFloat - method","slug":"getfloat-method","link":"#getfloat-method","children":[]},{"level":2,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method","link":"#remove-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method-1","link":"#remove-method-1","children":[]},{"level":2,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":2,"title":"putString - method","slug":"putstring-method","link":"#putstring-method","children":[]},{"level":2,"title":"putStringSet - method","slug":"putstringset-method","link":"#putstringset-method","children":[]},{"level":2,"title":"putBoolean - method","slug":"putboolean-method","link":"#putboolean-method","children":[]},{"level":2,"title":"putInt - method","slug":"putint-method","link":"#putint-method","children":[]},{"level":2,"title":"putLong - method","slug":"putlong-method","link":"#putlong-method","children":[]},{"level":2,"title":"putFloat - method","slug":"putfloat-method","link":"#putfloat-method","children":[]},{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":2,"title":"clearCache - method","slug":"clearcache-method","link":"#clearcache-method","children":[]}],"git":{"updatedTime":1672331859000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"}');export{e as data}; diff --git a/docs/assets/YukiHookModulePrefs.html.bdd6b713.js b/docs/assets/YukiHookModulePrefs.html.25bb60fd.js similarity index 88% rename from docs/assets/YukiHookModulePrefs.html.bdd6b713.js rename to docs/assets/YukiHookModulePrefs.html.25bb60fd.js index ccefe1ca3..88e829cff 100644 --- a/docs/assets/YukiHookModulePrefs.html.bdd6b713.js +++ b/docs/assets/YukiHookModulePrefs.html.25bb60fd.js @@ -1,10 +1,9 @@ -import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.99fcdd51.js";const r={},d=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    -

    Change Records

    v1.0 first

    Function Illustrate

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u5B58\u53D6\uFF0C\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences\u3002

    \u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u5B58\u53D6\u4F7F\u7528\u7684\u5BF9\u8C61\u3002

    Pay Attention

    \u6B64\u529F\u80FD\u4E3A\u5B9E\u9A8C\u6027\u529F\u80FD\uFF0C\u4EC5\u5728 LSPosed \u73AF\u5883\u6D4B\u8BD5\u901A\u8FC7\uFF0CEdXposed \u7406\u8BBA\u4E5F\u53EF\u4EE5\u4F7F\u7528\u4F46\u4E0D\u518D\u63A8\u8350\u3002

    \u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5728 AndroidManifests.xml \u4E2D\u5C06 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\u3002

    `,10),i=s("\u8BE6\u89C1 "),y={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},u=s("New XSharedPreferences"),g=s("\u3002"),h=o("p",null,[s("\u82E5\u4F60\u5728\u6309\u7167\u89C4\u5B9A\u914D\u7F6E\u540E\u4F9D\u7136\u65E0\u6CD5\u4F7F\u7528\u6216\u51FA\u73B0\u6587\u4EF6\u6743\u9650\u9519\u8BEF\u95EE\u9898\uFF0C\u53EF\u4EE5\u53C2\u8003 "),o("a",{href:"../../../YukiHookAPI#isenablehooksharedpreferences-field"},"isEnableHookSharedPreferences"),s("\u3002")],-1),A=o("p",null,[s("\u672A\u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5C06\u4F60\u7684\u6A21\u5757 "),o("code",null,"API"),s(" \u964D\u81F3 "),o("code",null,"26"),s(" \u4EE5\u4E0B\uFF0C"),o("code",null,"YukiHookAPI"),s(" \u5C06\u4F1A\u5C1D\u8BD5\u4F7F\u7528 "),o("code",null,"makeWorldReadable"),s(" \u4F46\u4ECD\u6709\u53EF\u80FD\u4E0D\u6210\u529F\u3002")],-1),F=s("\u592A\u6781\u8BF7\u53C2\u9605 "),B={href:"https://taichi.cool/zh/doc/for-xposed-dev.html#%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90-%E9%85%8D%E7%BD%AE-xsharedpreference",target:"_blank",rel:"noopener noreferrer"},C=s("\u6587\u4EF6\u6743\u9650/\u914D\u7F6E/XSharedPreference"),D=s("\u3002"),k=a('

    Pay Attention

    \u5F53\u4F60\u5728 Xposed \u6A21\u5757\u4E2D\u5B58\u53D6\u6570\u636E\u7684\u65F6\u5019 context \u5FC5\u987B\u4E0D\u80FD\u662F\u7A7A\u7684\u3002

    \u82E5\u4F60\u6B63\u5728\u4F7F\u7528 PreferenceFragmentCompat\uFF0C\u8BF7\u8FC1\u79FB\u5230 ModulePreferenceFragment \u4EE5\u9002\u914D\u4E0A\u8FF0\u529F\u80FD\u7279\u6027\u3002

    \u53EF\u9009\u914D\u7F6E

    \u82E5\u4F60\u4E0D\u60F3\u5C06\u4F60\u7684\u6A21\u5757\u7684 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\uFF0C\u4F60\u53EF\u4EE5\u5728 AndroidManifest.xml \u4E2D\u6DFB\u52A0 xposedsharedprefs \u6765\u5B9E\u73B0\u652F\u6301\u3002

    ',4),m=s("\u8BE6\u89C1 "),b={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},v=s("New XSharedPreferences"),f=s("\u3002"),x=a(`

    The following example

    <meta-data
    +import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.6074a838.js";const r={},d=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    +

    Change Records

    v1.0 first

    Function Illustrate

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u5B58\u53D6\uFF0C\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences\u3002

    \u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u5B58\u53D6\u4F7F\u7528\u7684\u5BF9\u8C61\u3002

    Pay Attention

    \u6B64\u529F\u80FD\u4E3A\u5B9E\u9A8C\u6027\u529F\u80FD\uFF0C\u4EC5\u5728 LSPosed \u73AF\u5883\u6D4B\u8BD5\u901A\u8FC7\uFF0CEdXposed \u7406\u8BBA\u4E5F\u53EF\u4EE5\u4F7F\u7528\u4F46\u4E0D\u518D\u63A8\u8350\u3002

    \u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5728 AndroidManifests.xml \u4E2D\u5C06 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\u3002

    `,10),i=s("\u8BE6\u89C1 "),y={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},u=s("New XSharedPreferences"),g=s("\u3002"),h=o("p",null,[s("\u82E5\u4F60\u5728\u6309\u7167\u89C4\u5B9A\u914D\u7F6E\u540E\u4F9D\u7136\u65E0\u6CD5\u4F7F\u7528\u6216\u51FA\u73B0\u6587\u4EF6\u6743\u9650\u9519\u8BEF\u95EE\u9898\uFF0C\u53EF\u4EE5\u53C2\u8003 "),o("a",{href:"../../../YukiHookAPI#isenablehooksharedpreferences-field"},"isEnableHookSharedPreferences"),s("\u3002")],-1),A=o("p",null,[s("\u672A\u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5C06\u4F60\u7684\u6A21\u5757 "),o("code",null,"API"),s(" \u964D\u81F3 "),o("code",null,"26"),s(" \u4EE5\u4E0B\uFF0C"),o("code",null,"YukiHookAPI"),s(" \u5C06\u4F1A\u5C1D\u8BD5\u4F7F\u7528 "),o("code",null,"makeWorldReadable"),s(" \u4F46\u4ECD\u6709\u53EF\u80FD\u4E0D\u6210\u529F\u3002")],-1),F=s("\u592A\u6781\u8BF7\u53C2\u9605 "),B={href:"https://taichi.cool/zh/doc/for-xposed-dev.html#%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90-%E9%85%8D%E7%BD%AE-xsharedpreference",target:"_blank",rel:"noopener noreferrer"},C=s("\u6587\u4EF6\u6743\u9650/\u914D\u7F6E/XSharedPreference"),D=s("\u3002"),k=a('

    Pay Attention

    \u5F53\u4F60\u5728 Xposed \u6A21\u5757\u4E2D\u5B58\u53D6\u6570\u636E\u7684\u65F6\u5019 context \u5FC5\u987B\u4E0D\u80FD\u662F\u7A7A\u7684\u3002

    \u82E5\u4F60\u6B63\u5728\u4F7F\u7528 PreferenceFragmentCompat\uFF0C\u8BF7\u8FC1\u79FB\u5230 ModulePreferenceFragment \u4EE5\u9002\u914D\u4E0A\u8FF0\u529F\u80FD\u7279\u6027\u3002

    Optional Configuration

    \u82E5\u4F60\u4E0D\u60F3\u5C06\u4F60\u7684\u6A21\u5757\u7684 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\uFF0C\u4F60\u53EF\u4EE5\u5728 AndroidManifest.xml \u4E2D\u6DFB\u52A0 xposedsharedprefs \u6765\u5B9E\u73B0\u652F\u6301\u3002

    ',4),m=s("\u8BE6\u89C1 "),v={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},b=s("New XSharedPreferences"),f=s("\u3002"),x=a(`

    The following example

    <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
    -

    isXSharePrefsReadable - field

    val isXSharePrefsReadable: Boolean
    -

    Change Records

    v1.0.90 added

    Function Illustrate

    \u83B7\u53D6 XSharedPreferences \u662F\u5426\u53EF\u8BFB\u3002

    Pay Attention

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    isRunInNewXShareMode - field

    val isRunInNewXShareMode: Boolean
    -

    Change Records

    v1.0.78 added

    Function Illustrate

    \u83B7\u53D6 YukiHookModulePrefs \u662F\u5426\u6B63\u5904\u4E8E EdXposed/LSPosed \u7684\u6700\u9AD8\u6743\u9650\u8FD0\u884C\u3002

    \u524D\u63D0\u6761\u4EF6\u4E3A\u5F53\u524D Xposed \u6A21\u5757\u5DF2\u88AB\u6FC0\u6D3B\u3002

    Pay Attention

    \u53EA\u80FD\u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    name - method

    fun name(name: String): YukiHookModulePrefs
    +

    isXSharePrefsReadable - field

    Change Records

    v1.0.90 added

    v1.1.5 deprecated

    \u8BF7\u8F6C\u79FB\u5230 isPreferencesAvailable

    isRunInNewXShareMode - field

    Change Records

    v1.0.78 added

    v1.1.5 deprecated

    \u8BF7\u8F6C\u79FB\u5230 isPreferencesAvailable

    isPreferencesAvailable - field

    val isPreferencesAvailable: Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D YukiHookModulePrefs \u7684\u53EF\u7528\u72B6\u6001\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u8FD4\u56DE XSharedPreferences \u53EF\u7528\u72B6\u6001 (\u53EF\u8BFB)\u3002

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u8FD4\u56DE\u5F53\u524D\u662F\u5426\u5904\u4E8E New XSharedPreferences \u6A21\u5F0F (\u53EF\u8BFB\u53EF\u5199)\u3002

    name - method

    fun name(name: String): YukiHookModulePrefs
     

    Change Records

    v1.0 first

    Function Illustrate

    \u81EA\u5B9A\u4E49 Sp \u5B58\u50A8\u540D\u79F0\u3002

    Function Example

    \u5728 Activity \u4E2D\u7684\u4F7F\u7528\u65B9\u6CD5\u3002

    The following example

    modulePrefs("custom_name").getString("custom_key")
     

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883 PackageParam \u4E2D\u7684\u4F7F\u7528\u65B9\u6CD5\u3002

    The following example

    prefs("custom_name").getString("custom_key")
     

    direct - method

    fun direct(): YukiHookModulePrefs
    @@ -27,4 +26,4 @@ import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.99fcdd51.js";con
     

    Change Records

    v1.0 first

    Function Illustrate

    \u5B58\u50A8 Float \u952E\u503C\u3002

    Notice

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0B\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u4F7F\u7528\u3002

    get - method

    inline fun <reified T> get(prefs: PrefsData<T>, value: T): T
     

    Change Records

    v1.0.67 added

    Function Illustrate

    \u667A\u80FD\u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u952E\u503C\u3002

    put - method

    inline fun <reified T> put(prefs: PrefsData<T>, value: T)
     

    Change Records

    v1.0.67 added

    Function Illustrate

    \u667A\u80FD\u5B58\u50A8\u6307\u5B9A\u7C7B\u578B\u7684\u952E\u503C\u3002

    Notice

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0B\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u4F7F\u7528\u3002

    clearCache - method

    fun clearCache()
    -

    Change Records

    v1.0.5 added

    Function Illustrate

    \u6E05\u9664 XSharedPreferences \u4E2D\u7F13\u5B58\u7684\u952E\u503C\u6570\u636E\u3002

    \u65E0\u8BBA\u662F\u5426\u5F00\u542F YukiHookAPI.Configs.isEnableModulePrefsCache\u3002

    \u8C03\u7528\u6B64\u65B9\u6CD5\u5C06\u6E05\u9664\u5F53\u524D\u5B58\u50A8\u7684\u5168\u90E8\u952E\u503C\u7F13\u5B58\u3002

    \u4E0B\u6B21\u5C06\u4ECE XSharedPreferences \u91CD\u65B0\u8BFB\u53D6\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\u3002

    `,168);function S(q,_){const e=p("ExternalLinkIcon");return t(),c("div",null,[d,o("p",null,[i,o("a",y,[u,n(e)]),g]),h,A,o("p",null,[F,o("a",B,[C,n(e)]),D]),k,o("p",null,[m,o("a",b,[v,n(e)]),f]),x])}const I=l(r,[["render",S],["__file","YukiHookModulePrefs.html.vue"]]);export{I as default}; +

    Change Records

    v1.0.5 added

    Function Illustrate

    \u6E05\u9664 XSharedPreferences \u4E2D\u7F13\u5B58\u7684\u952E\u503C\u6570\u636E\u3002

    \u65E0\u8BBA\u662F\u5426\u5F00\u542F YukiHookAPI.Configs.isEnableModulePrefsCache\u3002

    \u8C03\u7528\u6B64\u65B9\u6CD5\u5C06\u6E05\u9664\u5F53\u524D\u5B58\u50A8\u7684\u5168\u90E8\u952E\u503C\u7F13\u5B58\u3002

    \u4E0B\u6B21\u5C06\u4ECE XSharedPreferences \u91CD\u65B0\u8BFB\u53D6\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\u3002

    `,171);function S(q,_){const e=p("ExternalLinkIcon");return t(),c("div",null,[d,o("p",null,[i,o("a",y,[u,n(e)]),g]),h,A,o("p",null,[F,o("a",B,[C,n(e)]),D]),k,o("p",null,[m,o("a",v,[b,n(e)]),f]),x])}const I=l(r,[["render",S],["__file","YukiHookModulePrefs.html.vue"]]);export{I as default}; diff --git a/docs/assets/YukiHookModulePrefs.html.aad74b54.js b/docs/assets/YukiHookModulePrefs.html.549d8090.js similarity index 89% rename from docs/assets/YukiHookModulePrefs.html.aad74b54.js rename to docs/assets/YukiHookModulePrefs.html.549d8090.js index 62c384ea8..fe1244afa 100644 --- a/docs/assets/YukiHookModulePrefs.html.aad74b54.js +++ b/docs/assets/YukiHookModulePrefs.html.549d8090.js @@ -1,10 +1,9 @@ -import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.99fcdd51.js";const r={},d=a(`

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u5B58\u53D6\uFF0C\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences\u3002

    \u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u5B58\u53D6\u4F7F\u7528\u7684\u5BF9\u8C61\u3002

    \u7279\u522B\u6CE8\u610F

    \u6B64\u529F\u80FD\u4E3A\u5B9E\u9A8C\u6027\u529F\u80FD\uFF0C\u4EC5\u5728 LSPosed \u73AF\u5883\u6D4B\u8BD5\u901A\u8FC7\uFF0CEdXposed \u7406\u8BBA\u4E5F\u53EF\u4EE5\u4F7F\u7528\u4F46\u4E0D\u518D\u63A8\u8350\u3002

    \u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5728 AndroidManifests.xml \u4E2D\u5C06 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\u3002

    `,9),i=s("\u8BE6\u89C1 "),y={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},g=s("New XSharedPreferences"),u=s("\u3002"),A=o("p",null,[s("\u82E5\u4F60\u5728\u6309\u7167\u89C4\u5B9A\u914D\u7F6E\u540E\u4F9D\u7136\u65E0\u6CD5\u4F7F\u7528\u6216\u51FA\u73B0\u6587\u4EF6\u6743\u9650\u9519\u8BEF\u95EE\u9898\uFF0C\u53EF\u4EE5\u53C2\u8003 "),o("a",{href:"../../../YukiHookAPI#isenablehooksharedpreferences-field"},"isEnableHookSharedPreferences"),s("\u3002")],-1),h=o("p",null,[s("\u672A\u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5C06\u4F60\u7684\u6A21\u5757 "),o("code",null,"API"),s(" \u964D\u81F3 "),o("code",null,"26"),s(" \u4EE5\u4E0B\uFF0C"),o("code",null,"YukiHookAPI"),s(" \u5C06\u4F1A\u5C1D\u8BD5\u4F7F\u7528 "),o("code",null,"makeWorldReadable"),s(" \u4F46\u4ECD\u6709\u53EF\u80FD\u4E0D\u6210\u529F\u3002")],-1),B=s("\u592A\u6781\u8BF7\u53C2\u9605 "),F={href:"https://taichi.cool/zh/doc/for-xposed-dev.html#%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90-%E9%85%8D%E7%BD%AE-xsharedpreference",target:"_blank",rel:"noopener noreferrer"},D=s("\u6587\u4EF6\u6743\u9650/\u914D\u7F6E/XSharedPreference"),C=s("\u3002"),k=a('

    \u7279\u522B\u6CE8\u610F

    \u5F53\u4F60\u5728 Xposed \u6A21\u5757\u4E2D\u5B58\u53D6\u6570\u636E\u7684\u65F6\u5019 context \u5FC5\u987B\u4E0D\u80FD\u662F\u7A7A\u7684\u3002

    \u82E5\u4F60\u6B63\u5728\u4F7F\u7528 PreferenceFragmentCompat\uFF0C\u8BF7\u8FC1\u79FB\u5230 ModulePreferenceFragment \u4EE5\u9002\u914D\u4E0A\u8FF0\u529F\u80FD\u7279\u6027\u3002

    \u53EF\u9009\u914D\u7F6E

    \u82E5\u4F60\u4E0D\u60F3\u5C06\u4F60\u7684\u6A21\u5757\u7684 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\uFF0C\u4F60\u53EF\u4EE5\u5728 AndroidManifest.xml \u4E2D\u6DFB\u52A0 xposedsharedprefs \u6765\u5B9E\u73B0\u652F\u6301\u3002

    ',4),m=s("\u8BE6\u89C1 "),b={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},v=s("New XSharedPreferences"),f=s("\u3002"),x=a(`

    \u793A\u4F8B\u5982\u4E0B

    <meta-data
    +import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.6074a838.js";const r={},d=a(`

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5B9E\u73B0 Xposed \u6A21\u5757\u7684\u6570\u636E\u5B58\u53D6\uFF0C\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences\u3002

    \u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u5B58\u53D6\u4F7F\u7528\u7684\u5BF9\u8C61\u3002

    \u7279\u522B\u6CE8\u610F

    \u6B64\u529F\u80FD\u4E3A\u5B9E\u9A8C\u6027\u529F\u80FD\uFF0C\u4EC5\u5728 LSPosed \u73AF\u5883\u6D4B\u8BD5\u901A\u8FC7\uFF0CEdXposed \u7406\u8BBA\u4E5F\u53EF\u4EE5\u4F7F\u7528\u4F46\u4E0D\u518D\u63A8\u8350\u3002

    \u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5728 AndroidManifests.xml \u4E2D\u5C06 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\u3002

    `,9),i=s("\u8BE6\u89C1 "),y={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},A=s("New XSharedPreferences"),g=s("\u3002"),h=o("p",null,[s("\u82E5\u4F60\u5728\u6309\u7167\u89C4\u5B9A\u914D\u7F6E\u540E\u4F9D\u7136\u65E0\u6CD5\u4F7F\u7528\u6216\u51FA\u73B0\u6587\u4EF6\u6743\u9650\u9519\u8BEF\u95EE\u9898\uFF0C\u53EF\u4EE5\u53C2\u8003 "),o("a",{href:"../../../YukiHookAPI#isenablehooksharedpreferences-field"},"isEnableHookSharedPreferences"),s("\u3002")],-1),u=o("p",null,[s("\u672A\u4F7F\u7528 LSPosed \u73AF\u5883\u8BF7\u5C06\u4F60\u7684\u6A21\u5757 "),o("code",null,"API"),s(" \u964D\u81F3 "),o("code",null,"26"),s(" \u4EE5\u4E0B\uFF0C"),o("code",null,"YukiHookAPI"),s(" \u5C06\u4F1A\u5C1D\u8BD5\u4F7F\u7528 "),o("code",null,"makeWorldReadable"),s(" \u4F46\u4ECD\u6709\u53EF\u80FD\u4E0D\u6210\u529F\u3002")],-1),B=s("\u592A\u6781\u8BF7\u53C2\u9605 "),F={href:"https://taichi.cool/zh/doc/for-xposed-dev.html#%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90-%E9%85%8D%E7%BD%AE-xsharedpreference",target:"_blank",rel:"noopener noreferrer"},D=s("\u6587\u4EF6\u6743\u9650/\u914D\u7F6E/XSharedPreference"),C=s("\u3002"),k=a('

    \u7279\u522B\u6CE8\u610F

    \u5F53\u4F60\u5728 Xposed \u6A21\u5757\u4E2D\u5B58\u53D6\u6570\u636E\u7684\u65F6\u5019 context \u5FC5\u987B\u4E0D\u80FD\u662F\u7A7A\u7684\u3002

    \u82E5\u4F60\u6B63\u5728\u4F7F\u7528 PreferenceFragmentCompat\uFF0C\u8BF7\u8FC1\u79FB\u5230 ModulePreferenceFragment \u4EE5\u9002\u914D\u4E0A\u8FF0\u529F\u80FD\u7279\u6027\u3002

    \u53EF\u9009\u914D\u7F6E

    \u82E5\u4F60\u4E0D\u60F3\u5C06\u4F60\u7684\u6A21\u5757\u7684 xposedminversion \u6700\u4F4E\u8BBE\u7F6E\u4E3A 93\uFF0C\u4F60\u53EF\u4EE5\u5728 AndroidManifest.xml \u4E2D\u6DFB\u52A0 xposedsharedprefs \u6765\u5B9E\u73B0\u652F\u6301\u3002

    ',4),m=s("\u8BE6\u89C1 "),v={href:"https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module",target:"_blank",rel:"noopener noreferrer"},b=s("New XSharedPreferences"),f=s("\u3002"),x=a(`

    \u793A\u4F8B\u5982\u4E0B

    <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
    -

    isXSharePrefsReadable - field

    val isXSharePrefsReadable: Boolean
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.90 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6 XSharedPreferences \u662F\u5426\u53EF\u8BFB\u3002

    \u7279\u522B\u6CE8\u610F

    \u53EA\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C\u6A21\u5757\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    isRunInNewXShareMode - field

    val isRunInNewXShareMode: Boolean
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.78 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6 YukiHookModulePrefs \u662F\u5426\u6B63\u5904\u4E8E EdXposed/LSPosed \u7684\u6700\u9AD8\u6743\u9650\u8FD0\u884C\u3002

    \u524D\u63D0\u6761\u4EF6\u4E3A\u5F53\u524D Xposed \u6A21\u5757\u5DF2\u88AB\u6FC0\u6D3B\u3002

    \u7279\u522B\u6CE8\u610F

    \u53EA\u80FD\u5728\u6A21\u5757\u73AF\u5883\u4E2D\u4F7F\u7528\uFF0C(Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u59CB\u7EC8\u8FD4\u56DE false\u3002

    name - method

    fun name(name: String): YukiHookModulePrefs
    +

    isXSharePrefsReadable - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.90 \u65B0\u589E

    v1.1.5 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 isPreferencesAvailable

    isRunInNewXShareMode - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.78 \u65B0\u589E

    v1.1.5 \u4F5C\u5E9F

    \u8BF7\u8F6C\u79FB\u5230 isPreferencesAvailable

    isPreferencesAvailable - field

    val isPreferencesAvailable: Boolean
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D YukiHookModulePrefs \u7684\u53EF\u7528\u72B6\u6001\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u8FD4\u56DE XSharedPreferences \u53EF\u7528\u72B6\u6001 (\u53EF\u8BFB)\u3002

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\u8FD4\u56DE\u5F53\u524D\u662F\u5426\u5904\u4E8E New XSharedPreferences \u6A21\u5F0F (\u53EF\u8BFB\u53EF\u5199)\u3002

    name - method

    fun name(name: String): YukiHookModulePrefs
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u81EA\u5B9A\u4E49 Sp \u5B58\u50A8\u540D\u79F0\u3002

    \u529F\u80FD\u793A\u4F8B

    \u5728 Activity \u4E2D\u7684\u4F7F\u7528\u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    modulePrefs("custom_name").getString("custom_key")
     

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883 PackageParam \u4E2D\u7684\u4F7F\u7528\u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    prefs("custom_name").getString("custom_key")
     

    direct - method

    fun direct(): YukiHookModulePrefs
    @@ -27,4 +26,4 @@ import{_ as l,r as p,o as t,c,b as o,d as n,a,e as s}from"./app.99fcdd51.js";con
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5B58\u50A8 Float \u952E\u503C\u3002

    \u6CE8\u610F

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0B\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u4F7F\u7528\u3002

    get - method

    inline fun <reified T> get(prefs: PrefsData<T>, value: T): T
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.67 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u667A\u80FD\u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u952E\u503C\u3002

    put - method

    inline fun <reified T> put(prefs: PrefsData<T>, value: T)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.67 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u667A\u80FD\u5B58\u50A8\u6307\u5B9A\u7C7B\u578B\u7684\u952E\u503C\u3002

    \u6CE8\u610F

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0B\u53EA\u8BFB\uFF0C\u65E0\u6CD5\u4F7F\u7528\u3002

    clearCache - method

    fun clearCache()
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6E05\u9664 XSharedPreferences \u4E2D\u7F13\u5B58\u7684\u952E\u503C\u6570\u636E\u3002

    \u65E0\u8BBA\u662F\u5426\u5F00\u542F YukiHookAPI.Configs.isEnableModulePrefsCache\u3002

    \u8C03\u7528\u6B64\u65B9\u6CD5\u5C06\u6E05\u9664\u5F53\u524D\u5B58\u50A8\u7684\u5168\u90E8\u952E\u503C\u7F13\u5B58\u3002

    \u4E0B\u6B21\u5C06\u4ECE XSharedPreferences \u91CD\u65B0\u8BFB\u53D6\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\u3002

    `,168);function S(q,_){const e=p("ExternalLinkIcon");return t(),c("div",null,[d,o("p",null,[i,o("a",y,[g,n(e)]),u]),A,h,o("p",null,[B,o("a",F,[D,n(e)]),C]),k,o("p",null,[m,o("a",b,[v,n(e)]),f]),x])}const X=l(r,[["render",S],["__file","YukiHookModulePrefs.html.vue"]]);export{X as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6E05\u9664 XSharedPreferences \u4E2D\u7F13\u5B58\u7684\u952E\u503C\u6570\u636E\u3002

    \u65E0\u8BBA\u662F\u5426\u5F00\u542F YukiHookAPI.Configs.isEnableModulePrefsCache\u3002

    \u8C03\u7528\u6B64\u65B9\u6CD5\u5C06\u6E05\u9664\u5F53\u524D\u5B58\u50A8\u7684\u5168\u90E8\u952E\u503C\u7F13\u5B58\u3002

    \u4E0B\u6B21\u5C06\u4ECE XSharedPreferences \u91CD\u65B0\u8BFB\u53D6\u3002

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528\u3002

    `,171);function S(q,_){const e=p("ExternalLinkIcon");return t(),c("div",null,[d,o("p",null,[i,o("a",y,[A,n(e)]),g]),h,u,o("p",null,[B,o("a",F,[D,n(e)]),C]),k,o("p",null,[m,o("a",v,[b,n(e)]),f]),x])}const X=l(r,[["render",S],["__file","YukiHookModulePrefs.html.vue"]]);export{X as default}; diff --git a/docs/assets/YukiHookModulePrefs.html.5eb62ec3.js b/docs/assets/YukiHookModulePrefs.html.5eb62ec3.js deleted file mode 100644 index eb32858bd..000000000 --- a/docs/assets/YukiHookModulePrefs.html.5eb62ec3.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-5858709e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html","title":"YukiHookModulePrefs - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"isXSharePrefsReadable - field","slug":"isxshareprefsreadable-field","link":"#isxshareprefsreadable-field","children":[]},{"level":2,"title":"isRunInNewXShareMode - field","slug":"isruninnewxsharemode-field","link":"#isruninnewxsharemode-field","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"direct - method","slug":"direct-method","link":"#direct-method","children":[]},{"level":2,"title":"getString - method","slug":"getstring-method","link":"#getstring-method","children":[]},{"level":2,"title":"getStringSet - method","slug":"getstringset-method","link":"#getstringset-method","children":[]},{"level":2,"title":"getBoolean - method","slug":"getboolean-method","link":"#getboolean-method","children":[]},{"level":2,"title":"getInt - method","slug":"getint-method","link":"#getint-method","children":[]},{"level":2,"title":"getLong - method","slug":"getlong-method","link":"#getlong-method","children":[]},{"level":2,"title":"getFloat - method","slug":"getfloat-method","link":"#getfloat-method","children":[]},{"level":2,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method","link":"#remove-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method-1","link":"#remove-method-1","children":[]},{"level":2,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":2,"title":"putString - method","slug":"putstring-method","link":"#putstring-method","children":[]},{"level":2,"title":"putStringSet - method","slug":"putstringset-method","link":"#putstringset-method","children":[]},{"level":2,"title":"putBoolean - method","slug":"putboolean-method","link":"#putboolean-method","children":[]},{"level":2,"title":"putInt - method","slug":"putint-method","link":"#putint-method","children":[]},{"level":2,"title":"putLong - method","slug":"putlong-method","link":"#putlong-method","children":[]},{"level":2,"title":"putFloat - method","slug":"putfloat-method","link":"#putfloat-method","children":[]},{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":2,"title":"clearCache - method","slug":"clearcache-method","link":"#clearcache-method","children":[]}],"git":{"updatedTime":1663862409000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"}');export{e as data}; diff --git a/docs/assets/YukiHookModulePrefs.html.6bedc781.js b/docs/assets/YukiHookModulePrefs.html.6bedc781.js new file mode 100644 index 000000000..8f29ffc6a --- /dev/null +++ b/docs/assets/YukiHookModulePrefs.html.6bedc781.js @@ -0,0 +1 @@ +const e=JSON.parse('{"key":"v-5858709e","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html","title":"YukiHookModulePrefs - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"isPreferencesAvailable - field","slug":"ispreferencesavailable-field","link":"#ispreferencesavailable-field","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"direct - method","slug":"direct-method","link":"#direct-method","children":[]},{"level":2,"title":"getString - method","slug":"getstring-method","link":"#getstring-method","children":[]},{"level":2,"title":"getStringSet - method","slug":"getstringset-method","link":"#getstringset-method","children":[]},{"level":2,"title":"getBoolean - method","slug":"getboolean-method","link":"#getboolean-method","children":[]},{"level":2,"title":"getInt - method","slug":"getint-method","link":"#getint-method","children":[]},{"level":2,"title":"getLong - method","slug":"getlong-method","link":"#getlong-method","children":[]},{"level":2,"title":"getFloat - method","slug":"getfloat-method","link":"#getfloat-method","children":[]},{"level":2,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method","link":"#remove-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method-1","link":"#remove-method-1","children":[]},{"level":2,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":2,"title":"putString - method","slug":"putstring-method","link":"#putstring-method","children":[]},{"level":2,"title":"putStringSet - method","slug":"putstringset-method","link":"#putstringset-method","children":[]},{"level":2,"title":"putBoolean - method","slug":"putboolean-method","link":"#putboolean-method","children":[]},{"level":2,"title":"putInt - method","slug":"putint-method","link":"#putint-method","children":[]},{"level":2,"title":"putLong - method","slug":"putlong-method","link":"#putlong-method","children":[]},{"level":2,"title":"putFloat - method","slug":"putfloat-method","link":"#putfloat-method","children":[]},{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":2,"title":"clearCache - method","slug":"clearcache-method","link":"#clearcache-method","children":[]}],"git":{"updatedTime":1672331859000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"}');export{e as data}; diff --git a/docs/assets/YukiHookModulePrefs.html.e0f278fe.js b/docs/assets/YukiHookModulePrefs.html.e0f278fe.js deleted file mode 100644 index 5516f188e..000000000 --- a/docs/assets/YukiHookModulePrefs.html.e0f278fe.js +++ /dev/null @@ -1 +0,0 @@ -const e=JSON.parse('{"key":"v-003862c2","path":"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html","title":"YukiHookModulePrefs - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"isXSharePrefsReadable - field","slug":"isxshareprefsreadable-field","link":"#isxshareprefsreadable-field","children":[]},{"level":2,"title":"isRunInNewXShareMode - field","slug":"isruninnewxsharemode-field","link":"#isruninnewxsharemode-field","children":[]},{"level":2,"title":"name - method","slug":"name-method","link":"#name-method","children":[]},{"level":2,"title":"direct - method","slug":"direct-method","link":"#direct-method","children":[]},{"level":2,"title":"getString - method","slug":"getstring-method","link":"#getstring-method","children":[]},{"level":2,"title":"getStringSet - method","slug":"getstringset-method","link":"#getstringset-method","children":[]},{"level":2,"title":"getBoolean - method","slug":"getboolean-method","link":"#getboolean-method","children":[]},{"level":2,"title":"getInt - method","slug":"getint-method","link":"#getint-method","children":[]},{"level":2,"title":"getLong - method","slug":"getlong-method","link":"#getlong-method","children":[]},{"level":2,"title":"getFloat - method","slug":"getfloat-method","link":"#getfloat-method","children":[]},{"level":2,"title":"all - method","slug":"all-method","link":"#all-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method","link":"#remove-method","children":[]},{"level":2,"title":"remove - method","slug":"remove-method-1","link":"#remove-method-1","children":[]},{"level":2,"title":"clear - method","slug":"clear-method","link":"#clear-method","children":[]},{"level":2,"title":"putString - method","slug":"putstring-method","link":"#putstring-method","children":[]},{"level":2,"title":"putStringSet - method","slug":"putstringset-method","link":"#putstringset-method","children":[]},{"level":2,"title":"putBoolean - method","slug":"putboolean-method","link":"#putboolean-method","children":[]},{"level":2,"title":"putInt - method","slug":"putint-method","link":"#putint-method","children":[]},{"level":2,"title":"putLong - method","slug":"putlong-method","link":"#putlong-method","children":[]},{"level":2,"title":"putFloat - method","slug":"putfloat-method","link":"#putfloat-method","children":[]},{"level":2,"title":"get - method","slug":"get-method","link":"#get-method","children":[]},{"level":2,"title":"put - method","slug":"put-method","link":"#put-method","children":[]},{"level":2,"title":"clearCache - method","slug":"clearcache-method","link":"#clearcache-method","children":[]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"}');export{e as data}; diff --git a/docs/assets/YukiMemberHookCreator.html.b90d4528.js b/docs/assets/YukiMemberHookCreator.html.1d205da5.js similarity index 96% rename from docs/assets/YukiMemberHookCreator.html.b90d4528.js rename to docs/assets/YukiMemberHookCreator.html.1d205da5.js index f66ab66e7..43958ff92 100644 --- a/docs/assets/YukiMemberHookCreator.html.b90d4528.js +++ b/docs/assets/YukiMemberHookCreator.html.1d205da5.js @@ -1,5 +1,5 @@ -import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiMemberHookCreator - class

    class YukiMemberHookCreator(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    -

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5BF9 hookClass \u8FDB\u884C inline \u5904\u7406

    v1.1.0 modified

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    Function Illustrate

    YukiHookAPI \u7684 Member \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
    +import{_ as s,o,c as n,a as e}from"./app.6074a838.js";const a={},l=e(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiMemberHookCreator - class

    class YukiMemberHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    +

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5BF9 hookClass \u8FDB\u884C inline \u5904\u7406

    v1.1.0 modified

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    v1.1.5 modified

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    Function Illustrate

    YukiHookAPI \u7684 Member \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u9ED8\u8BA4 Hook \u56DE\u8C03\u4F18\u5148\u7EA7\u3002

    PRIORITY_LOWEST - field

    val PRIORITY_LOWEST: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5EF6\u8FDF\u56DE\u8C03 Hook \u65B9\u6CD5\u7ED3\u679C\u3002

    PRIORITY_HIGHEST - field

    val PRIORITY_HIGHEST: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u66F4\u5FEB\u56DE\u8C03 Hook \u65B9\u6CD5\u7ED3\u679C\u3002

    instanceClass - field

    val instanceClass: Class<*>
    @@ -17,15 +17,15 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Change Records

    v1.1.0 added

    Function Illustrate

    \u5141\u8BB8 Hook \u8FC7\u7A0B\u4E2D\u7684\u6240\u6709\u5371\u9669\u884C\u4E3A\u3002

    \u8BF7\u5728 option \u4E2D\u952E\u5165 Yes do as I say! \u4EE3\u8868\u4F60\u540C\u610F\u5141\u8BB8\u6240\u6709\u5371\u9669\u884C\u4E3A\u3002

    \u4F60\u8FD8\u9700\u8981\u5728\u6574\u4E2A\u8C03\u7528\u57DF\u4E2D\u58F0\u660E\u6CE8\u89E3 CauseProblemsApi \u4EE5\u6D88\u9664\u8B66\u544A\u3002

    \u82E5\u4F60\u53EA\u9700\u8981 Hook ClassLoader \u7684 loadClass \u65B9\u6CD5\uFF0C\u8BF7\u53C2\u8003 ClassLoader.onLoadClass\u3002

    Pay Attention

    \u82E5\u4F60\u4E0D\u77E5\u9053\u5141\u8BB8\u6B64\u529F\u80FD\u4F1A\u5E26\u6765\u4F55\u79CD\u540E\u679C\uFF0C\u8BF7\u52FF\u4F7F\u7528\u3002

    MemberHookCreator - class

    inner class MemberHookCreator internal constructor(private val priority: Int, internal val tag: String)
     

    Change Records

    v1.0 first

    v1.0.80 modified

    \u589E\u52A0 priority Hook \u4F18\u5148\u7EA7

    v1.0.81 modified

    \u589E\u52A0 packageName \u5F53\u524D Hook \u7684 APP \u5305\u540D

    v1.1.0 modified

    \u79FB\u9664 packageName

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    Function Illustrate

    Hook \u6838\u5FC3\u529F\u80FD\u5B9E\u73B0\u7C7B\uFF0C\u67E5\u627E\u548C\u5904\u7406\u9700\u8981 Hook \u7684 Method\u3001Constructor\u3002

    member - field

    Change Records

    v1.0 first

    v1.1.0 removed

    \u8BF7\u8F6C\u79FB\u5230 members

    members - method

    fun members(vararg member: Member?)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    \u624B\u52A8\u6307\u5B9A\u8981 Hook \u7684 Method\u3001Constructor\u3002

    Notice

    \u4E0D\u5EFA\u8BAE\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u7F6E\u76EE\u6807\u9700\u8981 Hook \u7684 Member \u5BF9\u8C61\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 method \u6216 constructor \u65B9\u6CD5\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u8C03\u7528 instanceClass \u6765\u624B\u52A8\u67E5\u627E\u8981 Hook \u7684 Method\u3001Constructor\u3002

    The following example

    injectMember {
    -    members(instanceClass.getDeclaredMethod("test", StringType))
    +    members(instanceClass.getDeclaredMethod("test", StringClass))
         beforeHook {}
         afterHook {}
     }
     

    \u540C\u6837\u5730\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u4F20\u5165\u4E00\u7EC4 Member \u540C\u65F6\u8FDB\u884C Hook\u3002

    The following example

    injectMember {
         members(
    -        instanceClass.getDeclaredMethod("test1", StringType),
    -        instanceClass.getDeclaredMethod("test2", StringType),
    -        instanceClass.getDeclaredMethod("test3", StringType)
    +        instanceClass.getDeclaredMethod("test1", StringClass),
    +        instanceClass.getDeclaredMethod("test2", StringClass),
    +        instanceClass.getDeclaredMethod("test3", StringClass)
         )
         beforeHook {}
         afterHook {}
    @@ -35,7 +35,7 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u67E5\u627E\u5F53\u524D Class \u9700\u8981 Hook \u7684 Method \u3002

    Function Example

    \u4F60\u53EF\u53C2\u8003 MethodFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         beforeHook {}
    @@ -51,7 +51,7 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`
    }

    \u6B64\u65F6 beforeHook \u4E0E afterHook \u4F1A\u5728\u6BCF\u4E2A\u67E5\u627E\u5230\u7684\u7ED3\u679C\u4E2D\u591A\u6B21\u56DE\u8C03 Hook \u65B9\u6CD5\u4F53\u3002

    Notice

    \u82E5\u6CA1\u6709 all\uFF0C\u9ED8\u8BA4\u53EA\u4F1A Hook \u5F53\u524D\u6761\u4EF6\u67E5\u627E\u5230\u7684\u6570\u7EC4\u4E0B\u6807\u7ED3\u679C\u7B2C\u4E00\u4F4D\u3002

    constructor - method

    inline fun constructor(initiate: ConstructorConditions): ConstructorFinder.Result
     

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u67E5\u627E\u5F53\u524D Class \u9700\u8981 Hook \u7684 Constructor\u3002

    Function Example

    \u4F60\u53EF\u53C2\u8003 ConstructorFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    The following example

    injectMember {
    -    constructor { param(StringType) }
    +    constructor { param(StringClass) }
         beforeHook {}
         afterHook {}
     }
    @@ -64,7 +64,7 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Change Records

    v1.0 first

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u4F7F\u7528\u5F53\u524D hookClass \u67E5\u627E\u5E76\u5F97\u5230 Field\u3002

    Function Example

    \u4F60\u53EF\u53C2\u8003 FieldFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         afterHook {
    @@ -118,4 +118,4 @@ import{_ as s,o,c as e,a as n}from"./app.99fcdd51.js";const a={},l=n(`

    Change Records

    v1.0.5 added

    v1.0.80 modified

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    Function Illustrate

    \u6DFB\u52A0\u6267\u884C Hook \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6\uFF0C\u4E0D\u6EE1\u8DB3\u6761\u4EF6\u5C06\u76F4\u63A5\u505C\u6B62 Hook\u3002

    onPrepareHook - method

    fun onPrepareHook(callback: () -> Unit): Result
     

    Change Records

    v1.0.70 added

    Function Illustrate

    \u76D1\u542C hookClass \u5B58\u5728\u65F6\u51C6\u5907\u5F00\u59CB Hook \u7684\u64CD\u4F5C\u3002

    onHookClassNotFoundFailure - method

    fun onHookClassNotFoundFailure(result: (Throwable) -> Unit): Result
     

    Change Records

    v1.0.3 added

    Function Illustrate

    \u76D1\u542C hookClass \u627E\u4E0D\u5230\u65F6\u53D1\u751F\u9519\u8BEF\u7684\u56DE\u8C03\u65B9\u6CD5\u3002

    ignoredHookClassNotFoundFailure - method

    fun ignoredHookClassNotFoundFailure(): Result
    -

    Change Records

    v1.0.3 added

    Function Illustrate

    \u5FFD\u7565 hookClass \u627E\u4E0D\u5230\u65F6\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,399),p=[l];function c(t,r){return o(),e("div",null,p)}const i=s(a,[["render",c],["__file","YukiMemberHookCreator.html.vue"]]);export{i as default}; +

    Change Records

    v1.0.3 added

    Function Illustrate

    \u5FFD\u7565 hookClass \u627E\u4E0D\u5230\u65F6\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,401),p=[l];function c(t,r){return o(),n("div",null,p)}const i=s(a,[["render",c],["__file","YukiMemberHookCreator.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiMemberHookCreator.html.d3b181da.js b/docs/assets/YukiMemberHookCreator.html.7e0c1b2e.js similarity index 97% rename from docs/assets/YukiMemberHookCreator.html.d3b181da.js rename to docs/assets/YukiMemberHookCreator.html.7e0c1b2e.js index 85e380ac2..9f684c089 100644 --- a/docs/assets/YukiMemberHookCreator.html.d3b181da.js +++ b/docs/assets/YukiMemberHookCreator.html.7e0c1b2e.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-71147891","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html","title":"YukiMemberHookCreator - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"PRIORITY_DEFAULT - field","slug":"priority-default-field","link":"#priority-default-field","children":[]},{"level":2,"title":"PRIORITY_LOWEST - field","slug":"priority-lowest-field","link":"#priority-lowest-field","children":[]},{"level":2,"title":"PRIORITY_HIGHEST - field","slug":"priority-highest-field","link":"#priority-highest-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"injectMember - method","slug":"injectmember-method","link":"#injectmember-method","children":[]},{"level":2,"title":"useDangerousOperation - method","slug":"usedangerousoperation-method","link":"#usedangerousoperation-method","children":[]},{"level":2,"title":"MemberHookCreator - class","slug":"memberhookcreator-class","link":"#memberhookcreator-class","children":[{"level":3,"title":"members - method","slug":"members-method","link":"#members-method","children":[]},{"level":3,"title":"allMembers - method","slug":"allmembers-method","link":"#allmembers-method","children":[]},{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"HookParam.field - i-ext-method","slug":"hookparam-field-i-ext-method","link":"#hookparam-field-i-ext-method","children":[]},{"level":3,"title":"HookParam.method - i-ext-method","slug":"hookparam-method-i-ext-method","link":"#hookparam-method-i-ext-method","children":[]},{"level":3,"title":"HookParam.constructor - i-ext-method","slug":"hookparam-constructor-i-ext-method","link":"#hookparam-constructor-i-ext-method","children":[]},{"level":3,"title":"HookParam.injectMember - i-ext-method","slug":"hookparam-injectmember-i-ext-method","link":"#hookparam-injectmember-i-ext-method","children":[]},{"level":3,"title":"beforeHook - method","slug":"beforehook-method","link":"#beforehook-method","children":[]},{"level":3,"title":"afterHook - method","slug":"afterhook-method","link":"#afterhook-method","children":[]},{"level":3,"title":"replaceAny - method","slug":"replaceany-method","link":"#replaceany-method","children":[]},{"level":3,"title":"replaceUnit - method","slug":"replaceunit-method","link":"#replaceunit-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"intercept - method","slug":"intercept-method","link":"#intercept-method","children":[]},{"level":3,"title":"removeSelf - method","slug":"removeself-method","link":"#removeself-method","children":[]},{"level":3,"title":"HookCallback - class","slug":"hookcallback-class","link":"#hookcallback-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"by - method","slug":"by-method-1","link":"#by-method-1","children":[]},{"level":3,"title":"onPrepareHook - method","slug":"onpreparehook-method","link":"#onpreparehook-method","children":[]},{"level":3,"title":"onHookClassNotFoundFailure - method","slug":"onhookclassnotfoundfailure-method","link":"#onhookclassnotfoundfailure-method","children":[]},{"level":3,"title":"ignoredHookClassNotFoundFailure - method","slug":"ignoredhookclassnotfoundfailure-method","link":"#ignoredhookclassnotfoundfailure-method","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-71147891","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html","title":"YukiMemberHookCreator - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"PRIORITY_DEFAULT - field","slug":"priority-default-field","link":"#priority-default-field","children":[]},{"level":2,"title":"PRIORITY_LOWEST - field","slug":"priority-lowest-field","link":"#priority-lowest-field","children":[]},{"level":2,"title":"PRIORITY_HIGHEST - field","slug":"priority-highest-field","link":"#priority-highest-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"injectMember - method","slug":"injectmember-method","link":"#injectmember-method","children":[]},{"level":2,"title":"useDangerousOperation - method","slug":"usedangerousoperation-method","link":"#usedangerousoperation-method","children":[]},{"level":2,"title":"MemberHookCreator - class","slug":"memberhookcreator-class","link":"#memberhookcreator-class","children":[{"level":3,"title":"members - method","slug":"members-method","link":"#members-method","children":[]},{"level":3,"title":"allMembers - method","slug":"allmembers-method","link":"#allmembers-method","children":[]},{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"HookParam.field - i-ext-method","slug":"hookparam-field-i-ext-method","link":"#hookparam-field-i-ext-method","children":[]},{"level":3,"title":"HookParam.method - i-ext-method","slug":"hookparam-method-i-ext-method","link":"#hookparam-method-i-ext-method","children":[]},{"level":3,"title":"HookParam.constructor - i-ext-method","slug":"hookparam-constructor-i-ext-method","link":"#hookparam-constructor-i-ext-method","children":[]},{"level":3,"title":"HookParam.injectMember - i-ext-method","slug":"hookparam-injectmember-i-ext-method","link":"#hookparam-injectmember-i-ext-method","children":[]},{"level":3,"title":"beforeHook - method","slug":"beforehook-method","link":"#beforehook-method","children":[]},{"level":3,"title":"afterHook - method","slug":"afterhook-method","link":"#afterhook-method","children":[]},{"level":3,"title":"replaceAny - method","slug":"replaceany-method","link":"#replaceany-method","children":[]},{"level":3,"title":"replaceUnit - method","slug":"replaceunit-method","link":"#replaceunit-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"intercept - method","slug":"intercept-method","link":"#intercept-method","children":[]},{"level":3,"title":"removeSelf - method","slug":"removeself-method","link":"#removeself-method","children":[]},{"level":3,"title":"HookCallback - class","slug":"hookcallback-class","link":"#hookcallback-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"by - method","slug":"by-method-1","link":"#by-method-1","children":[]},{"level":3,"title":"onPrepareHook - method","slug":"onpreparehook-method","link":"#onpreparehook-method","children":[]},{"level":3,"title":"onHookClassNotFoundFailure - method","slug":"onhookclassnotfoundfailure-method","link":"#onhookclassnotfoundfailure-method","children":[]},{"level":3,"title":"ignoredHookClassNotFoundFailure - method","slug":"ignoredhookclassnotfoundfailure-method","link":"#ignoredhookclassnotfoundfailure-method","children":[]}]}],"git":{"updatedTime":1669495178000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"}');export{e as data}; diff --git a/docs/assets/YukiMemberHookCreator.html.148a1429.js b/docs/assets/YukiMemberHookCreator.html.de53c2f8.js similarity index 96% rename from docs/assets/YukiMemberHookCreator.html.148a1429.js rename to docs/assets/YukiMemberHookCreator.html.de53c2f8.js index bfadeb0f4..57e1a3ec2 100644 --- a/docs/assets/YukiMemberHookCreator.html.148a1429.js +++ b/docs/assets/YukiMemberHookCreator.html.de53c2f8.js @@ -1,5 +1,5 @@ -import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    YukiMemberHookCreator - class

    class YukiMemberHookCreator(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5BF9 hookClass \u8FDB\u884C inline \u5904\u7406

    v1.1.0 \u4FEE\u6539

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    \u529F\u80FD\u63CF\u8FF0

    YukiHookAPI \u7684 Member \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
    +import{_ as s,o,c as n,a as e}from"./app.6074a838.js";const a={},l=e(`

    YukiMemberHookCreator - class

    class YukiMemberHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5BF9 hookClass \u8FDB\u884C inline \u5904\u7406

    v1.1.0 \u4FEE\u6539

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    v1.1.5 \u4FEE\u6539

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    \u529F\u80FD\u63CF\u8FF0

    YukiHookAPI \u7684 Member \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u9ED8\u8BA4 Hook \u56DE\u8C03\u4F18\u5148\u7EA7\u3002

    PRIORITY_LOWEST - field

    val PRIORITY_LOWEST: Int
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5EF6\u8FDF\u56DE\u8C03 Hook \u65B9\u6CD5\u7ED3\u679C\u3002

    PRIORITY_HIGHEST - field

    val PRIORITY_HIGHEST: Int
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u66F4\u5FEB\u56DE\u8C03 Hook \u65B9\u6CD5\u7ED3\u679C\u3002

    instanceClass - field

    val instanceClass: Class<*>
    @@ -17,15 +17,15 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5141\u8BB8 Hook \u8FC7\u7A0B\u4E2D\u7684\u6240\u6709\u5371\u9669\u884C\u4E3A\u3002

    \u8BF7\u5728 option \u4E2D\u952E\u5165 Yes do as I say! \u4EE3\u8868\u4F60\u540C\u610F\u5141\u8BB8\u6240\u6709\u5371\u9669\u884C\u4E3A\u3002

    \u4F60\u8FD8\u9700\u8981\u5728\u6574\u4E2A\u8C03\u7528\u57DF\u4E2D\u58F0\u660E\u6CE8\u89E3 CauseProblemsApi \u4EE5\u6D88\u9664\u8B66\u544A\u3002

    \u82E5\u4F60\u53EA\u9700\u8981 Hook ClassLoader \u7684 loadClass \u65B9\u6CD5\uFF0C\u8BF7\u53C2\u8003 ClassLoader.onLoadClass\u3002

    \u7279\u522B\u6CE8\u610F

    \u82E5\u4F60\u4E0D\u77E5\u9053\u5141\u8BB8\u6B64\u529F\u80FD\u4F1A\u5E26\u6765\u4F55\u79CD\u540E\u679C\uFF0C\u8BF7\u52FF\u4F7F\u7528\u3002

    MemberHookCreator - class

    inner class MemberHookCreator internal constructor(private val priority: Int, internal val tag: String)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u589E\u52A0 priority Hook \u4F18\u5148\u7EA7

    v1.0.81 \u4FEE\u6539

    \u589E\u52A0 packageName \u5F53\u524D Hook \u7684 APP \u5305\u540D

    v1.1.0 \u4FEE\u6539

    \u79FB\u9664 packageName

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    \u529F\u80FD\u63CF\u8FF0

    Hook \u6838\u5FC3\u529F\u80FD\u5B9E\u73B0\u7C7B\uFF0C\u67E5\u627E\u548C\u5904\u7406\u9700\u8981 Hook \u7684 Method\u3001Constructor\u3002

    member - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.1.0 \u79FB\u9664

    \u8BF7\u8F6C\u79FB\u5230 members

    members - method

    fun members(vararg member: Member?)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.1.0 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u624B\u52A8\u6307\u5B9A\u8981 Hook \u7684 Method\u3001Constructor\u3002

    \u6CE8\u610F

    \u4E0D\u5EFA\u8BAE\u4F7F\u7528\u6B64\u65B9\u6CD5\u8BBE\u7F6E\u76EE\u6807\u9700\u8981 Hook \u7684 Member \u5BF9\u8C61\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 method \u6216 constructor \u65B9\u6CD5\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u8C03\u7528 instanceClass \u6765\u624B\u52A8\u67E5\u627E\u8981 Hook \u7684 Method\u3001Constructor\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    -    members(instanceClass.getDeclaredMethod("test", StringType))
    +    members(instanceClass.getDeclaredMethod("test", StringClass))
         beforeHook {}
         afterHook {}
     }
     

    \u540C\u6837\u5730\uFF0C\u4F60\u4E5F\u53EF\u4EE5\u4F20\u5165\u4E00\u7EC4 Member \u540C\u65F6\u8FDB\u884C Hook\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         members(
    -        instanceClass.getDeclaredMethod("test1", StringType),
    -        instanceClass.getDeclaredMethod("test2", StringType),
    -        instanceClass.getDeclaredMethod("test3", StringType)
    +        instanceClass.getDeclaredMethod("test1", StringClass),
    +        instanceClass.getDeclaredMethod("test2", StringClass),
    +        instanceClass.getDeclaredMethod("test3", StringClass)
         )
         beforeHook {}
         afterHook {}
    @@ -35,7 +35,7 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u67E5\u627E\u5F53\u524D Class \u9700\u8981 Hook \u7684 Method \u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u53C2\u8003 MethodFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         beforeHook {}
    @@ -51,7 +51,7 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    }

    \u6B64\u65F6 beforeHook \u4E0E afterHook \u4F1A\u5728\u6BCF\u4E2A\u67E5\u627E\u5230\u7684\u7ED3\u679C\u4E2D\u591A\u6B21\u56DE\u8C03 Hook \u65B9\u6CD5\u4F53\u3002

    \u6CE8\u610F

    \u82E5\u6CA1\u6709 all\uFF0C\u9ED8\u8BA4\u53EA\u4F1A Hook \u5F53\u524D\u6761\u4EF6\u67E5\u627E\u5230\u7684\u6570\u7EC4\u4E0B\u6807\u7ED3\u679C\u7B2C\u4E00\u4F4D\u3002

    constructor - method

    inline fun constructor(initiate: ConstructorConditions): ConstructorFinder.Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u67E5\u627E\u5F53\u524D Class \u9700\u8981 Hook \u7684 Constructor\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u53C2\u8003 ConstructorFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    -    constructor { param(StringType) }
    +    constructor { param(StringClass) }
         beforeHook {}
         afterHook {}
     }
    @@ -64,7 +64,7 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0 \u6DFB\u52A0

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u4F7F\u7528\u5F53\u524D hookClass \u67E5\u627E\u5E76\u5F97\u5230 Field\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u53C2\u8003 FieldFinder \u67E5\u770B\u8BE6\u7EC6\u7528\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         afterHook {
    @@ -118,4 +118,4 @@ import{_ as s,o,c as n,a as e}from"./app.99fcdd51.js";const a={},l=e(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.5 \u65B0\u589E

    v1.0.80 \u4FEE\u6539

    \u5C06\u65B9\u6CD5\u4F53\u8FDB\u884C inline

    \u529F\u80FD\u63CF\u8FF0

    \u6DFB\u52A0\u6267\u884C Hook \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6\uFF0C\u4E0D\u6EE1\u8DB3\u6761\u4EF6\u5C06\u76F4\u63A5\u505C\u6B62 Hook\u3002

    onPrepareHook - method

    fun onPrepareHook(callback: () -> Unit): Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.70 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C hookClass \u5B58\u5728\u65F6\u51C6\u5907\u5F00\u59CB Hook \u7684\u64CD\u4F5C\u3002

    onHookClassNotFoundFailure - method

    fun onHookClassNotFoundFailure(result: (Throwable) -> Unit): Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.3 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C hookClass \u627E\u4E0D\u5230\u65F6\u53D1\u751F\u9519\u8BEF\u7684\u56DE\u8C03\u65B9\u6CD5\u3002

    ignoredHookClassNotFoundFailure - method

    fun ignoredHookClassNotFoundFailure(): Result
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.3 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5FFD\u7565 hookClass \u627E\u4E0D\u5230\u65F6\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,398),p=[l];function c(r,t){return o(),n("div",null,p)}const i=s(a,[["render",c],["__file","YukiMemberHookCreator.html.vue"]]);export{i as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.3 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5FFD\u7565 hookClass \u627E\u4E0D\u5230\u65F6\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,400),p=[l];function c(r,t){return o(),n("div",null,p)}const i=s(a,[["render",c],["__file","YukiMemberHookCreator.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiMemberHookCreator.html.37dcaec4.js b/docs/assets/YukiMemberHookCreator.html.e217488d.js similarity index 97% rename from docs/assets/YukiMemberHookCreator.html.37dcaec4.js rename to docs/assets/YukiMemberHookCreator.html.e217488d.js index 5bf412b47..8878ca5a9 100644 --- a/docs/assets/YukiMemberHookCreator.html.37dcaec4.js +++ b/docs/assets/YukiMemberHookCreator.html.e217488d.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-3ac40680","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html","title":"YukiMemberHookCreator - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"PRIORITY_DEFAULT - field","slug":"priority-default-field","link":"#priority-default-field","children":[]},{"level":2,"title":"PRIORITY_LOWEST - field","slug":"priority-lowest-field","link":"#priority-lowest-field","children":[]},{"level":2,"title":"PRIORITY_HIGHEST - field","slug":"priority-highest-field","link":"#priority-highest-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"injectMember - method","slug":"injectmember-method","link":"#injectmember-method","children":[]},{"level":2,"title":"useDangerousOperation - method","slug":"usedangerousoperation-method","link":"#usedangerousoperation-method","children":[]},{"level":2,"title":"MemberHookCreator - class","slug":"memberhookcreator-class","link":"#memberhookcreator-class","children":[{"level":3,"title":"members - method","slug":"members-method","link":"#members-method","children":[]},{"level":3,"title":"allMembers - method","slug":"allmembers-method","link":"#allmembers-method","children":[]},{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"HookParam.field - i-ext-method","slug":"hookparam-field-i-ext-method","link":"#hookparam-field-i-ext-method","children":[]},{"level":3,"title":"HookParam.method - i-ext-method","slug":"hookparam-method-i-ext-method","link":"#hookparam-method-i-ext-method","children":[]},{"level":3,"title":"HookParam.constructor - i-ext-method","slug":"hookparam-constructor-i-ext-method","link":"#hookparam-constructor-i-ext-method","children":[]},{"level":3,"title":"HookParam.injectMember - i-ext-method","slug":"hookparam-injectmember-i-ext-method","link":"#hookparam-injectmember-i-ext-method","children":[]},{"level":3,"title":"beforeHook - method","slug":"beforehook-method","link":"#beforehook-method","children":[]},{"level":3,"title":"afterHook - method","slug":"afterhook-method","link":"#afterhook-method","children":[]},{"level":3,"title":"replaceAny - method","slug":"replaceany-method","link":"#replaceany-method","children":[]},{"level":3,"title":"replaceUnit - method","slug":"replaceunit-method","link":"#replaceunit-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"intercept - method","slug":"intercept-method","link":"#intercept-method","children":[]},{"level":3,"title":"removeSelf - method","slug":"removeself-method","link":"#removeself-method","children":[]},{"level":3,"title":"HookCallback - class","slug":"hookcallback-class","link":"#hookcallback-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"by - method","slug":"by-method-1","link":"#by-method-1","children":[]},{"level":3,"title":"onPrepareHook - method","slug":"onpreparehook-method","link":"#onpreparehook-method","children":[]},{"level":3,"title":"onHookClassNotFoundFailure - method","slug":"onhookclassnotfoundfailure-method","link":"#onhookclassnotfoundfailure-method","children":[]},{"level":3,"title":"ignoredHookClassNotFoundFailure - method","slug":"ignoredhookclassnotfoundfailure-method","link":"#ignoredhookclassnotfoundfailure-method","children":[]}]}],"git":{"updatedTime":1663743027000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-3ac40680","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html","title":"YukiMemberHookCreator - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"PRIORITY_DEFAULT - field","slug":"priority-default-field","link":"#priority-default-field","children":[]},{"level":2,"title":"PRIORITY_LOWEST - field","slug":"priority-lowest-field","link":"#priority-lowest-field","children":[]},{"level":2,"title":"PRIORITY_HIGHEST - field","slug":"priority-highest-field","link":"#priority-highest-field","children":[]},{"level":2,"title":"instanceClass - field","slug":"instanceclass-field","link":"#instanceclass-field","children":[]},{"level":2,"title":"injectMember - method","slug":"injectmember-method","link":"#injectmember-method","children":[]},{"level":2,"title":"useDangerousOperation - method","slug":"usedangerousoperation-method","link":"#usedangerousoperation-method","children":[]},{"level":2,"title":"MemberHookCreator - class","slug":"memberhookcreator-class","link":"#memberhookcreator-class","children":[{"level":3,"title":"members - method","slug":"members-method","link":"#members-method","children":[]},{"level":3,"title":"allMembers - method","slug":"allmembers-method","link":"#allmembers-method","children":[]},{"level":3,"title":"method - method","slug":"method-method","link":"#method-method","children":[]},{"level":3,"title":"constructor - method","slug":"constructor-method","link":"#constructor-method","children":[]},{"level":3,"title":"HookParam.field - i-ext-method","slug":"hookparam-field-i-ext-method","link":"#hookparam-field-i-ext-method","children":[]},{"level":3,"title":"HookParam.method - i-ext-method","slug":"hookparam-method-i-ext-method","link":"#hookparam-method-i-ext-method","children":[]},{"level":3,"title":"HookParam.constructor - i-ext-method","slug":"hookparam-constructor-i-ext-method","link":"#hookparam-constructor-i-ext-method","children":[]},{"level":3,"title":"HookParam.injectMember - i-ext-method","slug":"hookparam-injectmember-i-ext-method","link":"#hookparam-injectmember-i-ext-method","children":[]},{"level":3,"title":"beforeHook - method","slug":"beforehook-method","link":"#beforehook-method","children":[]},{"level":3,"title":"afterHook - method","slug":"afterhook-method","link":"#afterhook-method","children":[]},{"level":3,"title":"replaceAny - method","slug":"replaceany-method","link":"#replaceany-method","children":[]},{"level":3,"title":"replaceUnit - method","slug":"replaceunit-method","link":"#replaceunit-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"intercept - method","slug":"intercept-method","link":"#intercept-method","children":[]},{"level":3,"title":"removeSelf - method","slug":"removeself-method","link":"#removeself-method","children":[]},{"level":3,"title":"HookCallback - class","slug":"hookcallback-class","link":"#hookcallback-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]}]},{"level":2,"title":"Result - class","slug":"result-class-1","link":"#result-class-1","children":[{"level":3,"title":"result - method","slug":"result-method-1","link":"#result-method-1","children":[]},{"level":3,"title":"by - method","slug":"by-method-1","link":"#by-method-1","children":[]},{"level":3,"title":"onPrepareHook - method","slug":"onpreparehook-method","link":"#onpreparehook-method","children":[]},{"level":3,"title":"onHookClassNotFoundFailure - method","slug":"onhookclassnotfoundfailure-method","link":"#onhookclassnotfoundfailure-method","children":[]},{"level":3,"title":"ignoredHookClassNotFoundFailure - method","slug":"ignoredhookclassnotfoundfailure-method","link":"#ignoredhookclassnotfoundfailure-method","children":[]}]}],"git":{"updatedTime":1669495178000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"}');export{e as data}; diff --git a/docs/assets/YukiModuleResources.html.f47310a8.js b/docs/assets/YukiModuleResources.html.4be33489.js similarity index 97% rename from docs/assets/YukiModuleResources.html.f47310a8.js rename to docs/assets/YukiModuleResources.html.4be33489.js index 6bf44a005..30974a992 100644 --- a/docs/assets/YukiModuleResources.html.f47310a8.js +++ b/docs/assets/YukiModuleResources.html.4be33489.js @@ -1,3 +1,3 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5BF9\u63A5 XModuleResources \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    fwd - method

    fun fwd(resId: Int): YukiResForwarder
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5BF9\u63A5 XModuleResources.fwd \u65B9\u6CD5\u3002

    \u521B\u5EFA YukiResForwarder \u4E0E XResForwarder \u5B9E\u4F8B\u3002

    `,14),c=[l];function t(r,p){return e(),o("div",null,c)}const i=s(n,[["render",t],["__file","YukiModuleResources.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiModuleResources.html.10f2c38d.js b/docs/assets/YukiModuleResources.html.78b4ac12.js similarity index 97% rename from docs/assets/YukiModuleResources.html.10f2c38d.js rename to docs/assets/YukiModuleResources.html.78b4ac12.js index 1eda7e434..34608d88f 100644 --- a/docs/assets/YukiModuleResources.html.10f2c38d.js +++ b/docs/assets/YukiModuleResources.html.78b4ac12.js @@ -1,3 +1,3 @@ -import{_ as s,o,c as e,a}from"./app.99fcdd51.js";const n={},l=a(`

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
    +import{_ as s,o,c as e,a}from"./app.6074a838.js";const n={},l=a(`

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9\u63A5 XModuleResources \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    fwd - method

    fun fwd(resId: Int): YukiResForwarder
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9\u63A5 XModuleResources.fwd \u65B9\u6CD5\u3002

    \u521B\u5EFA YukiResForwarder \u4E0E XResForwarder \u5B9E\u4F8B\u3002

    `,13),c=[l];function p(r,t){return o(),e("div",null,c)}const u=s(n,[["render",p],["__file","YukiModuleResources.html.vue"]]);export{u as default}; diff --git a/docs/assets/YukiResForwarder.html.234358d5.js b/docs/assets/YukiResForwarder.html.0fa21457.js similarity index 98% rename from docs/assets/YukiResForwarder.html.234358d5.js rename to docs/assets/YukiResForwarder.html.0fa21457.js index 427757640..0a446348c 100644 --- a/docs/assets/YukiResForwarder.html.234358d5.js +++ b/docs/assets/YukiResForwarder.html.0fa21457.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},c=a(`

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},c=a(`

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9\u63A5 XResForwarder \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    instance - field

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    v1.1.0 \u4F5C\u5E9F

    \u4E0D\u518D\u5BF9\u5916\u516C\u5F00 instance \u53C2\u6570

    id - field

    val id: Int
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D APP \u7684 Resources Id\u3002

    resources - field

    val resources: Resources
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u5F97\u5F53\u524D APP \u7684 Resources\u3002

    `,23),l=[c];function r(p,t){return e(),o("div",null,l)}const i=s(n,[["render",r],["__file","YukiResForwarder.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiResForwarder.html.62d9bea1.js b/docs/assets/YukiResForwarder.html.8f56be0b.js similarity index 98% rename from docs/assets/YukiResForwarder.html.62d9bea1.js rename to docs/assets/YukiResForwarder.html.8f56be0b.js index d3839ca4c..bb468d9ce 100644 --- a/docs/assets/YukiResForwarder.html.62d9bea1.js +++ b/docs/assets/YukiResForwarder.html.8f56be0b.js @@ -1,4 +1,4 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},r=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},r=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5BF9\u63A5 XResForwarder \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    instance - field

    Change Records

    v1.0.80 added

    v1.1.0 deprecated

    \u4E0D\u518D\u5BF9\u5916\u516C\u5F00 instance \u53C2\u6570

    id - field

    val id: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D APP \u7684 Resources Id\u3002

    resources - field

    val resources: Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u83B7\u5F97\u5F53\u524D APP \u7684 Resources\u3002

    `,24),c=[r];function l(t,p){return e(),o("div",null,c)}const i=s(n,[["render",l],["__file","YukiResForwarder.html.vue"]]);export{i as default}; diff --git a/docs/assets/YukiResources.html.8651ca84.js b/docs/assets/YukiResources.html.1ebe8f03.js similarity index 99% rename from docs/assets/YukiResources.html.8651ca84.js rename to docs/assets/YukiResources.html.1ebe8f03.js index cf0cc709d..2c2927666 100644 --- a/docs/assets/YukiResources.html.8651ca84.js +++ b/docs/assets/YukiResources.html.1ebe8f03.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as o,a as n}from"./app.99fcdd51.js";const e={},l=n(`

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
    +import{_ as s,o as a,c as o,a as n}from"./app.6074a838.js";const e={},l=n(`

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9\u63A5 XResources \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    LayoutInflatedParam - class

    class LayoutInflatedParam(internal val baseParam: XC_LayoutInflated.LayoutInflatedParam)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u88C5\u8F7D Hook APP \u7684\u76EE\u6807\u5E03\u5C40 Resources \u5B9E\u73B0\u7C7B\u3002

    variantName - field

    val variantName: String
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u83B7\u53D6\u5F53\u524D\u88AB Hook \u7684\u5E03\u5C40\u88C5\u8F7D\u76EE\u5F55\u540D\u79F0\u3002

    \u4F8B\u5982\uFF1Alayout\u3001layout-land\u3001layout-sw600dp\u3002

    currentView - field

    val currentView: View
    diff --git a/docs/assets/YukiResources.html.8cdff557.js b/docs/assets/YukiResources.html.24245e68.js
    similarity index 99%
    rename from docs/assets/YukiResources.html.8cdff557.js
    rename to docs/assets/YukiResources.html.24245e68.js
    index af991f930..7086525fe 100644
    --- a/docs/assets/YukiResources.html.8cdff557.js
    +++ b/docs/assets/YukiResources.html.24245e68.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as a,c as n,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
    +import{_ as s,o as a,c as n,a as o}from"./app.6074a838.js";const e={},l=o(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5BF9\u63A5 XResources \u7684\u4E2D\u95F4\u5C42\u5B9E\u4F8B\u3002

    LayoutInflatedParam - class

    class LayoutInflatedParam(internal val baseParam: XC_LayoutInflated.LayoutInflatedParam)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u88C5\u8F7D Hook APP \u7684\u76EE\u6807\u5E03\u5C40 Resources \u5B9E\u73B0\u7C7B\u3002

    variantName - field

    val variantName: String
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u83B7\u53D6\u5F53\u524D\u88AB Hook \u7684\u5E03\u5C40\u88C5\u8F7D\u76EE\u5F55\u540D\u79F0\u3002

    \u4F8B\u5982\uFF1Alayout\u3001layout-land\u3001layout-sw600dp\u3002

    currentView - field

    val currentView: View
    diff --git a/docs/assets/YukiResourcesHookCreator.html.46168b72.js b/docs/assets/YukiResourcesHookCreator.html.1f540f56.js
    similarity index 93%
    rename from docs/assets/YukiResourcesHookCreator.html.46168b72.js
    rename to docs/assets/YukiResourcesHookCreator.html.1f540f56.js
    index 6fc3538e9..5176698f9 100644
    --- a/docs/assets/YukiResourcesHookCreator.html.46168b72.js
    +++ b/docs/assets/YukiResourcesHookCreator.html.1f540f56.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-5e81af42","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html","title":"YukiResourcesHookCreator - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"injectResource - method","slug":"injectresource-method","link":"#injectresource-method","children":[]},{"level":2,"title":"ResourcesHookCreator - class","slug":"resourceshookcreator-class","link":"#resourceshookcreator-class","children":[{"level":3,"title":"resourceId - field","slug":"resourceid-field","link":"#resourceid-field","children":[]},{"level":3,"title":"conditions - method","slug":"conditions-method","link":"#conditions-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"replaceToModuleResource - method","slug":"replacetomoduleresource-method","link":"#replacetomoduleresource-method","children":[]},{"level":3,"title":"injectAsLayout - method","slug":"injectaslayout-method","link":"#injectaslayout-method","children":[]},{"level":3,"title":"ConditionFinder - class","slug":"conditionfinder-class","link":"#conditionfinder-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]},{"level":3,"title":"onHookingFailure - method","slug":"onhookingfailure-method","link":"#onhookingfailure-method","children":[]},{"level":3,"title":"ignoredHookingFailure - method","slug":"ignoredhookingfailure-method","link":"#ignoredhookingfailure-method","children":[]}]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-5e81af42","path":"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html","title":"YukiResourcesHookCreator - class","lang":"zh-CN","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"injectResource - method","slug":"injectresource-method","link":"#injectresource-method","children":[]},{"level":2,"title":"ResourcesHookCreator - class","slug":"resourceshookcreator-class","link":"#resourceshookcreator-class","children":[{"level":3,"title":"resourceId - field","slug":"resourceid-field","link":"#resourceid-field","children":[]},{"level":3,"title":"conditions - method","slug":"conditions-method","link":"#conditions-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"replaceToModuleResource - method","slug":"replacetomoduleresource-method","link":"#replacetomoduleresource-method","children":[]},{"level":3,"title":"injectAsLayout - method","slug":"injectaslayout-method","link":"#injectaslayout-method","children":[]},{"level":3,"title":"ConditionFinder - class","slug":"conditionfinder-class","link":"#conditionfinder-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]},{"level":3,"title":"onHookingFailure - method","slug":"onhookingfailure-method","link":"#onhookingfailure-method","children":[]},{"level":3,"title":"ignoredHookingFailure - method","slug":"ignoredhookingfailure-method","link":"#ignoredhookingfailure-method","children":[]}]}],"git":{"updatedTime":1669495178000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"}');export{e as data};
    diff --git a/docs/assets/YukiResourcesHookCreator.html.8aaa9934.js b/docs/assets/YukiResourcesHookCreator.html.2fa2ff0f.js
    similarity index 93%
    rename from docs/assets/YukiResourcesHookCreator.html.8aaa9934.js
    rename to docs/assets/YukiResourcesHookCreator.html.2fa2ff0f.js
    index 3579a7ee6..254714b9e 100644
    --- a/docs/assets/YukiResourcesHookCreator.html.8aaa9934.js
    +++ b/docs/assets/YukiResourcesHookCreator.html.2fa2ff0f.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-5ed1ceee","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html","title":"YukiResourcesHookCreator - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"injectResource - method","slug":"injectresource-method","link":"#injectresource-method","children":[]},{"level":2,"title":"ResourcesHookCreator - class","slug":"resourceshookcreator-class","link":"#resourceshookcreator-class","children":[{"level":3,"title":"resourceId - field","slug":"resourceid-field","link":"#resourceid-field","children":[]},{"level":3,"title":"conditions - method","slug":"conditions-method","link":"#conditions-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"replaceToModuleResource - method","slug":"replacetomoduleresource-method","link":"#replacetomoduleresource-method","children":[]},{"level":3,"title":"injectAsLayout - method","slug":"injectaslayout-method","link":"#injectaslayout-method","children":[]},{"level":3,"title":"ConditionFinder - class","slug":"conditionfinder-class","link":"#conditionfinder-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]},{"level":3,"title":"onHookingFailure - method","slug":"onhookingfailure-method","link":"#onhookingfailure-method","children":[]},{"level":3,"title":"ignoredHookingFailure - method","slug":"ignoredhookingfailure-method","link":"#ignoredhookingfailure-method","children":[]}]}],"git":{"updatedTime":1664299331000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-5ed1ceee","path":"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html","title":"YukiResourcesHookCreator - class","lang":"en-US","frontmatter":{"pageClass":"code-page"},"excerpt":"","headers":[{"level":2,"title":"injectResource - method","slug":"injectresource-method","link":"#injectresource-method","children":[]},{"level":2,"title":"ResourcesHookCreator - class","slug":"resourceshookcreator-class","link":"#resourceshookcreator-class","children":[{"level":3,"title":"resourceId - field","slug":"resourceid-field","link":"#resourceid-field","children":[]},{"level":3,"title":"conditions - method","slug":"conditions-method","link":"#conditions-method","children":[]},{"level":3,"title":"replaceTo - method","slug":"replaceto-method","link":"#replaceto-method","children":[]},{"level":3,"title":"replaceToTrue - method","slug":"replacetotrue-method","link":"#replacetotrue-method","children":[]},{"level":3,"title":"replaceToFalse - method","slug":"replacetofalse-method","link":"#replacetofalse-method","children":[]},{"level":3,"title":"replaceToModuleResource - method","slug":"replacetomoduleresource-method","link":"#replacetomoduleresource-method","children":[]},{"level":3,"title":"injectAsLayout - method","slug":"injectaslayout-method","link":"#injectaslayout-method","children":[]},{"level":3,"title":"ConditionFinder - class","slug":"conditionfinder-class","link":"#conditionfinder-class","children":[]},{"level":3,"title":"Result - class","slug":"result-class","link":"#result-class","children":[]},{"level":3,"title":"onHookingFailure - method","slug":"onhookingfailure-method","link":"#onhookingfailure-method","children":[]},{"level":3,"title":"ignoredHookingFailure - method","slug":"ignoredhookingfailure-method","link":"#ignoredhookingfailure-method","children":[]}]}],"git":{"updatedTime":1669495178000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"}');export{e as data};
    diff --git a/docs/assets/YukiResourcesHookCreator.html.0a994d9e.js b/docs/assets/YukiResourcesHookCreator.html.5e15700c.js
    similarity index 94%
    rename from docs/assets/YukiResourcesHookCreator.html.0a994d9e.js
    rename to docs/assets/YukiResourcesHookCreator.html.5e15700c.js
    index 0c0791254..babeb7784 100644
    --- a/docs/assets/YukiResourcesHookCreator.html.0a994d9e.js
    +++ b/docs/assets/YukiResourcesHookCreator.html.5e15700c.js
    @@ -1,5 +1,5 @@
    -import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    \u529F\u80FD\u63CF\u8FF0

    YukiHookAPI \u7684 Resources \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
    +import{_ as s,o as n,c as a,a as o}from"./app.6074a838.js";const e={},l=o(`

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    v1.1.0 \u4FEE\u6539

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    v1.1.5 \u4FEE\u6539

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    \u529F\u80FD\u63CF\u8FF0

    YukiHookAPI \u7684 Resources \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6CE8\u5165\u8981 Hook \u7684 Resources\u3002

    \u529F\u80FD\u793A\u4F8B

    \u4F60\u53EF\u4EE5\u6CE8\u5165\u4EFB\u610F Resources\uFF0C\u4F7F\u7528 injectResource \u5373\u53EF\u521B\u5EFA\u4E00\u4E2A Hook \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectResource {
         // Your code here.
     }
    @@ -92,4 +92,4 @@ import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u521B\u5EFA\u76D1\u542C\u4E8B\u4EF6\u65B9\u6CD5\u4F53\u3002

    by - method

    inline fun by(condition: () -> Boolean): Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u6DFB\u52A0\u6267\u884C Hook \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6\uFF0C\u4E0D\u6EE1\u8DB3\u6761\u4EF6\u5C06\u76F4\u63A5\u505C\u6B62 Hook\u3002

    onHookingFailure - method

    fun onHookingFailure(result: (Throwable) -> Unit): Result
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u76D1\u542C Hook \u8FC7\u7A0B\u53D1\u751F\u9519\u8BEF\u7684\u56DE\u8C03\u65B9\u6CD5\u3002

    ignoredHookingFailure - method

    fun ignoredHookingFailure(): Result
    -

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5FFD\u7565 Hook \u8FC7\u7A0B\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,230),p=[l];function c(r,t){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","YukiResourcesHookCreator.html.vue"]]);export{d as default}; +

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5FFD\u7565 Hook \u8FC7\u7A0B\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,232),p=[l];function c(r,t){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","YukiResourcesHookCreator.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiResourcesHookCreator.html.4985f81e.js b/docs/assets/YukiResourcesHookCreator.html.688a3244.js similarity index 94% rename from docs/assets/YukiResourcesHookCreator.html.4985f81e.js rename to docs/assets/YukiResourcesHookCreator.html.688a3244.js index db465971a..9d5a79806 100644 --- a/docs/assets/YukiResourcesHookCreator.html.4985f81e.js +++ b/docs/assets/YukiResourcesHookCreator.html.688a3244.js @@ -1,5 +1,5 @@ -import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    -

    Change Records

    v1.0.80 added

    v1.1.0 modified

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    Function Illustrate

    YukiHookAPI \u7684 Resources \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
    +import{_ as s,o as n,c as e,a}from"./app.6074a838.js";const o={},l=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    +

    Change Records

    v1.0.80 added

    v1.1.0 modified

    \u4FEE\u6B63\u62FC\u5199\u9519\u8BEF\u7684 Creater \u547D\u540D\u5230 Creator

    v1.1.5 modified

    \u79C1\u6709\u5316\u6784\u9020\u65B9\u6CD5

    Function Illustrate

    YukiHookAPI \u7684 Resources \u6838\u5FC3 Hook \u5B9E\u73B0\u7C7B\u3002

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u6CE8\u5165\u8981 Hook \u7684 Resources\u3002

    Function Example

    \u4F60\u53EF\u4EE5\u6CE8\u5165\u4EFB\u610F Resources\uFF0C\u4F7F\u7528 injectResource \u5373\u53EF\u521B\u5EFA\u4E00\u4E2A Hook \u5BF9\u8C61\u3002

    The following example

    injectResource {
         // Your code here.
     }
    @@ -92,4 +92,4 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    Change Records

    v1.0.80 added

    Function Illustrate

    \u521B\u5EFA\u76D1\u542C\u4E8B\u4EF6\u65B9\u6CD5\u4F53\u3002

    by - method

    inline fun by(condition: () -> Boolean): Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u6DFB\u52A0\u6267\u884C Hook \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6\uFF0C\u4E0D\u6EE1\u8DB3\u6761\u4EF6\u5C06\u76F4\u63A5\u505C\u6B62 Hook\u3002

    onHookingFailure - method

    fun onHookingFailure(result: (Throwable) -> Unit): Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u76D1\u542C Hook \u8FC7\u7A0B\u53D1\u751F\u9519\u8BEF\u7684\u56DE\u8C03\u65B9\u6CD5\u3002

    ignoredHookingFailure - method

    fun ignoredHookingFailure(): Result
    -

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5FFD\u7565 Hook \u8FC7\u7A0B\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,231),p=[l];function c(r,t){return n(),e("div",null,p)}const d=s(o,[["render",c],["__file","YukiResourcesHookCreator.html.vue"]]);export{d as default}; +

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5FFD\u7565 Hook \u8FC7\u7A0B\u51FA\u73B0\u7684\u9519\u8BEF\u3002

    `,233),p=[l];function c(r,t){return n(),e("div",null,p)}const d=s(o,[["render",c],["__file","YukiResourcesHookCreator.html.vue"]]);export{d as default}; diff --git a/docs/assets/YukiXposedEvent.html.04a50775.js b/docs/assets/YukiXposedEvent.html.b8957ead.js similarity index 98% rename from docs/assets/YukiXposedEvent.html.04a50775.js rename to docs/assets/YukiXposedEvent.html.b8957ead.js index e53ea4777..90e7fb0d5 100644 --- a/docs/assets/YukiXposedEvent.html.04a50775.js +++ b/docs/assets/YukiXposedEvent.html.b8957ead.js @@ -1,4 +1,4 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    YukiXposedEvent - object

    object YukiXposedEvent
    +import{_ as s,o,c as a,a as e}from"./app.6074a838.js";const n={},l=e(`

    YukiXposedEvent - object

    object YukiXposedEvent
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u6DFB\u52A0

    \u529F\u80FD\u63CF\u8FF0

    \u5B9E\u73B0\u5BF9\u539F\u751F Xposed API \u7684\u88C5\u8F7D\u4E8B\u4EF6\u76D1\u542C\u3002

    events - method

    inline fun events(initiate: YukiXposedEvent.() -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u5BF9 YukiXposedEvent \u521B\u5EFA\u4E00\u4E2A\u65B9\u6CD5\u4F53\u3002

    onInitZygote - method

    fun onInitZygote(result: (StartupParam) -> Unit)
     

    \u53D8\u66F4\u8BB0\u5F55

    v1.0.80 \u65B0\u589E

    \u529F\u80FD\u63CF\u8FF0

    \u8BBE\u7F6E initZygote \u4E8B\u4EF6\u76D1\u542C\u3002

    onHandleLoadPackage - method

    fun onHandleLoadPackage(result: (LoadPackageParam) -> Unit)
    diff --git a/docs/assets/YukiXposedEvent.html.5f49c197.js b/docs/assets/YukiXposedEvent.html.bfad9f81.js
    similarity index 98%
    rename from docs/assets/YukiXposedEvent.html.5f49c197.js
    rename to docs/assets/YukiXposedEvent.html.bfad9f81.js
    index 912f6cf85..962573692 100644
    --- a/docs/assets/YukiXposedEvent.html.5f49c197.js
    +++ b/docs/assets/YukiXposedEvent.html.bfad9f81.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},t=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiXposedEvent - object

    object YukiXposedEvent
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},t=a(`

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiXposedEvent - object

    object YukiXposedEvent
     

    Change Records

    v1.0.80 first

    Function Illustrate

    \u5B9E\u73B0\u5BF9\u539F\u751F Xposed API \u7684\u88C5\u8F7D\u4E8B\u4EF6\u76D1\u542C\u3002

    events - method

    inline fun events(initiate: YukiXposedEvent.() -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u5BF9 YukiXposedEvent \u521B\u5EFA\u4E00\u4E2A\u65B9\u6CD5\u4F53\u3002

    onInitZygote - method

    fun onInitZygote(result: (StartupParam) -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    \u8BBE\u7F6E initZygote \u4E8B\u4EF6\u76D1\u542C\u3002

    onHandleLoadPackage - method

    fun onHandleLoadPackage(result: (LoadPackageParam) -> Unit)
    diff --git a/docs/assets/about.html.d844c71e.js b/docs/assets/about.html.1789aea9.js
    similarity index 95%
    rename from docs/assets/about.html.d844c71e.js
    rename to docs/assets/about.html.1789aea9.js
    index 6e6458331..6b380fc88 100644
    --- a/docs/assets/about.html.d844c71e.js
    +++ b/docs/assets/about.html.1789aea9.js
    @@ -1,6 +1,6 @@
    -import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.99fcdd51.js";const i={},r=s("h1",{id:"\u5173\u4E8E\u6B64\u6587\u6863",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u5173\u4E8E\u6B64\u6587\u6863","aria-hidden":"true"},"#"),a(" \u5173\u4E8E\u6B64\u6587\u6863")],-1),d=a("\u6B64\u6587\u6863\u7531 "),h={href:"https://v2.vuepress.vuejs.org/zh",target:"_blank",rel:"noopener noreferrer"},b=a("VuePress"),T=a(" \u5F3A\u529B\u9A71\u52A8\u3002"),I=s("h2",{id:"license",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" License")],-1),E={href:"https://github.com/fankes/YukiHookAPI/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"},u=a("The MIT License (MIT)"),O=p(`
    MIT License
    +import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.6074a838.js";const i={},r=s("h1",{id:"\u5173\u4E8E\u6B64\u6587\u6863",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u5173\u4E8E\u6B64\u6587\u6863","aria-hidden":"true"},"#"),a(" \u5173\u4E8E\u6B64\u6587\u6863")],-1),d=a("\u6B64\u6587\u6863\u7531 "),h={href:"https://v2.vuepress.vuejs.org/zh",target:"_blank",rel:"noopener noreferrer"},b=a("VuePress"),T=a(" \u5F3A\u529B\u9A71\u52A8\u3002"),I=s("h2",{id:"license",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" License")],-1),E={href:"https://github.com/fankes/YukiHookAPI/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"},u=a("The MIT License (MIT)"),O=p(`
    MIT License
     
    -Copyright (C) 2019-2022 HighCapable
    +Copyright (C) 2019-2023 HighCapable
     
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
    @@ -19,4 +19,4 @@ import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.99fcdd51.js
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     SOFTWARE.
    -

    \u7248\u6743\u6240\u6709 \xA9 2019-2022 HighCapable

    `,2);function N(R,_){const n=t("ExternalLinkIcon");return l(),c("div",null,[r,s("blockquote",null,[s("p",null,[d,s("a",h,[b,e(n)]),T])]),I,s("p",null,[s("a",E,[u,e(n)])]),O])}const f=o(i,[["render",N],["__file","about.html.vue"]]);export{f as default}; +

    \u7248\u6743\u6240\u6709 \xA9 2019-2023 HighCapable

    `,2);function N(R,_){const n=t("ExternalLinkIcon");return l(),c("div",null,[r,s("blockquote",null,[s("p",null,[d,s("a",h,[b,e(n)]),T])]),I,s("p",null,[s("a",E,[u,e(n)])]),O])}const f=o(i,[["render",N],["__file","about.html.vue"]]);export{f as default}; diff --git a/docs/assets/about.html.31fb9bcd.js b/docs/assets/about.html.4c54fb40.js similarity index 95% rename from docs/assets/about.html.31fb9bcd.js rename to docs/assets/about.html.4c54fb40.js index dccd43151..fd56797c7 100644 --- a/docs/assets/about.html.31fb9bcd.js +++ b/docs/assets/about.html.4c54fb40.js @@ -1,6 +1,6 @@ -import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.99fcdd51.js";const i={},r=s("h1",{id:"about-this-document",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#about-this-document","aria-hidden":"true"},"#"),a(" About this Document")],-1),d=a("This document is powered by "),h={href:"https://v2.vuepress.vuejs.org/en",target:"_blank",rel:"noopener noreferrer"},b=a("VuePress"),T=a("."),u=s("h2",{id:"license",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" License")],-1),I={href:"https://github.com/fankes/YukiHookAPI/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"},E=a("The MIT License (MIT)"),O=p(`
    MIT License
    +import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.6074a838.js";const i={},r=s("h1",{id:"about-this-document",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#about-this-document","aria-hidden":"true"},"#"),a(" About this Document")],-1),d=a("This document is powered by "),h={href:"https://v2.vuepress.vuejs.org/en",target:"_blank",rel:"noopener noreferrer"},b=a("VuePress"),T=a("."),u=s("h2",{id:"license",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#license","aria-hidden":"true"},"#"),a(" License")],-1),I={href:"https://github.com/fankes/YukiHookAPI/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"},E=a("The MIT License (MIT)"),O=p(`
    MIT License
     
    -Copyright (C) 2019-2022 HighCapable
    +Copyright (C) 2019-2023 HighCapable
     
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
    @@ -19,4 +19,4 @@ import{_ as o,r as t,o as l,c,b as s,d as e,e as a,a as p}from"./app.99fcdd51.js
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     SOFTWARE.
    -

    Copyright \xA9 2019-2022 HighCapable

    `,2);function N(R,_){const n=t("ExternalLinkIcon");return l(),c("div",null,[r,s("blockquote",null,[s("p",null,[d,s("a",h,[b,e(n)]),T])]),u,s("p",null,[s("a",I,[E,e(n)])]),O])}const A=o(i,[["render",N],["__file","about.html.vue"]]);export{A as default}; +

    Copyright \xA9 2019-2023 HighCapable

    `,2);function N(R,_){const n=t("ExternalLinkIcon");return l(),c("div",null,[r,s("blockquote",null,[s("p",null,[d,s("a",h,[b,e(n)]),T])]),u,s("p",null,[s("a",I,[E,e(n)])]),O])}const A=o(i,[["render",N],["__file","about.html.vue"]]);export{A as default}; diff --git a/docs/assets/about.html.c0115524.js b/docs/assets/about.html.4de66a22.js similarity index 70% rename from docs/assets/about.html.c0115524.js rename to docs/assets/about.html.4de66a22.js index 5af4a7e55..78a2befac 100644 --- a/docs/assets/about.html.c0115524.js +++ b/docs/assets/about.html.4de66a22.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-41967128","path":"/zh-cn/about/about.html","title":"\u5173\u4E8E\u6B64\u6587\u6863","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/about/about.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-41967128","path":"/zh-cn/about/about.html","title":"\u5173\u4E8E\u6B64\u6587\u6863","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{"updatedTime":1673548269000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/about/about.md"}');export{e as data}; diff --git a/docs/assets/about.html.7638d3a2.js b/docs/assets/about.html.bac55135.js similarity index 68% rename from docs/assets/about.html.7638d3a2.js rename to docs/assets/about.html.bac55135.js index f8aac98ed..b61a348af 100644 --- a/docs/assets/about.html.7638d3a2.js +++ b/docs/assets/about.html.bac55135.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7a15fe3b","path":"/en/about/about.html","title":"About this Document","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{"updatedTime":1664281711000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/about/about.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7a15fe3b","path":"/en/about/about.html","title":"About this Document","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"License","slug":"license","link":"#license","children":[]}],"git":{"updatedTime":1673548269000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/about/about.md"}');export{e as data}; diff --git a/docs/assets/api-example.html.7a4a6adf.js b/docs/assets/api-example.html.2e9017b9.js similarity index 99% rename from docs/assets/api-example.html.7a4a6adf.js rename to docs/assets/api-example.html.2e9017b9.js index 5fe715628..a37ea2d73 100644 --- a/docs/assets/api-example.html.7a4a6adf.js +++ b/docs/assets/api-example.html.2e9017b9.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,a as e}from"./app.99fcdd51.js";const o={},l=e(`

    API Basic Configs

    The basic configuration method of YukiHookAPI is introduced here.

    Function Configs

    Either Use as Xposed Module Configs or Use as Hook API Configs, you can specify YukiHookAPI for configuration.

    configs Method

    fun configs(initiate: Configs.() -> Unit)
    +import{_ as s,o as n,c as a,a as e}from"./app.6074a838.js";const o={},l=e(`

    API Basic Configs

    The basic configuration method of YukiHookAPI is introduced here.

    Function Configs

    Either Use as Xposed Module Configs or Use as Hook API Configs, you can specify YukiHookAPI for configuration.

    configs Method

    fun configs(initiate: Configs.() -> Unit)
     

    The configs method implements a lambda method body on the Configs class, which you can easily call for configuration.

    Tips

    For more functions, please refer to the YukiHookAPI.configs method.

    Hooker Configs

    The most important part of an Xposed Module or Hook API is the creation and use of Hooker. YukiHookAPI provides two ways to use it.

    Created by lambda

    This solution is the simplest. If your module has few functions and a small amount of code, and does not need to be classified, it is recommended to create it in this way.

    encase Method

    fun encase(initiate: PackageParam.() -> Unit)
     

    The encase method is the beginning of all Hook life. In a Module App or a Hook process, the encase method can only be used once to create a Hooker.

    PackageParam is an important instance object of the Host App, and PackageParam is used to implement all Hook operations on the current Hook object.

    Tips

    For more functions, please refer to PackageParam.

    The encase method can be created in the onHook method using two schemes.

    Sample Code 1

    YukiHookAPI.encase {
         loadApp(name = "com.example.demo") {
    diff --git a/docs/assets/api-example.html.0f0dfccf.js b/docs/assets/api-example.html.c9be3945.js
    similarity index 99%
    rename from docs/assets/api-example.html.0f0dfccf.js
    rename to docs/assets/api-example.html.c9be3945.js
    index d1be1d8d2..49eb99618 100644
    --- a/docs/assets/api-example.html.0f0dfccf.js
    +++ b/docs/assets/api-example.html.c9be3945.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const o={},e=l(`

    API \u57FA\u672C\u914D\u7F6E

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u914D\u7F6E\u65B9\u6CD5\u3002

    \u529F\u80FD\u914D\u7F6E

    \u65E0\u8BBA\u662F \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u8FD8\u662F \u4F5C\u4E3A Hook API \u4F7F\u7528\uFF0C\u4F60\u90FD\u53EF\u4EE5\u5728 API \u88C5\u8F7D\u4E4B\u524D\u6216\u88C5\u8F7D\u8FC7\u7A0B\u4E2D\u5BF9 YukiHookAPI \u8FDB\u884C\u914D\u7F6E\u3002

    configs \u65B9\u6CD5

    fun configs(initiate: Configs.() -> Unit)
    +import{_ as s,o as n,c as a,a as l}from"./app.6074a838.js";const o={},e=l(`

    API \u57FA\u672C\u914D\u7F6E

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u914D\u7F6E\u65B9\u6CD5\u3002

    \u529F\u80FD\u914D\u7F6E

    \u65E0\u8BBA\u662F \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u8FD8\u662F \u4F5C\u4E3A Hook API \u4F7F\u7528\uFF0C\u4F60\u90FD\u53EF\u4EE5\u5728 API \u88C5\u8F7D\u4E4B\u524D\u6216\u88C5\u8F7D\u8FC7\u7A0B\u4E2D\u5BF9 YukiHookAPI \u8FDB\u884C\u914D\u7F6E\u3002

    configs \u65B9\u6CD5

    fun configs(initiate: Configs.() -> Unit)
     

    configs \u65B9\u6CD5\u5BF9 Configs \u7C7B\u5B9E\u73B0\u4E86\u4E00\u4E2A lambda \u65B9\u6CD5\u4F53\uFF0C\u4F60\u53EF\u4EE5\u8F7B\u677E\u5730\u8C03\u7528\u5B83\u8FDB\u884C\u914D\u7F6E\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookAPI.configs \u65B9\u6CD5\u3002

    Hooker \u914D\u7F6E

    \u4E00\u4E2A Xposed \u6A21\u5757\u6216 Hook API \u6700\u91CD\u8981\u7684\u5730\u65B9\u5C31\u662F Hooker \u7684\u521B\u5EFA\u4E0E\u4F7F\u7528\uFF0CYukiHookAPI \u63D0\u4F9B\u4E86\u4E24\u79CD\u4F7F\u7528\u65B9\u6CD5\u3002

    \u901A\u8FC7 lambda \u521B\u5EFA

    \u8FD9\u79CD\u65B9\u6848\u662F\u6700\u7B80\u5355\u7684\uFF0C\u5982\u679C\u4F60\u7684\u6A21\u5757\u529F\u80FD\u4E0D\u591A\uFF0C\u4EE3\u7801\u6570\u91CF\u4E0D\u5927\uFF0C\u4E0D\u9700\u8981\u8FDB\u884C\u5206\u7C7B\u5904\u7406\uFF0C\u63A8\u8350\u4F7F\u7528\u8FD9\u79CD\u65B9\u5F0F\u8FDB\u884C\u521B\u5EFA\u3002

    encase \u65B9\u6CD5

    fun encase(initiate: PackageParam.() -> Unit)
     

    encase \u65B9\u6CD5\u662F Hook \u4E00\u5207\u751F\u547D\u7684\u5F00\u59CB\uFF0C\u5728\u4E00\u4E2A\u6A21\u5757\u6216\u4E00\u4E2A Hook \u8FC7\u7A0B\u4E2D\uFF0Cencase \u65B9\u6CD5\u53EA\u80FD\u4F5C\u7528\u4E00\u6B21\uFF0C\u7528\u4E8E\u521B\u5EFA Hooker\u3002

    PackageParam \u4E3A\u5BBF\u4E3B(\u76EE\u6807 APP)\u7684\u91CD\u8981\u5B9E\u4F8B\u5BF9\u8C61\uFF0C\u901A\u8FC7 PackageParam \u6765\u5B9E\u73B0\u5BF9\u5F53\u524D Hook \u4F5C\u7528\u5BF9\u8C61\u7684\u5168\u90E8 Hook \u64CD\u4F5C\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 PackageParam\u3002

    encase \u65B9\u6CD5\u53EF\u4EE5\u5728 onHook \u65B9\u6CD5\u4E2D\u4F7F\u7528\u4E24\u79CD\u65B9\u6848\u521B\u5EFA\u3002

    \u793A\u4F8B\u4EE3\u7801 1

    YukiHookAPI.encase {
         loadApp(name = "com.example.demo") {
    diff --git a/docs/assets/api-exception.html.7f0c42da.js b/docs/assets/api-exception.html.67d95ae2.js
    similarity index 71%
    rename from docs/assets/api-exception.html.7f0c42da.js
    rename to docs/assets/api-exception.html.67d95ae2.js
    index add44ebc7..1b41824da 100644
    --- a/docs/assets/api-exception.html.7f0c42da.js
    +++ b/docs/assets/api-exception.html.67d95ae2.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-72c12b7d","path":"/en/config/api-exception.html","title":"API Exception Handling","lang":"en-US","frontmatter":{"pageClass":"hidden-anchor-page"},"excerpt":"","headers":[{"level":2,"title":"Non-Blocking Exceptions","slug":"non-blocking-exceptions","link":"#non-blocking-exceptions","children":[]},{"level":2,"title":"Blocking Exceptions","slug":"blocking-exceptions","link":"#blocking-exceptions","children":[]}],"git":{"updatedTime":1664837213000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/config/api-exception.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-72c12b7d","path":"/en/config/api-exception.html","title":"API Exception Handling","lang":"en-US","frontmatter":{"pageClass":"hidden-anchor-page"},"excerpt":"","headers":[{"level":2,"title":"Non-Blocking Exceptions","slug":"non-blocking-exceptions","link":"#non-blocking-exceptions","children":[]},{"level":2,"title":"Blocking Exceptions","slug":"blocking-exceptions","link":"#blocking-exceptions","children":[]}],"git":{"updatedTime":1673551073000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":15}]},"filePathRelative":"en/config/api-exception.md"}');export{e as data};
    diff --git a/docs/assets/api-exception.html.f33af1c3.js b/docs/assets/api-exception.html.7a8cad47.js
    similarity index 66%
    rename from docs/assets/api-exception.html.f33af1c3.js
    rename to docs/assets/api-exception.html.7a8cad47.js
    index 54e880bab..e853ae5e8 100644
    --- a/docs/assets/api-exception.html.f33af1c3.js
    +++ b/docs/assets/api-exception.html.7a8cad47.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-5b43296c","path":"/zh-cn/config/api-exception.html","title":"API \u5F02\u5E38\u5904\u7406","lang":"zh-CN","frontmatter":{"pageClass":"hidden-anchor-page"},"excerpt":"","headers":[{"level":2,"title":"\u975E\u963B\u65AD\u5F02\u5E38","slug":"\u975E\u963B\u65AD\u5F02\u5E38","link":"#\u975E\u963B\u65AD\u5F02\u5E38","children":[]},{"level":2,"title":"\u963B\u65AD\u5F02\u5E38","slug":"\u963B\u65AD\u5F02\u5E38","link":"#\u963B\u65AD\u5F02\u5E38","children":[]}],"git":{"updatedTime":1664837213000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":8}]},"filePathRelative":"zh-cn/config/api-exception.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-5b43296c","path":"/zh-cn/config/api-exception.html","title":"API \u5F02\u5E38\u5904\u7406","lang":"zh-CN","frontmatter":{"pageClass":"hidden-anchor-page"},"excerpt":"","headers":[{"level":2,"title":"\u975E\u963B\u65AD\u5F02\u5E38","slug":"\u975E\u963B\u65AD\u5F02\u5E38","link":"#\u975E\u963B\u65AD\u5F02\u5E38","children":[]},{"level":2,"title":"\u963B\u65AD\u5F02\u5E38","slug":"\u963B\u65AD\u5F02\u5E38","link":"#\u963B\u65AD\u5F02\u5E38","children":[]}],"git":{"updatedTime":1673551073000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":19}]},"filePathRelative":"zh-cn/config/api-exception.md"}');export{e as data};
    diff --git a/docs/assets/api-exception.html.cd46328b.js b/docs/assets/api-exception.html.84af4512.js
    similarity index 74%
    rename from docs/assets/api-exception.html.cd46328b.js
    rename to docs/assets/api-exception.html.84af4512.js
    index 20e0ea083..3a9f3c2d1 100644
    --- a/docs/assets/api-exception.html.cd46328b.js
    +++ b/docs/assets/api-exception.html.84af4512.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    API Exception Handling

    Exceptions are the main problems often encountered in the development process. Here are some common exceptions that may be encountered during the use of YukiHookAPI and how to deal with them.

    The exception description here will only synchronize the latest API version, and the exception of the older API version will not be described again, please always keep the API version up-to-date.

    Non-Blocking Exceptions

    These exceptions will not cause the app to stop running (FC), but will print E level logs on the console, and may also stop continuing to execute related functions.

    exception

    loggerE

    Could not found XposedBridge in current space! Aborted

    Abnormal

    Your Hook Framework is not working or XposedBridge has not been successfully loaded.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    Abnormal

    You try to load the encase method in the onInit or onXposedEvent method of the Hook entry class that implements IYukiHookXposedInit.

    The following example

    class HookEntry : IYukiHookXposedInit {
    +import{_ as e,o as s,c as n,a}from"./app.6074a838.js";const o={},l=a(`

    API Exception Handling

    Exceptions are the main problems often encountered in the development process. Here are some common exceptions that may be encountered during the use of YukiHookAPI and how to deal with them.

    The exception description here will only synchronize the latest API version, and the exception of the older API version will not be described again, please always keep the API version up-to-date.

    Non-Blocking Exceptions

    These exceptions will not cause the app to stop running (FC), but will print E level logs on the console, and may also stop continuing to execute related functions.

    exception

    loggerE

    Could not found any available Hook APIs in current environment! Aborted

    Abnormal

    Your Hook Framework is not working or did not successfully load the current Hook API.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    Abnormal

    You try to load the encase method in the onInit or onXposedEvent method of the Hook entry class that implements IYukiHookXposedInit.

    The following example

    class HookEntry : IYukiHookXposedInit {
     
         override fun onInit() {
             // \u2757 Wrong usage
    @@ -34,7 +34,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    } } } -

    exception

    loggerE

    Hooking Process exception occurred

    Abnormal

    YukiHookAPI throws an exception during its own initialization hook.

    Solution

    Usually, this kind of error does not happen easily. If this error occurs, you can directly submit the log for feedback.

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    Abnormal

    YukiHookAPI encountered an unhandled exception or the entry class could not be found when trying to load the hook entry class onInit or onHook method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    YukiHookAPI bind initZygote failed

    Abnormal

    YukiHookAPI encountered an unhandled exception when trying to load the Xposed native interface initZygote method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    Abnormal

    YukiHookAPI An error occurred while trying to do a Resources Hook.

    Solution

    Please double check the error log for details.

    If a Resources$NotFoundException occurs, you may be looking for an incorrect Resources Id.

    If ClassNotFound or NoClassDefFoundError occurs, it may be that Hook Framework does not support Resources Hook.

    exception

    loggerE

    HookClass [NAME] not found

    Abnormal

    The Class currently being hooked was not found.

    Solution

    Please check if the target Class exists, to ignore this error use the ignoredHookClassNotFoundFailure method.

    exception

    loggerE

    Hook Member [NAME] failed

    Abnormal

    An error occurred while hooking the target method, constructor.

    Solution

    This problem is usually caused by Hook Framework.

    Please check the corresponding log content.

    If the problem persists, please bring detailed logs for feedback.

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class have been set.

    Solution

    Please check the previous error log before this error occurs, maybe there is an error that the method and constructor cannot be found when searching for methods and constructors.

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class are not set.

    The following example

    injectMember {
    +
    exception

    loggerE

    An exception occurred in the Hooking Process of YukiHookAPI

    Abnormal

    YukiHookAPI exception occurred while loading Xposed entry method.

    Solution

    This is an exception summary.

    If any exception occurs in your current Hook Process (Hook Process crashes), it will be printed to the console using this method.

    Please trace the stack where the exception occurred to locate your code problem.

    exception

    loggerE

    An exception occurred when hooking internal function

    Abnormal

    YukiHookAPI throws an exception during its own initialization hook.

    Solution

    Usually, this kind of error does not happen easily. If this error occurs, you can directly submit the log for feedback.

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    Abnormal

    YukiHookAPI encountered an unhandled exception or the entry class could not be found when trying to load the hook entry class onInit or onHook method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    An exception occurred when YukiHookAPI loading Xposed Module

    Abnormal

    YukiHookAPI encountered an unhandled exception when trying to load a Xposed Module using the Xposed native interface.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    Abnormal

    YukiHookAPI An error occurred while trying to do a Resources Hook.

    Solution

    Please double check the error log for details.

    If a Resources$NotFoundException occurs, you may be looking for an incorrect Resources Id.

    If ClassNotFound or NoClassDefFoundError occurs, it may be that Hook Framework does not support Resources Hook.

    exception

    loggerE

    HookClass [NAME] not found

    Abnormal

    The Class currently being hooked was not found.

    Solution

    Please check if the target Class exists, to ignore this error use the ignoredHookClassNotFoundFailure method.

    exception

    loggerE

    Hook Member [NAME] failed

    Abnormal

    An error occurred while hooking the target method, constructor.

    Solution

    This problem is usually caused by Hook Framework.

    Please check the corresponding log content.

    If the problem persists, please bring detailed logs for feedback.

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class have been set.

    Solution

    Please check the previous error log before this error occurs, maybe there is an error that the method and constructor cannot be found when searching for methods and constructors.

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class are not set.

    The following example

    injectMember {
         // There are no search conditions for methods and constructors that require hooks
         afterHook {
             // ...
    @@ -49,7 +49,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... } } -

    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    Abnormal

    HookParam.result is set in the Hook callback method body or replaceHook is used but the return value type of the hooked method does not match the original return value type.

    The following example

    Suppose this is the method being Hooked.

    private boolean test()
    +
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    Abnormal

    HookParam.result is set in the Hook callback method body or replaceHook is used but the return value type of the hooked method does not match the original return value type.

    The following example

    Suppose this is the method being Hooked.

    private boolean test()
     

    Below is an error case.

    injectMember {
         method {
             name = "test"
    @@ -66,7 +66,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // <Scenario 3> Use the wrong type directly, the original type is Boolean replaceTo(any = 0) } -

    Notice

    If the above scenario occurs in beforeHook or afterHook, it will cause the Host App to throw an exception from XposedBridge (which will expose the fact of being Hooked).

    Solution

    Please confirm the correct return value type of the current Hook method, modify it and try again.

    exception

    loggerE

    Hook initialization failed because got an Exception

    Abnormal

    An arbitrary exception occurred while preparing the Hook.

    Solution

    This is a reminder that an exception occurred during the Hook preparation stage, please carefully check what the specific exception is to re-determine the problem.

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    Abnormal

    An arbitrary exception occurred at the start of the Hook.

    Solution

    This is a reminder that an exception occurred at the beginning of the Hook, please check carefully what the specific exception is to re-determine the problem.

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    Abnormal

    A disallowed parameter type was set when looking up methods, constructors, and variables.

    The following example

    // Find a method
    +

    Notice

    If the above scenario occurs in beforeHook or afterHook, it will cause the Host App to throw an exception from XposedBridge (which will expose the fact of being Hooked).

    Solution

    Please confirm the correct return value type of the current Hook method, modify it and try again.

    exception

    loggerE

    Hook initialization failed because got an Exception

    Abnormal

    An arbitrary exception occurred while preparing the Hook.

    Solution

    This is a reminder that an exception occurred during the Hook preparation stage, please carefully check what the specific exception is to re-determine the problem.

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    Abnormal

    An arbitrary exception occurred at the start of the Hook.

    Solution

    This is a reminder that an exception occurred at the beginning of the Hook, please check carefully what the specific exception is to re-determine the problem.

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    Abnormal

    A disallowed parameter type was set when looking up methods, constructors, and variables.

    The following example

    // Find a method
     method {
         // \u2757 Invalid type example is set
         param(false, 1, 0)
    @@ -94,40 +94,40 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // \u2705 Examples of correct usage type = BooleanType } -

    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    Abnormal

    The target method, constructor, and variable were not found when looking for methods, constructors, and variables.

    Solution

    Please confirm that your search criteria can correctly match the specified methods, constructors and variables in the target Class.

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    Abnormal

    When using RemedyPlan to search for methods, constructors, and variables, the methods, constructors, and variables are still not found.

    Solution

    Please confirm the RemedyPlan parameter you set and the Class that exists in the Host App, and try again.

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    Abnormal

    No conditions are set when looking for methods, constructors, and variables.

    The following example

    method {
    +
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    Abnormal

    The target method, constructor, and variable were not found when looking for methods, constructors, and variables.

    Solution

    Please confirm that your search criteria can correctly match the specified methods, constructors and variables in the target Class.

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    Abnormal

    When using RemedyPlan to search for methods, constructors, and variables, the methods, constructors, and variables are still not found.

    Solution

    Please confirm the RemedyPlan parameter you set and the Class that exists in the Host App, and try again.

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    Abnormal

    No conditions are set when looking for methods, constructors, and variables.

    The following example

    method {
         // No conditions are set here
     }
    -

    Solution

    Please complete your search criteria and try again.

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object to be searched for was not found via ClassLoader.searchClass or PackageParam.searchClass.

    The following example

    customClassLoader?.searchClass {
    +

    Solution

    Please complete your search criteria and try again.

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object to be searched for was not found via ClassLoader.searchClass or PackageParam.searchClass.

    The following example

    customClassLoader?.searchClass {
         from(...)
         // ...
     }.get()
    -

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the Class and bytecode object characteristics in the Dex and try again.

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The methods, constructors, and variables that need to be found cannot be found by specifying conditions.

    The following example

    TargetClass.method {
    +

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the Class and bytecode object characteristics in the Dex and try again.

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The methods, constructors, and variables that need to be found cannot be found by specifying conditions.

    The following example

    TargetClass.method {
         name = "test"
         param(BooleanType)
     }
    -

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the bytecode object characteristics in the Class, and try again.

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    Abnormal

    Incorrect use of VagueType in Method, Constructor lookup conditions.

    The following example

    TargetClass.method {
    +

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the bytecode object characteristics in the Class, and try again.

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    Abnormal

    Incorrect use of VagueType in Method, Constructor lookup conditions.

    The following example

    TargetClass.method {
         name = "test"
         // <Scenario 1>
         param(VagueType)
         // <Scenario 2>
         param(VagueType, VagueType ...)
     }
    -

    Solution

    VagueType cannot be completely filled in method and constructor parameters. If there is such a requirement, please use paramCount.

    exception

    loggerE

    Field match type class is not found

    Abnormal

    An instance of Class for type was not found in the lookup criteria set when looking up the variable.

    The following example

    field {
    +

    Solution

    VagueType cannot be completely filled in method and constructor parameters. If there is such a requirement, please use paramCount.

    exception

    loggerE

    Field match type class is not found

    Abnormal

    An instance of Class for type was not found in the lookup criteria set when looking up the variable.

    The following example

    field {
         name = "test"
         // Assume that the Class of the type set here does not exist
         type = "com.example.TestClass"
     }
    -

    Solution

    Please check if Class of type in the lookup condition exists and try again.

    exception

    loggerE

    Method match returnType class is not found

    Abnormal

    An instance of Class of returnType was not found in the search criteria set when looking up the method.

    The following example

    method {
    +

    Solution

    Please check if Class of type in the lookup condition exists and try again.

    exception

    loggerE

    Method match returnType class is not found

    Abnormal

    An instance of Class of returnType was not found in the search criteria set when looking up the method.

    The following example

    method {
         name = "test"
         // Assume that the Class of returnType set here does not exist
         returnType = "com.example.TestClass"
     }
    -

    Solution

    Please check if Class of returnType in the lookup condition exists and try again.

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    Abnormal

    The Class instance subscripted by the index number of param was not found in the search conditions set when searching for methods and constructors.

    method {
    +

    Solution

    Please check if Class of returnType in the lookup condition exists and try again.

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    Abnormal

    The Class instance subscripted by the index number of param was not found in the search conditions set when searching for methods and constructors.

    method {
         name = "test"
         // Assume that the Class with subscript "No.1" set here does not exist
    -    param(StringType, "com.example.TestClass", BooleanType)
    +    param(StringClass, "com.example.TestClass", BooleanType)
     }
    -

    Solution

    Please check if the Class subscripted by the index number of param in the lookup condition exists and try again.

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    Abnormal

    No conditions were set when looking for Resources.

    The following example

    // Case 1
    +

    Solution

    Please check if the Class subscripted by the index number of param in the lookup condition exists and try again.

    exception

    loggerE

    Invoke original Member [MEMBER] failed

    Abnormal

    An error occurred when using HookParam.callOriginal, HookParam.invokeOriginal, method { ... }.get(...).original() to call the original method without Hook.

    Solution

    Under normal circumstances, this error will basically not occur.

    If this error occurs, it may be a problem with the currently used Hook Framework.

    After troubleshooting your own code problems, please provide detailed logs for feedback.

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    Abnormal

    No conditions were set when looking for Resources.

    The following example

    // Case 1
     conditions {
         // No conditions are set here
     }
    @@ -136,13 +136,13 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    name = "test" // The type condition is missing here } -

    Solution

    The Hook of Resources is not a Hook similar to a method.

    It must have a complete name and type description in order to find it successfully.

    Please complete the search conditions and try again.

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    Abnormal

    An exception of the wrong type occurred while Hooking Resources.

    Solution

    YukiHookAPI will try to load Resources Hook in initZygote and handleInitPackageResources.

    If all loading fails, this exception may occur.

    The current Hook Framework needs to support and enable the Resources Hook function, please check and try again.

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    Abnormal

    An arbitrary exception occurred while Hooking Resources.

    Solution

    This is a summary of exceptions, please check down the log for the specific exception, such as the problem that the Resources Id cannot be found.

    exception

    loggerE

    Received action "ACTION" failed

    Abnormal

    Callback broadcast event exception when using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error basically does not occur.

    Once an error occurs, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    Abnormal

    Sending a broadcast when using YukiHookDataChannel got an empty context instance.

    Solution

    Under normal circumstances, this error basically does not occur.

    In the latest version, the problems that may occur when the host is used have been fixed.

    If the latest version still has errors, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    Abnormal

    An exception occurred when injecting Module App's Resources using injectModuleAppResources in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur. After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Please check the next error log after this error occurs.

    Maybe some problems may have occurred in the configuration parameters.

    If you cannot find the description of the relevant error log, after eliminating the problem of your own code, please bring the detailed log for feedback.

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur, but according to the difference of the system version, no detailed testing has been done.

    After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    Abnormal

    Invalid parameters were filled in when injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    The following example

    // \u2757 The content filled in here is just an example
    +

    Solution

    The Hook of Resources is not a Hook similar to a method.

    It must have a complete name and type description in order to find it successfully.

    Please complete the search conditions and try again.

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    Abnormal

    An exception of the wrong type occurred while Hooking Resources.

    Solution

    YukiHookAPI will try to load Resources Hook in initZygote and handleInitPackageResources.

    If all loading fails, this exception may occur.

    The current Hook Framework needs to support and enable the Resources Hook function, please check and try again.

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    Abnormal

    An arbitrary exception occurred while Hooking Resources.

    Solution

    This is a summary of exceptions, please check down the log for the specific exception, such as the problem that the Resources Id cannot be found.

    exception

    loggerE

    Received action "ACTION" failed

    Abnormal

    Callback broadcast event exception when using YukiHookDataChannel.

    Solution

    This exception is mostly caused by some related exceptions.

    Please check whether there is any problem in your own code.

    After troubleshooting your own code, please bring detailed logs to give feedback.

    exception

    loggerE

    Received data type TYPE is not a vailed YukiHookDataChannel's data

    Abnormal

    When using YukiHookDataChannel, the callback broadcast received data that does not belong to YukiHookDataChannel.

    Solution

    In order to ensure data security, YukiHookDataChannel will wrap the sent data, any third-party broadcast events cannot be received by YukiHookDataChannel, please check whether your code is correct.

    exception

    loggerE

    Unsupported segments data key of "KEY"'s type

    Abnormal

    Callback broadcast received unsupported segments data type when using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error cannot occur, because the segments data type supported by YukiHookDataChannel is fixed and will not change dynamically.

    If this happens, please check whether the API-related code has been changed.

    exception

    loggerE

    YukiHookDataChannel cannot merge this segments data key of "KEY"

    Abnormal

    When using YukiHookDataChannel, the callback broadcast received segments data that could not be processed, so the segments data could not be merged.

    Solution

    Under normal circumstances, this error will basically not occur, unless you receive broadcasts that are continuously sent or repeatedly sent (timing exceptions) or you set the wrong generic type when receiving data, after troubleshooting your own code problems, please bring detailed logs give feedback.

    exception

    loggerE

    YukiHookDataChannel cannot calculate the byte size of the data key of "KEY" to be sent, so this data cannot be sent

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    Abnormal

    Failed to calculate data size when sending broadcast data using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error will basically not occur.

    After troubleshooting your own code problems, please bring detailed logs for feedback.

    exception

    loggerE

    YukiHookDataChannel cannot send this data key of "KEY" type TYPE, because it is too large (total TOTAL KB, limit LIMIT KB) and cannot be segmented

    SUGGESTION_MESSAGE

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    Abnormal

    When using YukiHookDataChannel to send broadcast data, the data is too large, but this data type does not support being sent in segments.

    Solution

    When the data you send exceeds the upper limit of the system broadcast, YukiHookDataChannel will send the data in segments by default, but only supports processing List, Map, Set, String automatic segmentation function for common types.

    Tips

    If you still want to use this feature, please refer to YukiHookDataChannel.NameSpace.allowSendTooLargeData method.

    But it is strongly recommended not to do this, this may cause the system to not allow too large data to be sent and cause the app crash.

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    Abnormal

    Sending a broadcast when using YukiHookDataChannel got an empty context instance.

    Solution

    Under normal circumstances, this error basically does not occur.

    In the latest version, the problems that may occur when the host is used have been fixed.

    If the latest version still has errors, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    Abnormal

    An exception occurred when injecting Module App's Resources using injectModuleAppResources in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur. After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    You cannot inject module resources into yourself

    Abnormal

    Use injectModuleAppResources in the (Xposed) Host environment (the Module App's own Xposed Environment) to inject the Module App's own resources into itself.

    Solution

    Since the Module App itself can also be Hooked by itself, you cannot inject yourself into the Module App itself (you cannot recurse its own resources).

    If you must obtain the resources of the Module App itself, please use it directly without any other operations.

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Please check the next error log after this error occurs.

    Maybe some problems may have occurred in the configuration parameters.

    If you cannot find the description of the relevant error log, after eliminating the problem of your own code, please bring the detailed log for feedback.

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur, but according to the difference of the system version, no detailed testing has been done.

    After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    Abnormal

    Invalid parameters were filled in when injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    The following example

    // \u2757 The content filled in here is just an example
     // And the proxy is filled with invalid parameters that cannot be understood
     registerModuleAppActivities(proxy = false)
    -

    Solution

    The proxy parameter in the method only accepts String, CharSequence, Class types, please refer to the related usage method to fill in the method parameters correctly.

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    Abnormal

    When injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment, the Host App's launching Activity cannot be found.

    The following example

    // Register directly with default parameters
    +

    Solution

    The proxy parameter in the method only accepts String, CharSequence, Class types, please refer to the related usage method to fill in the method parameters correctly.

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    Abnormal

    When injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment, the Host App's launching Activity cannot be found.

    The following example

    // Register directly with default parameters
     registerModuleAppActivities()
    -

    Solution

    The default parameter (no parameter) can only be used for the app that can be launched.

    If the app does not declare the startup entry Activity, you need to manually specify the proxy parameter of the method.

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    Abnormal

    When injecting Module App's Activity with registerModuleAppActivities in a (Xposed) Host environment, the Activity filled with the parameter proxy cannot be found.

    The following example

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    -

    Solution

    Please make sure that the Activity name you fill in really and effectively exists in the Host App, and the target Class extends Activity.

    Blocking Exceptions

    These exceptions will directly cause the app to stop running (FC), at the same time print E level logs on the console, and also cause the Hook process to "die".

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    Abnormal

    You have invoked the Class object of the API itself using YukiHookAPI related reflection or Hook function.

    The following example

    // <Scenario 1>
    +

    Solution

    The default parameter (no parameter) can only be used for the app that can be launched.

    If the app does not declare the startup entry Activity, you need to manually specify the proxy parameter of the method.

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    Abnormal

    When injecting Module App's Activity with registerModuleAppActivities in a (Xposed) Host environment, the Activity filled with the parameter proxy cannot be found.

    The following example

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    +

    Solution

    Please make sure that the Activity name you fill in really and effectively exists in the Host App, and the target Class extends Activity.

    exception

    loggerE

    You cannot register Activity Proxy into yourself

    Abnormal

    Use registerModuleAppActivities to inject the Module App's own Activity into itself in the (Xposed) Host environment (the Module App's own Xposed Environment).

    Solution

    Since the Module App itself can also be Hooked by itself, you cannot inject yourself into the Module App itself (you cannot recurse its own resources).

    If you must obtain the resources of the Module App itself, please use it directly without any other operations.

    exception

    loggerE

    Activity Proxy only support for Android 7.0 (API 24) or higher

    Abnormal

    Use registerModuleAppActivities in the (Xposed) Host environment but the current system version does not meet the minimum requirements of Android 7.0 (API 24).

    Solution

    Activity Proxy only supports systems higher than or equal to Android 7.0 (API 24).

    Please try to upgrade your system or make requirements for the minimum api version compatibility of the Module App, for example, set the minimum api to 24.

    exception

    loggerE

    An exception occurred during AppLifecycle event

    Abnormal

    Use onAppLifecycle in the (Xposed) Host environment to listen for exceptions during the Host App's lifecycle.

    Solution

    This exception is thrown in onAppLifecycle.

    Since you set the parameter isOnFailureThrowToApp = false, the exception is not thrown in the Host App but printed in the (Xposed) Host environment.

    This is not an API exception, please be careful check your own code for problems.

    Blocking Exceptions

    These exceptions will directly cause the app to stop running (FC), at the same time print E level logs on the console, and also cause the Hook process to "die".

    exception

    IllegalStateException

    YukiHookAPI cannot support current Hook API or cannot find any available Hook APIs in current environment

    Abnormal

    YukiHookAPI does not support the Hook API used by the current environment or there is no Hook API that can be called.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    Abnormal

    You have invoked the Class object of the API itself using YukiHookAPI related reflection or Hook function.

    The following example

    // <Scenario 1>
     YukiHookAPI.current()
     // <Scenario 2>
     PackageParam::class.java.hook {
    @@ -151,7 +151,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // <Scenario 3> MethodFinder::class.java.method { name = "name" - param(StringType) + param(StringClass) }.get().call("name") // ...

    Solution

    Please check the code section for errors, such as the case below.

    The following example

    YourClass.method {
    @@ -163,7 +163,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... // \u2705 The correct way to use it, assuming this method has no parameters }.get(instance).call().current() -

    Inlining, reflection, Hook YukiHookAPI's own Class and internal functions are not allowed to prevent errors.

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    Abnormal

    You tried to hook a Class object in the list of dangerous behaviors, such as Class, ClassLoader, Method.

    The following example

    // <Scenario 1>
    +

    Inlining, reflection, Hook YukiHookAPI's own Class and internal functions are not allowed to prevent errors.

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    Abnormal

    You tried to hook a Class object in the list of dangerous behaviors, such as Class, ClassLoader, Method.

    The following example

    // <Scenario 1>
     JavaClassLoader.hook {
         // ...
     }
    @@ -176,18 +176,18 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... } // ... -

    Solution

    These functions are internal to the system, they should not be hooked, may not be supported on some Hook Frameworks, and may cause other errors, please try to replace the hook point.

    Tips

    If you still want to use this feature, please refer to YukiMemberHookCreator.useDangerousOperation.

    But It is strongly recommended not to do this, please do not report any problems, all the consequences will be borne by yourself.

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object you were looking for was not found via String.toClass(...) or classOf<...>().

    The following example

    "com.demo.Test".toClass()
    -

    Solution

    Please check if the Class matched by the current string or entity exists in the current ClassLoader and try again.

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    Abnormal

    Use ClassLoader.searchClass or PackageParam.searchClass to find Class but currently ClassLoader does not extends BaseDexClassLoader.

    Solution

    This situation basically does not exist, unless the current app references a Non-ART platform executable (which not realistic) or the current ClassLoader is null.

    exception

    IllegalStateException

    Failed to got SystemContext

    Abnormal

    systemContext was called in the Host App but the instance object was not successfully obtained.

    The following example

    encase {
    +

    Solution

    These functions are internal to the system, they should not be hooked, may not be supported on some Hook Frameworks, and may cause other errors, please try to replace the hook point.

    Tips

    If you still want to use this feature, please refer to YukiMemberHookCreator.useDangerousOperation method.

    But It is strongly recommended not to do this, please do not report any problems, all the consequences will be borne by yourself.

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object you were looking for was not found via String.toClass(...) or classOf<...>().

    The following example

    "com.demo.Test".toClass()
    +

    Solution

    Please check if the Class matched by the current string or entity exists in the current ClassLoader and try again.

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    Abnormal

    Use ClassLoader.searchClass or PackageParam.searchClass to find Class but currently ClassLoader does not extends BaseDexClassLoader.

    Solution

    This situation basically does not exist, unless the current app references a Non-ART platform executable (which not realistic) or the current ClassLoader is null.

    exception

    IllegalStateException

    Failed to got SystemContext

    Abnormal

    systemContext was called in the Host App but the instance object was not successfully obtained.

    The following example

    encase {
         // This variable is called
         systemContext...
     }
    -

    Solution

    This situation should not exist, since systemContext is obtained from ActivityThread through reflection, unless the system process fails, the obtained object will not be null.

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    Abnormal

    The first case

    The appContext of the ModuleApplication is called within the Hook App.

    The following example

    encase {
    +

    Solution

    This situation should not exist, since systemContext is obtained from ActivityThread through reflection, unless the system process fails, the obtained object will not be null.

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    Abnormal

    The first case

    The appContext of the ModuleApplication is called within the Hook App.

    The following example

    encase {
         // This variable is called
         ModuleApplication.appContext...
     }
     

    The second case

    appContext was called when using ModuleApplication but the app may have been destroyed or not started correctly.

    The following example

    // This variable is called but the app may have been destroyed or not started correctly
     ModuleApplication.appContext...
    -

    Solution

    The first case

    You can only use the appContext of ModuleApplication in the Module App, please use the appContext in the PackageParam in the Host App, please make sure you use it correctly.

    The second case

    This situation basically does not exist, because appContext is assigned in onCreate, unless the onCreate method of the parent class is called by reflection before multi-process concurrent startup or app is not started and completed.

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    Abnormal

    YukiHookModulePrefs is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
    +

    Solution

    The first case

    You can only use the appContext of ModuleApplication in the Module App, please use the appContext in the PackageParam in the Host App, please make sure you use it correctly.

    The second case

    This situation basically does not exist, because appContext is assigned in onCreate, unless the onCreate method of the parent class is called by reflection before multi-process concurrent startup or app is not started and completed.

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    Abnormal

    YukiHookModulePrefs is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -197,11 +197,11 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    super.attachBaseContext(base) } } -

    Solution

    You can only use YukiHookModulePrefs when Use as Xposed Module Configs, please use the native Sp storage in the Hook's own app.

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    Abnormal

    Using YukiHookModulePrefs in (Xposed) Host environment but unable to get XSharedPreferences object.

    The following example

    encase {
    +

    Solution

    You can only use YukiHookModulePrefs when Use as Xposed Module Configs, please use the native Sp storage in the Hook's own app.

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    Abnormal

    Using YukiHookModulePrefs in (Xposed) Host environment but unable to get XSharedPreferences object.

    The following example

    encase {
         // This variable is called
         prefs...
     }
    -

    Solution

    Under normal circumstances, this problem does not occur.

    If you continue to fail to obtain the XSharedPreferences object, it may be that the Hook Framework you are using does not support this function or has an error.

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    Abnormal

    YukiHookDataChannel is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
    +

    Solution

    Under normal circumstances, this problem does not occur.

    If you continue to fail to obtain the XSharedPreferences object, it may be that the Hook Framework you are using does not support this function or has an error.

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    Abnormal

    YukiHookDataChannel is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -213,7 +213,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    super.attachBaseContext(base) } } -

    Solution

    You can only use YukiHookDataChannel when Use as Xposed Module Configs.

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    Abnormal

    YukiHookDataChannel is used in a non-Activity context of a Module App.

    Solution

    You can only use YukiHookDataChannel in Activity or Fragment.

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    Abnormal

    When using YukiHookModulePrefs or YukiHookDataChannel in the Hook process, the modulePackageName at load time cannot be read, resulting in the package name of the own Module App cannot be determined.

    Solution

    Please read the help document here carefully, and configure the Module App's Hook entry class package name correctly.

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    Abnormal

    YukiHookModulePrefs is used in the Module App to store data but no Context instance is passed in.

    The following example

    class MainActivity : AppCompatActivity() {
    +

    Solution

    You can only use YukiHookDataChannel when Use as Xposed Module Configs.

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    Abnormal

    YukiHookDataChannel is used in a non-Activity context of a Module App.

    Solution

    You can only use YukiHookDataChannel in Activity or Fragment.

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    Abnormal

    When using YukiHookModulePrefs or YukiHookDataChannel in the Hook process, the modulePackageName at load time cannot be read, resulting in the package name of the own Module App cannot be determined.

    Solution

    Please read the help document here carefully, and configure the Module App's Hook entry class package name correctly.

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    Abnormal

    YukiHookModulePrefs is used in the Module App to store data but no Context instance is passed in.

    The following example

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    @@ -230,7 +230,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    modulePrefs.getBoolean("test_data") } } -

    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    Abnormal

    An unsupported storage type was passed in when using the get or put methods of YukiHookModulePrefs or the wait or put methods of YukiHookDataChannel.

    Solution

    The supported types of YukiHookModulePrefs are only String, Set<String>, Int, Float, Long, Boolean, please pass in the supported types.

    The supported types of YukiHookDataChannel are the types restricted by Intent.putExtra, please pass in the supported types.

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    Abnormal

    The variable array variable parameter that needs to be filled is missing in loadApp, loadZygote, loadSystem, withProcess.

    The following example

    // <Scenario 1>
    +
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    Abnormal

    An unsupported storage type was passed in when using the get or put methods of YukiHookModulePrefs or the wait or put methods of YukiHookDataChannel.

    Solution

    The supported types of YukiHookModulePrefs are only String, Set<String>, Int, Float, Long, Boolean, please pass in the supported types.

    The supported types of YukiHookDataChannel are the types restricted by Intent.putExtra, please pass in the supported types.

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    Abnormal

    The variable array variable parameter that needs to be filled is missing in loadApp, loadZygote, loadSystem, withProcess.

    The following example

    // <Scenario 1>
     loadApp()
     // <Scenario 2>
     loadZygote()
    @@ -238,18 +238,18 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    loadSystem() // <Scenario 4> withProcess() -

    Solution

    Please see the usage in PackageParam to use this function correctly.

    exception

    IllegalStateException

    YukiHookDataChannel cannot be used in zygote

    Abnormal

    YukiHookDataChannel is used in loadZygote.

    The following example

    loadZygote {
    +

    Solution

    Please see the usage in PackageParam to use this function correctly.

    exception

    IllegalStateException

    YukiHookDataChannel cannot be used in zygote

    Abnormal

    YukiHookDataChannel is used in loadZygote.

    The following example

    loadZygote {
         // This variable is called
         dataChannel...
     }
    -

    Solution

    YukiHookDataChannel can only be used in loadSystem, loadApp.

    exception

    IllegalStateException

    Custom Hooking Members is empty

    Abnormal

    members() is called in MemberHookCreator but the Member instance that requires the Hook is not set.

    The following example

    injectMember {
    +

    Solution

    YukiHookDataChannel can only be used in loadSystem, loadApp.

    exception

    IllegalStateException

    Custom Hooking Members is empty

    Abnormal

    members() is called in MemberHookCreator but the Member instance that requires the Hook is not set.

    The following example

    injectMember {
         // Method parameters in parentheses are left blank
         members()
         afterHook {
             // ...
         }
     }
    -

    Solution

    To use members() to set a custom Hook method, you must ensure that the Member array object in its method parameter cannot be empty.

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    Abnormal

    args().last() is called in HookParam but the target param is empty or the index in args is set to a value less than 0.

    The following example

    injectMember {
    +

    Solution

    To use members() to set a custom Hook method, you must ensure that the Member array object in its method parameter cannot be empty.

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    Abnormal

    args().last() is called in HookParam but the target param is empty or the index in args is set to a value less than 0.

    The following example

    injectMember {
         // ...
         afterHook {
             // Assume param is empty
    @@ -258,7 +258,7 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    args(index = -5)... } } -

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, and the subscript of args cannot be set to a value less than 0.

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    Abnormal

    An object that calls an instance variable or instance method in a HookParam but cannot get the current instance.

    The following example

    injectMember {
    +

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, and the subscript of args cannot be set to a value less than 0.

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    Abnormal

    An object that calls an instance variable or instance method in a HookParam but cannot get the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
    @@ -267,35 +267,35 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    instance<Any>()... } } -

    Solution

    Please confirm whether the method of your Hook is a static type.

    The static type method has no instance and cannot use this function.

    If it is not a static method, please check whether the instance has been destroyed.

    exception

    IllegalStateException

    Current hooked Member args is null

    Abnormal

    The args variable is called in HookParam, but the parameter array of the current instance method and constructor cannot be obtained.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a static type.

    The static type method has no instance and cannot use this function.

    If it is not a static method, please check whether the instance has been destroyed.

    exception

    IllegalStateException

    Current hooked Member args is null

    Abnormal

    The args variable is called in HookParam, but the parameter array of the current instance method and constructor cannot be obtained.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             args...
         }
     }
    -

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is null

    Abnormal

    Call the member variable in HookParam but cannot get the method and constructor instance of the current instance.

    The following example

    injectMember {
    +

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is null

    Abnormal

    Call the member variable in HookParam but cannot get the method and constructor instance of the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             member...
         }
     }
    -

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is not a Method

    Abnormal

    Calling the method variable in HookParam but not getting the method instance of the current instance.

    The following example

    injectMember {
    +

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is not a Method

    Abnormal

    Calling the method variable in HookParam but not getting the method instance of the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             method...
         }
     }
    -

    Solution

    Please confirm whether the method of your Hook is a constructor or a common method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    Abnormal

    A method instance for calling a constructor variable in a HookParam but not getting the current instance.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a constructor or a common method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    Abnormal

    A method instance for calling a constructor variable in a HookParam but not getting the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             constructor...
         }
     }
    -

    Solution

    Please confirm whether the method of your Hook is a common method or a constructor method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    Abnormal

    Invoking the instance method in a HookParam specifies the wrong type.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a common method or a constructor method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    Abnormal

    Invoking the instance method in a HookParam specifies the wrong type.

    The following example

    injectMember {
         // ...
         afterHook {
             // The type is cast to Activity
    @@ -303,14 +303,14 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    instance<Activity>()... } } -

    Solution

    Please confirm the correct type of the current Hook instance and refill the type in the generic.

    If you are not sure, please use Any or directly use the instance variable.

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    Abnormal

    The ArgsModifyer.set method is called in HookParam but the method parameter array for the current instance is empty.

    The following example

    injectMember {
    +

    Solution

    Please confirm the correct type of the current Hook instance and refill the type in the generic.

    If you are not sure, please use Any or directly use the instance variable.

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    Abnormal

    The ArgsModifyer.set method is called in HookParam but the method parameter array for the current instance is empty.

    The following example

    injectMember {
         // ...
         afterHook {
             // This method is called
             args(...).set(...)
         }
     }
    -

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, otherwise you cannot use this function.

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    Abnormal

    Calling the ArgsModifyer.set method in HookParam specifies an array number beyond the subscript of the method parameter.

    The following example

    injectMember {
    +

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, otherwise you cannot use this function.

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    Abnormal

    Calling the ArgsModifyer.set method in HookParam specifies an array number beyond the subscript of the method parameter.

    The following example

    injectMember {
         // ...
         afterHook {
             // The subscript starts from 0
    @@ -318,20 +318,16 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    args(index = 6).set(...) } } -

    Solution

    Please confirm the target method of your Hook, the number of method parameters of the constructor, and reset the array subscript.

    exception

    IllegalStateException

    PackageParam got null ClassLoader

    Abnormal

    The appClassLoader variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
    -    // This variable is called
    -    appClassLoader...
    -}
    -

    Solution

    This situation hardly exists, unless there is a problem with the Host App where the Module App is loaded or the target Hook Framework itself.

    If this problem does occur, please provide feedback with detailed logs.

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    Abnormal

    The moduleAppResources variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
    +

    Solution

    Please confirm the target method of your Hook, the number of method parameters of the constructor, and reset the array subscript.

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    Abnormal

    The moduleAppResources variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
         // This variable is called
         moduleAppResources...
     }
    -

    Solution

    moduleAppResources requires the current Hook Framework to support the initZygote function, please check and try again.

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    Abnormal

    All Class were not found when creating indeterminate Class objects using VariousClass.

    Solution

    After checking whether there is a matching Class in the Host App of the current Hook, try again.

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    Abnormal

    The instanceClass variable is called in the hook method body other than the onPrepareHook method and the Class of the current Hook does not exist.

    The following example

    TargetClass.hook {
    +

    Solution

    This situation hardly exists, unless there is a problem with the target Hook Framework itself.

    If this problem does occur, please provide feedback with detailed logs.

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    Abnormal

    All Class were not found when creating indeterminate Class objects using VariousClass.

    Solution

    After checking whether there is a matching Class in the Host App of the current Hook, try again.

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    Abnormal

    The instanceClass variable is called in the hook method body other than the onPrepareHook method and the Class of the current Hook does not exist.

    The following example

    TargetClass.hook {
         // The possible case is that the instanceClass variable
         // Who is called in the body of the non-onPrepareHook method to print the log
         loggerD(msg = "$instanceClass hook start")
     }
    -

    Solution

    Using instanceClass directly in hook is very dangerous, if the Class does not exist, it will directly cause the Hook process to "die".

    For details, please refer to Status Monitor.

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    Abnormal

    currentView was called in the layout hook callback but no instance object was obtained.

    The following example

    injectResource {
    +

    Solution

    Using instanceClass directly in hook is very dangerous, if the Class does not exist, it will directly cause the Hook process to "die".

    For details, please refer to Status Monitor.

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    Abnormal

    currentView was called in the layout hook callback but no instance object was obtained.

    The following example

    injectResource {
         conditions {
             name = "activity_main"
             layout()
    @@ -341,9 +337,9 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    currentView... } } -

    Solution

    This situation basically does not exist, unless the current Activity of the Host App has been destroyed or there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    XResForwarder is invalid

    Abnormal

    resources was called in YukiResForwarder but no instance object was obtained.

    The following example

    // This variable is called
    +

    Solution

    This situation basically does not exist, unless the current Activity of the Host App has been destroyed or there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    XResForwarder is invalid

    Abnormal

    resources was called in YukiResForwarder but no instance object was obtained.

    The following example

    // This variable is called
     moduleAppResources.fwd(...).resources
    -

    Solution

    This basically doesn't exist unless there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    Abnormal

    The empty param method is preserved when looking up methods, constructors.

    The following example

    method {
    +

    Solution

    This basically doesn't exist unless there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    Abnormal

    The empty param method is preserved when looking up methods, constructors.

    The following example

    method {
         name = "test"
         // No parameters are filled in parentheses
         param()
    @@ -356,12 +352,18 @@ import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const o={},l=a(`

    name = "test" paramCount = 0 } -

    exception

    IllegalStateException

    Invalid YukiHookCallback type

    Abnormal

    The core Hook functionality of YukiHookAPI is broken.

    Solution

    This situation basically does not exist.

    If the above problem occurs, after confirming that the problem is not in your own code, you can submit a log for feedback.

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    Abnormal

    Called repeatedly when using the applyModuleTheme method in the Context.

    The following example

    // Assume this is the current Context object
    +
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    Abnormal

    The core Hook functionality of YukiHookAPI is broken.

    Solution

    This situation basically does not exist.

    If the above problem occurs, after confirming that the problem is not in your own code, you can submit a log for feedback.

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    Abnormal

    Called repeatedly when using the applyModuleTheme method in the Context.

    The following example

    // Assume this is the current Context object
     context.applyModuleTheme(R.style.Theme_AppCompat).applyModuleTheme(R.style.Theme_AppCompat)
    -

    Solution

    The ModuleContextThemeWrapper can only be created once in the Context, please check the code for loop call problems.

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    Abnormal

    The DexClassFinder cache function searchClass(name = ...) is used in the System Framework ("android") Host App.

    The following example

    loadSystem {
    +

    Solution

    The ModuleContextThemeWrapper can only be created once in the Context, please check the code for loop call problems.

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    Abnormal

    The DexClassFinder cache function searchClass(name = ...) is used in the System Framework ("android") Host App.

    The following example

    loadSystem {
         searchClass(name = "test") {
             from(...)
             // ...
         }.get()
     }
    -

    Solution

    Since the cache will store the found Class name in SharedPreferences, but the data directory does not exist in the System Framework, so please do not use this function in the System Framework.

    `,568),t=[l];function i(p,c){return e(),n("div",null,t)}const d=s(o,[["render",i],["__file","api-exception.html.vue"]]);export{d as default}; +

    Solution

    Since the cache will store the found Class name in SharedPreferences, but the data directory does not exist in the System Framework, so please do not use this function in the System Framework.

    exception

    IllegalStateException

    Target Class type cannot cast to TYPE

    Abnormal

    Wrong type declared when converting string class name to target Class using Class.toClass, Class.toClassOrNull, GenericClass.argument methods.

    The following uses the Class.toClass method as an example.

    The following example

    // Assume the target type is Activity but it was wrongly cast to WrongClass type
    +val clazz = "android.app.Activity".toClass<WrongClass>()
    +

    Solution

    The following example

    // <Solution 1> Fill in the correct type
    +val clazz1 = "android.app.Activity".toClass<Activity>()
    +// <Solution 2> Do not fill in the generic declaration
    +val clazz2 = "android.app.Activity".toClass()
    +

    Please ensure that the generic type declared after executing the method is the specified target Class type, and you do not need to fill in the generic declaration if the target type is not sure.

    `,656),t=[l];function i(p,c){return s(),n("div",null,t)}const d=e(o,[["render",i],["__file","api-exception.html.vue"]]);export{d as default}; diff --git a/docs/assets/api-exception.html.066f0dc6.js b/docs/assets/api-exception.html.c2017872.js similarity index 71% rename from docs/assets/api-exception.html.066f0dc6.js rename to docs/assets/api-exception.html.c2017872.js index 5f6760e79..0481f4ee5 100644 --- a/docs/assets/api-exception.html.066f0dc6.js +++ b/docs/assets/api-exception.html.c2017872.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    API \u5F02\u5E38\u5904\u7406

    \u5F02\u5E38\u662F\u5728\u5F00\u53D1\u8FC7\u7A0B\u7ECF\u5E38\u9047\u5230\u7684\u4E3B\u8981\u95EE\u9898\uFF0C\u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u5728\u4F7F\u7528\u8FC7\u7A0B\u4E2D\u53EF\u80FD\u9047\u5230\u7684\u5E38\u89C1\u5F02\u5E38\u4EE5\u53CA\u5904\u7406\u65B9\u5F0F\u3002

    \u8FD9\u91CC\u7684\u5F02\u5E38\u8BF4\u660E\u53EA\u4F1A\u540C\u6B65\u6700\u65B0\u7684 API \u7248\u672C\uFF0C\u8F83\u65E7\u7684 API \u7248\u672C\u7684\u5F02\u5E38\u5C06\u4E0D\u4F1A\u518D\u8FDB\u884C\u8BF4\u660E\uFF0C\u8BF7\u59CB\u7EC8\u4FDD\u6301 API \u7248\u672C\u4E3A\u6700\u65B0\u3002

    \u975E\u963B\u65AD\u5F02\u5E38

    \u8FD9\u4E9B\u5F02\u5E38\u4E0D\u4F1A\u5BFC\u81F4 APP \u505C\u6B62\u8FD0\u884C(FC)\uFF0C\u4F46\u662F\u4F1A\u5728\u63A7\u5236\u53F0\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u4E5F\u53EF\u80FD\u4F1A\u505C\u6B62\u7EE7\u7EED\u6267\u884C\u76F8\u5173\u529F\u80FD\u3002

    exception

    loggerE

    Could not found XposedBridge in current space! Aborted

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u7684 Hook Framework \u672A\u5728\u5DE5\u4F5C\u6216\u5E76\u672A\u6210\u529F\u88C5\u8F7D XposedBridge\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u5728\u6B63\u786E\u7684\u5730\u65B9\u88C5\u8F7D\u4E86 YukiHookAPI \u7684 encase \u65B9\u6CD5\uFF0C\u8BE6\u60C5\u8BF7\u53C2\u8003 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E \u4EE5\u53CA \u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u3002

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u5C1D\u8BD5\u5728\u7EE7\u627F IYukiHookXposedInit \u7684 Hook \u5165\u53E3\u7C7B\u7684 onInit \u6216 onXposedEvent \u65B9\u6CD5\u4E2D\u88C5\u8F7D\u4E86 encase \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    class HookEntry : IYukiHookXposedInit {
    +import{_ as s,o as n,c as e,a}from"./app.6074a838.js";const o={},l=a(`

    API \u5F02\u5E38\u5904\u7406

    \u5F02\u5E38\u662F\u5728\u5F00\u53D1\u8FC7\u7A0B\u7ECF\u5E38\u9047\u5230\u7684\u4E3B\u8981\u95EE\u9898\uFF0C\u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u5728\u4F7F\u7528\u8FC7\u7A0B\u4E2D\u53EF\u80FD\u9047\u5230\u7684\u5E38\u89C1\u5F02\u5E38\u4EE5\u53CA\u5904\u7406\u65B9\u5F0F\u3002

    \u8FD9\u91CC\u7684\u5F02\u5E38\u8BF4\u660E\u53EA\u4F1A\u540C\u6B65\u6700\u65B0\u7684 API \u7248\u672C\uFF0C\u8F83\u65E7\u7684 API \u7248\u672C\u7684\u5F02\u5E38\u5C06\u4E0D\u4F1A\u518D\u8FDB\u884C\u8BF4\u660E\uFF0C\u8BF7\u59CB\u7EC8\u4FDD\u6301 API \u7248\u672C\u4E3A\u6700\u65B0\u3002

    \u975E\u963B\u65AD\u5F02\u5E38

    \u8FD9\u4E9B\u5F02\u5E38\u4E0D\u4F1A\u5BFC\u81F4 APP \u505C\u6B62\u8FD0\u884C(FC)\uFF0C\u4F46\u662F\u4F1A\u5728\u63A7\u5236\u53F0\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u4E5F\u53EF\u80FD\u4F1A\u505C\u6B62\u7EE7\u7EED\u6267\u884C\u76F8\u5173\u529F\u80FD\u3002

    exception

    loggerE

    Could not found any available Hook APIs in current environment! Aborted

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u7684 Hook Framework \u672A\u5728\u5DE5\u4F5C\u6216\u5E76\u672A\u6210\u529F\u88C5\u8F7D\u5F53\u524D Hook API\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u5728\u6B63\u786E\u7684\u5730\u65B9\u88C5\u8F7D\u4E86 YukiHookAPI \u7684 encase \u65B9\u6CD5\uFF0C\u8BE6\u60C5\u8BF7\u53C2\u8003 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E \u4EE5\u53CA \u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u3002

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u5C1D\u8BD5\u5728\u7EE7\u627F IYukiHookXposedInit \u7684 Hook \u5165\u53E3\u7C7B\u7684 onInit \u6216 onXposedEvent \u65B9\u6CD5\u4E2D\u88C5\u8F7D\u4E86 encase \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    class HookEntry : IYukiHookXposedInit {
     
         override fun onInit() {
             // \u2757\u9519\u8BEF\u7684\u4F7F\u7528\u65B9\u6CD5
    @@ -34,7 +34,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    } } } -

    exception

    loggerE

    Hooking Process exception occurred

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u8FDB\u884C\u81EA\u8EAB\u521D\u59CB\u5316 Hook \u8FC7\u7A0B\u4E2D\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u53EF\u76F4\u63A5\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u88C5\u8F7D Hook \u5165\u53E3\u7C7B onInit \u6216 onHook \u65B9\u6CD5\u65F6\u53D1\u751F\u4E86\u4E0D\u80FD\u5904\u7406\u7684\u5F02\u5E38\u6216\u627E\u4E0D\u5230\u5165\u53E3\u7C7B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u8BF7\u81EA\u884C\u67E5\u770B\u63A7\u5236\u53F0\u6253\u5370\u7684\u65E5\u5FD7\u5B9A\u4F4D\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    YukiHookAPI bind initZygote failed

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u88C5\u8F7D Xposed \u539F\u751F\u63A5\u53E3 initZygote \u65B9\u6CD5\u65F6\u53D1\u751F\u4E86\u4E0D\u80FD\u5904\u7406\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u8BF7\u81EA\u884C\u67E5\u770B\u63A7\u5236\u53F0\u6253\u5370\u7684\u65E5\u5FD7\u5B9A\u4F4D\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u8FDB\u884C Resources Hook \u65F6\u53D1\u751F\u9519\u8BEF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u4ED4\u7EC6\u68C0\u67E5\u9519\u8BEF\u65E5\u5FD7\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002

    \u82E5\u53D1\u751F Resources$NotFoundException \u5219\u53EF\u80FD\u4E3A\u4F60\u67E5\u627E\u7684 Resources Id \u4E0D\u6B63\u786E\u3002

    \u82E5\u53D1\u751F ClassNotFound \u6216 NoClassDefFoundError \u53EF\u80FD\u662F Hook Framework \u4E0D\u652F\u6301 Resources Hook(\u8D44\u6E90\u94A9\u5B50)\u3002

    exception

    loggerE

    HookClass [NAME] not found

    \u5F02\u5E38\u539F\u56E0

    \u5F53\u524D\u88AB Hook \u7684 Class \u6CA1\u6709\u88AB\u627E\u5230\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u76EE\u6807 Class \u662F\u5426\u5B58\u5728\uFF0C\u82E5\u60F3\u5FFD\u7565\u6B64\u9519\u8BEF\u8BF7\u4F7F\u7528 ignoredHookClassNotFoundFailure \u65B9\u6CD5\u3002

    exception

    loggerE

    Hook Member [NAME] failed

    \u5F02\u5E38\u539F\u56E0

    Hook \u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u53D1\u751F\u9519\u8BEF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u6B64\u95EE\u9898\u901A\u5E38\u7531 Hook Framework \u4EA7\u751F\uFF0C\u8BF7\u68C0\u67E5\u5BF9\u5E94\u7684\u65E5\u5FD7\u5185\u5BB9\uFF0C\u82E5\u95EE\u9898\u6301\u7EED\u51FA\u73B0\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u6267\u884C\u540E\u88AB Hook \u7684 member \u4E3A null \u4E14\u5DF2\u7ECF\u8BBE\u7F6E\u76EE\u6807 Hook \u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u6B64\u9519\u8BEF\u53D1\u751F\u524D\u7684\u4E0A\u4E00\u4E2A\u9519\u8BEF\u65E5\u5FD7\uFF0C\u6216\u8BB8\u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65F6\u5019\u53D1\u751F\u4E86\u627E\u4E0D\u5230\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u9519\u8BEF\u3002

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u6267\u884C\u540E\u88AB Hook \u7684 member \u4E3A null \u4E14\u6CA1\u6709\u8BBE\u7F6E\u76EE\u6807 Hook \u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +
    exception

    loggerE

    An exception occurred in the Hooking Process of YukiHookAPI

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u88C5\u8F7D Xposed \u5165\u53E3\u65B9\u6CD5\u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5F02\u5E38\u6C47\u603B\uFF0C\u5982\u679C\u4F60\u5F53\u524D\u7684 Hook \u8FDB\u7A0B\u4E2D\u53D1\u751F\u4E86\u4EFB\u4F55\u5F02\u5E38 (Hook \u8FDB\u7A0B\u5D29\u6E83)\uFF0C\u90FD\u4F1A\u4F7F\u7528\u6B64\u65B9\u5F0F\u6253\u5370\u5230\u63A7\u5236\u53F0\uFF0C\u8BF7\u8FFD\u6EAF\u5F02\u5E38\u53D1\u751F\u7684\u5806\u6808\u4EE5\u5B9A\u4F4D\u4F60\u7684\u4EE3\u7801\u95EE\u9898\u4F4D\u7F6E\u3002

    exception

    loggerE

    An exception occurred when hooking internal function

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u8FDB\u884C\u81EA\u8EAB\u521D\u59CB\u5316 Hook \u8FC7\u7A0B\u4E2D\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u53EF\u76F4\u63A5\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u88C5\u8F7D Hook \u5165\u53E3\u7C7B onInit \u6216 onHook \u65B9\u6CD5\u65F6\u53D1\u751F\u4E86\u4E0D\u80FD\u5904\u7406\u7684\u5F02\u5E38\u6216\u627E\u4E0D\u5230\u5165\u53E3\u7C7B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u8BF7\u81EA\u884C\u67E5\u770B\u63A7\u5236\u53F0\u6253\u5370\u7684\u65E5\u5FD7\u5B9A\u4F4D\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    An exception occurred when YukiHookAPI loading Xposed Module

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u4F7F\u7528 Xposed \u539F\u751F\u63A5\u53E3\u88C5\u8F7D Xposed \u6A21\u5757\u65F6\u53D1\u751F\u4E86\u4E0D\u80FD\u5904\u7406\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u901A\u5E38\u60C5\u51B5\u4E0B\u8FD9\u79CD\u9519\u8BEF\u4E0D\u4F1A\u8F7B\u6613\u53D1\u751F\uFF0C\u82E5\u4E00\u65E6\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u8BF7\u81EA\u884C\u67E5\u770B\u63A7\u5236\u53F0\u6253\u5370\u7684\u65E5\u5FD7\u5B9A\u4F4D\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u5728\u5C1D\u8BD5\u8FDB\u884C Resources Hook \u65F6\u53D1\u751F\u9519\u8BEF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u4ED4\u7EC6\u68C0\u67E5\u9519\u8BEF\u65E5\u5FD7\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002

    \u82E5\u53D1\u751F Resources$NotFoundException \u5219\u53EF\u80FD\u4E3A\u4F60\u67E5\u627E\u7684 Resources Id \u4E0D\u6B63\u786E\u3002

    \u82E5\u53D1\u751F ClassNotFound \u6216 NoClassDefFoundError \u53EF\u80FD\u662F Hook Framework \u4E0D\u652F\u6301 Resources Hook(\u8D44\u6E90\u94A9\u5B50)\u3002

    exception

    loggerE

    HookClass [NAME] not found

    \u5F02\u5E38\u539F\u56E0

    \u5F53\u524D\u88AB Hook \u7684 Class \u6CA1\u6709\u88AB\u627E\u5230\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u76EE\u6807 Class \u662F\u5426\u5B58\u5728\uFF0C\u82E5\u60F3\u5FFD\u7565\u6B64\u9519\u8BEF\u8BF7\u4F7F\u7528 ignoredHookClassNotFoundFailure \u65B9\u6CD5\u3002

    exception

    loggerE

    Hook Member [NAME] failed

    \u5F02\u5E38\u539F\u56E0

    Hook \u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u53D1\u751F\u9519\u8BEF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u6B64\u95EE\u9898\u901A\u5E38\u7531 Hook Framework \u4EA7\u751F\uFF0C\u8BF7\u68C0\u67E5\u5BF9\u5E94\u7684\u65E5\u5FD7\u5185\u5BB9\uFF0C\u82E5\u95EE\u9898\u6301\u7EED\u51FA\u73B0\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u6267\u884C\u540E\u88AB Hook \u7684 member \u4E3A null \u4E14\u5DF2\u7ECF\u8BBE\u7F6E\u76EE\u6807 Hook \u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u6B64\u9519\u8BEF\u53D1\u751F\u524D\u7684\u4E0A\u4E00\u4E2A\u9519\u8BEF\u65E5\u5FD7\uFF0C\u6216\u8BB8\u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65F6\u5019\u53D1\u751F\u4E86\u627E\u4E0D\u5230\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u9519\u8BEF\u3002

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u6267\u884C\u540E\u88AB Hook \u7684 member \u4E3A null \u4E14\u6CA1\u6709\u8BBE\u7F6E\u76EE\u6807 Hook \u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // \u8FD9\u91CC\u5E76\u6CA1\u6709\u8BBE\u7F6E\u9700\u8981 Hook \u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u67E5\u627E\u6761\u4EF6
         afterHook {
             // ...
    @@ -49,7 +49,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... } } -

    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u56DE\u8C03\u65B9\u6CD5\u4F53\u4E2D\u8BBE\u7F6E\u4E86 HookParam.result \u6216\u4F7F\u7528\u4E86 replaceHook \u4F46\u662F\u88AB Hook \u7684\u65B9\u6CD5\u8FD4\u56DE\u503C\u7C7B\u578B\u4E0E\u539F\u8FD4\u56DE\u503C\u7C7B\u578B\u4E0D\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    \u5047\u8BBE\u8FD9\u4E2A\u662F\u88AB Hook \u7684\u65B9\u6CD5\u3002

    private boolean test()
    +
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u56DE\u8C03\u65B9\u6CD5\u4F53\u4E2D\u8BBE\u7F6E\u4E86 HookParam.result \u6216\u4F7F\u7528\u4E86 replaceHook \u4F46\u662F\u88AB Hook \u7684\u65B9\u6CD5\u8FD4\u56DE\u503C\u7C7B\u578B\u4E0E\u539F\u8FD4\u56DE\u503C\u7C7B\u578B\u4E0D\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    \u5047\u8BBE\u8FD9\u4E2A\u662F\u88AB Hook \u7684\u65B9\u6CD5\u3002

    private boolean test()
     

    \u4E0B\u9762\u662F\u4E00\u4E2A\u9519\u8BEF\u7684\u6848\u5217\u3002

    injectMember {
         method {
             name = "test"
    @@ -66,7 +66,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // <\u60C5\u666F3> \u76F4\u63A5\u4F7F\u7528\u4E86\u9519\u8BEF\u7684\u7C7B\u578B\uFF0C\u539F\u7C7B\u578B\u4E3A Boolean replaceTo(any = 0) } -

    \u6CE8\u610F

    \u82E5\u4E0A\u8FF0\u573A\u666F\u5728 beforeHook \u6216 afterHook \u4E2D\u53D1\u751F\uFF0C\u5219\u4F1A\u9020\u6210\u88AB Hook \u7684 APP (\u5BBF\u4E3B) \u7531 XposedBridge \u629B\u51FA\u5F02\u5E38 (\u4F1A\u5BF9\u5176\u66B4\u9732\u88AB Hook \u7684\u4E8B\u5B9E)\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u5F53\u524D\u88AB Hook \u65B9\u6CD5\u7684\u6B63\u786E\u8FD4\u56DE\u503C\u7C7B\u578B\uFF0C\u4FEE\u6539\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Hook initialization failed because got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728\u51C6\u5907 Hook \u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u51C6\u5907 Hook \u9636\u6BB5\u5C31\u53D1\u751F\u5F02\u5E38\u7684\u63D0\u9192\uFF0C\u8BF7\u4ED4\u7EC6\u67E5\u770B\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\u4EE5\u91CD\u65B0\u786E\u5B9A\u95EE\u9898\u3002

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u5F00\u59CB\u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A Hook \u5F00\u59CB\u5C31\u53D1\u751F\u5F02\u5E38\u7684\u63D0\u9192\uFF0C\u8BF7\u4ED4\u7EC6\u67E5\u770B\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\u4EE5\u91CD\u65B0\u786E\u5B9A\u95EE\u9898\u3002

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u8BBE\u7F6E\u4E86\u4E0D\u5141\u8BB8\u7684\u53C2\u6570\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u67E5\u627E\u4E00\u4E2A\u65B9\u6CD5
    +

    \u6CE8\u610F

    \u82E5\u4E0A\u8FF0\u573A\u666F\u5728 beforeHook \u6216 afterHook \u4E2D\u53D1\u751F\uFF0C\u5219\u4F1A\u9020\u6210\u88AB Hook \u7684 APP (\u5BBF\u4E3B) \u7531 XposedBridge \u629B\u51FA\u5F02\u5E38 (\u4F1A\u5BF9\u5176\u66B4\u9732\u88AB Hook \u7684\u4E8B\u5B9E)\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u5F53\u524D\u88AB Hook \u65B9\u6CD5\u7684\u6B63\u786E\u8FD4\u56DE\u503C\u7C7B\u578B\uFF0C\u4FEE\u6539\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Hook initialization failed because got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728\u51C6\u5907 Hook \u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u51C6\u5907 Hook \u9636\u6BB5\u5C31\u53D1\u751F\u5F02\u5E38\u7684\u63D0\u9192\uFF0C\u8BF7\u4ED4\u7EC6\u67E5\u770B\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\u4EE5\u91CD\u65B0\u786E\u5B9A\u95EE\u9898\u3002

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u5F00\u59CB\u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A Hook \u5F00\u59CB\u5C31\u53D1\u751F\u5F02\u5E38\u7684\u63D0\u9192\uFF0C\u8BF7\u4ED4\u7EC6\u67E5\u770B\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\u4EE5\u91CD\u65B0\u786E\u5B9A\u95EE\u9898\u3002

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u8BBE\u7F6E\u4E86\u4E0D\u5141\u8BB8\u7684\u53C2\u6570\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u67E5\u627E\u4E00\u4E2A\u65B9\u6CD5
     method {
         // \u2757\u8BBE\u7F6E\u4E86\u65E0\u6548\u7684\u7C7B\u578B\u4E3E\u4F8B
         param(false, 1, 0)
    @@ -94,40 +94,40 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\u4E3E\u4F8B type = BooleanType } -

    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u5E76\u672A\u627E\u5230\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u7684\u67E5\u627E\u6761\u4EF6\u662F\u5426\u80FD\u6B63\u786E\u5339\u914D\u5230\u76EE\u6807 Class \u4E2D\u7684\u6307\u5B9A\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 RemedyPlan \u91CD\u65B0\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u65F6\u4F9D\u7136\u6CA1\u6709\u627E\u5230\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u8BBE\u7F6E\u7684 RemedyPlan \u53C2\u6570\u4EE5\u53CA\u5BBF\u4E3B\u5185\u5B58\u5728\u7684 Class\uFF0C\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u5E76\u672A\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
    +
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u5E76\u672A\u627E\u5230\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u7684\u67E5\u627E\u6761\u4EF6\u662F\u5426\u80FD\u6B63\u786E\u5339\u914D\u5230\u76EE\u6807 Class \u4E2D\u7684\u6307\u5B9A\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 RemedyPlan \u91CD\u65B0\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u65F6\u4F9D\u7136\u6CA1\u6709\u627E\u5230\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u8BBE\u7F6E\u7684 RemedyPlan \u53C2\u6570\u4EE5\u53CA\u5BBF\u4E3B\u5185\u5B58\u5728\u7684 Class\uFF0C\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u65F6\u5E76\u672A\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
         // \u8FD9\u91CC\u6CA1\u6709\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u5C06\u67E5\u627E\u6761\u4EF6\u8865\u5145\u5B8C\u6574\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7 ClassLoader.searchClass \u6216 PackageParam.searchClass \u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    customClassLoader?.searchClass {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u5C06\u67E5\u627E\u6761\u4EF6\u8865\u5145\u5B8C\u6574\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7 ClassLoader.searchClass \u6216 PackageParam.searchClass \u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    customClassLoader?.searchClass {
         from(...)
         // ...
     }.get()
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5B89\u5168\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u4F60\u8BBE\u7F6E\u7684\u6761\u4EF6\uFF0C\u4F7F\u7528\u76F8\u5173\u5DE5\u5177\u67E5\u770B\u6240\u5728 Dex \u4E2D\u7684 Class \u4EE5\u53CA\u5B57\u8282\u7801\u5BF9\u8C61\u7279\u5F81\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7\u6307\u5B9A\u6761\u4EF6\u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.method {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5B89\u5168\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u4F60\u8BBE\u7F6E\u7684\u6761\u4EF6\uFF0C\u4F7F\u7528\u76F8\u5173\u5DE5\u5177\u67E5\u770B\u6240\u5728 Dex \u4E2D\u7684 Class \u4EE5\u53CA\u5B57\u8282\u7801\u5BF9\u8C61\u7279\u5F81\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7\u6307\u5B9A\u6761\u4EF6\u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.method {
         name = "test"
         param(BooleanType)
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5B89\u5168\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u4F60\u8BBE\u7F6E\u7684\u6761\u4EF6\uFF0C\u4F7F\u7528\u76F8\u5173\u5DE5\u5177\u67E5\u770B\u6240\u5728 Class \u4E2D\u7684\u5B57\u8282\u7801\u5BF9\u8C61\u7279\u5F81\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    \u5F02\u5E38\u539F\u56E0

    \u5728 Method\u3001Constructor \u67E5\u627E\u6761\u4EF6\u4E2D\u9519\u8BEF\u5730\u4F7F\u7528\u4E86 VagueType\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.method {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5B89\u5168\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5\u4F60\u8BBE\u7F6E\u7684\u6761\u4EF6\uFF0C\u4F7F\u7528\u76F8\u5173\u5DE5\u5177\u67E5\u770B\u6240\u5728 Class \u4E2D\u7684\u5B57\u8282\u7801\u5BF9\u8C61\u7279\u5F81\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    \u5F02\u5E38\u539F\u56E0

    \u5728 Method\u3001Constructor \u67E5\u627E\u6761\u4EF6\u4E2D\u9519\u8BEF\u5730\u4F7F\u7528\u4E86 VagueType\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.method {
         name = "test"
         // <\u60C5\u666F1>
         param(VagueType)
         // <\u60C5\u666F2>
         param(VagueType, VagueType ...)
     }
    -

    \u89E3\u51B3\u65B9\u6848

    VagueType \u4E0D\u80FD\u5728\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u53C2\u6570\u4E2D\u5B8C\u5168\u586B\u5145\uFF0C\u82E5\u5B58\u5728\u8FD9\u6837\u7684\u9700\u6C42\u8BF7\u4F7F\u7528 paramCount\u3002

    exception

    loggerE

    Field match type class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u53D8\u91CF\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D type \u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    \u793A\u4F8B\u5982\u4E0B

    field {
    +

    \u89E3\u51B3\u65B9\u6848

    VagueType \u4E0D\u80FD\u5728\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u53C2\u6570\u4E2D\u5B8C\u5168\u586B\u5145\uFF0C\u82E5\u5B58\u5728\u8FD9\u6837\u7684\u9700\u6C42\u8BF7\u4F7F\u7528 paramCount\u3002

    exception

    loggerE

    Field match type class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u53D8\u91CF\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D type \u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    \u793A\u4F8B\u5982\u4E0B

    field {
         name = "test"
         // \u5047\u8BBE\u8FD9\u91CC\u8BBE\u7F6E\u7684 type \u7684 Class \u5E76\u4E0D\u5B58\u5728
         type = "com.example.TestClass"
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D type \u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Method match returnType class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D returnType \u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D type \u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Method match returnType class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D returnType \u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
         name = "test"
         // \u5047\u8BBE\u8FD9\u91CC\u8BBE\u7F6E\u7684 returnType \u7684 Class \u5E76\u4E0D\u5B58\u5728
         returnType = "com.example.TestClass"
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D returnType \u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D param \u7684 index \u53F7\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    method {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D returnType \u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u6240\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6\u4E2D param \u7684 index \u53F7\u4E0B\u6807\u7684 Class \u5B9E\u4F8B\u672A\u88AB\u627E\u5230\u3002

    method {
         name = "test"
         // \u5047\u8BBE\u8FD9\u91CC\u8BBE\u7F6E\u7684 1 \u53F7\u4E0B\u6807\u7684 Class \u5E76\u4E0D\u5B58\u5728
    -    param(StringType, "com.example.TestClass", BooleanType)
    +    param(StringClass, "com.example.TestClass", BooleanType)
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D param \u7684 index \u53F7\u4E0B\u6807\u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E Resources \u65F6\u5E76\u672A\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u60C5\u51B5 1
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u67E5\u627E\u6761\u4EF6\u4E2D param \u7684 index \u53F7\u4E0B\u6807\u7684 Class \u662F\u5426\u5B58\u5728\uFF0C\u7136\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Invoke original Member [MEMBER] failed

    \u5F02\u5E38\u539F\u56E0

    \u5728\u4F7F\u7528 HookParam.callOriginal\u3001HookParam.invokeOriginal\u3001method { ... }.get(...).original() \u8C03\u7528\u672A\u7ECF Hook \u7684\u539F\u59CB\u65B9\u6CD5\u65F6\u53D1\u751F\u9519\u8BEF\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u82E5\u53D1\u751F\u6B64\u9519\u8BEF\uFF0C\u53EF\u80FD\u4E3A\u5F53\u524D\u4F7F\u7528\u7684 Hook Framework \u95EE\u9898\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E Resources \u65F6\u5E76\u672A\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u60C5\u51B5 1
     conditions {
         // \u8FD9\u91CC\u6CA1\u6709\u8BBE\u7F6E\u4EFB\u4F55\u6761\u4EF6
     }
    @@ -136,12 +136,12 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    name = "test" // \u8FD9\u91CC\u7F3A\u5C11\u4E86 type \u6761\u4EF6 } -

    \u89E3\u51B3\u65B9\u6848

    Resources \u7684 Hook \u5E76\u975E\u7C7B\u4F3C\u65B9\u6CD5\u7684 Hook\uFF0C\u5176\u5FC5\u987B\u62E5\u6709\u5B8C\u6574\u7684\u540D\u79F0\u548C\u7C7B\u578B\u63CF\u8FF0\u624D\u80FD\u67E5\u627E\u6210\u529F\uFF0C\u8BF7\u5C06\u67E5\u627E\u6761\u4EF6\u8865\u5145\u5B8C\u6574\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook Resources \u65F6\u53D1\u751F\u4E86\u7C7B\u578B\u9519\u8BEF\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    YukiHookAPI \u4F1A\u5C1D\u8BD5\u5728 initZygote \u4E0E handleInitPackageResources \u4E2D\u88C5\u8F7D Resources Hook\uFF0C\u82E5\u5168\u90E8\u88C5\u8F7D\u5931\u8D25\u53EF\u80FD\u4F1A\u53D1\u751F\u6B64\u5F02\u5E38\uFF0C\u5F53\u524D Hook Framework \u9700\u8981\u652F\u6301\u5E76\u542F\u7528\u8D44\u6E90\u94A9\u5B50(Resources Hook)\u529F\u80FD\uFF0C\u8BF7\u68C0\u67E5\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook Resources \u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5F02\u5E38\u6C47\u603B\uFF0C\u8BF7\u81EA\u884C\u5411\u4E0B\u67E5\u770B\u65E5\u5FD7\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\uFF0C\u4F8B\u5982\u627E\u4E0D\u5230 Resources Id \u7684\u95EE\u9898\u3002

    exception

    loggerE

    Received action "ACTION" failed

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u56DE\u8C03\u5E7F\u64AD\u4E8B\u4EF6\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u4E00\u65E6\u53D1\u751F\u9519\u8BEF\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u53D1\u9001\u5E7F\u64AD\u53D6\u5230\u4E86\u7A7A\u7684\u4E0A\u4E0B\u6587\u5B9E\u4F8B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u5728\u6700\u65B0\u7248\u672C\u4E2D\u5DF2\u7ECF\u4FEE\u590D\u5BBF\u4E3B\u4F7F\u7528\u65F6\u53EF\u80FD\u53D1\u751F\u7684\u95EE\u9898\uFF0C\u82E5\u6700\u65B0\u7248\u672C\u4F9D\u7136\u53D1\u751F\u9519\u8BEF\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 injectModuleAppResources \u6CE8\u5165\u6A21\u5757\u8D44\u6E90\u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u6B64\u9519\u8BEF\u53D1\u751F\u540E\u7684\u4E0B\u4E00\u4E2A\u9519\u8BEF\u65E5\u5FD7\uFF0C\u6216\u8BB8\u5728\u914D\u7F6E\u53C2\u6570\u4E0A\u53EF\u80FD\u53D1\u751F\u4E86\u4E00\u4E9B\u95EE\u9898\uFF0C\u82E5\u627E\u4E0D\u5230\u76F8\u5173\u9519\u8BEF\u65E5\u5FD7\u7684\u8BF4\u660E\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u4F46\u6839\u636E\u7CFB\u7EDF\u7248\u672C\u5DEE\u5F02\u6027\u5E76\u672A\u505A\u8BE6\u7EC6\u6D4B\u8BD5\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u586B\u5165\u4E86\u65E0\u6548\u7684\u53C2\u6570\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u2757 \u8FD9\u91CC\u586B\u5165\u7684\u5185\u5BB9\u4EC5\u4E3A\u4E3E\u4F8B\uFF0C\u5176\u4E2D proxy \u586B\u5165\u4E86\u4E0D\u80FD\u7406\u89E3\u7684\u65E0\u6548\u53C2\u6570
    +

    \u89E3\u51B3\u65B9\u6848

    Resources \u7684 Hook \u5E76\u975E\u7C7B\u4F3C\u65B9\u6CD5\u7684 Hook\uFF0C\u5176\u5FC5\u987B\u62E5\u6709\u5B8C\u6574\u7684\u540D\u79F0\u548C\u7C7B\u578B\u63CF\u8FF0\u624D\u80FD\u67E5\u627E\u6210\u529F\uFF0C\u8BF7\u5C06\u67E5\u627E\u6761\u4EF6\u8865\u5145\u5B8C\u6574\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook Resources \u65F6\u53D1\u751F\u4E86\u7C7B\u578B\u9519\u8BEF\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    YukiHookAPI \u4F1A\u5C1D\u8BD5\u5728 initZygote \u4E0E handleInitPackageResources \u4E2D\u88C5\u8F7D Resources Hook\uFF0C\u82E5\u5168\u90E8\u88C5\u8F7D\u5931\u8D25\u53EF\u80FD\u4F1A\u53D1\u751F\u6B64\u5F02\u5E38\uFF0C\u5F53\u524D Hook Framework \u9700\u8981\u652F\u6301\u5E76\u542F\u7528\u8D44\u6E90\u94A9\u5B50 (Resources Hook) \u529F\u80FD\uFF0C\u8BF7\u68C0\u67E5\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook Resources \u65F6\u53D1\u751F\u4E86\u4EFB\u610F\u7684\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u662F\u4E00\u4E2A\u5F02\u5E38\u6C47\u603B\uFF0C\u8BF7\u81EA\u884C\u5411\u4E0B\u67E5\u770B\u65E5\u5FD7\u5177\u4F53\u7684\u5F02\u5E38\u662F\u4EC0\u4E48\uFF0C\u4F8B\u5982\u627E\u4E0D\u5230 Resources Id \u7684\u95EE\u9898\u3002

    exception

    loggerE

    Received action "ACTION" failed

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u56DE\u8C03\u5E7F\u64AD\u4E8B\u4EF6\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u6B64\u5F02\u5E38\u591A\u4E3A\u4E00\u4E9B\u5173\u8054\u6027\u5F02\u5E38\u5F15\u53D1\uFF0C\u8BF7\u68C0\u67E5\u81EA\u8EAB\u4EE3\u7801\u662F\u5426\u5B58\u5728\u95EE\u9898\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Received data type TYPE is not a vailed YukiHookDataChannel's data

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u56DE\u8C03\u5E7F\u64AD\u6536\u5230\u4E86\u4E0D\u5C5E\u4E8E YukiHookDataChannel \u7684\u6570\u636E\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E3A\u4E86\u786E\u4FDD\u6570\u636E\u5B89\u5168\u6027\uFF0CYukiHookDataChannel \u4F1A\u5BF9\u53D1\u9001\u7684\u6570\u636E\u8FDB\u884C\u5305\u88C5\uFF0C\u4EFB\u4F55\u7B2C\u4E09\u65B9\u5E7F\u64AD\u4E8B\u4EF6\u5747\u4E0D\u80FD\u88AB YukiHookDataChannel \u63A5\u6536\uFF0C\u8BF7\u68C0\u67E5\u4F60\u7684\u4EE3\u7801\u662F\u5426\u6B63\u786E\u3002

    exception

    loggerE

    Unsupported segments data key of "KEY"'s type

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u56DE\u8C03\u5E7F\u64AD\u6536\u5230\u4E86\u4E0D\u652F\u6301\u7684\u5206\u6BB5\u6570\u636E\u7C7B\u578B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u4E0D\u53EF\u80FD\u53D1\u751F\uFF0C\u56E0\u4E3A YukiHookDataChannel \u6240\u652F\u6301\u7684\u5206\u6BB5\u6570\u636E\u7C7B\u578B\u662F\u56FA\u5B9A\u7684\uFF0C\u4E0D\u4F1A\u52A8\u6001\u6539\u53D8\uFF0C\u82E5\u53D1\u751F\u8FD9\u79CD\u60C5\u51B5\uFF0C\u8BF7\u68C0\u67E5\u662F\u5426\u6539\u52A8\u4E86 API \u76F8\u5173\u4EE3\u7801\u3002

    exception

    loggerE

    YukiHookDataChannel cannot merge this segments data key of "KEY"

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u56DE\u8C03\u5E7F\u64AD\u6536\u5230\u4E86\u65E0\u6CD5\u5904\u7406\u7684\u5206\u6BB5\u6570\u636E\u5BFC\u81F4\u65E0\u6CD5\u5408\u5E76\u5206\u6BB5\u6570\u636E\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u9664\u975E\u6536\u5230\u8FDE\u7EED\u53D1\u9001\u6216\u91CD\u590D\u53D1\u9001\u7684\u5E7F\u64AD (\u65F6\u5E8F\u5F02\u5E38) \u6216\u5728\u63A5\u6536\u6570\u636E\u65F6\u8BBE\u7F6E\u4E86\u9519\u8BEF\u7684\u6CDB\u578B\u7C7B\u578B\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    YukiHookDataChannel cannot calculate the byte size of the data key of "KEY" to be sent, so this data cannot be sent

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u53D1\u9001\u5E7F\u64AD\u6570\u636E\u65F6\u8BA1\u7B97\u6570\u636E\u5927\u5C0F\u5931\u8D25\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    YukiHookDataChannel cannot send this data key of "KEY" type TYPE, because it is too large (total TOTAL KB, limit LIMIT KB) and cannot be segmented

    SUGGESTION_MESSAGE

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u53D1\u9001\u5E7F\u64AD\u6570\u636E\u65F6\u6570\u636E\u8FC7\u5927\uFF0C\u4F46\u662F\u6B64\u6570\u636E\u7C7B\u578B\u5E76\u4E0D\u652F\u6301\u88AB\u5206\u6BB5\u53D1\u9001\u3002

    \u89E3\u51B3\u65B9\u6848

    \u5F53\u4F60\u53D1\u9001\u7684\u6570\u636E\u8D85\u51FA\u7CFB\u7EDF\u5E7F\u64AD\u7684\u4E0A\u9650\u65F6\uFF0CYukiHookDataChannel \u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4F1A\u5C06\u6B64\u6570\u636E\u5206\u6BB5\u540E\u4F9D\u6B21\u53D1\u9001\uFF0C\u4F46\u4EC5\u652F\u6301\u5904\u7406 List\u3001Map\u3001Set\u3001String \u5E38\u89C1\u7C7B\u578B\u7684\u81EA\u52A8\u5206\u6BB5\u529F\u80FD\u3002

    \u5C0F\u63D0\u793A

    \u82E5\u4F60\u4ECD\u8981\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u8BF7\u53C2\u8003 YukiHookDataChannel.NameSpace.allowSendTooLargeData \u65B9\u6CD5\u3002

    \u4F46\u662F\u5F3A\u70C8\u5EFA\u8BAE\u4E0D\u8981\u8FD9\u6837\u505A\uFF0C\u8FD9\u6709\u53EF\u80FD\u4F1A\u5BFC\u81F4\u7CFB\u7EDF\u4E0D\u5141\u8BB8\u8FC7\u5927\u7684\u6570\u636E\u53D1\u9001\u800C\u9020\u6210\u5E94\u7528\u5D29\u6E83\u3002

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 YukiHookDataChannel \u65F6\u53D1\u9001\u5E7F\u64AD\u53D6\u5230\u4E86\u7A7A\u7684\u4E0A\u4E0B\u6587\u5B9E\u4F8B\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u5728\u6700\u65B0\u7248\u672C\u4E2D\u5DF2\u7ECF\u4FEE\u590D\u5BBF\u4E3B\u4F7F\u7528\u65F6\u53EF\u80FD\u53D1\u751F\u7684\u95EE\u9898\uFF0C\u82E5\u6700\u65B0\u7248\u672C\u4F9D\u7136\u53D1\u751F\u9519\u8BEF\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 injectModuleAppResources \u6CE8\u5165\u6A21\u5757\u8D44\u6E90\u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    You cannot inject module resources into yourself

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883 (\u6A21\u5757\u81EA\u8EAB\u7684 Xposed \u73AF\u5883) \u4E2D\u4F7F\u7528 injectModuleAppResources \u5C06\u6A21\u5757\u81EA\u8EAB\u7684\u8D44\u6E90\u6CE8\u5165\u81EA\u8EAB\u3002

    \u89E3\u51B3\u65B9\u6848

    \u7531\u4E8E\u6A21\u5757\u81EA\u8EAB\u4E5F\u53EF\u4EE5\u88AB\u81EA\u8EAB Hook\uFF0C\u4F46\u4F60\u5E76\u4E0D\u53EF\u4EE5\u5728\u6A21\u5757\u81EA\u8EAB\u6CE8\u5165\u81EA\u5DF1 (\u4E0D\u80FD\u9012\u5F52\u81EA\u8EAB\u7684\u8D44\u6E90)\uFF0C\u82E5\u4F60\u4E00\u5B9A\u8981\u83B7\u53D6\u6A21\u5757\u81EA\u8EAB\u7684\u8D44\u6E90\uFF0C\u8BF7\u76F4\u63A5\u4F7F\u7528\u5373\u53EF\uFF0C\u65E0\u9700\u4EFB\u4F55\u5176\u5B83\u64CD\u4F5C\u3002

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u6B64\u9519\u8BEF\u53D1\u751F\u540E\u7684\u4E0B\u4E00\u4E2A\u9519\u8BEF\u65E5\u5FD7\uFF0C\u6216\u8BB8\u5728\u914D\u7F6E\u53C2\u6570\u4E0A\u53EF\u80FD\u53D1\u751F\u4E86\u4E00\u4E9B\u95EE\u9898\uFF0C\u82E5\u627E\u4E0D\u5230\u76F8\u5173\u9519\u8BEF\u65E5\u5FD7\u7684\u8BF4\u660E\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\uFF0C\u6B64\u9519\u8BEF\u57FA\u672C\u4E0A\u4E0D\u4F1A\u53D1\u751F\uFF0C\u4F46\u6839\u636E\u7CFB\u7EDF\u7248\u672C\u5DEE\u5F02\u6027\u5E76\u672A\u505A\u8BE6\u7EC6\u6D4B\u8BD5\uFF0C\u6392\u9664\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u540E\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u586B\u5165\u4E86\u65E0\u6548\u7684\u53C2\u6570\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u2757 \u8FD9\u91CC\u586B\u5165\u7684\u5185\u5BB9\u4EC5\u4E3A\u4E3E\u4F8B\uFF0C\u5176\u4E2D proxy \u586B\u5165\u4E86\u4E0D\u80FD\u7406\u89E3\u7684\u65E0\u6548\u53C2\u6570
     registerModuleAppActivities(proxy = false)
    -

    \u89E3\u51B3\u65B9\u6848

    \u65B9\u6CD5\u4E2D\u7684 proxy \u53C2\u6570\u53EA\u63A5\u53D7 String\u3001CharSequence\u3001Class \u7C7B\u578B\uFF0C\u8BF7\u67E5\u770B\u76F8\u5173\u4F7F\u7528\u65B9\u6CD5\u6B63\u786E\u586B\u5165\u65B9\u6CD5\u53C2\u6570\u3002

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u627E\u4E0D\u5230\u5BBF\u4E3B\u7684\u542F\u52A8 Activity\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528\u4E86\u9ED8\u8BA4\u53C2\u6570\u76F4\u63A5\u8FDB\u884C\u6CE8\u518C
    +

    \u89E3\u51B3\u65B9\u6848

    \u65B9\u6CD5\u4E2D\u7684 proxy \u53C2\u6570\u53EA\u63A5\u53D7 String\u3001CharSequence\u3001Class \u7C7B\u578B\uFF0C\u8BF7\u67E5\u770B\u76F8\u5173\u4F7F\u7528\u65B9\u6CD5\u6B63\u786E\u586B\u5165\u65B9\u6CD5\u53C2\u6570\u3002

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u627E\u4E0D\u5230\u5BBF\u4E3B\u7684\u542F\u52A8 Activity\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4F7F\u7528\u4E86\u9ED8\u8BA4\u53C2\u6570\u76F4\u63A5\u8FDB\u884C\u6CE8\u518C
     registerModuleAppActivities()
    -

    \u89E3\u51B3\u65B9\u6848

    \u9ED8\u8BA4\u53C2\u6570 (\u65E0\u53C2) \u53EA\u80FD\u7528\u4E8E\u53EF\u88AB\u542F\u52A8\u7684 APP\uFF0C\u82E5 APP \u5E76\u672A\u58F0\u660E\u542F\u52A8\u5165\u53E3 Activity\uFF0C\u4F60\u5C31\u9700\u8981\u624B\u52A8\u6307\u5B9A\u65B9\u6CD5\u7684 proxy \u53C2\u6570\u3002

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u65E0\u6CD5\u627E\u5230\u88AB\u586B\u5165\u53C2\u6570 proxy \u7684 Activity\u3002

    \u793A\u4F8B\u5982\u4E0B

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u586B\u5165\u7684 Activity \u540D\u79F0\u771F\u5B9E\u6709\u6548\u5730\u5B58\u5728\u4E8E\u5BBF\u4E3B\u4E2D\uFF0C\u4E14\u76EE\u6807 Class \u7EE7\u627F\u4E8E Activity\u3002

    \u963B\u65AD\u5F02\u5E38

    \u8FD9\u4E9B\u5F02\u5E38\u4F1A\u76F4\u63A5\u5BFC\u81F4 APP \u505C\u6B62\u8FD0\u884C(FC)\uFF0C\u540C\u65F6\u4F1A\u5728\u63A7\u5236\u53F0\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u8FD8\u4F1A\u9020\u6210 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u4F7F\u7528 YukiHookAPI \u7684\u76F8\u5173\u53CD\u5C04\u6216 Hook \u529F\u80FD\u8C03\u7528\u4E86 API \u81EA\u8EAB\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F1>
    +

    \u89E3\u51B3\u65B9\u6848

    \u9ED8\u8BA4\u53C2\u6570 (\u65E0\u53C2) \u53EA\u80FD\u7528\u4E8E\u53EF\u88AB\u542F\u52A8\u7684 APP\uFF0C\u82E5 APP \u5E76\u672A\u58F0\u660E\u542F\u52A8\u5165\u53E3 Activity\uFF0C\u4F60\u5C31\u9700\u8981\u624B\u52A8\u6307\u5B9A\u65B9\u6CD5\u7684 proxy \u53C2\u6570\u3002

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 registerModuleAppActivities \u6CE8\u5165\u6A21\u5757 Activity \u65F6\u65E0\u6CD5\u627E\u5230\u88AB\u586B\u5165\u53C2\u6570 proxy \u7684 Activity\u3002

    \u793A\u4F8B\u5982\u4E0B

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u586B\u5165\u7684 Activity \u540D\u79F0\u771F\u5B9E\u6709\u6548\u5730\u5B58\u5728\u4E8E\u5BBF\u4E3B\u4E2D\uFF0C\u4E14\u76EE\u6807 Class \u7EE7\u627F\u4E8E Activity\u3002

    exception

    loggerE

    You cannot register Activity Proxy into yourself

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883 (\u6A21\u5757\u81EA\u8EAB\u7684 Xposed \u73AF\u5883) \u4E2D\u4F7F\u7528 registerModuleAppActivities \u5C06\u6A21\u5757\u81EA\u8EAB Activity \u6CE8\u5165\u81EA\u8EAB\u3002

    \u89E3\u51B3\u65B9\u6848

    \u7531\u4E8E\u6A21\u5757\u81EA\u8EAB\u4E5F\u53EF\u4EE5\u88AB\u81EA\u8EAB Hook\uFF0C\u4F46\u4F60\u5E76\u4E0D\u53EF\u4EE5\u5728\u6A21\u5757\u81EA\u8EAB\u6CE8\u5165\u81EA\u5DF1 (\u4E0D\u80FD\u9012\u5F52\u81EA\u8EAB\u7684\u8D44\u6E90)\uFF0C\u82E5\u4F60\u4E00\u5B9A\u8981\u83B7\u53D6\u6A21\u5757\u81EA\u8EAB\u7684\u8D44\u6E90\uFF0C\u8BF7\u76F4\u63A5\u4F7F\u7528\u5373\u53EF\uFF0C\u65E0\u9700\u4EFB\u4F55\u5176\u5B83\u64CD\u4F5C\u3002

    exception

    loggerE

    Activity Proxy only support for Android 7.0 (API 24) or higher

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883 (\u6A21\u5757\u81EA\u8EAB\u7684 Xposed \u73AF\u5883) \u4E2D\u4F7F\u7528 registerModuleAppActivities \u4F46\u662F\u5F53\u524D\u7CFB\u7EDF\u7248\u672C\u4E0D\u6EE1\u8DB3 Android 7.0 (API 24) \u6700\u4F4E\u8981\u6C42\u3002

    \u89E3\u51B3\u65B9\u6848

    Activity Proxy \u4EC5\u652F\u6301\u9AD8\u4E8E\u6216\u7B49\u4E8E Android 7.0 (API 24) \u7684\u7CFB\u7EDF\uFF0C\u8BF7\u5C1D\u8BD5\u5347\u7EA7\u4F60\u7684\u7CFB\u7EDF\u6216\u5BF9\u6A21\u5757 APP \u6700\u4F4E\u7CFB\u7EDF\u7248\u672C\u517C\u5BB9\u6027\u505A\u51FA\u8981\u6C42\uFF0C\u4F8B\u5982\u8BBE\u7F6E Min API \u4E3A 24\u3002

    exception

    loggerE

    An exception occurred during AppLifecycle event

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u4F7F\u7528 onAppLifecycle \u76D1\u542C\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u671F\u95F4\u53D1\u751F\u5F02\u5E38\u3002

    \u89E3\u51B3\u65B9\u6848

    \u6B64\u5F02\u5E38\u4E3A onAppLifecycle \u4E2D\u629B\u51FA\uFF0C\u7531\u4E8E\u4F60\u8BBE\u7F6E\u4E86\u53C2\u6570 isOnFailureThrowToApp = false\uFF0C\u5F02\u5E38\u6CA1\u6709\u5728\u5BBF\u4E3B\u4E2D\u88AB\u629B\u51FA\u800C\u662F\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u8FDB\u884C\u6253\u5370\uFF0C\u8FD9\u4E0D\u5C5E\u4E8E API \u7684\u5F02\u5E38\uFF0C\u8BF7\u4ED4\u7EC6\u68C0\u67E5\u81EA\u8EAB\u4EE3\u7801\u7684\u95EE\u9898\u3002

    \u963B\u65AD\u5F02\u5E38

    \u8FD9\u4E9B\u5F02\u5E38\u4F1A\u76F4\u63A5\u5BFC\u81F4 APP \u505C\u6B62\u8FD0\u884C(FC)\uFF0C\u540C\u65F6\u4F1A\u5728\u63A7\u5236\u53F0\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u8FD8\u4F1A\u9020\u6210 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

    exception

    IllegalStateException

    YukiHookAPI cannot support current Hook API or cannot found any available Hook APIs in current environment

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u4E0D\u652F\u6301\u5F53\u524D\u73AF\u5883\u4F7F\u7528\u7684 Hook API \u6216\u4E0D\u5B58\u5728 Hook API \u53EF\u88AB\u8C03\u7528\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60\u5728\u6B63\u786E\u7684\u5730\u65B9\u88C5\u8F7D\u4E86 YukiHookAPI \u7684 encase \u65B9\u6CD5\uFF0C\u8BE6\u60C5\u8BF7\u53C2\u8003 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E \u4EE5\u53CA \u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u3002

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u4F7F\u7528 YukiHookAPI \u7684\u76F8\u5173\u53CD\u5C04\u6216 Hook \u529F\u80FD\u8C03\u7528\u4E86 API \u81EA\u8EAB\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F1>
     YukiHookAPI.current()
     // <\u60C5\u666F2>
     PackageParam::class.java.hook {
    @@ -150,7 +150,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // <\u60C5\u666F3> MethodFinder::class.java.method { name = "name" - param(StringType) + param(StringClass) }.get().call("name") // ...

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u4EE3\u7801\u90E8\u5206\u662F\u5426\u6709\u9519\u8BEF\uFF0C\u4F8B\u5982\u4E0B\u9762\u7684\u60C5\u51B5\u3002

    \u793A\u4F8B\u5982\u4E0B

    YourClass.method {
    @@ -161,7 +161,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5047\u8BBE\u6B64\u65B9\u6CD5\u65E0\u53C2 }.get(instance).call().current() -

    \u4E0D\u5141\u8BB8\u5185\u8054\u3001\u53CD\u5C04\u3001Hook YukiHookAPI \u81EA\u8EAB\u7684 Class \u4EE5\u53CA\u5185\u90E8\u529F\u80FD\uFF0C\u9632\u6B62\u53D1\u751F\u9519\u8BEF\u3002

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u5C1D\u8BD5 Hook \u4E86\u5904\u4E8E\u5371\u9669\u884C\u4E3A\u5217\u8868\u4E2D\u7684 Class \u5BF9\u8C61\uFF0C\u4F8B\u5982 Class\u3001ClassLoader\u3001Method\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F1>
    +

    \u4E0D\u5141\u8BB8\u5185\u8054\u3001\u53CD\u5C04\u3001Hook YukiHookAPI \u81EA\u8EAB\u7684 Class \u4EE5\u53CA\u5185\u90E8\u529F\u80FD\uFF0C\u9632\u6B62\u53D1\u751F\u9519\u8BEF\u3002

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    \u5F02\u5E38\u539F\u56E0

    \u4F60\u5C1D\u8BD5 Hook \u4E86\u5904\u4E8E\u5371\u9669\u884C\u4E3A\u5217\u8868\u4E2D\u7684 Class \u5BF9\u8C61\uFF0C\u4F8B\u5982 Class\u3001ClassLoader\u3001Method\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F1>
     JavaClassLoader.hook {
         // ...
     }
    @@ -174,18 +174,18 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    // ... } // ... -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u4E9B\u529F\u80FD\u662F\u7CFB\u7EDF\u5185\u90E8\u7684\uFF0C\u5B83\u4EEC\u4E0D\u5E94\u8BE5\u88AB Hook\uFF0C\u5728\u90E8\u5206 Hook Framework \u4E0A\u53EF\u80FD\u4E0D\u88AB\u652F\u6301\uFF0C\u8FD8\u4F1A\u5F15\u53D1\u5176\u5B83\u9519\u8BEF\uFF0C\u8BF7\u5C1D\u8BD5\u66F4\u6362 Hook \u70B9\u3002

    \u5C0F\u63D0\u793A

    \u82E5\u4F60\u4ECD\u8981\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u8BF7\u53C2\u8003 YukiMemberHookCreator.useDangerousOperation\u3002

    \u4F46\u662F\u5F3A\u70C8\u5EFA\u8BAE\u4E0D\u8981\u8FD9\u6837\u505A\uFF0C\u53D1\u751F\u95EE\u9898\u8BF7\u4E0D\u8981\u53CD\u9988\uFF0C\u81EA\u884C\u627F\u62C5\u4E00\u5207\u540E\u679C\u3002

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7 String.toClass(...) \u6216 classOf<...>() \u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.demo.Test".toClass()
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u5F53\u524D\u5B57\u7B26\u4E32\u6216\u5B9E\u4F53\u5339\u914D\u5230\u7684 Class \u662F\u5426\u5B58\u5728\u4E8E\u5F53\u524D ClassLoader\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 ClassLoader.searchClass \u6216 PackageParam.searchClass \u67E5\u627E Class \u4F46\u662F\u5F53\u524D ClassLoader \u5E76\u4E0D\u7EE7\u627F\u4E8E BaseDexClassLoader\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u5F53\u524D APP \u5F15\u7528\u4E86\u975E ART \u5E73\u53F0\u7684\u53EF\u6267\u884C\u6587\u4EF6 (\u4F46\u662F\u8FD9\u79CD\u60C5\u51B5\u8FD8\u662F\u4E0D\u4F1A\u5B58\u5728) \u6216\u5F53\u524D ClassLoader \u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    Failed to got SystemContext

    \u5F02\u5E38\u539F\u56E0

    \u5728\u88AB Hook \u7684\u5BBF\u4E3B\u5185\u8C03\u7528\u4E86 systemContext \u4F46\u5E76\u672A\u6210\u529F\u83B7\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u4E9B\u529F\u80FD\u662F\u7CFB\u7EDF\u5185\u90E8\u7684\uFF0C\u5B83\u4EEC\u4E0D\u5E94\u8BE5\u88AB Hook\uFF0C\u5728\u90E8\u5206 Hook Framework \u4E0A\u53EF\u80FD\u4E0D\u88AB\u652F\u6301\uFF0C\u8FD8\u4F1A\u5F15\u53D1\u5176\u5B83\u9519\u8BEF\uFF0C\u8BF7\u5C1D\u8BD5\u66F4\u6362 Hook \u70B9\u3002

    \u5C0F\u63D0\u793A

    \u82E5\u4F60\u4ECD\u8981\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u8BF7\u53C2\u8003 YukiMemberHookCreator.useDangerousOperation \u65B9\u6CD5\u3002

    \u4F46\u662F\u5F3A\u70C8\u5EFA\u8BAE\u4E0D\u8981\u8FD9\u6837\u505A\uFF0C\u53D1\u751F\u95EE\u9898\u8BF7\u4E0D\u8981\u53CD\u9988\uFF0C\u81EA\u884C\u627F\u62C5\u4E00\u5207\u540E\u679C\u3002

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    \u5F02\u5E38\u539F\u56E0

    \u901A\u8FC7 String.toClass(...) \u6216 classOf<...>() \u627E\u4E0D\u5230\u9700\u8981\u67E5\u627E\u7684 Class \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.demo.Test".toClass()
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u68C0\u67E5\u5F53\u524D\u5B57\u7B26\u4E32\u6216\u5B9E\u4F53\u5339\u914D\u5230\u7684 Class \u662F\u5426\u5B58\u5728\u4E8E\u5F53\u524D ClassLoader\uFF0C\u5E76\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 ClassLoader.searchClass \u6216 PackageParam.searchClass \u67E5\u627E Class \u4F46\u662F\u5F53\u524D ClassLoader \u5E76\u4E0D\u7EE7\u627F\u4E8E BaseDexClassLoader\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u5F53\u524D APP \u5F15\u7528\u4E86\u975E ART \u5E73\u53F0\u7684\u53EF\u6267\u884C\u6587\u4EF6 (\u4F46\u662F\u8FD9\u79CD\u60C5\u51B5\u8FD8\u662F\u4E0D\u4F1A\u5B58\u5728) \u6216\u5F53\u524D ClassLoader \u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    Failed to got SystemContext

    \u5F02\u5E38\u539F\u56E0

    \u5728\u88AB Hook \u7684\u5BBF\u4E3B\u5185\u8C03\u7528\u4E86 systemContext \u4F46\u5E76\u672A\u6210\u529F\u83B7\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
         // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
         systemContext...
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u4E0D\u5E94\u8BE5\u5B58\u5728\uFF0C\u7531\u4E8E systemContext \u901A\u8FC7\u53CD\u5C04\u4ECE ActivityThread \u4E2D\u5F97\u5230\uFF0C\u9664\u975E\u7CFB\u7EDF\u8FDB\u7A0B\u53D1\u751F\u5F02\u5E38\uFF0C\u5426\u5219\u83B7\u53D6\u5230\u7684\u5BF9\u8C61\u4E0D\u4F1A\u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    \u5F02\u5E38\u539F\u56E0

    \u7B2C\u4E00\u79CD\u60C5\u51B5

    \u5728\u88AB Hook \u7684\u5BBF\u4E3B\u5185\u8C03\u7528\u4E86 ModuleApplication \u7684 appContext\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u4E0D\u5E94\u8BE5\u5B58\u5728\uFF0C\u7531\u4E8E systemContext \u901A\u8FC7\u53CD\u5C04\u4ECE ActivityThread \u4E2D\u5F97\u5230\uFF0C\u9664\u975E\u7CFB\u7EDF\u8FDB\u7A0B\u53D1\u751F\u5F02\u5E38\uFF0C\u5426\u5219\u83B7\u53D6\u5230\u7684\u5BF9\u8C61\u4E0D\u4F1A\u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    \u5F02\u5E38\u539F\u56E0

    \u7B2C\u4E00\u79CD\u60C5\u51B5

    \u5728\u88AB Hook \u7684\u5BBF\u4E3B\u5185\u8C03\u7528\u4E86 ModuleApplication \u7684 appContext\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
         // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
         ModuleApplication.appContext...
     }
     

    \u7B2C\u4E8C\u79CD\u60C5\u51B5

    \u4F7F\u7528 ModuleApplication \u65F6\u8C03\u7528\u4E86 appContext \u4F46\u662F APP \u53EF\u80FD\u5DF2\u7ECF\u88AB\u9500\u6BC1\u6216\u6CA1\u6709\u6B63\u786E\u542F\u52A8\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF\u4F46\u662F APP \u53EF\u80FD\u5DF2\u88AB\u9500\u6BC1\u6216\u6CA1\u6709\u6B63\u786E\u542F\u52A8
     ModuleApplication.appContext...
    -

    \u89E3\u51B3\u65B9\u6848

    \u7B2C\u4E00\u79CD\u60C5\u51B5

    \u4F60\u53EA\u80FD\u5728\u6A21\u5757\u5185\u4F7F\u7528 ModuleApplication \u7684 appContext\uFF0C\u5728\u5BBF\u4E3B\u5185\u8BF7\u4F7F\u7528 PackageParam \u4E2D\u7684 appContext\uFF0C\u8BF7\u786E\u8BA4\u4F60\u4F7F\u7528\u7684\u662F\u5426\u6B63\u786E\u3002

    \u7B2C\u4E8C\u79CD\u60C5\u51B5

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0D\u5B58\u5728\uFF0C\u7531\u4E8E appContext \u662F\u5728 onCreate \u4E2D\u88AB\u8D4B\u503C\u7684\uFF0C\u9664\u975E\u9047\u5230\u591A\u8FDB\u7A0B\u5E76\u53D1\u542F\u52A8\u6216 APP \u6CA1\u6709\u542F\u52A8\u5B8C\u6210\u524D\u88AB\u53CD\u5C04\u8C03\u7528\u4E86\u7236\u7C7B\u7684 onCreate \u65B9\u6CD5\u3002

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u81EA\u8EAB APP(\u975E Xposed \u6A21\u5757) \u4E2D\u4F7F\u7528\u4E86 YukiHookModulePrefs\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
    +

    \u89E3\u51B3\u65B9\u6848

    \u7B2C\u4E00\u79CD\u60C5\u51B5

    \u4F60\u53EA\u80FD\u5728\u6A21\u5757\u5185\u4F7F\u7528 ModuleApplication \u7684 appContext\uFF0C\u5728\u5BBF\u4E3B\u5185\u8BF7\u4F7F\u7528 PackageParam \u4E2D\u7684 appContext\uFF0C\u8BF7\u786E\u8BA4\u4F60\u4F7F\u7528\u7684\u662F\u5426\u6B63\u786E\u3002

    \u7B2C\u4E8C\u79CD\u60C5\u51B5

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0D\u5B58\u5728\uFF0C\u7531\u4E8E appContext \u662F\u5728 onCreate \u4E2D\u88AB\u8D4B\u503C\u7684\uFF0C\u9664\u975E\u9047\u5230\u591A\u8FDB\u7A0B\u5E76\u53D1\u542F\u52A8\u6216 APP \u6CA1\u6709\u542F\u52A8\u5B8C\u6210\u524D\u88AB\u53CD\u5C04\u8C03\u7528\u4E86\u7236\u7C7B\u7684 onCreate \u65B9\u6CD5\u3002

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u81EA\u8EAB APP(\u975E Xposed \u6A21\u5757) \u4E2D\u4F7F\u7528\u4E86 YukiHookModulePrefs\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -195,11 +195,11 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    super.attachBaseContext(base) } } -

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u65F6\u4F7F\u7528 YukiHookModulePrefs\uFF0C\u5728 Hook \u81EA\u8EAB APP \u4E2D\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Sp \u5B58\u50A8\u3002

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u4E86 YukiHookModulePrefs \u4F46\u662F\u65E0\u6CD5\u5F97\u5230 XSharedPreferences \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
    +

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u65F6\u4F7F\u7528 YukiHookModulePrefs\uFF0C\u5728 Hook \u81EA\u8EAB APP \u4E2D\u8BF7\u4F7F\u7528\u539F\u751F\u7684 Sp \u5B58\u50A8\u3002

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    \u5F02\u5E38\u539F\u56E0

    \u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u4E86 YukiHookModulePrefs \u4F46\u662F\u65E0\u6CD5\u5F97\u5230 XSharedPreferences \u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
         // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
         prefs...
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u53D1\u751F\u6B64\u95EE\u9898\uFF0C\u82E5\u6301\u7EED\u65E0\u6CD5\u83B7\u53D6 XSharedPreferences \u5BF9\u8C61\u5219\u53EF\u80FD\u662F\u4F60\u4F7F\u7528\u7684 Hook Framework \u4E0D\u652F\u6301\u6B64\u529F\u80FD\u6216\u81EA\u8EAB\u5B58\u5728\u9519\u8BEF\u3002

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u81EA\u8EAB APP(\u975E Xposed \u6A21\u5757) \u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
    +

    \u89E3\u51B3\u65B9\u6848

    \u4E00\u822C\u60C5\u51B5\u4E0B\u4E0D\u4F1A\u53D1\u751F\u6B64\u95EE\u9898\uFF0C\u82E5\u6301\u7EED\u65E0\u6CD5\u83B7\u53D6 XSharedPreferences \u5BF9\u8C61\u5219\u53EF\u80FD\u662F\u4F60\u4F7F\u7528\u7684 Hook Framework \u4E0D\u652F\u6301\u6B64\u529F\u80FD\u6216\u81EA\u8EAB\u5B58\u5728\u9519\u8BEF\u3002

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u81EA\u8EAB APP(\u975E Xposed \u6A21\u5757) \u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -211,7 +211,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    super.attachBaseContext(base) } } -

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u65F6\u4F7F\u7528 YukiHookDataChannel\u3002

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    \u5F02\u5E38\u539F\u56E0

    \u5728\u6A21\u5757\u7684\u975E Activity \u73AF\u5883\u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 Activity \u6216 Fragment \u4E2D\u4F7F\u7528 YukiHookDataChannel\u3002

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u8FC7\u7A0B\u4E2D\u4F7F\u7528 YukiHookModulePrefs \u6216 YukiHookDataChannel \u65F6\u65E0\u6CD5\u8BFB\u53D6\u88C5\u8F7D\u65F6\u7684 modulePackageName \u5BFC\u81F4\u4E0D\u80FD\u786E\u5B9A\u81EA\u8EAB\u6A21\u5757\u7684\u5305\u540D\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u4ED4\u7EC6\u9605\u8BFB \u8FD9\u91CC \u7684\u5E2E\u52A9\u6587\u6863\uFF0C\u6B63\u786E\u914D\u7F6E\u6A21\u5757\u7684 Hook \u5165\u53E3\u7C7B\u5305\u540D\u3002

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    \u5F02\u5E38\u539F\u56E0

    \u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u4E86 YukiHookModulePrefs \u5B58\u50A8\u6570\u636E\u4F46\u5E76\u672A\u4F20\u5165 Context \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MainActivity : AppCompatActivity() {
    +

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528 \u65F6\u4F7F\u7528 YukiHookDataChannel\u3002

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    \u5F02\u5E38\u539F\u56E0

    \u5728\u6A21\u5757\u7684\u975E Activity \u73AF\u5883\u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u89E3\u51B3\u65B9\u6848

    \u4F60\u53EA\u80FD\u5728 Activity \u6216 Fragment \u4E2D\u4F7F\u7528 YukiHookDataChannel\u3002

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    \u5F02\u5E38\u539F\u56E0

    \u5728 Hook \u8FC7\u7A0B\u4E2D\u4F7F\u7528 YukiHookModulePrefs \u6216 YukiHookDataChannel \u65F6\u65E0\u6CD5\u8BFB\u53D6\u88C5\u8F7D\u65F6\u7684 modulePackageName \u5BFC\u81F4\u4E0D\u80FD\u786E\u5B9A\u81EA\u8EAB\u6A21\u5757\u7684\u5305\u540D\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u4ED4\u7EC6\u9605\u8BFB \u8FD9\u91CC \u7684\u5E2E\u52A9\u6587\u6863\uFF0C\u6B63\u786E\u914D\u7F6E\u6A21\u5757\u7684 Hook \u5165\u53E3\u7C7B\u5305\u540D\u3002

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    \u5F02\u5E38\u539F\u56E0

    \u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u4E86 YukiHookModulePrefs \u5B58\u50A8\u6570\u636E\u4F46\u5E76\u672A\u4F20\u5165 Context \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    @@ -228,7 +228,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    modulePrefs.getBoolean("test_data") } } -

    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728\u4F7F\u7528 YukiHookModulePrefs \u7684 get \u6216 put \u65B9\u6CD5\u6216 YukiHookDataChannel \u7684 wait \u6216 put \u65B9\u6CD5\u65F6\u4F20\u5165\u4E86\u4E0D\u652F\u6301\u7684\u5B58\u50A8\u7C7B\u578B\u3002

    \u89E3\u51B3\u65B9\u6848

    YukiHookModulePrefs \u652F\u6301\u7684\u7C7B\u578B\u53EA\u6709 String\u3001Set<String>\u3001Int\u3001Float\u3001Long\u3001Boolean\uFF0C\u8BF7\u4F20\u5165\u652F\u6301\u7684\u7C7B\u578B\u3002

    YukiHookDataChannel \u652F\u6301\u7684\u7C7B\u578B\u4E3A Intent.putExtra \u9650\u5236\u7684\u7C7B\u578B\uFF0C\u8BF7\u4F20\u5165\u652F\u6301\u7684\u7C7B\u578B\u3002

    exception

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    \u5F02\u5E38\u539F\u56E0

    \u5728 loadApp\u3001loadZygote\u3001loadSystem\u3001withProcess \u4E2D\u7F3A\u5C11\u4E86\u9700\u8981\u586B\u5199\u7684\u53EF\u53D8\u6570\u7EC4\u53D8\u91CF\u53C2\u6570\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F 1>
    +
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    \u5F02\u5E38\u539F\u56E0

    \u5728\u4F7F\u7528 YukiHookModulePrefs \u7684 get \u6216 put \u65B9\u6CD5\u6216 YukiHookDataChannel \u7684 wait \u6216 put \u65B9\u6CD5\u65F6\u4F20\u5165\u4E86\u4E0D\u652F\u6301\u7684\u5B58\u50A8\u7C7B\u578B\u3002

    \u89E3\u51B3\u65B9\u6848

    YukiHookModulePrefs \u652F\u6301\u7684\u7C7B\u578B\u53EA\u6709 String\u3001Set<String>\u3001Int\u3001Float\u3001Long\u3001Boolean\uFF0C\u8BF7\u4F20\u5165\u652F\u6301\u7684\u7C7B\u578B\u3002

    YukiHookDataChannel \u652F\u6301\u7684\u7C7B\u578B\u4E3A Intent.putExtra \u9650\u5236\u7684\u7C7B\u578B\uFF0C\u8BF7\u4F20\u5165\u652F\u6301\u7684\u7C7B\u578B\u3002

    exception

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    \u5F02\u5E38\u539F\u56E0

    \u5728 loadApp\u3001loadZygote\u3001loadSystem\u3001withProcess \u4E2D\u7F3A\u5C11\u4E86\u9700\u8981\u586B\u5199\u7684\u53EF\u53D8\u6570\u7EC4\u53D8\u91CF\u53C2\u6570\u3002

    \u793A\u4F8B\u5982\u4E0B

    // <\u60C5\u666F 1>
     loadApp()
     // <\u60C5\u666F 2> 
     loadZygote()
    @@ -236,18 +236,18 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    loadSystem() // <\u60C5\u666F 4> withProcess() -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u67E5\u770B PackageParam \u4E2D\u7684\u7528\u6CD5\u6B63\u786E\u5730\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    exception

    IllegalStateException

    YukiHookDataChannel cannot used in zygote

    \u5F02\u5E38\u539F\u56E0

    \u5728 loadZygote \u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadZygote {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u67E5\u770B PackageParam \u4E2D\u7684\u7528\u6CD5\u6B63\u786E\u5730\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    exception

    IllegalStateException

    YukiHookDataChannel cannot used in zygote

    \u5F02\u5E38\u539F\u56E0

    \u5728 loadZygote \u4E2D\u4F7F\u7528\u4E86 YukiHookDataChannel\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadZygote {
         // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
         dataChannel...
     }
    -

    \u89E3\u51B3\u65B9\u6848

    YukiHookDataChannel \u53EA\u80FD\u5728 loadSystem\u3001loadApp \u4E2D\u4F7F\u7528\u3002

    exception

    IllegalStateException

    Custom Hooking Members is empty

    \u5F02\u5E38\u539F\u56E0

    \u5728 MemberHookCreator \u4E2D\u8C03\u7528 members() \u4F46\u662F\u672A\u8BBE\u7F6E\u9700\u8981 Hook \u7684 Member \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    YukiHookDataChannel \u53EA\u80FD\u5728 loadSystem\u3001loadApp \u4E2D\u4F7F\u7528\u3002

    exception

    IllegalStateException

    Custom Hooking Members is empty

    \u5F02\u5E38\u539F\u56E0

    \u5728 MemberHookCreator \u4E2D\u8C03\u7528 members() \u4F46\u662F\u672A\u8BBE\u7F6E\u9700\u8981 Hook \u7684 Member \u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // \u62EC\u53F7\u91CC\u7684\u65B9\u6CD5\u53C2\u6570\u88AB\u7559\u7A7A\u4E86
         members()
         afterHook {
             // ...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u82E5\u8981\u4F7F\u7528 members() \u8BBE\u7F6E\u81EA\u5B9A\u4E49 Hook \u65B9\u6CD5\uFF0C\u4F60\u5FC5\u987B\u4FDD\u8BC1\u5176\u65B9\u6CD5\u53C2\u6570\u91CC\u7684 Member \u6570\u7EC4\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 args().last() \u4F46\u662F\u76EE\u6807 param \u4E3A\u7A7A\u6216 args \u4E2D\u7684 index \u8BBE\u7F6E\u4E86\u5C0F\u4E8E 0 \u7684\u6570\u503C\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u82E5\u8981\u4F7F\u7528 members() \u8BBE\u7F6E\u81EA\u5B9A\u4E49 Hook \u65B9\u6CD5\uFF0C\u4F60\u5FC5\u987B\u4FDD\u8BC1\u5176\u65B9\u6CD5\u53C2\u6570\u91CC\u7684 Member \u6570\u7EC4\u5BF9\u8C61\u4E0D\u80FD\u4E3A\u7A7A\u3002

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 args().last() \u4F46\u662F\u76EE\u6807 param \u4E3A\u7A7A\u6216 args \u4E2D\u7684 index \u8BBE\u7F6E\u4E86\u5C0F\u4E8E 0 \u7684\u6570\u503C\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u5047\u8BBE param \u662F\u7A7A\u7684
    @@ -256,7 +256,7 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    args(index = -5)... } } -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u91CF\u662F\u5426\u4E0D\u4E3A\u7A7A\uFF0C\u4E14\u4E0D\u80FD\u5BF9 args \u7684\u4E0B\u6807\u8BBE\u7F6E\u5C0F\u4E8E 0 \u7684\u6570\u503C\u3002

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 instance \u53D8\u91CF\u6216 instance \u65B9\u6CD5\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u91CF\u662F\u5426\u4E0D\u4E3A\u7A7A\uFF0C\u4E14\u4E0D\u80FD\u5BF9 args \u7684\u4E0B\u6807\u8BBE\u7F6E\u5C0F\u4E8E 0 \u7684\u6570\u503C\u3002

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 instance \u53D8\u91CF\u6216 instance \u65B9\u6CD5\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
    @@ -265,68 +265,64 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    instance<Any>()... } } -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u5426\u4E3A\u9759\u6001\u7C7B\u578B\uFF0C\u9759\u6001\u7C7B\u578B\u7684\u65B9\u6CD5\u6CA1\u6709\u5B9E\u4F8B\uFF0C\u4E0D\u80FD\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u82E5\u975E\u9759\u6001\u65B9\u6CD5\uFF0C\u8BF7\u68C0\u67E5\u5B9E\u4F8B\u662F\u5426\u5DF2\u7ECF\u9500\u6BC1\u3002

    exception

    IllegalStateException

    Current hooked Member args is null

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 args \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u53C2\u6570\u6570\u7EC4\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u5426\u4E3A\u9759\u6001\u7C7B\u578B\uFF0C\u9759\u6001\u7C7B\u578B\u7684\u65B9\u6CD5\u6CA1\u6709\u5B9E\u4F8B\uFF0C\u4E0D\u80FD\u4F7F\u7528\u6B64\u529F\u80FD\uFF0C\u82E5\u975E\u9759\u6001\u65B9\u6CD5\uFF0C\u8BF7\u68C0\u67E5\u5B9E\u4F8B\u662F\u5426\u5DF2\u7ECF\u9500\u6BC1\u3002

    exception

    IllegalStateException

    Current hooked Member args is null

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 args \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u53C2\u6570\u6570\u7EC4\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
             args...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u95EE\u9898\u4E00\u822C\u4E0D\u4F1A\u53D1\u751F\uFF0C\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    Current hooked Member is null

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 member \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u95EE\u9898\u4E00\u822C\u4E0D\u4F1A\u53D1\u751F\uFF0C\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    Current hooked Member is null

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 member \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
             member...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u95EE\u9898\u4E00\u822C\u4E0D\u4F1A\u53D1\u751F\uFF0C\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    Current hooked Member is not a Method

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 method \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u95EE\u9898\u4E00\u822C\u4E0D\u4F1A\u53D1\u751F\uFF0C\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    Current hooked Member is not a Method

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 method \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
             method...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u6784\u9020\u65B9\u6CD5\u8FD8\u662F\u666E\u901A\u65B9\u6CD5\u5E76\u4F7F\u7528\u5BF9\u5E94\u7C7B\u578B\u7684\u65B9\u6CD5\u83B7\u53D6\u6307\u5B9A\u7684\u5B9E\u4F8B\uFF0C\u82E5\u4E0D\u77E5\u9053\u5B57\u8282\u7801\u7684\u7C7B\u578B\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 member \u6765\u83B7\u53D6\u3002

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 constructor \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u6784\u9020\u65B9\u6CD5\u8FD8\u662F\u666E\u901A\u65B9\u6CD5\u5E76\u4F7F\u7528\u5BF9\u5E94\u7C7B\u578B\u7684\u65B9\u6CD5\u83B7\u53D6\u6307\u5B9A\u7684\u5B9E\u4F8B\uFF0C\u82E5\u4E0D\u77E5\u9053\u5B57\u8282\u7801\u7684\u7C7B\u578B\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 member \u6765\u83B7\u53D6\u3002

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 constructor \u53D8\u91CF\u4F46\u83B7\u53D6\u4E0D\u5230\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
             constructor...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u666E\u901A\u65B9\u6CD5\u8FD8\u662F\u6784\u9020\u65B9\u6CD5\u5E76\u4F7F\u7528\u5BF9\u5E94\u7C7B\u578B\u7684\u65B9\u6CD5\u83B7\u53D6\u6307\u5B9A\u7684\u5B9E\u4F8B\uFF0C\u82E5\u4E0D\u77E5\u9053\u5B57\u8282\u7801\u7684\u7C7B\u578B\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 member \u6765\u83B7\u53D6\u3002

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 instance \u65B9\u6CD5\u6307\u5B9A\u4E86\u9519\u8BEF\u7684\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u65B9\u6CD5\u662F\u666E\u901A\u65B9\u6CD5\u8FD8\u662F\u6784\u9020\u65B9\u6CD5\u5E76\u4F7F\u7528\u5BF9\u5E94\u7C7B\u578B\u7684\u65B9\u6CD5\u83B7\u53D6\u6307\u5B9A\u7684\u5B9E\u4F8B\uFF0C\u82E5\u4E0D\u77E5\u9053\u5B57\u8282\u7801\u7684\u7C7B\u578B\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 member \u6765\u83B7\u53D6\u3002

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 instance \u65B9\u6CD5\u6307\u5B9A\u4E86\u9519\u8BEF\u7684\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u7C7B\u578B\u88AB cast \u4E3A Activity \u4F46\u5047\u8BBE\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u578B\u5E76\u975E\u6B64\u7C7B\u578B
             instance<Activity>()...
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u6B63\u786E\u7C7B\u578B\u5E76\u91CD\u65B0\u586B\u5199\u6CDB\u578B\u4E2D\u7684\u7C7B\u578B\uFF0C\u82E5\u4E0D\u80FD\u786E\u5B9A\u8BF7\u4F7F\u7528 Any \u6216\u76F4\u63A5\u4F7F\u7528 instance \u53D8\u91CF\u3002

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 ArgsModifyer.set \u65B9\u6CD5\u4F46\u662F\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u7EC4\u4E3A\u7A7A\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u5F53\u524D Hook \u5B9E\u4F8B\u7684\u6B63\u786E\u7C7B\u578B\u5E76\u91CD\u65B0\u586B\u5199\u6CDB\u578B\u4E2D\u7684\u7C7B\u578B\uFF0C\u82E5\u4E0D\u80FD\u786E\u5B9A\u8BF7\u4F7F\u7528 Any \u6216\u76F4\u63A5\u4F7F\u7528 instance \u53D8\u91CF\u3002

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 ArgsModifyer.set \u65B9\u6CD5\u4F46\u662F\u5F53\u524D\u5B9E\u4F8B\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u7EC4\u4E3A\u7A7A\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u8C03\u7528\u4E86\u6B64\u65B9\u6CD5
             args(...).set(...)
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u91CF\u662F\u5426\u4E0D\u4E3A\u7A7A\uFF0C\u5426\u5219\u4F60\u65E0\u6CD5\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 ArgsModifyer.set \u65B9\u6CD5\u6307\u5B9A\u4E86\u8D85\u51FA\u65B9\u6CD5\u53C2\u6570\u4E0B\u6807\u7684\u6570\u7EC4\u5E8F\u53F7\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u6570\u91CF\u662F\u5426\u4E0D\u4E3A\u7A7A\uFF0C\u5426\u5219\u4F60\u65E0\u6CD5\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    \u5F02\u5E38\u539F\u56E0

    \u5728 HookParam \u4E2D\u8C03\u7528 ArgsModifyer.set \u65B9\u6CD5\u6307\u5B9A\u4E86\u8D85\u51FA\u65B9\u6CD5\u53C2\u6570\u4E0B\u6807\u7684\u6570\u7EC4\u5E8F\u53F7\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectMember {
         // ...
         afterHook {
             // \u4E0B\u6807\u4ECE 0 \u5F00\u59CB\uFF0C\u5047\u8BBE\u539F\u59CB\u7684\u53C2\u6570\u4E0B\u6807\u662F 5 \u4E2A\uFF0C\u4F46\u662F\u8FD9\u91CC\u586B\u5199\u4E86 6
             args(index = 6).set(...)
         }
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u4E2A\u6570\uFF0C\u5E76\u91CD\u65B0\u8BBE\u7F6E\u6570\u7EC4\u4E0B\u6807\u3002

    exception

    IllegalStateException

    PackageParam got null ClassLoader

    \u5F02\u5E38\u539F\u56E0

    \u5728 PackageParam \u4E2D\u8C03\u7528\u4E86 appClassLoader \u53D8\u91CF\u4F46\u662F\u65E0\u6CD5\u83B7\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
    -    // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
    -    appClassLoader...
    -}
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u51E0\u4E4E\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u6A21\u5757\u88AB\u88C5\u8F7D\u7684\u5BBF\u4E3B\u6216\u76EE\u6807 Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\uFF0C\u82E5\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    \u5F02\u5E38\u539F\u56E0

    \u5728 PackageParam \u4E2D\u8C03\u7528\u4E86 moduleAppResources \u53D8\u91CF\u4F46\u662F\u65E0\u6CD5\u83B7\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8BF7\u786E\u8BA4\u4F60 Hook \u7684\u76EE\u6807\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u7684\u65B9\u6CD5\u53C2\u6570\u4E2A\u6570\uFF0C\u5E76\u91CD\u65B0\u8BBE\u7F6E\u6570\u7EC4\u4E0B\u6807\u3002

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    \u5F02\u5E38\u539F\u56E0

    \u5728 PackageParam \u4E2D\u8C03\u7528\u4E86 moduleAppResources \u53D8\u91CF\u4F46\u662F\u65E0\u6CD5\u83B7\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    encase {
         // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
         moduleAppResources...
     }
    -

    \u89E3\u51B3\u65B9\u6848

    moduleAppResources \u9700\u8981\u5F53\u524D Hook Framework \u652F\u6301 initZygote \u529F\u80FD\uFF0C\u8BF7\u68C0\u67E5\u540E\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    \u5F02\u5E38\u539F\u56E0

    \u5728\u4F7F\u7528 VariousClass \u521B\u5EFA\u4E0D\u786E\u5B9A\u7684 Class \u5BF9\u8C61\u65F6\u5168\u90E8\u7684 Class \u90FD\u6CA1\u6709\u88AB\u627E\u5230\u3002

    \u89E3\u51B3\u65B9\u6848

    \u68C0\u67E5\u5F53\u524D Hook \u7684\u5BBF\u4E3B\u5185\u662F\u5426\u5B58\u5728\u5176\u4E2D\u80FD\u591F\u5339\u914D\u7684 Class \u540E\uFF0C\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    \u5F02\u5E38\u539F\u56E0

    \u5728 hook \u65B9\u6CD5\u4F53\u975E onPrepareHook \u65B9\u6CD5\u5185\u8C03\u7528\u4E86 instanceClass \u53D8\u91CF\u4E14\u5F53\u524D Hook \u7684 Class \u4E0D\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.hook {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u51E0\u4E4E\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u76EE\u6807 Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\uFF0C\u82E5\u771F\u7684\u53D1\u751F\u4E86\u6B64\u95EE\u9898\uFF0C\u8BF7\u643A\u5E26\u8BE6\u7EC6\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    \u5F02\u5E38\u539F\u56E0

    \u5728\u4F7F\u7528 VariousClass \u521B\u5EFA\u4E0D\u786E\u5B9A\u7684 Class \u5BF9\u8C61\u65F6\u5168\u90E8\u7684 Class \u90FD\u6CA1\u6709\u88AB\u627E\u5230\u3002

    \u89E3\u51B3\u65B9\u6848

    \u68C0\u67E5\u5F53\u524D Hook \u7684\u5BBF\u4E3B\u5185\u662F\u5426\u5B58\u5728\u5176\u4E2D\u80FD\u591F\u5339\u914D\u7684 Class \u540E\uFF0C\u518D\u8BD5\u4E00\u6B21\u3002

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    \u5F02\u5E38\u539F\u56E0

    \u5728 hook \u65B9\u6CD5\u4F53\u975E onPrepareHook \u65B9\u6CD5\u5185\u8C03\u7528\u4E86 instanceClass \u53D8\u91CF\u4E14\u5F53\u524D Hook \u7684 Class \u4E0D\u5B58\u5728\u3002

    \u793A\u4F8B\u5982\u4E0B

    TargetClass.hook {
         // \u53EF\u80FD\u7684\u60C5\u51B5\u4E3A\u5728\u975E onPrepareHook \u65B9\u6CD5\u4F53\u5185\u8C03\u7528\u4E86 instanceClass \u53D8\u91CF\u7528\u4E8E\u6253\u5370\u65E5\u5FD7
         loggerD(msg = "$instanceClass hook start")
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u5728 hook \u5185\u76F4\u63A5\u4F7F\u7528 instanceClass \u662F\u5F88\u5371\u9669\u7684\uFF0C\u82E5 Class \u4E0D\u5B58\u5728\u5219\u4F1A\u76F4\u63A5\u5BFC\u81F4 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

    \u8BE6\u60C5\u8BF7\u53C2\u8003 \u72B6\u6001\u76D1\u542C\u3002

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    \u5F02\u5E38\u539F\u56E0

    \u5728\u5E03\u5C40 Hook \u56DE\u8C03\u4E2D\u8C03\u7528\u4E86 currentView \u4F46\u6CA1\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectResource {
    +

    \u89E3\u51B3\u65B9\u6848

    \u5728 hook \u5185\u76F4\u63A5\u4F7F\u7528 instanceClass \u662F\u5F88\u5371\u9669\u7684\uFF0C\u82E5 Class \u4E0D\u5B58\u5728\u5219\u4F1A\u76F4\u63A5\u5BFC\u81F4 Hook \u8FDB\u7A0B\u201C\u6B7B\u6389\u201D\u3002

    \u8BE6\u60C5\u8BF7\u53C2\u8003 \u72B6\u6001\u76D1\u542C\u3002

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    \u5F02\u5E38\u539F\u56E0

    \u5728\u5E03\u5C40 Hook \u56DE\u8C03\u4E2D\u8C03\u7528\u4E86 currentView \u4F46\u6CA1\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    injectResource {
         conditions {
             name = "activity_main"
             layout()
    @@ -336,9 +332,9 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    currentView... } } -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u88AB Hook \u7684\u5BBF\u4E3B\u5F53\u524D Activity \u5DF2\u7ECF\u9500\u6BC1\u6216 Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\u3002

    exception

    IllegalStateException

    XResForwarder is invalid

    \u5F02\u5E38\u539F\u56E0

    \u5728 YukiResForwarder \u4E2D\u8C03\u7528\u4E86 resources \u4F46\u6CA1\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u9664\u975E\u88AB Hook \u7684\u5BBF\u4E3B\u5F53\u524D Activity \u5DF2\u7ECF\u9500\u6BC1\u6216 Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\u3002

    exception

    IllegalStateException

    XResForwarder is invalid

    \u5F02\u5E38\u539F\u56E0

    \u5728 YukiResForwarder \u4E2D\u8C03\u7528\u4E86 resources \u4F46\u6CA1\u53D6\u5230\u5B9E\u4F8B\u5BF9\u8C61\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u8C03\u7528\u4E86\u6B64\u53D8\u91CF
     moduleAppResources.fwd(...).resources
    -

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u9664\u975E Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\u3002

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u4FDD\u7559\u4E86\u7A7A\u7684 param \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
    +

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u9664\u975E Hook Framework \u81EA\u8EAB\u5B58\u5728\u95EE\u9898\u3002

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    \u5F02\u5E38\u539F\u56E0

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u65F6\u4FDD\u7559\u4E86\u7A7A\u7684 param \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
         name = "test"
         // \u62EC\u53F7\u5185\u6CA1\u6709\u586B\u5199\u4EFB\u4F55\u53C2\u6570
         param()
    @@ -351,12 +347,18 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const o={},l=a(`

    name = "test" paramCount = 0 } -

    exception

    IllegalStateException

    Invalid YukiHookCallback type

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u7684\u6838\u5FC3 Hook \u529F\u80FD\u53D1\u751F\u6545\u969C\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u82E5\u53D1\u751F\u4E0A\u8FF0\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    \u5F02\u5E38\u539F\u56E0

    \u5728 Context \u4E2D\u4F7F\u7528 applyModuleTheme \u65B9\u6CD5\u65F6\u91CD\u590D\u8FDB\u884C\u8C03\u7528\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u5F53\u524D\u7684 Context \u5BF9\u8C61
    +
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    \u5F02\u5E38\u539F\u56E0

    YukiHookAPI \u7684\u6838\u5FC3 Hook \u529F\u80FD\u53D1\u751F\u6545\u969C\u3002

    \u89E3\u51B3\u65B9\u6848

    \u8FD9\u79CD\u60C5\u51B5\u57FA\u672C\u4E0A\u4E0D\u5B58\u5728\uFF0C\u82E5\u53D1\u751F\u4E0A\u8FF0\u95EE\u9898\uFF0C\u786E\u5B9A\u5E76\u975E\u81EA\u5DF1\u7684\u4EE3\u7801\u53D1\u751F\u7684\u95EE\u9898\u540E\uFF0C\u53EF\u63D0\u4EA4\u65E5\u5FD7\u8FDB\u884C\u53CD\u9988\u3002

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    \u5F02\u5E38\u539F\u56E0

    \u5728 Context \u4E2D\u4F7F\u7528 applyModuleTheme \u65B9\u6CD5\u65F6\u91CD\u590D\u8FDB\u884C\u8C03\u7528\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u5F53\u524D\u7684 Context \u5BF9\u8C61
     context.applyModuleTheme(R.style.Theme_AppCompat).applyModuleTheme(R.style.Theme_AppCompat)
    -

    \u89E3\u51B3\u65B9\u6848

    \u5728 Context \u4E2D\u53EA\u80FD\u521B\u5EFA\u4E00\u6B21 ModuleContextThemeWrapper\uFF0C\u8BF7\u68C0\u67E5\u4EE3\u7801\u662F\u5426\u6709\u5FAA\u73AF\u8C03\u7528\u95EE\u9898\u3002

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    \u5F02\u5E38\u539F\u56E0

    \u5728\u7CFB\u7EDF\u6846\u67B6 (android) \u5BBF\u4E3B\u4F7F\u7528\u4E86 DexClassFinder \u7684\u7F13\u5B58\u529F\u80FD searchClass(name = ...)\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadSystem {
    +

    \u89E3\u51B3\u65B9\u6848

    \u5728 Context \u4E2D\u53EA\u80FD\u521B\u5EFA\u4E00\u6B21 ModuleContextThemeWrapper\uFF0C\u8BF7\u68C0\u67E5\u4EE3\u7801\u662F\u5426\u6709\u5FAA\u73AF\u8C03\u7528\u95EE\u9898\u3002

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    \u5F02\u5E38\u539F\u56E0

    \u5728\u7CFB\u7EDF\u6846\u67B6 (android) \u5BBF\u4E3B\u4F7F\u7528\u4E86 DexClassFinder \u7684\u7F13\u5B58\u529F\u80FD searchClass(name = ...)\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadSystem {
         searchClass(name = "test") {
             from(...)
             // ...
         }.get()
     }
    -

    \u89E3\u51B3\u65B9\u6848

    \u7531\u4E8E\u7F13\u5B58\u4F1A\u5C06\u627E\u5230\u7684 Class \u540D\u79F0\u5B58\u5165 SharedPreferences\uFF0C\u4F46\u662F\u7CFB\u7EDF\u6846\u67B6\u4E0D\u5B58\u5728 data \u76EE\u5F55\uFF0C\u6240\u4EE5\u8BF7\u4E0D\u8981\u5728\u7CFB\u7EDF\u6846\u67B6\u4E2D\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    `,542),p=[l];function c(i,t){return n(),e("div",null,p)}const d=s(o,[["render",c],["__file","api-exception.html.vue"]]);export{d as default}; +

    \u89E3\u51B3\u65B9\u6848

    \u7531\u4E8E\u7F13\u5B58\u4F1A\u5C06\u627E\u5230\u7684 Class \u540D\u79F0\u5B58\u5165 SharedPreferences\uFF0C\u4F46\u662F\u7CFB\u7EDF\u6846\u67B6\u4E0D\u5B58\u5728 data \u76EE\u5F55\uFF0C\u6240\u4EE5\u8BF7\u4E0D\u8981\u5728\u7CFB\u7EDF\u6846\u67B6\u4E2D\u4F7F\u7528\u6B64\u529F\u80FD\u3002

    exception

    IllegalStateException

    Target Class type cannot cast to TYPE

    \u5F02\u5E38\u539F\u56E0

    \u4F7F\u7528 Class.toClass\u3001Class.toClassOrNull\u3001GenericClass.argument \u65B9\u6CD5\u5C06\u5B57\u7B26\u4E32\u7C7B\u540D\u8F6C\u6362\u4E3A\u76EE\u6807 Class \u65F6\u58F0\u660E\u4E86\u9519\u8BEF\u7684\u7C7B\u578B\u3002

    \u4EE5\u4E0B\u4F7F\u7528 Class.toClass \u65B9\u6CD5\u6765\u8FDB\u884C\u793A\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u76EE\u6807\u7C7B\u578B\u662F Activity \u4F46\u662F\u88AB\u9519\u8BEF\u5730\u8F6C\u6362\u4E3A\u4E86 WrongClass \u7C7B\u578B
    +val clazz = "android.app.Activity".toClass<WrongClass>()
    +

    \u89E3\u51B3\u65B9\u6848

    \u793A\u4F8B\u5982\u4E0B

    // <\u89E3\u51B3\u65B9\u6848 1> \u586B\u5199\u6B63\u786E\u7684\u7C7B\u578B
    +val clazz1 = "android.app.Activity".toClass<Activity>()
    +// <\u89E3\u51B3\u65B9\u6848 2> \u4E0D\u586B\u5199\u6CDB\u578B\u58F0\u660E
    +val clazz2 = "android.app.Activity".toClass()
    +

    \u8BF7\u786E\u4FDD\u6267\u884C\u65B9\u6CD5\u540E\u58F0\u660E\u7684\u6CDB\u578B\u662F\u6307\u5B9A\u7684\u76EE\u6807 Class \u7C7B\u578B\uFF0C\u5728\u4E0D\u786E\u5B9A\u76EE\u6807\u7C7B\u578B\u7684\u60C5\u51B5\u4E0B\u4F60\u53EF\u4EE5\u4E0D\u9700\u8981\u586B\u5199\u6CDB\u578B\u58F0\u660E\u3002

    `,618),p=[l];function c(i,t){return n(),e("div",null,p)}const d=s(o,[["render",c],["__file","api-exception.html.vue"]]);export{d as default}; diff --git a/docs/assets/api-using.html.52d29a3e.js b/docs/assets/api-using.html.1f938a68.js similarity index 99% rename from docs/assets/api-using.html.52d29a3e.js rename to docs/assets/api-using.html.1f938a68.js index ca649b179..0251cc2a0 100644 --- a/docs/assets/api-using.html.52d29a3e.js +++ b/docs/assets/api-using.html.1f938a68.js @@ -1,4 +1,4 @@ -import{_ as l,r as p,o as c,c as t,b as s,d as e,a as o,e as n}from"./app.99fcdd51.js";const i={},r=o(`

    Use as Hook API Configs

    As a Hook API, it is usually used for Hook operations for hot updates or functional needs of its own app and product testing.

    Dependency Configs

    You just need to integrate the com.highcapable.yukihookapi:api dependency.

    Then please integrate the Hook Framework dependencies used by your target.

    Entry Configs

    Create your custom Application.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    class MyApplication : Application() {
    +import{_ as l,r as p,o as c,c as t,b as s,d as e,a as o,e as n}from"./app.6074a838.js";const i={},r=o(`

    Use as Hook API Configs

    As a Hook API, it is usually used for Hook operations for hot updates or functional needs of its own app and product testing.

    Dependency Configs

    You just need to integrate the com.highcapable.yukihookapi:api dependency.

    Then please integrate the Hook Framework dependencies used by your target.

    Entry Configs

    Create your custom Application.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             // Load Hook Framework
    diff --git a/docs/assets/api-using.html.61ecfdd2.js b/docs/assets/api-using.html.8ff50bb9.js
    similarity index 99%
    rename from docs/assets/api-using.html.61ecfdd2.js
    rename to docs/assets/api-using.html.8ff50bb9.js
    index f4aa2c5a7..843c1dfa8 100644
    --- a/docs/assets/api-using.html.61ecfdd2.js
    +++ b/docs/assets/api-using.html.8ff50bb9.js
    @@ -1,4 +1,4 @@
    -import{_ as l,r as p,o as c,c as r,b as s,d as e,a as o,e as n}from"./app.99fcdd51.js";const t={},i=o(`

    \u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E

    \u4F5C\u4E3A Hook API \u901A\u5E38\u4E3A\u505A\u81EA\u8EAB APP \u70ED\u66F4\u65B0\u6216\u529F\u80FD\u9700\u8981\u4EE5\u53CA\u4EA7\u54C1\u6D4B\u8BD5\u7684 Hook \u64CD\u4F5C\u3002

    \u4F9D\u8D56\u914D\u7F6E

    \u4F60\u53EA\u9700\u8981\u96C6\u6210 com.highcapable.yukihookapi:api \u4F9D\u8D56\u5373\u53EF\u3002

    \u7136\u540E\u8BF7\u96C6\u6210\u4F60\u76EE\u6807\u4F7F\u7528\u7684 Hook Framework \u4F9D\u8D56\u3002

    \u5165\u53E3\u914D\u7F6E

    \u521B\u5EFA\u4F60\u7684\u81EA\u5B9A\u4E49 Application\u3002

    \u5728 attachBaseContext \u4E2D\u6DFB\u52A0 YukiHookAPI.encase \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
    +import{_ as l,r as p,o as c,c as r,b as s,d as e,a as o,e as n}from"./app.6074a838.js";const t={},i=o(`

    \u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E

    \u4F5C\u4E3A Hook API \u901A\u5E38\u4E3A\u505A\u81EA\u8EAB APP \u70ED\u66F4\u65B0\u6216\u529F\u80FD\u9700\u8981\u4EE5\u53CA\u4EA7\u54C1\u6D4B\u8BD5\u7684 Hook \u64CD\u4F5C\u3002

    \u4F9D\u8D56\u914D\u7F6E

    \u4F60\u53EA\u9700\u8981\u96C6\u6210 com.highcapable.yukihookapi:api \u4F9D\u8D56\u5373\u53EF\u3002

    \u7136\u540E\u8BF7\u96C6\u6210\u4F60\u76EE\u6807\u4F7F\u7528\u7684 Hook Framework \u4F9D\u8D56\u3002

    \u5165\u53E3\u914D\u7F6E

    \u521B\u5EFA\u4F60\u7684\u81EA\u5B9A\u4E49 Application\u3002

    \u5728 attachBaseContext \u4E2D\u6DFB\u52A0 YukiHookAPI.encase \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             // \u88C5\u8F7D Hook Framework
    diff --git a/docs/assets/app.6074a838.js b/docs/assets/app.6074a838.js
    new file mode 100644
    index 000000000..c6035638f
    --- /dev/null
    +++ b/docs/assets/app.6074a838.js
    @@ -0,0 +1,10 @@
    +const Jr="modulepreload",Zr=function(e){return"/YukiHookAPI/"+e},Xo={},d=function(t,l,i){return!l||l.length===0?t():Promise.all(l.map(o=>{if(o=Zr(o),o in Xo)return;Xo[o]=!0;const n=o.endsWith(".css"),a=n?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${a}`))return;const r=document.createElement("link");if(r.rel=n?"stylesheet":Jr,n||(r.as="script",r.crossOrigin=""),r.href=o,document.head.appendChild(r),n)return new Promise((s,c)=>{r.addEventListener("load",s),r.addEventListener("error",()=>c(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},es={"v-8daa1a0e":()=>d(()=>import("./index.html.1ad46905.js"),[]).then(({data:e})=>e),"v-2d0a870d":()=>d(()=>import("./index.html.771ceabe.js"),[]).then(({data:e})=>e),"v-c0c85b84":()=>d(()=>import("./index.html.962e6741.js"),[]).then(({data:e})=>e),"v-7a15fe3b":()=>d(()=>import("./about.html.bac55135.js"),[]).then(({data:e})=>e),"v-3f851d14":()=>d(()=>import("./changelog.html.9ab752eb.js"),[]).then(({data:e})=>e),"v-193cf592":()=>d(()=>import("./contacts.html.5dc8225c.js"),[]).then(({data:e})=>e),"v-ae7b83f2":()=>d(()=>import("./future.html.94bd226b.js"),[]).then(({data:e})=>e),"v-64fc7bb8":()=>d(()=>import("./home.html.f6b9c2a4.js"),[]).then(({data:e})=>e),"v-9cfea7fc":()=>d(()=>import("./api-example.html.47c311e0.js"),[]).then(({data:e})=>e),"v-72c12b7d":()=>d(()=>import("./api-exception.html.67d95ae2.js"),[]).then(({data:e})=>e),"v-793879e8":()=>d(()=>import("./api-using.html.c794f69e.js"),[]).then(({data:e})=>e),"v-29d6c1ba":()=>d(()=>import("./r8-proguard.html.15e04e11.js"),[]).then(({data:e})=>e),"v-24e71de7":()=>d(()=>import("./xposed-using.html.44c15d78.js"),[]).then(({data:e})=>e),"v-7b22efaf":()=>d(()=>import("./example.html.3cb1bbf7.js"),[]).then(({data:e})=>e),"v-efb45d4c":()=>d(()=>import("./home.html.9718dcfa.js"),[]).then(({data:e})=>e),"v-277b35ca":()=>d(()=>import("./knowledge.html.13983a8b.js"),[]).then(({data:e})=>e),"v-77d752a2":()=>d(()=>import("./move-to-new-api.html.f91df01f.js"),[]).then(({data:e})=>e),"v-72889797":()=>d(()=>import("./quick-start.html.02af8471.js"),[]).then(({data:e})=>e),"v-55c11626":()=>d(()=>import("./yukihookapi-projectbuilder.html.ed4fa356.js"),[]).then(({data:e})=>e),"v-41967128":()=>d(()=>import("./about.html.4de66a22.js"),[]).then(({data:e})=>e),"v-0e6c3476":()=>d(()=>import("./changelog.html.9c2f128d.js"),[]).then(({data:e})=>e),"v-6cf86266":()=>d(()=>import("./contacts.html.3df7cacf.js"),[]).then(({data:e})=>e),"v-3106ca14":()=>d(()=>import("./future.html.2cf8d6de.js"),[]).then(({data:e})=>e),"v-c8deafb2":()=>d(()=>import("./home.html.cad3998c.js"),[]).then(({data:e})=>e),"v-c6114c9e":()=>d(()=>import("./api-example.html.f5361b1b.js"),[]).then(({data:e})=>e),"v-5b43296c":()=>d(()=>import("./api-exception.html.7a8cad47.js"),[]).then(({data:e})=>e),"v-2ee67152":()=>d(()=>import("./api-using.html.0a59e2e0.js"),[]).then(({data:e})=>e),"v-154d6f69":()=>d(()=>import("./r8-proguard.html.683a5429.js"),[]).then(({data:e})=>e),"v-af73b3d0":()=>d(()=>import("./xposed-using.html.649a9099.js"),[]).then(({data:e})=>e),"v-13b430a0":()=>d(()=>import("./example.html.c868eee2.js"),[]).then(({data:e})=>e),"v-6a609e09":()=>d(()=>import("./home.html.e3bb15fd.js"),[]).then(({data:e})=>e),"v-b4f1a468":()=>d(()=>import("./knowledge.html.830e8c66.js"),[]).then(({data:e})=>e),"v-c0d5dada":()=>d(()=>import("./move-to-new-api.html.4bf89a9b.js"),[]).then(({data:e})=>e),"v-24840ff0":()=>d(()=>import("./quick-start.html.3cf0abe8.js"),[]).then(({data:e})=>e),"v-a2fab4d6":()=>d(()=>import("./yukihookapi-projectbuilder.html.d499d226.js"),[]).then(({data:e})=>e),"v-12042f1f":()=>d(()=>import("./host-inject.html.8e7a6aa7.js"),[]).then(({data:e})=>e),"v-deaff1d0":()=>d(()=>import("./host-lifecycle.html.7e81cf29.js"),[]).then(({data:e})=>e),"v-33c1dc26":()=>d(()=>import("./logger.html.9662b4ff.js"),[]).then(({data:e})=>e),"v-581ddb9c":()=>d(()=>import("./reflection.html.2a870d09.js"),[]).then(({data:e})=>e),"v-2e6ad66c":()=>d(()=>import("./xposed-channel.html.5975332b.js"),[]).then(({data:e})=>e),"v-68bebbf4":()=>d(()=>import("./xposed-storage.html.c35a7041.js"),[]).then(({data:e})=>e),"v-6ac5be8e":()=>d(()=>import("./host-inject.html.77802245.js"),[]).then(({data:e})=>e),"v-357a8d49":()=>d(()=>import("./host-lifecycle.html.136055f0.js"),[]).then(({data:e})=>e),"v-1f0f591e":()=>d(()=>import("./logger.html.c120d3dc.js"),[]).then(({data:e})=>e),"v-001858e3":()=>d(()=>import("./reflection.html.0e88a14d.js"),[]).then(({data:e})=>e),"v-598546c6":()=>d(()=>import("./xposed-channel.html.325b6181.js"),[]).then(({data:e})=>e),"v-0d914225":()=>d(()=>import("./xposed-storage.html.5fd9a913.js"),[]).then(({data:e})=>e),"v-6931cb54":()=>d(()=>import("./YukiHookAPI.html.bf9903b0.js"),[]).then(({data:e})=>e),"v-053599a5":()=>d(()=>import("./YukiHookAPI.html.e73ead3a.js"),[]).then(({data:e})=>e),"v-30f3ba1e":()=>d(()=>import("./InjectYukiHookWithXposed.html.cf9b500d.js"),[]).then(({data:e})=>e),"v-6e47300f":()=>d(()=>import("./CurrentClass.html.641fcd58.js"),[]).then(({data:e})=>e),"v-69c1c226":()=>d(()=>import("./GenericClass.html.5d4a2ffe.js"),[]).then(({data:e})=>e),"v-735374af":()=>d(()=>import("./HookClass.html.486aa6ea.js"),[]).then(({data:e})=>e),"v-1c516d22":()=>d(()=>import("./HookResources.html.4f07fd98.js"),[]).then(({data:e})=>e),"v-66735bfe":()=>d(()=>import("./VariousClass.html.a490557a.js"),[]).then(({data:e})=>e),"v-3ac40680":()=>d(()=>import("./YukiMemberHookCreator.html.e217488d.js"),[]).then(({data:e})=>e),"v-5e81af42":()=>d(()=>import("./YukiResourcesHookCreator.html.1f540f56.js"),[]).then(({data:e})=>e),"v-004a009e":()=>d(()=>import("./LoggerFactory.html.ae54c997.js"),[]).then(({data:e})=>e),"v-213d88b3":()=>d(()=>import("./ReflectionFactory.html.fc39b155.js"),[]).then(({data:e})=>e),"v-448e9585":()=>d(()=>import("./YukiHookFactory.html.09287903.js"),[]).then(({data:e})=>e),"v-75a9b636":()=>d(()=>import("./HookParam.html.a5a7a5a4.js"),[]).then(({data:e})=>e),"v-100b529c":()=>d(()=>import("./PackageParam.html.510255b8.js"),[]).then(({data:e})=>e),"v-516df326":()=>d(()=>import("./YukiBaseHooker.html.b68236f9.js"),[]).then(({data:e})=>e),"v-818b3ca6":()=>d(()=>import("./InjectYukiHookWithXposed.html.56391530.js"),[]).then(({data:e})=>e),"v-b6a815c4":()=>d(()=>import("./CurrentClass.html.16c29272.js"),[]).then(({data:e})=>e),"v-0183e3fc":()=>d(()=>import("./GenericClass.html.f94281cf.js"),[]).then(({data:e})=>e),"v-57506200":()=>d(()=>import("./HookClass.html.52e59cf0.js"),[]).then(({data:e})=>e),"v-9af56c1a":()=>d(()=>import("./HookResources.html.2486cf29.js"),[]).then(({data:e})=>e),"v-032b1710":()=>d(()=>import("./VariousClass.html.153f4c39.js"),[]).then(({data:e})=>e),"v-71147891":()=>d(()=>import("./YukiMemberHookCreator.html.7e0c1b2e.js"),[]).then(({data:e})=>e),"v-5ed1ceee":()=>d(()=>import("./YukiResourcesHookCreator.html.2fa2ff0f.js"),[]).then(({data:e})=>e),"v-e288ce96":()=>d(()=>import("./YukiBaseHooker.html.99eec744.js"),[]).then(({data:e})=>e),"v-0d0fcec2":()=>d(()=>import("./ReflectionFactory.html.b0131cbd.js"),[]).then(({data:e})=>e),"v-65091354":()=>d(()=>import("./YukiHookFactory.html.bfbfbca6.js"),[]).then(({data:e})=>e),"v-36aec5ad":()=>d(()=>import("./LoggerFactory.html.52af0d44.js"),[]).then(({data:e})=>e),"v-60cbe1b4":()=>d(()=>import("./HookParam.html.74f919b4.js"),[]).then(({data:e})=>e),"v-b381a126":()=>d(()=>import("./PackageParam.html.aaf5b5a4.js"),[]).then(({data:e})=>e),"v-5e874c45":()=>d(()=>import("./ComponentTypeFactory.html.0026a7b8.js"),[]).then(({data:e})=>e),"v-4ea62475":()=>d(()=>import("./GraphicsTypeFactory.html.bfb4e259.js"),[]).then(({data:e})=>e),"v-ef79cde2":()=>d(()=>import("./ViewTypeFactory.html.612b6202.js"),[]).then(({data:e})=>e),"v-5acc12ab":()=>d(()=>import("./DefinedTypeFactory.html.ba3bdd0b.js"),[]).then(({data:e})=>e),"v-14ec8671":()=>d(()=>import("./VariableTypeFactory.html.550d3346.js"),[]).then(({data:e})=>e),"v-4709ad58":()=>d(()=>import("./ModuleApplication.html.a386b8db.js"),[]).then(({data:e})=>e),"v-632be8ee":()=>d(()=>import("./YukiHookDataChannel.html.14b03350.js"),[]).then(({data:e})=>e),"v-5858709e":()=>d(()=>import("./YukiHookModulePrefs.html.6bedc781.js"),[]).then(({data:e})=>e),"v-763140ee":()=>d(()=>import("./IYukiHookXposedInit.html.78a55860.js"),[]).then(({data:e})=>e),"v-8293d958":()=>d(()=>import("./ComponentTypeFactory.html.5af05d7d.js"),[]).then(({data:e})=>e),"v-7b0abf86":()=>d(()=>import("./GraphicsTypeFactory.html.a3936b7c.js"),[]).then(({data:e})=>e),"v-5309e4a0":()=>d(()=>import("./ViewTypeFactory.html.7da3eef4.js"),[]).then(({data:e})=>e),"v-a2615d0c":()=>d(()=>import("./DefinedTypeFactory.html.8137c32c.js"),[]).then(({data:e})=>e),"v-ba01a600":()=>d(()=>import("./VariableTypeFactory.html.d4c9dbd1.js"),[]).then(({data:e})=>e),"v-7fec5836":()=>d(()=>import("./ModuleApplication.html.57573770.js"),[]).then(({data:e})=>e),"v-7414265a":()=>d(()=>import("./YukiHookDataChannel.html.85591c3b.js"),[]).then(({data:e})=>e),"v-003862c2":()=>d(()=>import("./YukiHookModulePrefs.html.198e73d3.js"),[]).then(({data:e})=>e),"v-1d680acc":()=>d(()=>import("./IYukiHookXposedInit.html.b37a852b.js"),[]).then(({data:e})=>e),"v-0f719471":()=>d(()=>import("./BaseFinder.html.8f275c85.js"),[]).then(({data:e})=>e),"v-45111efc":()=>d(()=>import("./DexClassFinder.html.78c5f805.js"),[]).then(({data:e})=>e),"v-1e2cbc9c":()=>d(()=>import("./ConstructorFinder.html.bd11174d.js"),[]).then(({data:e})=>e),"v-22449c48":()=>d(()=>import("./FieldFinder.html.7f9e6371.js"),[]).then(({data:e})=>e),"v-fd738322":()=>d(()=>import("./MethodFinder.html.ede3f1a0.js"),[]).then(({data:e})=>e),"v-3d943532":()=>d(()=>import("./YukiModuleResources.html.d8e27a7f.js"),[]).then(({data:e})=>e),"v-526c4200":()=>d(()=>import("./YukiResForwarder.html.0dadd8db.js"),[]).then(({data:e})=>e),"v-68541dca":()=>d(()=>import("./YukiResources.html.7b0a4824.js"),[]).then(({data:e})=>e),"v-0a4de82f":()=>d(()=>import("./YukiXposedEvent.html.a93ee4ef.js"),[]).then(({data:e})=>e),"v-493d37f6":()=>d(()=>import("./ChannelData.html.5ca343ea.js"),[]).then(({data:e})=>e),"v-b57870de":()=>d(()=>import("./ChannelPriority.html.b460c4bc.js"),[]).then(({data:e})=>e),"v-4b468415":()=>d(()=>import("./ModuleClassLoader.html.0388bffd.js"),[]).then(({data:e})=>e),"v-d99f7f36":()=>d(()=>import("./PrefsData.html.40b2fabe.js"),[]).then(({data:e})=>e),"v-53bcae06":()=>d(()=>import("./ModulePreferenceFragment.html.0c7dadc7.js"),[]).then(({data:e})=>e),"v-4fca92c0":()=>d(()=>import("./BaseFinder.html.a5dbb7a7.js"),[]).then(({data:e})=>e),"v-2a898c66":()=>d(()=>import("./DexClassFinder.html.5d8e12f0.js"),[]).then(({data:e})=>e),"v-a71937aa":()=>d(()=>import("./ConstructorFinder.html.5d3a6cdd.js"),[]).then(({data:e})=>e),"v-42e0f0ab":()=>d(()=>import("./FieldFinder.html.ba29e9c4.js"),[]).then(({data:e})=>e),"v-a4aa4d00":()=>d(()=>import("./MethodFinder.html.99f87a1e.js"),[]).then(({data:e})=>e),"v-0f1e3594":()=>d(()=>import("./YukiModuleResources.html.e5c5fb30.js"),[]).then(({data:e})=>e),"v-35faec91":()=>d(()=>import("./YukiResForwarder.html.4e23df75.js"),[]).then(({data:e})=>e),"v-2c04b82a":()=>d(()=>import("./YukiResources.html.afb6fb92.js"),[]).then(({data:e})=>e),"v-19e7277e":()=>d(()=>import("./YukiXposedEvent.html.560fa41c.js"),[]).then(({data:e})=>e),"v-2f64a2d4":()=>d(()=>import("./ChannelData.html.1981f416.js"),[]).then(({data:e})=>e),"v-87027140":()=>d(()=>import("./ChannelPriority.html.7d2ec81d.js"),[]).then(({data:e})=>e),"v-2d4e0da6":()=>d(()=>import("./ModuleClassLoader.html.2ddf88b6.js"),[]).then(({data:e})=>e),"v-58ed8298":()=>d(()=>import("./PrefsData.html.3061ee5b.js"),[]).then(({data:e})=>e),"v-23e1a817":()=>d(()=>import("./ModulePreferenceFragment.html.764fecc3.js"),[]).then(({data:e})=>e),"v-1b2ad030":()=>d(()=>import("./CountRules.html.2639d392.js"),[]).then(({data:e})=>e),"v-547a3c3c":()=>d(()=>import("./ModifierRules.html.f7582dc2.js"),[]).then(({data:e})=>e),"v-58c26516":()=>d(()=>import("./NameRules.html.47e512e4.js"),[]).then(({data:e})=>e),"v-80fd32ec":()=>d(()=>import("./ObjectRules.html.4b682129.js"),[]).then(({data:e})=>e),"v-a42f54a4":()=>d(()=>import("./ConstructorRules.html.f8ba43ee.js"),[]).then(({data:e})=>e),"v-3e67a42e":()=>d(()=>import("./FieldRules.html.a499e892.js"),[]).then(({data:e})=>e),"v-2cab152c":()=>d(()=>import("./MemberRules.html.b3e5d297.js"),[]).then(({data:e})=>e),"v-5388621e":()=>d(()=>import("./MethodRules.html.afeaf85e.js"),[]).then(({data:e})=>e),"v-1446bdca":()=>d(()=>import("./ModuleAppActivity.html.09451ff7.js"),[]).then(({data:e})=>e),"v-c7cef530":()=>d(()=>import("./ModuleAppCompatActivity.html.dd9e40e9.js"),[]).then(({data:e})=>e),"v-44efb702":()=>d(()=>import("./ModuleContextThemeWrapper.html.229a46ac.js"),[]).then(({data:e})=>e),"v-52995ef7":()=>d(()=>import("./CountRules.html.2d5ab94d.js"),[]).then(({data:e})=>e),"v-8d5ce71a":()=>d(()=>import("./ModifierRules.html.c36dff17.js"),[]).then(({data:e})=>e),"v-f5b1ffb2":()=>d(()=>import("./NameRules.html.00ac96fb.js"),[]).then(({data:e})=>e),"v-652b815b":()=>d(()=>import("./ObjectRules.html.70d91cad.js"),[]).then(({data:e})=>e),"v-08b70f7f":()=>d(()=>import("./ConstructorRules.html.c7161b83.js"),[]).then(({data:e})=>e),"v-21f64ebf":()=>d(()=>import("./FieldRules.html.c8edc48c.js"),[]).then(({data:e})=>e),"v-77f11cf9":()=>d(()=>import("./MemberRules.html.a071b3c6.js"),[]).then(({data:e})=>e),"v-64827680":()=>d(()=>import("./MethodRules.html.6c9a8df6.js"),[]).then(({data:e})=>e),"v-2d5d16db":()=>d(()=>import("./ModuleAppActivity.html.90d3c4e6.js"),[]).then(({data:e})=>e),"v-cadbe48e":()=>d(()=>import("./ModuleAppCompatActivity.html.a20d9206.js"),[]).then(({data:e})=>e),"v-78731c50":()=>d(()=>import("./ModuleContextThemeWrapper.html.0879426b.js"),[]).then(({data:e})=>e),"v-b8000f3a":()=>d(()=>import("./MemberRulesResult.html.58e81c94.js"),[]).then(({data:e})=>e),"v-5e375d98":()=>d(()=>import("./MemberRulesResult.html.e79843c3.js"),[]).then(({data:e})=>e),"v-3706649a":()=>d(()=>import("./404.html.c038a05a.js"),[]).then(({data:e})=>e)};function mo(e,t){const l=Object.create(null),i=e.split(",");for(let o=0;o!!l[o.toLowerCase()]:o=>!!l[o]}const ts="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",ls=mo(ts);function ha(e){return!!e||e===""}function Sl(e){if(te(e)){const t={};for(let l=0;l{if(l){const i=l.split(os);i.length>1&&(t[i[0].trim()]=i[1].trim())}}),t}function Ke(e){let t="";if(be(e))t=e;else if(te(e))for(let l=0;lbe(e)?e:e==null?"":te(e)||Oe(e)&&(e.toString===ma||!ae(e.toString))?JSON.stringify(e,da,2):String(e),da=(e,t)=>t&&t.__v_isRef?da(e,t.value):rl(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((l,[i,o])=>(l[`${i} =>`]=o,l),{})}:ua(t)?{[`Set(${t.size})`]:[...t.values()]}:Oe(t)&&!te(t)&&!fa(t)?String(t):t,Ce={},al=[],rt=()=>{},as=()=>!1,rs=/^on[^a-z]/,Vl=e=>rs.test(e),fo=e=>e.startsWith("onUpdate:"),Se=Object.assign,go=(e,t)=>{const l=e.indexOf(t);l>-1&&e.splice(l,1)},ss=Object.prototype.hasOwnProperty,de=(e,t)=>ss.call(e,t),te=Array.isArray,rl=e=>bi(e)==="[object Map]",ua=e=>bi(e)==="[object Set]",ae=e=>typeof e=="function",be=e=>typeof e=="string",ko=e=>typeof e=="symbol",Oe=e=>e!==null&&typeof e=="object",pa=e=>Oe(e)&&ae(e.then)&&ae(e.catch),ma=Object.prototype.toString,bi=e=>ma.call(e),cs=e=>bi(e).slice(8,-1),fa=e=>bi(e)==="[object Object]",vo=e=>be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Cl=mo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_i=e=>{const t=Object.create(null);return l=>t[l]||(t[l]=e(l))},hs=/-(\w)/g,ut=_i(e=>e.replace(hs,(t,l)=>l?l.toUpperCase():"")),ds=/\B([A-Z])/g,Jt=_i(e=>e.replace(ds,"-$1").toLowerCase()),yi=_i(e=>e.charAt(0).toUpperCase()+e.slice(1)),Oi=_i(e=>e?`on${yi(e)}`:""),wl=(e,t)=>!Object.is(e,t),Fi=(e,t)=>{for(let l=0;l{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:l})},ga=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let qo;const us=()=>qo||(qo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Xe;class ps{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Xe&&(this.parent=Xe,this.index=(Xe.scopes||(Xe.scopes=[])).push(this)-1)}run(t){if(this.active){const l=Xe;try{return Xe=this,t()}finally{Xe=l}}}on(){Xe=this}off(){Xe=this.parent}stop(t){if(this.active){let l,i;for(l=0,i=this.effects.length;l{const t=new Set(e);return t.w=0,t.n=0,t},ka=e=>(e.w&Ft)>0,va=e=>(e.n&Ft)>0,ks=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let l=0;for(let i=0;i{(c==="length"||c>=i)&&r.push(s)});else switch(l!==void 0&&r.push(a.get(l)),t){case"add":te(e)?vo(l)&&r.push(a.get("length")):(r.push(a.get(Kt)),rl(e)&&r.push(a.get(qi)));break;case"delete":te(e)||(r.push(a.get(Kt)),rl(e)&&r.push(a.get(qi)));break;case"set":rl(e)&&r.push(a.get(Kt));break}if(r.length===1)r[0]&&Ki(r[0]);else{const s=[];for(const c of r)c&&s.push(...c);Ki(bo(s))}}function Ki(e,t){const l=te(e)?e:[...e];for(const i of l)i.computed&&Go(i);for(const i of l)i.computed||Go(i)}function Go(e,t){(e!==nt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const bs=mo("__proto__,__v_isRef,__isVue"),ya=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ko)),_s=yo(),ys=yo(!1,!0),xs=yo(!0),Qo=Es();function Es(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...l){const i=ke(this);for(let n=0,a=this.length;n{e[t]=function(...l){ml();const i=ke(this)[t].apply(this,l);return fl(),i}}),e}function yo(e=!1,t=!1){return function(i,o,n){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&n===(e?t?Vs:Pa:t?Ra:Ca).get(i))return i;const a=te(i);if(!e&&a&&de(Qo,o))return Reflect.get(Qo,o,n);const r=Reflect.get(i,o,n);return(ko(o)?ya.has(o):bs(o))||(e||Qe(i,"get",o),t)?r:De(r)?a&&vo(o)?r:r.value:Oe(r)?e?Co(r):gl(r):r}}const Cs=xa(),Rs=xa(!0);function xa(e=!1){return function(l,i,o,n){let a=l[i];if(Ol(a)&&De(a)&&!De(o))return!1;if(!e&&!Ol(o)&&(Gi(o)||(o=ke(o),a=ke(a)),!te(l)&&De(a)&&!De(o)))return a.value=o,!0;const r=te(l)&&vo(i)?Number(i)e,xi=e=>Reflect.getPrototypeOf(e);function Xl(e,t,l=!1,i=!1){e=e.__v_raw;const o=ke(e),n=ke(t);l||(t!==n&&Qe(o,"get",t),Qe(o,"get",n));const{has:a}=xi(o),r=i?xo:l?Po:Fl;if(a.call(o,t))return r(e.get(t));if(a.call(o,n))return r(e.get(n));e!==o&&e.get(t)}function ql(e,t=!1){const l=this.__v_raw,i=ke(l),o=ke(e);return t||(e!==o&&Qe(i,"has",e),Qe(i,"has",o)),e===o?l.has(e):l.has(e)||l.has(o)}function Kl(e,t=!1){return e=e.__v_raw,!t&&Qe(ke(e),"iterate",Kt),Reflect.get(e,"size",e)}function Jo(e){e=ke(e);const t=ke(this);return xi(t).has.call(t,e)||(t.add(e),bt(t,"add",e,e)),this}function Zo(e,t){t=ke(t);const l=ke(this),{has:i,get:o}=xi(l);let n=i.call(l,e);n||(e=ke(e),n=i.call(l,e));const a=o.call(l,e);return l.set(e,t),n?wl(t,a)&&bt(l,"set",e,t):bt(l,"add",e,t),this}function en(e){const t=ke(this),{has:l,get:i}=xi(t);let o=l.call(t,e);o||(e=ke(e),o=l.call(t,e)),i&&i.call(t,e);const n=t.delete(e);return o&&bt(t,"delete",e,void 0),n}function tn(){const e=ke(this),t=e.size!==0,l=e.clear();return t&&bt(e,"clear",void 0,void 0),l}function Gl(e,t){return function(i,o){const n=this,a=n.__v_raw,r=ke(a),s=t?xo:e?Po:Fl;return!e&&Qe(r,"iterate",Kt),a.forEach((c,h)=>i.call(o,s(c),s(h),n))}}function Ql(e,t,l){return function(...i){const o=this.__v_raw,n=ke(o),a=rl(n),r=e==="entries"||e===Symbol.iterator&&a,s=e==="keys"&&a,c=o[e](...i),h=l?xo:t?Po:Fl;return!t&&Qe(n,"iterate",s?qi:Kt),{next(){const{value:p,done:m}=c.next();return m?{value:p,done:m}:{value:r?[h(p[0]),h(p[1])]:h(p),done:m}},[Symbol.iterator](){return this}}}}function xt(e){return function(...t){return e==="delete"?!1:this}}function ws(){const e={get(n){return Xl(this,n)},get size(){return Kl(this)},has:ql,add:Jo,set:Zo,delete:en,clear:tn,forEach:Gl(!1,!1)},t={get(n){return Xl(this,n,!1,!0)},get size(){return Kl(this)},has:ql,add:Jo,set:Zo,delete:en,clear:tn,forEach:Gl(!1,!0)},l={get(n){return Xl(this,n,!0)},get size(){return Kl(this,!0)},has(n){return ql.call(this,n,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Gl(!0,!1)},i={get(n){return Xl(this,n,!0,!0)},get size(){return Kl(this,!0)},has(n){return ql.call(this,n,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Gl(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(n=>{e[n]=Ql(n,!1,!1),l[n]=Ql(n,!0,!1),t[n]=Ql(n,!1,!0),i[n]=Ql(n,!0,!0)}),[e,l,t,i]}const[Os,Fs,zs,Ds]=ws();function Eo(e,t){const l=t?e?Ds:zs:e?Fs:Os;return(i,o,n)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?i:Reflect.get(de(l,o)&&o in i?l:i,o,n)}const Ms={get:Eo(!1,!1)},Hs={get:Eo(!1,!0)},Ss={get:Eo(!0,!1)},Ca=new WeakMap,Ra=new WeakMap,Pa=new WeakMap,Vs=new WeakMap;function Ns(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function js(e){return e.__v_skip||!Object.isExtensible(e)?0:Ns(cs(e))}function gl(e){return Ol(e)?e:Ro(e,!1,Ea,Ms,Ca)}function $s(e){return Ro(e,!1,Is,Hs,Ra)}function Co(e){return Ro(e,!0,As,Ss,Pa)}function Ro(e,t,l,i,o){if(!Oe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const n=o.get(e);if(n)return n;const a=js(e);if(a===0)return e;const r=new Proxy(e,a===2?i:l);return o.set(e,r),r}function sl(e){return Ol(e)?sl(e.__v_raw):!!(e&&e.__v_isReactive)}function Ol(e){return!!(e&&e.__v_isReadonly)}function Gi(e){return!!(e&&e.__v_isShallow)}function La(e){return sl(e)||Ol(e)}function ke(e){const t=e&&e.__v_raw;return t?ke(t):e}function Ta(e){return ni(e,"__v_skip",!0),e}const Fl=e=>Oe(e)?gl(e):e,Po=e=>Oe(e)?Co(e):e;function Aa(e){It&&nt&&(e=ke(e),_a(e.dep||(e.dep=bo())))}function Ia(e,t){e=ke(e),e.dep&&Ki(e.dep)}function De(e){return!!(e&&e.__v_isRef===!0)}function ye(e){return Oa(e,!1)}function wa(e){return Oa(e,!0)}function Oa(e,t){return De(e)?e:new Ys(e,t)}class Ys{constructor(t,l){this.__v_isShallow=l,this.dep=void 0,this.__v_isRef=!0,this._rawValue=l?t:ke(t),this._value=l?t:Fl(t)}get value(){return Aa(this),this._value}set value(t){t=this.__v_isShallow?t:ke(t),wl(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:Fl(t),Ia(this))}}function O(e){return De(e)?e.value:e}const Bs={get:(e,t,l)=>O(Reflect.get(e,t,l)),set:(e,t,l,i)=>{const o=e[t];return De(o)&&!De(l)?(o.value=l,!0):Reflect.set(e,t,l,i)}};function Fa(e){return sl(e)?e:new Proxy(e,Bs)}function Ei(e){const t=te(e)?new Array(e.length):{};for(const l in e)t[l]=Ws(e,l);return t}class Us{constructor(t,l,i){this._object=t,this._key=l,this._defaultValue=i,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Ws(e,t,l){const i=e[t];return De(i)?i:new Us(e,t,l)}class Xs{constructor(t,l,i,o){this._setter=l,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new _o(t,()=>{this._dirty||(this._dirty=!0,Ia(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=i}get value(){const t=ke(this);return Aa(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function qs(e,t,l=!1){let i,o;const n=ae(e);return n?(i=e,o=rt):(i=e.get,o=e.set),new Xs(i,o,n||!o,l)}function wt(e,t,l,i){let o;try{o=i?e(...i):e()}catch(n){Nl(n,t,l)}return o}function lt(e,t,l,i){if(ae(e)){const n=wt(e,t,l,i);return n&&pa(n)&&n.catch(a=>{Nl(a,t,l)}),n}const o=[];for(let n=0;n>>1;zl(qe[i])ft&&qe.splice(t,1)}function Ma(e,t,l,i){te(e)?l.push(...e):(!t||!t.includes(e,e.allowRecurse?i+1:i))&&l.push(e),Da()}function Js(e){Ma(e,El,Rl,il)}function Zs(e){Ma(e,Pt,Pl,ol)}function Ci(e,t=null){if(Rl.length){for(Ji=t,El=[...new Set(Rl)],Rl.length=0,il=0;ilzl(l)-zl(i)),ol=0;ole.id==null?1/0:e.id;function Ha(e){Qi=!1,ai=!0,Ci(e),qe.sort((l,i)=>zl(l)-zl(i));const t=rt;try{for(ft=0;ftg.trim())),p&&(o=l.map(ga))}let r,s=i[r=Oi(t)]||i[r=Oi(ut(t))];!s&&n&&(s=i[r=Oi(Jt(t))]),s&<(s,e,6,o);const c=i[r+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[r])return;e.emitted[r]=!0,lt(c,e,6,o)}}function Sa(e,t,l=!1){const i=t.emitsCache,o=i.get(e);if(o!==void 0)return o;const n=e.emits;let a={},r=!1;if(!ae(e)){const s=c=>{const h=Sa(c,t,!0);h&&(r=!0,Se(a,h))};!l&&t.mixins.length&&t.mixins.forEach(s),e.extends&&s(e.extends),e.mixins&&e.mixins.forEach(s)}return!n&&!r?(i.set(e,null),null):(te(n)?n.forEach(s=>a[s]=null):Se(a,n),i.set(e,a),a)}function Ri(e,t){return!e||!Vl(t)?!1:(t=t.slice(2).replace(/Once$/,""),de(e,t[0].toLowerCase()+t.slice(1))||de(e,Jt(t))||de(e,t))}let Ve=null,Va=null;function si(e){const t=Ve;return Ve=e,Va=e&&e.type.__scopeId||null,t}function He(e,t=Ve,l){if(!t||e._n)return e;const i=(...o)=>{i._d&&pn(-1);const n=si(t),a=e(...o);return si(n),i._d&&pn(1),a};return i._n=!0,i._c=!0,i._d=!0,i}function zi(e){const{type:t,vnode:l,proxy:i,withProxy:o,props:n,propsOptions:[a],slots:r,attrs:s,emit:c,render:h,renderCache:p,data:m,setupState:g,ctx:x,inheritAttrs:P}=e;let E,k;const _=si(e);try{if(l.shapeFlag&4){const H=o||i;E=ot(h.call(H,H,p,n,g,m,x)),k=s}else{const H=t;E=ot(H.length>1?H(n,{attrs:s,slots:r,emit:c}):H(n,null)),k=t.props?s:tc(s)}}catch(H){Tl.length=0,Nl(H,e,1),E=oe(Ge)}let L=E;if(k&&P!==!1){const H=Object.keys(k),{shapeFlag:U}=L;H.length&&U&7&&(a&&H.some(fo)&&(k=lc(k,a)),L=Dt(L,k))}return l.dirs&&(L=Dt(L),L.dirs=L.dirs?L.dirs.concat(l.dirs):l.dirs),l.transition&&(L.transition=l.transition),E=L,si(_),E}const tc=e=>{let t;for(const l in e)(l==="class"||l==="style"||Vl(l))&&((t||(t={}))[l]=e[l]);return t},lc=(e,t)=>{const l={};for(const i in e)(!fo(i)||!(i.slice(9)in t))&&(l[i]=e[i]);return l};function ic(e,t,l){const{props:i,children:o,component:n}=e,{props:a,children:r,patchFlag:s}=t,c=n.emitsOptions;if(t.dirs||t.transition)return!0;if(l&&s>=0){if(s&1024)return!0;if(s&16)return i?ln(i,a,c):!!a;if(s&8){const h=t.dynamicProps;for(let p=0;pe.__isSuspense;function Na(e,t){t&&t.pendingBranch?te(e)?t.effects.push(...e):t.effects.push(e):Zs(e)}function Gt(e,t){if(Fe){let l=Fe.provides;const i=Fe.parent&&Fe.parent.provides;i===l&&(l=Fe.provides=Object.create(i)),l[e]=t}}function Me(e,t,l=!1){const i=Fe||Ve;if(i){const o=i.parent==null?i.vnode.appContext&&i.vnode.appContext.provides:i.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return l&&ae(t)?t.call(i.proxy):t}}const on={};function dt(e,t,l){return ja(e,t,l)}function ja(e,t,{immediate:l,deep:i,flush:o,onTrack:n,onTrigger:a}=Ce){const r=Fe;let s,c=!1,h=!1;if(De(e)?(s=()=>e.value,c=Gi(e)):sl(e)?(s=()=>e,i=!0):te(e)?(h=!0,c=e.some(k=>sl(k)||Gi(k)),s=()=>e.map(k=>{if(De(k))return k.value;if(sl(k))return qt(k);if(ae(k))return wt(k,r,2)})):ae(e)?t?s=()=>wt(e,r,2):s=()=>{if(!(r&&r.isUnmounted))return p&&p(),lt(e,r,3,[m])}:s=rt,t&&i){const k=s;s=()=>qt(k())}let p,m=k=>{p=E.onStop=()=>{wt(k,r,4)}};if(dl)return m=rt,t?l&<(t,r,3,[s(),h?[]:void 0,m]):s(),rt;let g=h?[]:on;const x=()=>{if(!!E.active)if(t){const k=E.run();(i||c||(h?k.some((_,L)=>wl(_,g[L])):wl(k,g)))&&(p&&p(),lt(t,r,3,[k,g===on?void 0:g,m]),g=k)}else E.run()};x.allowRecurse=!!t;let P;o==="sync"?P=x:o==="post"?P=()=>Be(x,r&&r.suspense):P=()=>Js(x);const E=new _o(s,P);return t?l?x():g=E.run():o==="post"?Be(E.run.bind(E),r&&r.suspense):E.run(),()=>{E.stop(),r&&r.scope&&go(r.scope.effects,E)}}function ac(e,t,l){const i=this.proxy,o=be(e)?e.includes(".")?$a(i,e):()=>i[e]:e.bind(i,i);let n;ae(t)?n=t:(n=t.handler,l=t);const a=Fe;hl(this);const r=ja(o,n.bind(i),l);return a?hl(a):Qt(),r}function $a(e,t){const l=t.split(".");return()=>{let i=e;for(let o=0;o{qt(l,t)});else if(fa(e))for(const l in e)qt(e[l],t);return e}function rc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Je(()=>{e.isMounted=!0}),Yl(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],sc={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},setup(e,{slots:t}){const l=wo(),i=rc();let o;return()=>{const n=t.default&&Ua(t.default(),!0);if(!n||!n.length)return;let a=n[0];if(n.length>1){for(const P of n)if(P.type!==Ge){a=P;break}}const r=ke(e),{mode:s}=r;if(i.isLeaving)return Di(a);const c=nn(a);if(!c)return Di(a);const h=Zi(c,r,i,l);eo(c,h);const p=l.subTree,m=p&&nn(p);let g=!1;const{getTransitionKey:x}=c.type;if(x){const P=x();o===void 0?o=P:P!==o&&(o=P,g=!0)}if(m&&m.type!==Ge&&(!Wt(c,m)||g)){const P=Zi(m,r,i,l);if(eo(m,P),s==="out-in")return i.isLeaving=!0,P.afterLeave=()=>{i.isLeaving=!1,l.update()},Di(a);s==="in-out"&&c.type!==Ge&&(P.delayLeave=(E,k,_)=>{const L=Ba(i,m);L[String(m.key)]=m,E._leaveCb=()=>{k(),E._leaveCb=void 0,delete h.delayedLeave},h.delayedLeave=_})}return a}}},Ya=sc;function Ba(e,t){const{leavingVNodes:l}=e;let i=l.get(t.type);return i||(i=Object.create(null),l.set(t.type,i)),i}function Zi(e,t,l,i){const{appear:o,mode:n,persisted:a=!1,onBeforeEnter:r,onEnter:s,onAfterEnter:c,onEnterCancelled:h,onBeforeLeave:p,onLeave:m,onAfterLeave:g,onLeaveCancelled:x,onBeforeAppear:P,onAppear:E,onAfterAppear:k,onAppearCancelled:_}=t,L=String(e.key),H=Ba(l,e),U=(v,q)=>{v&<(v,i,9,q)},ee=(v,q)=>{const B=q[1];U(v,q),te(v)?v.every(G=>G.length<=1)&&B():v.length<=1&&B()},w={mode:n,persisted:a,beforeEnter(v){let q=r;if(!l.isMounted)if(o)q=P||r;else return;v._leaveCb&&v._leaveCb(!0);const B=H[L];B&&Wt(e,B)&&B.el._leaveCb&&B.el._leaveCb(),U(q,[v])},enter(v){let q=s,B=c,G=h;if(!l.isMounted)if(o)q=E||s,B=k||c,G=_||h;else return;let C=!1;const S=v._enterCb=F=>{C||(C=!0,F?U(G,[v]):U(B,[v]),w.delayedLeave&&w.delayedLeave(),v._enterCb=void 0)};q?ee(q,[v,S]):S()},leave(v,q){const B=String(e.key);if(v._enterCb&&v._enterCb(!0),l.isUnmounting)return q();U(p,[v]);let G=!1;const C=v._leaveCb=S=>{G||(G=!0,q(),S?U(x,[v]):U(g,[v]),v._leaveCb=void 0,H[B]===e&&delete H[B])};H[B]=e,m?ee(m,[v,C]):C()},clone(v){return Zi(v,t,l,i)}};return w}function Di(e){if($l(e))return e=Dt(e),e.children=null,e}function nn(e){return $l(e)?e.children?e.children[0]:void 0:e}function eo(e,t){e.shapeFlag&6&&e.component?eo(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ua(e,t=!1,l){let i=[],o=0;for(let n=0;n1)for(let n=0;n!!e.type.__asyncLoader;function b(e){ae(e)&&(e={loader:e});const{loader:t,loadingComponent:l,errorComponent:i,delay:o=200,timeout:n,suspensible:a=!0,onError:r}=e;let s=null,c,h=0;const p=()=>(h++,s=null,m()),m=()=>{let g;return s||(g=s=t().catch(x=>{if(x=x instanceof Error?x:new Error(String(x)),r)return new Promise((P,E)=>{r(x,()=>P(p()),()=>E(x),h+1)});throw x}).then(x=>g!==s&&s?s:(x&&(x.__esModule||x[Symbol.toStringTag]==="Module")&&(x=x.default),c=x,x)))};return ue({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return c},setup(){const g=Fe;if(c)return()=>Mi(c,g);const x=_=>{s=null,Nl(_,g,13,!i)};if(a&&g.suspense||dl)return m().then(_=>()=>Mi(_,g)).catch(_=>(x(_),()=>i?oe(i,{error:_}):null));const P=ye(!1),E=ye(),k=ye(!!o);return o&&setTimeout(()=>{k.value=!1},o),n!=null&&setTimeout(()=>{if(!P.value&&!E.value){const _=new Error(`Async component timed out after ${n}ms.`);x(_),E.value=_}},n),m().then(()=>{P.value=!0,g.parent&&$l(g.parent.vnode)&&To(g.parent.update)}).catch(_=>{x(_),E.value=_}),()=>{if(P.value&&c)return Mi(c,g);if(E.value&&i)return oe(i,{error:E.value});if(l&&!k.value)return oe(l)}}})}function Mi(e,{vnode:{ref:t,props:l,children:i,shapeFlag:o},parent:n}){const a=oe(e,l,i);return a.ref=t,a}const $l=e=>e.type.__isKeepAlive;function cc(e,t){Wa(e,"a",t)}function hc(e,t){Wa(e,"da",t)}function Wa(e,t,l=Fe){const i=e.__wdc||(e.__wdc=()=>{let o=l;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Pi(t,i,l),l){let o=l.parent;for(;o&&o.parent;)$l(o.parent.vnode)&&dc(i,t,l,o),o=o.parent}}function dc(e,t,l,i){const o=Pi(t,e,i,!0);Li(()=>{go(i[t],o)},l)}function Pi(e,t,l=Fe,i=!1){if(l){const o=l[e]||(l[e]=[]),n=t.__weh||(t.__weh=(...a)=>{if(l.isUnmounted)return;ml(),hl(l);const r=lt(t,l,e,a);return Qt(),fl(),r});return i?o.unshift(n):o.push(n),n}}const yt=e=>(t,l=Fe)=>(!dl||e==="sp")&&Pi(e,t,l),Xa=yt("bm"),Je=yt("m"),uc=yt("bu"),pc=yt("u"),Yl=yt("bum"),Li=yt("um"),mc=yt("sp"),fc=yt("rtg"),gc=yt("rtc");function kc(e,t=Fe){Pi("ec",e,t)}function ci(e,t){const l=Ve;if(l===null)return e;const i=Ai(l)||l.proxy,o=e.dirs||(e.dirs=[]);for(let n=0;nt(a,r,void 0,n&&n[r]));else{const a=Object.keys(e);o=new Array(a.length);for(let r=0,s=a.length;rpi(t)?!(t.type===Ge||t.type===Pe&&!Ka(t.children)):!0)?e:null}const to=e=>e?rr(e)?Ai(e)||e.proxy:to(e.parent):null,hi=Se(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>to(e.parent),$root:e=>to(e.root),$emit:e=>e.emit,$options:e=>Qa(e),$forceUpdate:e=>e.f||(e.f=()=>To(e.update)),$nextTick:e=>e.n||(e.n=jl.bind(e.proxy)),$watch:e=>ac.bind(e)}),_c={get({_:e},t){const{ctx:l,setupState:i,data:o,props:n,accessCache:a,type:r,appContext:s}=e;let c;if(t[0]!=="$"){const g=a[t];if(g!==void 0)switch(g){case 1:return i[t];case 2:return o[t];case 4:return l[t];case 3:return n[t]}else{if(i!==Ce&&de(i,t))return a[t]=1,i[t];if(o!==Ce&&de(o,t))return a[t]=2,o[t];if((c=e.propsOptions[0])&&de(c,t))return a[t]=3,n[t];if(l!==Ce&&de(l,t))return a[t]=4,l[t];lo&&(a[t]=0)}}const h=hi[t];let p,m;if(h)return t==="$attrs"&&Qe(e,"get",t),h(e);if((p=r.__cssModules)&&(p=p[t]))return p;if(l!==Ce&&de(l,t))return a[t]=4,l[t];if(m=s.config.globalProperties,de(m,t))return m[t]},set({_:e},t,l){const{data:i,setupState:o,ctx:n}=e;return o!==Ce&&de(o,t)?(o[t]=l,!0):i!==Ce&&de(i,t)?(i[t]=l,!0):de(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(n[t]=l,!0)},has({_:{data:e,setupState:t,accessCache:l,ctx:i,appContext:o,propsOptions:n}},a){let r;return!!l[a]||e!==Ce&&de(e,a)||t!==Ce&&de(t,a)||(r=n[0])&&de(r,a)||de(i,a)||de(hi,a)||de(o.config.globalProperties,a)},defineProperty(e,t,l){return l.get!=null?e._.accessCache[t]=0:de(l,"value")&&this.set(e,t,l.value,null),Reflect.defineProperty(e,t,l)}};let lo=!0;function yc(e){const t=Qa(e),l=e.proxy,i=e.ctx;lo=!1,t.beforeCreate&&rn(t.beforeCreate,e,"bc");const{data:o,computed:n,methods:a,watch:r,provide:s,inject:c,created:h,beforeMount:p,mounted:m,beforeUpdate:g,updated:x,activated:P,deactivated:E,beforeDestroy:k,beforeUnmount:_,destroyed:L,unmounted:H,render:U,renderTracked:ee,renderTriggered:w,errorCaptured:v,serverPrefetch:q,expose:B,inheritAttrs:G,components:C,directives:S,filters:F}=t;if(c&&xc(c,i,null,e.appContext.config.unwrapInjectedRef),a)for(const le in a){const se=a[le];ae(se)&&(i[le]=se.bind(l))}if(o){const le=o.call(l,l);Oe(le)&&(e.data=gl(le))}if(lo=!0,n)for(const le in n){const se=n[le],Ie=ae(se)?se.bind(l,l):ae(se.get)?se.get.bind(l,l):rt,Ne=!ae(se)&&ae(se.set)?se.set.bind(l):rt,Ue=Y({get:Ie,set:Ne});Object.defineProperty(i,le,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Ze=>Ue.value=Ze})}if(r)for(const le in r)Ga(r[le],i,l,le);if(s){const le=ae(s)?s.call(l):s;Reflect.ownKeys(le).forEach(se=>{Gt(se,le[se])})}h&&rn(h,e,"c");function j(le,se){te(se)?se.forEach(Ie=>le(Ie.bind(l))):se&&le(se.bind(l))}if(j(Xa,p),j(Je,m),j(uc,g),j(pc,x),j(cc,P),j(hc,E),j(kc,v),j(gc,ee),j(fc,w),j(Yl,_),j(Li,H),j(mc,q),te(B))if(B.length){const le=e.exposed||(e.exposed={});B.forEach(se=>{Object.defineProperty(le,se,{get:()=>l[se],set:Ie=>l[se]=Ie})})}else e.exposed||(e.exposed={});U&&e.render===rt&&(e.render=U),G!=null&&(e.inheritAttrs=G),C&&(e.components=C),S&&(e.directives=S)}function xc(e,t,l=rt,i=!1){te(e)&&(e=io(e));for(const o in e){const n=e[o];let a;Oe(n)?"default"in n?a=Me(n.from||o,n.default,!0):a=Me(n.from||o):a=Me(n),De(a)&&i?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>a.value,set:r=>a.value=r}):t[o]=a}}function rn(e,t,l){lt(te(e)?e.map(i=>i.bind(t.proxy)):e.bind(t.proxy),t,l)}function Ga(e,t,l,i){const o=i.includes(".")?$a(l,i):()=>l[i];if(be(e)){const n=t[e];ae(n)&&dt(o,n)}else if(ae(e))dt(o,e.bind(l));else if(Oe(e))if(te(e))e.forEach(n=>Ga(n,t,l,i));else{const n=ae(e.handler)?e.handler.bind(l):t[e.handler];ae(n)&&dt(o,n,e)}}function Qa(e){const t=e.type,{mixins:l,extends:i}=t,{mixins:o,optionsCache:n,config:{optionMergeStrategies:a}}=e.appContext,r=n.get(t);let s;return r?s=r:!o.length&&!l&&!i?s=t:(s={},o.length&&o.forEach(c=>di(s,c,a,!0)),di(s,t,a)),n.set(t,s),s}function di(e,t,l,i=!1){const{mixins:o,extends:n}=t;n&&di(e,n,l,!0),o&&o.forEach(a=>di(e,a,l,!0));for(const a in t)if(!(i&&a==="expose")){const r=Ec[a]||l&&l[a];e[a]=r?r(e[a],t[a]):t[a]}return e}const Ec={data:sn,props:Yt,emits:Yt,methods:Yt,computed:Yt,beforeCreate:je,created:je,beforeMount:je,mounted:je,beforeUpdate:je,updated:je,beforeDestroy:je,beforeUnmount:je,destroyed:je,unmounted:je,activated:je,deactivated:je,errorCaptured:je,serverPrefetch:je,components:Yt,directives:Yt,watch:Rc,provide:sn,inject:Cc};function sn(e,t){return t?e?function(){return Se(ae(e)?e.call(this,this):e,ae(t)?t.call(this,this):t)}:t:e}function Cc(e,t){return Yt(io(e),io(t))}function io(e){if(te(e)){const t={};for(let l=0;l0)&&!(a&16)){if(a&8){const h=e.vnode.dynamicProps;for(let p=0;p{s=!0;const[m,g]=Za(p,t,!0);Se(a,m),g&&r.push(...g)};!l&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!n&&!s)return i.set(e,al),al;if(te(n))for(let h=0;h-1,g[1]=P<0||x-1||de(g,"default"))&&r.push(p)}}}const c=[a,r];return i.set(e,c),c}function cn(e){return e[0]!=="$"}function hn(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function dn(e,t){return hn(e)===hn(t)}function un(e,t){return te(t)?t.findIndex(l=>dn(l,e)):ae(t)&&dn(t,e)?0:-1}const er=e=>e[0]==="_"||e==="$stable",Ao=e=>te(e)?e.map(ot):[ot(e)],Tc=(e,t,l)=>{if(t._n)return t;const i=He((...o)=>Ao(t(...o)),l);return i._c=!1,i},tr=(e,t,l)=>{const i=e._ctx;for(const o in e){if(er(o))continue;const n=e[o];if(ae(n))t[o]=Tc(o,n,i);else if(n!=null){const a=Ao(n);t[o]=()=>a}}},lr=(e,t)=>{const l=Ao(t);e.slots.default=()=>l},Ac=(e,t)=>{if(e.vnode.shapeFlag&32){const l=t._;l?(e.slots=ke(t),ni(t,"_",l)):tr(t,e.slots={})}else e.slots={},t&&lr(e,t);ni(e.slots,Ti,1)},Ic=(e,t,l)=>{const{vnode:i,slots:o}=e;let n=!0,a=Ce;if(i.shapeFlag&32){const r=t._;r?l&&r===1?n=!1:(Se(o,t),!l&&r===1&&delete o._):(n=!t.$stable,tr(t,o)),a=t}else t&&(lr(e,t),a={default:1});if(n)for(const r in o)!er(r)&&!(r in a)&&delete o[r]};function ir(){return{app:null,config:{isNativeTag:as,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let wc=0;function Oc(e,t){return function(i,o=null){ae(i)||(i=Object.assign({},i)),o!=null&&!Oe(o)&&(o=null);const n=ir(),a=new Set;let r=!1;const s=n.app={_uid:wc++,_component:i,_props:o,_container:null,_context:n,_instance:null,version:Qc,get config(){return n.config},set config(c){},use(c,...h){return a.has(c)||(c&&ae(c.install)?(a.add(c),c.install(s,...h)):ae(c)&&(a.add(c),c(s,...h))),s},mixin(c){return n.mixins.includes(c)||n.mixins.push(c),s},component(c,h){return h?(n.components[c]=h,s):n.components[c]},directive(c,h){return h?(n.directives[c]=h,s):n.directives[c]},mount(c,h,p){if(!r){const m=oe(i,o);return m.appContext=n,h&&t?t(m,c):e(m,c,p),r=!0,s._container=c,c.__vue_app__=s,Ai(m.component)||m.component.proxy}},unmount(){r&&(e(null,s._container),delete s._container.__vue_app__)},provide(c,h){return n.provides[c]=h,s}};return s}}function ui(e,t,l,i,o=!1){if(te(e)){e.forEach((m,g)=>ui(m,t&&(te(t)?t[g]:t),l,i,o));return}if(cl(i)&&!o)return;const n=i.shapeFlag&4?Ai(i.component)||i.component.proxy:i.el,a=o?null:n,{i:r,r:s}=e,c=t&&t.r,h=r.refs===Ce?r.refs={}:r.refs,p=r.setupState;if(c!=null&&c!==s&&(be(c)?(h[c]=null,de(p,c)&&(p[c]=null)):De(c)&&(c.value=null)),ae(s))wt(s,r,12,[a,h]);else{const m=be(s),g=De(s);if(m||g){const x=()=>{if(e.f){const P=m?h[s]:s.value;o?te(P)&&go(P,n):te(P)?P.includes(n)||P.push(n):m?(h[s]=[n],de(p,s)&&(p[s]=h[s])):(s.value=[n],e.k&&(h[e.k]=s.value))}else m?(h[s]=a,de(p,s)&&(p[s]=a)):g&&(s.value=a,e.k&&(h[e.k]=a))};a?(x.id=-1,Be(x,l)):x()}}}let Et=!1;const Jl=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zl=e=>e.nodeType===8;function Fc(e){const{mt:t,p:l,o:{patchProp:i,createText:o,nextSibling:n,parentNode:a,remove:r,insert:s,createComment:c}}=e,h=(k,_)=>{if(!_.hasChildNodes()){l(null,k,_),ri(),_._vnode=k;return}Et=!1,p(_.firstChild,k,null,null,null),ri(),_._vnode=k,Et&&console.error("Hydration completed but contains mismatches.")},p=(k,_,L,H,U,ee=!1)=>{const w=Zl(k)&&k.data==="[",v=()=>P(k,_,L,H,U,w),{type:q,ref:B,shapeFlag:G,patchFlag:C}=_,S=k.nodeType;_.el=k,C===-2&&(ee=!1,_.dynamicChildren=null);let F=null;switch(q){case Dl:S!==3?_.children===""?(s(_.el=o(""),a(k),k),F=k):F=v():(k.data!==_.children&&(Et=!0,k.data=_.children),F=n(k));break;case Ge:S!==8||w?F=v():F=n(k);break;case Ll:if(S!==1&&S!==3)F=v();else{F=k;const re=!_.children.length;for(let j=0;j<_.staticCount;j++)re&&(_.children+=F.nodeType===1?F.outerHTML:F.data),j===_.staticCount-1&&(_.anchor=F),F=n(F);return F}break;case Pe:w?F=x(k,_,L,H,U,ee):F=v();break;default:if(G&1)S!==1||_.type.toLowerCase()!==k.tagName.toLowerCase()?F=v():F=m(k,_,L,H,U,ee);else if(G&6){_.slotScopeIds=U;const re=a(k);if(t(_,re,null,L,H,Jl(re),ee),F=w?E(k):n(k),F&&Zl(F)&&F.data==="teleport end"&&(F=n(F)),cl(_)){let j;w?(j=oe(Pe),j.anchor=F?F.previousSibling:re.lastChild):j=k.nodeType===3?Mt(""):oe("div"),j.el=k,_.component.subTree=j}}else G&64?S!==8?F=v():F=_.type.hydrate(k,_,L,H,U,ee,e,g):G&128&&(F=_.type.hydrate(k,_,L,H,Jl(a(k)),U,ee,e,p))}return B!=null&&ui(B,null,H,_),F},m=(k,_,L,H,U,ee)=>{ee=ee||!!_.dynamicChildren;const{type:w,props:v,patchFlag:q,shapeFlag:B,dirs:G}=_,C=w==="input"&&G||w==="option";if(C||q!==-1){if(G&&ht(_,null,L,"created"),v)if(C||!ee||q&48)for(const F in v)(C&&F.endsWith("value")||Vl(F)&&!Cl(F))&&i(k,F,null,v[F],!1,void 0,L);else v.onClick&&i(k,"onClick",null,v.onClick,!1,void 0,L);let S;if((S=v&&v.onVnodeBeforeMount)&&tt(S,L,_),G&&ht(_,null,L,"beforeMount"),((S=v&&v.onVnodeMounted)||G)&&Na(()=>{S&&tt(S,L,_),G&&ht(_,null,L,"mounted")},H),B&16&&!(v&&(v.innerHTML||v.textContent))){let F=g(k.firstChild,_,k,L,H,U,ee);for(;F;){Et=!0;const re=F;F=F.nextSibling,r(re)}}else B&8&&k.textContent!==_.children&&(Et=!0,k.textContent=_.children)}return k.nextSibling},g=(k,_,L,H,U,ee,w)=>{w=w||!!_.dynamicChildren;const v=_.children,q=v.length;for(let B=0;B{const{slotScopeIds:w}=_;w&&(U=U?U.concat(w):w);const v=a(k),q=g(n(k),_,v,L,H,U,ee);return q&&Zl(q)&&q.data==="]"?n(_.anchor=q):(Et=!0,s(_.anchor=c("]"),v,q),q)},P=(k,_,L,H,U,ee)=>{if(Et=!0,_.el=null,ee){const q=E(k);for(;;){const B=n(k);if(B&&B!==q)r(B);else break}}const w=n(k),v=a(k);return r(k),l(null,_,v,w,L,H,Jl(v),U),w},E=k=>{let _=0;for(;k;)if(k=n(k),k&&Zl(k)&&(k.data==="["&&_++,k.data==="]")){if(_===0)return n(k);_--}return k};return[h,p]}const Be=Na;function zc(e){return Dc(e,Fc)}function Dc(e,t){const l=us();l.__VUE__=!0;const{insert:i,remove:o,patchProp:n,createElement:a,createText:r,createComment:s,setText:c,setElementText:h,parentNode:p,nextSibling:m,setScopeId:g=rt,cloneNode:x,insertStaticContent:P}=e,E=(u,f,y,A=null,T=null,z=null,$=!1,D=null,V=!!f.dynamicChildren)=>{if(u===f)return;u&&!Wt(u,f)&&(A=X(u),Ye(u,T,z,!0),u=null),f.patchFlag===-2&&(V=!1,f.dynamicChildren=null);const{type:I,ref:Q,shapeFlag:K}=f;switch(I){case Dl:k(u,f,y,A);break;case Ge:_(u,f,y,A);break;case Ll:u==null&&L(f,y,A,$);break;case Pe:S(u,f,y,A,T,z,$,D,V);break;default:K&1?ee(u,f,y,A,T,z,$,D,V):K&6?F(u,f,y,A,T,z,$,D,V):(K&64||K&128)&&I.process(u,f,y,A,T,z,$,D,V,_e)}Q!=null&&T&&ui(Q,u&&u.ref,z,f||u,!f)},k=(u,f,y,A)=>{if(u==null)i(f.el=r(f.children),y,A);else{const T=f.el=u.el;f.children!==u.children&&c(T,f.children)}},_=(u,f,y,A)=>{u==null?i(f.el=s(f.children||""),y,A):f.el=u.el},L=(u,f,y,A)=>{[u.el,u.anchor]=P(u.children,f,y,A,u.el,u.anchor)},H=({el:u,anchor:f},y,A)=>{let T;for(;u&&u!==f;)T=m(u),i(u,y,A),u=T;i(f,y,A)},U=({el:u,anchor:f})=>{let y;for(;u&&u!==f;)y=m(u),o(u),u=y;o(f)},ee=(u,f,y,A,T,z,$,D,V)=>{$=$||f.type==="svg",u==null?w(f,y,A,T,z,$,D,V):B(u,f,T,z,$,D,V)},w=(u,f,y,A,T,z,$,D)=>{let V,I;const{type:Q,props:K,shapeFlag:J,transition:ne,patchFlag:pe,dirs:xe}=u;if(u.el&&x!==void 0&&pe===-1)V=u.el=x(u.el);else{if(V=u.el=a(u.type,z,K&&K.is,K),J&8?h(V,u.children):J&16&&q(u.children,V,null,A,T,z&&Q!=="foreignObject",$,D),xe&&ht(u,null,A,"created"),K){for(const Le in K)Le!=="value"&&!Cl(Le)&&n(V,Le,null,K[Le],z,u.children,A,T,M);"value"in K&&n(V,"value",null,K.value),(I=K.onVnodeBeforeMount)&&tt(I,A,u)}v(V,u,u.scopeId,$,A)}xe&&ht(u,null,A,"beforeMount");const Ee=(!T||T&&!T.pendingBranch)&&ne&&!ne.persisted;Ee&&ne.beforeEnter(V),i(V,f,y),((I=K&&K.onVnodeMounted)||Ee||xe)&&Be(()=>{I&&tt(I,A,u),Ee&&ne.enter(V),xe&&ht(u,null,A,"mounted")},T)},v=(u,f,y,A,T)=>{if(y&&g(u,y),A)for(let z=0;z{for(let I=V;I{const D=f.el=u.el;let{patchFlag:V,dynamicChildren:I,dirs:Q}=f;V|=u.patchFlag&16;const K=u.props||Ce,J=f.props||Ce;let ne;y&&Nt(y,!1),(ne=J.onVnodeBeforeUpdate)&&tt(ne,y,f,u),Q&&ht(f,u,y,"beforeUpdate"),y&&Nt(y,!0);const pe=T&&f.type!=="foreignObject";if(I?G(u.dynamicChildren,I,D,y,A,pe,z):$||Ie(u,f,D,null,y,A,pe,z,!1),V>0){if(V&16)C(D,f,K,J,y,A,T);else if(V&2&&K.class!==J.class&&n(D,"class",null,J.class,T),V&4&&n(D,"style",K.style,J.style,T),V&8){const xe=f.dynamicProps;for(let Ee=0;Ee{ne&&tt(ne,y,f,u),Q&&ht(f,u,y,"updated")},A)},G=(u,f,y,A,T,z,$)=>{for(let D=0;D{if(y!==A){for(const D in A){if(Cl(D))continue;const V=A[D],I=y[D];V!==I&&D!=="value"&&n(u,D,I,V,$,f.children,T,z,M)}if(y!==Ce)for(const D in y)!Cl(D)&&!(D in A)&&n(u,D,y[D],null,$,f.children,T,z,M);"value"in A&&n(u,"value",y.value,A.value)}},S=(u,f,y,A,T,z,$,D,V)=>{const I=f.el=u?u.el:r(""),Q=f.anchor=u?u.anchor:r("");let{patchFlag:K,dynamicChildren:J,slotScopeIds:ne}=f;ne&&(D=D?D.concat(ne):ne),u==null?(i(I,y,A),i(Q,y,A),q(f.children,y,Q,T,z,$,D,V)):K>0&&K&64&&J&&u.dynamicChildren?(G(u.dynamicChildren,J,y,T,z,$,D),(f.key!=null||T&&f===T.subTree)&&or(u,f,!0)):Ie(u,f,y,Q,T,z,$,D,V)},F=(u,f,y,A,T,z,$,D,V)=>{f.slotScopeIds=D,u==null?f.shapeFlag&512?T.ctx.activate(f,y,A,$,V):re(f,y,A,T,z,$,V):j(u,f,V)},re=(u,f,y,A,T,z,$)=>{const D=u.component=Bc(u,A,T);if($l(u)&&(D.ctx.renderer=_e),Uc(D),D.asyncDep){if(T&&T.registerDep(D,le),!u.el){const V=D.subTree=oe(Ge);_(null,V,f,y)}return}le(D,u,f,y,T,z,$)},j=(u,f,y)=>{const A=f.component=u.component;if(ic(u,f,y))if(A.asyncDep&&!A.asyncResolved){se(A,f,y);return}else A.next=f,Qs(A.update),A.update();else f.el=u.el,A.vnode=f},le=(u,f,y,A,T,z,$)=>{const D=()=>{if(u.isMounted){let{next:Q,bu:K,u:J,parent:ne,vnode:pe}=u,xe=Q,Ee;Nt(u,!1),Q?(Q.el=pe.el,se(u,Q,$)):Q=pe,K&&Fi(K),(Ee=Q.props&&Q.props.onVnodeBeforeUpdate)&&tt(Ee,ne,Q,pe),Nt(u,!0);const Le=zi(u),it=u.subTree;u.subTree=Le,E(it,Le,p(it.el),X(it),u,T,z),Q.el=Le.el,xe===null&&oc(u,Le.el),J&&Be(J,T),(Ee=Q.props&&Q.props.onVnodeUpdated)&&Be(()=>tt(Ee,ne,Q,pe),T)}else{let Q;const{el:K,props:J}=f,{bm:ne,m:pe,parent:xe}=u,Ee=cl(f);if(Nt(u,!1),ne&&Fi(ne),!Ee&&(Q=J&&J.onVnodeBeforeMount)&&tt(Q,xe,f),Nt(u,!0),K&&ie){const Le=()=>{u.subTree=zi(u),ie(K,u.subTree,u,T,null)};Ee?f.type.__asyncLoader().then(()=>!u.isUnmounted&&Le()):Le()}else{const Le=u.subTree=zi(u);E(null,Le,y,A,u,T,z),f.el=Le.el}if(pe&&Be(pe,T),!Ee&&(Q=J&&J.onVnodeMounted)){const Le=f;Be(()=>tt(Q,xe,Le),T)}(f.shapeFlag&256||xe&&cl(xe.vnode)&&xe.vnode.shapeFlag&256)&&u.a&&Be(u.a,T),u.isMounted=!0,f=y=A=null}},V=u.effect=new _o(D,()=>To(I),u.scope),I=u.update=()=>V.run();I.id=u.uid,Nt(u,!0),I()},se=(u,f,y)=>{f.component=u;const A=u.vnode.props;u.vnode=f,u.next=null,Lc(u,f.props,A,y),Ic(u,f.children,y),ml(),Ci(void 0,u.update),fl()},Ie=(u,f,y,A,T,z,$,D,V=!1)=>{const I=u&&u.children,Q=u?u.shapeFlag:0,K=f.children,{patchFlag:J,shapeFlag:ne}=f;if(J>0){if(J&128){Ue(I,K,y,A,T,z,$,D,V);return}else if(J&256){Ne(I,K,y,A,T,z,$,D,V);return}}ne&8?(Q&16&&M(I,T,z),K!==I&&h(y,K)):Q&16?ne&16?Ue(I,K,y,A,T,z,$,D,V):M(I,T,z,!0):(Q&8&&h(y,""),ne&16&&q(K,y,A,T,z,$,D,V))},Ne=(u,f,y,A,T,z,$,D,V)=>{u=u||al,f=f||al;const I=u.length,Q=f.length,K=Math.min(I,Q);let J;for(J=0;JQ?M(u,T,z,!0,!1,K):q(f,y,A,T,z,$,D,V,K)},Ue=(u,f,y,A,T,z,$,D,V)=>{let I=0;const Q=f.length;let K=u.length-1,J=Q-1;for(;I<=K&&I<=J;){const ne=u[I],pe=f[I]=V?Lt(f[I]):ot(f[I]);if(Wt(ne,pe))E(ne,pe,y,null,T,z,$,D,V);else break;I++}for(;I<=K&&I<=J;){const ne=u[K],pe=f[J]=V?Lt(f[J]):ot(f[J]);if(Wt(ne,pe))E(ne,pe,y,null,T,z,$,D,V);else break;K--,J--}if(I>K){if(I<=J){const ne=J+1,pe=neJ)for(;I<=K;)Ye(u[I],T,z,!0),I++;else{const ne=I,pe=I,xe=new Map;for(I=pe;I<=J;I++){const We=f[I]=V?Lt(f[I]):ot(f[I]);We.key!=null&&xe.set(We.key,I)}let Ee,Le=0;const it=J-pe+1;let el=!1,Bo=0;const kl=new Array(it);for(I=0;I=it){Ye(We,T,z,!0);continue}let ct;if(We.key!=null)ct=xe.get(We.key);else for(Ee=pe;Ee<=J;Ee++)if(kl[Ee-pe]===0&&Wt(We,f[Ee])){ct=Ee;break}ct===void 0?Ye(We,T,z,!0):(kl[ct-pe]=I+1,ct>=Bo?Bo=ct:el=!0,E(We,f[ct],y,null,T,z,$,D,V),Le++)}const Uo=el?Mc(kl):al;for(Ee=Uo.length-1,I=it-1;I>=0;I--){const We=pe+I,ct=f[We],Wo=We+1{const{el:z,type:$,transition:D,children:V,shapeFlag:I}=u;if(I&6){Ze(u.component.subTree,f,y,A);return}if(I&128){u.suspense.move(f,y,A);return}if(I&64){$.move(u,f,y,_e);return}if($===Pe){i(z,f,y);for(let K=0;KD.enter(z),T);else{const{leave:K,delayLeave:J,afterLeave:ne}=D,pe=()=>i(z,f,y),xe=()=>{K(z,()=>{pe(),ne&&ne()})};J?J(z,pe,xe):xe()}else i(z,f,y)},Ye=(u,f,y,A=!1,T=!1)=>{const{type:z,props:$,ref:D,children:V,dynamicChildren:I,shapeFlag:Q,patchFlag:K,dirs:J}=u;if(D!=null&&ui(D,null,y,u,!0),Q&256){f.ctx.deactivate(u);return}const ne=Q&1&&J,pe=!cl(u);let xe;if(pe&&(xe=$&&$.onVnodeBeforeUnmount)&&tt(xe,f,u),Q&6)W(u.component,y,A);else{if(Q&128){u.suspense.unmount(y,A);return}ne&&ht(u,null,f,"beforeUnmount"),Q&64?u.type.remove(u,f,y,T,_e,A):I&&(z!==Pe||K>0&&K&64)?M(I,f,y,!1,!0):(z===Pe&&K&384||!T&&Q&16)&&M(V,f,y),A&&Vt(u)}(pe&&(xe=$&&$.onVnodeUnmounted)||ne)&&Be(()=>{xe&&tt(xe,f,u),ne&&ht(u,null,f,"unmounted")},y)},Vt=u=>{const{type:f,el:y,anchor:A,transition:T}=u;if(f===Pe){R(y,A);return}if(f===Ll){U(u);return}const z=()=>{o(y),T&&!T.persisted&&T.afterLeave&&T.afterLeave()};if(u.shapeFlag&1&&T&&!T.persisted){const{leave:$,delayLeave:D}=T,V=()=>$(y,z);D?D(u.el,z,V):V()}else z()},R=(u,f)=>{let y;for(;u!==f;)y=m(u),o(u),u=y;o(f)},W=(u,f,y)=>{const{bum:A,scope:T,update:z,subTree:$,um:D}=u;A&&Fi(A),T.stop(),z&&(z.active=!1,Ye($,u,f,y)),D&&Be(D,f),Be(()=>{u.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},M=(u,f,y,A=!1,T=!1,z=0)=>{for(let $=z;$u.shapeFlag&6?X(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el),ge=(u,f,y)=>{u==null?f._vnode&&Ye(f._vnode,null,null,!0):E(f._vnode||null,u,f,null,null,null,y),ri(),f._vnode=u},_e={p:E,um:Ye,m:Ze,r:Vt,mt:re,mc:q,pc:Ie,pbc:G,n:X,o:e};let ce,ie;return t&&([ce,ie]=t(_e)),{render:ge,hydrate:ce,createApp:Oc(ge,ce)}}function Nt({effect:e,update:t},l){e.allowRecurse=t.allowRecurse=l}function or(e,t,l=!1){const i=e.children,o=t.children;if(te(i)&&te(o))for(let n=0;n>1,e[l[r]]0&&(t[i]=l[n-1]),l[n]=i)}}for(n=l.length,a=l[n-1];n-- >0;)l[n]=a,a=t[a];return l}const Hc=e=>e.__isTeleport,Pe=Symbol(void 0),Dl=Symbol(void 0),Ge=Symbol(void 0),Ll=Symbol(void 0),Tl=[];let at=null;function N(e=!1){Tl.push(at=e?null:[])}function Sc(){Tl.pop(),at=Tl[Tl.length-1]||null}let Ml=1;function pn(e){Ml+=e}function nr(e){return e.dynamicChildren=Ml>0?at||al:null,Sc(),Ml>0&&at&&at.push(e),e}function Z(e,t,l,i,o,n){return nr(fe(e,t,l,i,o,n,!0))}function we(e,t,l,i,o){return nr(oe(e,t,l,i,o,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function Wt(e,t){return e.type===t.type&&e.key===t.key}const Ti="__vInternal",ar=({key:e})=>e!=null?e:null,li=({ref:e,ref_key:t,ref_for:l})=>e!=null?be(e)||De(e)||ae(e)?{i:Ve,r:e,k:t,f:!!l}:e:null;function fe(e,t=null,l=null,i=0,o=null,n=e===Pe?0:1,a=!1,r=!1){const s={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ar(t),ref:t&&li(t),scopeId:Va,slotScopeIds:null,children:l,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:n,patchFlag:i,dynamicProps:o,dynamicChildren:null,appContext:null};return r?(Io(s,l),n&128&&e.normalize(s)):l&&(s.shapeFlag|=be(l)?8:16),Ml>0&&!a&&at&&(s.patchFlag>0||n&6)&&s.patchFlag!==32&&at.push(s),s}const oe=Vc;function Vc(e,t=null,l=null,i=0,o=null,n=!1){if((!e||e===vc)&&(e=Ge),pi(e)){const r=Dt(e,t,!0);return l&&Io(r,l),Ml>0&&!n&&at&&(r.shapeFlag&6?at[at.indexOf(e)]=r:at.push(r)),r.patchFlag|=-2,r}if(Gc(e)&&(e=e.__vccOpts),t){t=Nc(t);let{class:r,style:s}=t;r&&!be(r)&&(t.class=Ke(r)),Oe(s)&&(La(s)&&!te(s)&&(s=Se({},s)),t.style=Sl(s))}const a=be(e)?1:nc(e)?128:Hc(e)?64:Oe(e)?4:ae(e)?2:0;return fe(e,t,l,i,o,a,n,!0)}function Nc(e){return e?La(e)||Ti in e?Se({},e):e:null}function Dt(e,t,l=!1){const{props:i,ref:o,patchFlag:n,children:a}=e,r=t?no(i||{},t):i;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:r,key:r&&ar(r),ref:t&&t.ref?l&&o?te(o)?o.concat(li(t)):[o,li(t)]:li(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Pe?n===-1?16:n|16:n,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Dt(e.ssContent),ssFallback:e.ssFallback&&Dt(e.ssFallback),el:e.el,anchor:e.anchor}}function Mt(e=" ",t=0){return oe(Dl,null,e,t)}function jc(e,t){const l=oe(Ll,null,e);return l.staticCount=t,l}function Ae(e="",t=!1){return t?(N(),we(Ge,null,e)):oe(Ge,null,e)}function ot(e){return e==null||typeof e=="boolean"?oe(Ge):te(e)?oe(Pe,null,e.slice()):typeof e=="object"?Lt(e):oe(Dl,null,String(e))}function Lt(e){return e.el===null||e.memo?e:Dt(e)}function Io(e,t){let l=0;const{shapeFlag:i}=e;if(t==null)t=null;else if(te(t))l=16;else if(typeof t=="object")if(i&65){const o=t.default;o&&(o._c&&(o._d=!1),Io(e,o()),o._c&&(o._d=!0));return}else{l=32;const o=t._;!o&&!(Ti in t)?t._ctx=Ve:o===3&&Ve&&(Ve.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ae(t)?(t={default:t,_ctx:Ve},l=32):(t=String(t),i&64?(l=16,t=[Mt(t)]):l=8);e.children=t,e.shapeFlag|=l}function no(...e){const t={};for(let l=0;lFe||Ve,hl=e=>{Fe=e,e.scope.on()},Qt=()=>{Fe&&Fe.scope.off(),Fe=null};function rr(e){return e.vnode.shapeFlag&4}let dl=!1;function Uc(e,t=!1){dl=t;const{props:l,children:i}=e.vnode,o=rr(e);Pc(e,l,o,t),Ac(e,i);const n=o?Wc(e,t):void 0;return dl=!1,n}function Wc(e,t){const l=e.type;e.accessCache=Object.create(null),e.proxy=Ta(new Proxy(e.ctx,_c));const{setup:i}=l;if(i){const o=e.setupContext=i.length>1?qc(e):null;hl(e),ml();const n=wt(i,e,0,[e.props,o]);if(fl(),Qt(),pa(n)){if(n.then(Qt,Qt),t)return n.then(a=>{mn(e,a,t)}).catch(a=>{Nl(a,e,0)});e.asyncDep=n}else mn(e,n,t)}else sr(e,t)}function mn(e,t,l){ae(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Oe(t)&&(e.setupState=Fa(t)),sr(e,l)}let fn;function sr(e,t,l){const i=e.type;if(!e.render){if(!t&&fn&&!i.render){const o=i.template;if(o){const{isCustomElement:n,compilerOptions:a}=e.appContext.config,{delimiters:r,compilerOptions:s}=i,c=Se(Se({isCustomElement:n,delimiters:r},a),s);i.render=fn(o,c)}}e.render=i.render||rt}hl(e),ml(),yc(e),fl(),Qt()}function Xc(e){return new Proxy(e.attrs,{get(t,l){return Qe(e,"get","$attrs"),t[l]}})}function qc(e){const t=i=>{e.exposed=i||{}};let l;return{get attrs(){return l||(l=Xc(e))},slots:e.slots,emit:e.emit,expose:t}}function Ai(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Fa(Ta(e.exposed)),{get(t,l){if(l in t)return t[l];if(l in hi)return hi[l](e)}}))}function Kc(e,t=!0){return ae(e)?e.displayName||e.name:e.name||t&&e.__name}function Gc(e){return ae(e)&&"__vccOpts"in e}const Y=(e,t)=>qs(e,t,dl);function he(e,t,l){const i=arguments.length;return i===2?Oe(t)&&!te(t)?pi(t)?oe(e,null,[t]):oe(e,t):oe(e,null,t):(i>3?l=Array.prototype.slice.call(arguments,2):i===3&&pi(l)&&(l=[l]),oe(e,t,l))}const Qc="3.2.37",Jc="http://www.w3.org/2000/svg",Xt=typeof document<"u"?document:null,gn=Xt&&Xt.createElement("template"),Zc={insert:(e,t,l)=>{t.insertBefore(e,l||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,l,i)=>{const o=t?Xt.createElementNS(Jc,e):Xt.createElement(e,l?{is:l}:void 0);return e==="select"&&i&&i.multiple!=null&&o.setAttribute("multiple",i.multiple),o},createText:e=>Xt.createTextNode(e),createComment:e=>Xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,l,i,o,n){const a=l?l.previousSibling:t.lastChild;if(o&&(o===n||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),l),!(o===n||!(o=o.nextSibling)););else{gn.innerHTML=i?`${e}`:e;const r=gn.content;if(i){const s=r.firstChild;for(;s.firstChild;)r.appendChild(s.firstChild);r.removeChild(s)}t.insertBefore(r,l)}return[a?a.nextSibling:t.firstChild,l?l.previousSibling:t.lastChild]}};function eh(e,t,l){const i=e._vtc;i&&(t=(t?[t,...i]:[...i]).join(" ")),t==null?e.removeAttribute("class"):l?e.setAttribute("class",t):e.className=t}function th(e,t,l){const i=e.style,o=be(l);if(l&&!o){for(const n in l)ao(i,n,l[n]);if(t&&!be(t))for(const n in t)l[n]==null&&ao(i,n,"")}else{const n=i.display;o?t!==l&&(i.cssText=l):t&&e.removeAttribute("style"),"_vod"in e&&(i.display=n)}}const kn=/\s*!important$/;function ao(e,t,l){if(te(l))l.forEach(i=>ao(e,t,i));else if(l==null&&(l=""),t.startsWith("--"))e.setProperty(t,l);else{const i=lh(e,t);kn.test(l)?e.setProperty(Jt(i),l.replace(kn,""),"important"):e[i]=l}}const vn=["Webkit","Moz","ms"],Hi={};function lh(e,t){const l=Hi[t];if(l)return l;let i=ut(t);if(i!=="filter"&&i in e)return Hi[t]=i;i=yi(i);for(let o=0;o{let e=Date.now,t=!1;if(typeof window<"u"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const l=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(l&&Number(l[1])<=53)}return[e,t]})();let ro=0;const ah=Promise.resolve(),rh=()=>{ro=0},sh=()=>ro||(ah.then(rh),ro=cr());function ch(e,t,l,i){e.addEventListener(t,l,i)}function hh(e,t,l,i){e.removeEventListener(t,l,i)}function dh(e,t,l,i,o=null){const n=e._vei||(e._vei={}),a=n[t];if(i&&a)a.value=i;else{const[r,s]=uh(t);if(i){const c=n[t]=ph(i,o);ch(e,r,c,s)}else a&&(hh(e,r,a,s),n[t]=void 0)}}const _n=/(?:Once|Passive|Capture)$/;function uh(e){let t;if(_n.test(e)){t={};let l;for(;l=e.match(_n);)e=e.slice(0,e.length-l[0].length),t[l[0].toLowerCase()]=!0}return[Jt(e.slice(2)),t]}function ph(e,t){const l=i=>{const o=i.timeStamp||cr();(nh||o>=l.attached-1)&<(mh(i,l.value),t,5,[i])};return l.value=e,l.attached=sh(),l}function mh(e,t){if(te(t)){const l=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{l.call(e),e._stopped=!0},t.map(i=>o=>!o._stopped&&i&&i(o))}else return t}const yn=/^on[a-z]/,fh=(e,t,l,i,o=!1,n,a,r,s)=>{t==="class"?eh(e,i,o):t==="style"?th(e,l,i):Vl(t)?fo(t)||dh(e,t,l,i,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):gh(e,t,i,o))?oh(e,t,i,n,a,r,s):(t==="true-value"?e._trueValue=i:t==="false-value"&&(e._falseValue=i),ih(e,t,i,o))};function gh(e,t,l,i){return i?!!(t==="innerHTML"||t==="textContent"||t in e&&yn.test(t)&&ae(l)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||yn.test(t)&&be(l)?!1:t in e}const Ct="transition",vl="animation",Bl=(e,{slots:t})=>he(Ya,kh(e),t);Bl.displayName="Transition";const hr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Bl.props=Se({},Ya.props,hr);const jt=(e,t=[])=>{te(e)?e.forEach(l=>l(...t)):e&&e(...t)},xn=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function kh(e){const t={};for(const C in e)C in hr||(t[C]=e[C]);if(e.css===!1)return t;const{name:l="v",type:i,duration:o,enterFromClass:n=`${l}-enter-from`,enterActiveClass:a=`${l}-enter-active`,enterToClass:r=`${l}-enter-to`,appearFromClass:s=n,appearActiveClass:c=a,appearToClass:h=r,leaveFromClass:p=`${l}-leave-from`,leaveActiveClass:m=`${l}-leave-active`,leaveToClass:g=`${l}-leave-to`}=e,x=vh(o),P=x&&x[0],E=x&&x[1],{onBeforeEnter:k,onEnter:_,onEnterCancelled:L,onLeave:H,onLeaveCancelled:U,onBeforeAppear:ee=k,onAppear:w=_,onAppearCancelled:v=L}=t,q=(C,S,F)=>{$t(C,S?h:r),$t(C,S?c:a),F&&F()},B=(C,S)=>{C._isLeaving=!1,$t(C,p),$t(C,g),$t(C,m),S&&S()},G=C=>(S,F)=>{const re=C?w:_,j=()=>q(S,C,F);jt(re,[S,j]),En(()=>{$t(S,C?s:n),Rt(S,C?h:r),xn(re)||Cn(S,i,P,j)})};return Se(t,{onBeforeEnter(C){jt(k,[C]),Rt(C,n),Rt(C,a)},onBeforeAppear(C){jt(ee,[C]),Rt(C,s),Rt(C,c)},onEnter:G(!1),onAppear:G(!0),onLeave(C,S){C._isLeaving=!0;const F=()=>B(C,S);Rt(C,p),yh(),Rt(C,m),En(()=>{!C._isLeaving||($t(C,p),Rt(C,g),xn(H)||Cn(C,i,E,F))}),jt(H,[C,F])},onEnterCancelled(C){q(C,!1),jt(L,[C])},onAppearCancelled(C){q(C,!0),jt(v,[C])},onLeaveCancelled(C){B(C),jt(U,[C])}})}function vh(e){if(e==null)return null;if(Oe(e))return[Si(e.enter),Si(e.leave)];{const t=Si(e);return[t,t]}}function Si(e){return ga(e)}function Rt(e,t){t.split(/\s+/).forEach(l=>l&&e.classList.add(l)),(e._vtc||(e._vtc=new Set)).add(t)}function $t(e,t){t.split(/\s+/).forEach(i=>i&&e.classList.remove(i));const{_vtc:l}=e;l&&(l.delete(t),l.size||(e._vtc=void 0))}function En(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let bh=0;function Cn(e,t,l,i){const o=e._endId=++bh,n=()=>{o===e._endId&&i()};if(l)return setTimeout(n,l);const{type:a,timeout:r,propCount:s}=_h(e,t);if(!a)return i();const c=a+"end";let h=0;const p=()=>{e.removeEventListener(c,m),n()},m=g=>{g.target===e&&++h>=s&&p()};setTimeout(()=>{h(l[x]||"").split(", "),o=i(Ct+"Delay"),n=i(Ct+"Duration"),a=Rn(o,n),r=i(vl+"Delay"),s=i(vl+"Duration"),c=Rn(r,s);let h=null,p=0,m=0;t===Ct?a>0&&(h=Ct,p=a,m=n.length):t===vl?c>0&&(h=vl,p=c,m=s.length):(p=Math.max(a,c),h=p>0?a>c?Ct:vl:null,m=h?h===Ct?n.length:s.length:0);const g=h===Ct&&/\b(transform|all)(,|$)/.test(l[Ct+"Property"]);return{type:h,timeout:p,propCount:m,hasTransform:g}}function Rn(e,t){for(;e.lengthPn(l)+Pn(e[i])))}function Pn(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function yh(){return document.body.offsetHeight}const xh={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Eh=(e,t)=>l=>{if(!("key"in l))return;const i=Jt(l.key);if(t.some(o=>o===i||xh[o]===i))return e(l)},mi={beforeMount(e,{value:t},{transition:l}){e._vod=e.style.display==="none"?"":e.style.display,l&&t?l.beforeEnter(e):bl(e,t)},mounted(e,{value:t},{transition:l}){l&&t&&l.enter(e)},updated(e,{value:t,oldValue:l},{transition:i}){!t!=!l&&(i?t?(i.beforeEnter(e),bl(e,!0),i.enter(e)):i.leave(e,()=>{bl(e,!1)}):bl(e,t))},beforeUnmount(e,{value:t}){bl(e,t)}};function bl(e,t){e.style.display=t?e._vod:"none"}const Ch=Se({patchProp:fh},Zc);let Vi,Ln=!1;function Rh(){return Vi=Ln?Vi:zc(Ch),Ln=!0,Vi}const Ph=(...e)=>{const t=Rh().createApp(...e),{mount:l}=t;return t.mount=i=>{const o=Lh(i);if(o)return l(o,!0,o instanceof SVGElement)},t};function Lh(e){return be(e)?document.querySelector(e):e}const Th=JSON.parse('{"base":"/YukiHookAPI/","lang":"en-US","title":"Yuki Hook API","description":"An efficient Hook API and Xposed Module solution built in Kotlin","head":[["link",{"rel":"icon","href":"/YukiHookAPI/images/logo.png"}]],"locales":{"/en/":{"lang":"en-US","description":"An efficient Hook API and Xposed Module solution built in Kotlin"},"/zh-cn/":{"lang":"zh-CN","description":"\u4E00\u4E2A\u4F7F\u7528 Kotlin \u6784\u5EFA\u7684\u9AD8\u6548 Hook API \u4E0E Xposed \u6A21\u5757\u89E3\u51B3\u65B9\u6848"}}}');var Ah=([e,t,l])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,l]),Ih=e=>{const t=new Set,l=[];return e.forEach(i=>{const o=Ah(i);t.has(o)||(t.add(o),l.push(i))}),l},Ul=e=>/^(https?:)?\/\//.test(e),wh=e=>/^mailto:/.test(e),Oh=e=>/^tel:/.test(e),Oo=e=>Object.prototype.toString.call(e)==="[object Object]",dr=e=>e.replace(/\/$/,""),ur=e=>e.replace(/^\//,""),pr=(e,t)=>{const l=Object.keys(e).sort((i,o)=>{const n=o.split("/").length-i.split("/").length;return n!==0?n:o.length-i.length});for(const i of l)if(t.startsWith(i))return i;return"/"};const mr={"v-8daa1a0e":b(()=>d(()=>import("./index.html.7d529d80.js"),[])),"v-2d0a870d":b(()=>d(()=>import("./index.html.0d73fe13.js"),[])),"v-c0c85b84":b(()=>d(()=>import("./index.html.7de330d6.js"),[])),"v-7a15fe3b":b(()=>d(()=>import("./about.html.4c54fb40.js"),[])),"v-3f851d14":b(()=>d(()=>import("./changelog.html.57e5111c.js"),[])),"v-193cf592":b(()=>d(()=>import("./contacts.html.e284998c.js"),[])),"v-ae7b83f2":b(()=>d(()=>import("./future.html.7c6a1a9d.js"),[])),"v-64fc7bb8":b(()=>d(()=>import("./home.html.02cbcebb.js"),[])),"v-9cfea7fc":b(()=>d(()=>import("./api-example.html.2e9017b9.js"),[])),"v-72c12b7d":b(()=>d(()=>import("./api-exception.html.84af4512.js"),[])),"v-793879e8":b(()=>d(()=>import("./api-using.html.1f938a68.js"),[])),"v-29d6c1ba":b(()=>d(()=>import("./r8-proguard.html.f59eb363.js"),[])),"v-24e71de7":b(()=>d(()=>import("./xposed-using.html.0026a400.js"),[])),"v-7b22efaf":b(()=>d(()=>import("./example.html.bb180469.js"),[])),"v-efb45d4c":b(()=>d(()=>import("./home.html.615f4238.js"),[])),"v-277b35ca":b(()=>d(()=>import("./knowledge.html.9d79bd88.js"),[])),"v-77d752a2":b(()=>d(()=>import("./move-to-new-api.html.e805247b.js"),[])),"v-72889797":b(()=>d(()=>import("./quick-start.html.991be43b.js"),[])),"v-55c11626":b(()=>d(()=>import("./yukihookapi-projectbuilder.html.5ded7ae6.js"),[])),"v-41967128":b(()=>d(()=>import("./about.html.1789aea9.js"),[])),"v-0e6c3476":b(()=>d(()=>import("./changelog.html.dc0ca215.js"),[])),"v-6cf86266":b(()=>d(()=>import("./contacts.html.1669ed01.js"),[])),"v-3106ca14":b(()=>d(()=>import("./future.html.dce50bbf.js"),[])),"v-c8deafb2":b(()=>d(()=>import("./home.html.cc592da6.js"),[])),"v-c6114c9e":b(()=>d(()=>import("./api-example.html.c9be3945.js"),[])),"v-5b43296c":b(()=>d(()=>import("./api-exception.html.c2017872.js"),[])),"v-2ee67152":b(()=>d(()=>import("./api-using.html.8ff50bb9.js"),[])),"v-154d6f69":b(()=>d(()=>import("./r8-proguard.html.22bbf90d.js"),[])),"v-af73b3d0":b(()=>d(()=>import("./xposed-using.html.278102c7.js"),[])),"v-13b430a0":b(()=>d(()=>import("./example.html.ed3ea935.js"),[])),"v-6a609e09":b(()=>d(()=>import("./home.html.17ad2390.js"),[])),"v-b4f1a468":b(()=>d(()=>import("./knowledge.html.4101dc45.js"),[])),"v-c0d5dada":b(()=>d(()=>import("./move-to-new-api.html.28f5adf0.js"),[])),"v-24840ff0":b(()=>d(()=>import("./quick-start.html.c3581766.js"),[])),"v-a2fab4d6":b(()=>d(()=>import("./yukihookapi-projectbuilder.html.69dbcb86.js"),[])),"v-12042f1f":b(()=>d(()=>import("./host-inject.html.0a722722.js"),[])),"v-deaff1d0":b(()=>d(()=>import("./host-lifecycle.html.5b74ef69.js"),[])),"v-33c1dc26":b(()=>d(()=>import("./logger.html.0cf87819.js"),[])),"v-581ddb9c":b(()=>d(()=>import("./reflection.html.01ee432f.js"),[])),"v-2e6ad66c":b(()=>d(()=>import("./xposed-channel.html.6965bccc.js"),[])),"v-68bebbf4":b(()=>d(()=>import("./xposed-storage.html.6a4180bb.js"),[])),"v-6ac5be8e":b(()=>d(()=>import("./host-inject.html.abdaad63.js"),[])),"v-357a8d49":b(()=>d(()=>import("./host-lifecycle.html.6af9a14c.js"),[])),"v-1f0f591e":b(()=>d(()=>import("./logger.html.6a9600dc.js"),[])),"v-001858e3":b(()=>d(()=>import("./reflection.html.c2b91b4b.js"),[])),"v-598546c6":b(()=>d(()=>import("./xposed-channel.html.7069024e.js"),[])),"v-0d914225":b(()=>d(()=>import("./xposed-storage.html.ede06577.js"),[])),"v-6931cb54":b(()=>d(()=>import("./YukiHookAPI.html.bf694837.js"),[])),"v-053599a5":b(()=>d(()=>import("./YukiHookAPI.html.3732de64.js"),[])),"v-30f3ba1e":b(()=>d(()=>import("./InjectYukiHookWithXposed.html.7b3405c0.js"),[])),"v-6e47300f":b(()=>d(()=>import("./CurrentClass.html.9ebd6de0.js"),[])),"v-69c1c226":b(()=>d(()=>import("./GenericClass.html.2c071f63.js"),[])),"v-735374af":b(()=>d(()=>import("./HookClass.html.5578b861.js"),[])),"v-1c516d22":b(()=>d(()=>import("./HookResources.html.1c32befa.js"),[])),"v-66735bfe":b(()=>d(()=>import("./VariousClass.html.417bf33b.js"),[])),"v-3ac40680":b(()=>d(()=>import("./YukiMemberHookCreator.html.de53c2f8.js"),[])),"v-5e81af42":b(()=>d(()=>import("./YukiResourcesHookCreator.html.5e15700c.js"),[])),"v-004a009e":b(()=>d(()=>import("./LoggerFactory.html.1cd3639f.js"),[])),"v-213d88b3":b(()=>d(()=>import("./ReflectionFactory.html.01f072ba.js"),[])),"v-448e9585":b(()=>d(()=>import("./YukiHookFactory.html.e4062578.js"),[])),"v-75a9b636":b(()=>d(()=>import("./HookParam.html.26451068.js"),[])),"v-100b529c":b(()=>d(()=>import("./PackageParam.html.67aefbc0.js"),[])),"v-516df326":b(()=>d(()=>import("./YukiBaseHooker.html.0b3489b9.js"),[])),"v-818b3ca6":b(()=>d(()=>import("./InjectYukiHookWithXposed.html.abda4352.js"),[])),"v-b6a815c4":b(()=>d(()=>import("./CurrentClass.html.46b5c33a.js"),[])),"v-0183e3fc":b(()=>d(()=>import("./GenericClass.html.ee1f4409.js"),[])),"v-57506200":b(()=>d(()=>import("./HookClass.html.5ea967d0.js"),[])),"v-9af56c1a":b(()=>d(()=>import("./HookResources.html.7c7e37b1.js"),[])),"v-032b1710":b(()=>d(()=>import("./VariousClass.html.07a6fda6.js"),[])),"v-71147891":b(()=>d(()=>import("./YukiMemberHookCreator.html.1d205da5.js"),[])),"v-5ed1ceee":b(()=>d(()=>import("./YukiResourcesHookCreator.html.688a3244.js"),[])),"v-e288ce96":b(()=>d(()=>import("./YukiBaseHooker.html.e8ae1b4e.js"),[])),"v-0d0fcec2":b(()=>d(()=>import("./ReflectionFactory.html.625f54f2.js"),[])),"v-65091354":b(()=>d(()=>import("./YukiHookFactory.html.1e9cdab5.js"),[])),"v-36aec5ad":b(()=>d(()=>import("./LoggerFactory.html.3ad979ec.js"),[])),"v-60cbe1b4":b(()=>d(()=>import("./HookParam.html.fb282ad5.js"),[])),"v-b381a126":b(()=>d(()=>import("./PackageParam.html.be077ca1.js"),[])),"v-5e874c45":b(()=>d(()=>import("./ComponentTypeFactory.html.8429e98e.js"),[])),"v-4ea62475":b(()=>d(()=>import("./GraphicsTypeFactory.html.c239b92b.js"),[])),"v-ef79cde2":b(()=>d(()=>import("./ViewTypeFactory.html.fd7c5504.js"),[])),"v-5acc12ab":b(()=>d(()=>import("./DefinedTypeFactory.html.4e8930dc.js"),[])),"v-14ec8671":b(()=>d(()=>import("./VariableTypeFactory.html.58ffcfc1.js"),[])),"v-4709ad58":b(()=>d(()=>import("./ModuleApplication.html.eba04cee.js"),[])),"v-632be8ee":b(()=>d(()=>import("./YukiHookDataChannel.html.a56de5c2.js"),[])),"v-5858709e":b(()=>d(()=>import("./YukiHookModulePrefs.html.549d8090.js"),[])),"v-763140ee":b(()=>d(()=>import("./IYukiHookXposedInit.html.4b063082.js"),[])),"v-8293d958":b(()=>d(()=>import("./ComponentTypeFactory.html.207f9222.js"),[])),"v-7b0abf86":b(()=>d(()=>import("./GraphicsTypeFactory.html.1ef8a384.js"),[])),"v-5309e4a0":b(()=>d(()=>import("./ViewTypeFactory.html.1bc07f15.js"),[])),"v-a2615d0c":b(()=>d(()=>import("./DefinedTypeFactory.html.972bb7a0.js"),[])),"v-ba01a600":b(()=>d(()=>import("./VariableTypeFactory.html.31f26ece.js"),[])),"v-7fec5836":b(()=>d(()=>import("./ModuleApplication.html.de53842b.js"),[])),"v-7414265a":b(()=>d(()=>import("./YukiHookDataChannel.html.98585d6e.js"),[])),"v-003862c2":b(()=>d(()=>import("./YukiHookModulePrefs.html.25bb60fd.js"),[])),"v-1d680acc":b(()=>d(()=>import("./IYukiHookXposedInit.html.67168009.js"),[])),"v-0f719471":b(()=>d(()=>import("./BaseFinder.html.232eb7e2.js"),[])),"v-45111efc":b(()=>d(()=>import("./DexClassFinder.html.5b5ea097.js"),[])),"v-1e2cbc9c":b(()=>d(()=>import("./ConstructorFinder.html.33aa3dfc.js"),[])),"v-22449c48":b(()=>d(()=>import("./FieldFinder.html.34287b71.js"),[])),"v-fd738322":b(()=>d(()=>import("./MethodFinder.html.0f8d3ec6.js"),[])),"v-3d943532":b(()=>d(()=>import("./YukiModuleResources.html.78b4ac12.js"),[])),"v-526c4200":b(()=>d(()=>import("./YukiResForwarder.html.0fa21457.js"),[])),"v-68541dca":b(()=>d(()=>import("./YukiResources.html.1ebe8f03.js"),[])),"v-0a4de82f":b(()=>d(()=>import("./YukiXposedEvent.html.b8957ead.js"),[])),"v-493d37f6":b(()=>d(()=>import("./ChannelData.html.f5bfa9f6.js"),[])),"v-b57870de":b(()=>d(()=>import("./ChannelPriority.html.4033abe5.js"),[])),"v-4b468415":b(()=>d(()=>import("./ModuleClassLoader.html.c67890dd.js"),[])),"v-d99f7f36":b(()=>d(()=>import("./PrefsData.html.96712a80.js"),[])),"v-53bcae06":b(()=>d(()=>import("./ModulePreferenceFragment.html.88c44372.js"),[])),"v-4fca92c0":b(()=>d(()=>import("./BaseFinder.html.0c6ca85f.js"),[])),"v-2a898c66":b(()=>d(()=>import("./DexClassFinder.html.04d39013.js"),[])),"v-a71937aa":b(()=>d(()=>import("./ConstructorFinder.html.fec261d1.js"),[])),"v-42e0f0ab":b(()=>d(()=>import("./FieldFinder.html.a54e7410.js"),[])),"v-a4aa4d00":b(()=>d(()=>import("./MethodFinder.html.2f547804.js"),[])),"v-0f1e3594":b(()=>d(()=>import("./YukiModuleResources.html.4be33489.js"),[])),"v-35faec91":b(()=>d(()=>import("./YukiResForwarder.html.8f56be0b.js"),[])),"v-2c04b82a":b(()=>d(()=>import("./YukiResources.html.24245e68.js"),[])),"v-19e7277e":b(()=>d(()=>import("./YukiXposedEvent.html.bfad9f81.js"),[])),"v-2f64a2d4":b(()=>d(()=>import("./ChannelData.html.7a20315f.js"),[])),"v-87027140":b(()=>d(()=>import("./ChannelPriority.html.60b90501.js"),[])),"v-2d4e0da6":b(()=>d(()=>import("./ModuleClassLoader.html.1b539bd2.js"),[])),"v-58ed8298":b(()=>d(()=>import("./PrefsData.html.872ef9db.js"),[])),"v-23e1a817":b(()=>d(()=>import("./ModulePreferenceFragment.html.bb2257cc.js"),[])),"v-1b2ad030":b(()=>d(()=>import("./CountRules.html.302238b6.js"),[])),"v-547a3c3c":b(()=>d(()=>import("./ModifierRules.html.d20ef28f.js"),[])),"v-58c26516":b(()=>d(()=>import("./NameRules.html.16838860.js"),[])),"v-80fd32ec":b(()=>d(()=>import("./ObjectRules.html.b6996688.js"),[])),"v-a42f54a4":b(()=>d(()=>import("./ConstructorRules.html.2117de16.js"),[])),"v-3e67a42e":b(()=>d(()=>import("./FieldRules.html.9cc3cdd7.js"),[])),"v-2cab152c":b(()=>d(()=>import("./MemberRules.html.a2893e5a.js"),[])),"v-5388621e":b(()=>d(()=>import("./MethodRules.html.2f27242f.js"),[])),"v-1446bdca":b(()=>d(()=>import("./ModuleAppActivity.html.3bf696cc.js"),[])),"v-c7cef530":b(()=>d(()=>import("./ModuleAppCompatActivity.html.211b0863.js"),[])),"v-44efb702":b(()=>d(()=>import("./ModuleContextThemeWrapper.html.81c085e0.js"),[])),"v-52995ef7":b(()=>d(()=>import("./CountRules.html.a37475d9.js"),[])),"v-8d5ce71a":b(()=>d(()=>import("./ModifierRules.html.f137fa02.js"),[])),"v-f5b1ffb2":b(()=>d(()=>import("./NameRules.html.b0ccbaa6.js"),[])),"v-652b815b":b(()=>d(()=>import("./ObjectRules.html.5f24915c.js"),[])),"v-08b70f7f":b(()=>d(()=>import("./ConstructorRules.html.bb803535.js"),[])),"v-21f64ebf":b(()=>d(()=>import("./FieldRules.html.2a5e175f.js"),[])),"v-77f11cf9":b(()=>d(()=>import("./MemberRules.html.ba98f1ad.js"),[])),"v-64827680":b(()=>d(()=>import("./MethodRules.html.a600b3a9.js"),[])),"v-2d5d16db":b(()=>d(()=>import("./ModuleAppActivity.html.98503158.js"),[])),"v-cadbe48e":b(()=>d(()=>import("./ModuleAppCompatActivity.html.6270d1af.js"),[])),"v-78731c50":b(()=>d(()=>import("./ModuleContextThemeWrapper.html.477209a2.js"),[])),"v-b8000f3a":b(()=>d(()=>import("./MemberRulesResult.html.e6b8258c.js"),[])),"v-5e375d98":b(()=>d(()=>import("./MemberRulesResult.html.92b1d783.js"),[])),"v-3706649a":b(()=>d(()=>import("./404.html.035cddf5.js"),[]))};var Ht=(e={})=>e;function fr(e,t,l){var i,o,n;t===void 0&&(t=50),l===void 0&&(l={});var a=(i=l.isImmediate)!=null&&i,r=(o=l.callback)!=null&&o,s=l.maxWait,c=Date.now(),h=[];function p(){if(s!==void 0){var g=Date.now()-c;if(g+t>=s)return s-g}return t}var m=function(){var g=[].slice.call(arguments),x=this;return new Promise(function(P,E){var k=a&&n===void 0;if(n!==void 0&&clearTimeout(n),n=setTimeout(function(){if(n=void 0,c=Date.now(),!a){var L=e.apply(x,g);r&&r(L),h.forEach(function(H){return(0,H.resolve)(L)}),h=[]}},p()),k){var _=e.apply(x,g);return r&&r(_),P(_)}h.push({resolve:P,reject:E})})};return m.cancel=function(g){n!==void 0&&clearTimeout(n),h.forEach(function(x){return(0,x.reject)(g)}),h=[]},m}/*!
    +  * vue-router v4.1.5
    +  * (c) 2022 Eduardo San Martin Morote
    +  * @license MIT
    +  */const nl=typeof window<"u";function Fh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ve=Object.assign;function Ni(e,t){const l={};for(const i in t){const o=t[i];l[i]=st(o)?o.map(e):e(o)}return l}const Al=()=>{},st=Array.isArray,zh=/\/$/,Dh=e=>e.replace(zh,"");function ji(e,t,l="/"){let i,o={},n="",a="";const r=t.indexOf("#");let s=t.indexOf("?");return r=0&&(s=-1),s>-1&&(i=t.slice(0,s),n=t.slice(s+1,r>-1?r:t.length),o=e(n)),r>-1&&(i=i||t.slice(0,r),a=t.slice(r,t.length)),i=Vh(i!=null?i:t,l),{fullPath:i+(n&&"?")+n+a,path:i,query:o,hash:a}}function Mh(e,t){const l=t.query?e(t.query):"";return t.path+(l&&"?")+l+(t.hash||"")}function Tn(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Hh(e,t,l){const i=t.matched.length-1,o=l.matched.length-1;return i>-1&&i===o&&ul(t.matched[i],l.matched[o])&&gr(t.params,l.params)&&e(t.query)===e(l.query)&&t.hash===l.hash}function ul(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function gr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const l in e)if(!Sh(e[l],t[l]))return!1;return!0}function Sh(e,t){return st(e)?An(e,t):st(t)?An(t,e):e===t}function An(e,t){return st(t)?e.length===t.length&&e.every((l,i)=>l===t[i]):e.length===1&&e[0]===t}function Vh(e,t){if(e.startsWith("/"))return e;if(!e)return t;const l=t.split("/"),i=e.split("/");let o=l.length-1,n,a;for(n=0;n1&&o--;else break;return l.slice(0,o).join("/")+"/"+i.slice(n-(n===i.length?1:0)).join("/")}var Hl;(function(e){e.pop="pop",e.push="push"})(Hl||(Hl={}));var Il;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Il||(Il={}));function Nh(e){if(!e)if(nl){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Dh(e)}const jh=/^[^#]+#/;function $h(e,t){return e.replace(jh,"#")+t}function Yh(e,t){const l=document.documentElement.getBoundingClientRect(),i=e.getBoundingClientRect();return{behavior:t.behavior,left:i.left-l.left-(t.left||0),top:i.top-l.top-(t.top||0)}}const Ii=()=>({left:window.pageXOffset,top:window.pageYOffset});function Bh(e){let t;if("el"in e){const l=e.el,i=typeof l=="string"&&l.startsWith("#"),o=typeof l=="string"?i?document.getElementById(l.slice(1)):document.querySelector(l):l;if(!o)return;t=Yh(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function In(e,t){return(history.state?history.state.position-t:-1)+e}const so=new Map;function Uh(e,t){so.set(e,t)}function Wh(e){const t=so.get(e);return so.delete(e),t}let Xh=()=>location.protocol+"//"+location.host;function kr(e,t){const{pathname:l,search:i,hash:o}=t,n=e.indexOf("#");if(n>-1){let r=o.includes(e.slice(n))?e.slice(n).length:1,s=o.slice(r);return s[0]!=="/"&&(s="/"+s),Tn(s,"")}return Tn(l,e)+i+o}function qh(e,t,l,i){let o=[],n=[],a=null;const r=({state:m})=>{const g=kr(e,location),x=l.value,P=t.value;let E=0;if(m){if(l.value=g,t.value=m,a&&a===x){a=null;return}E=P?m.position-P.position:0}else i(g);o.forEach(k=>{k(l.value,x,{delta:E,type:Hl.pop,direction:E?E>0?Il.forward:Il.back:Il.unknown})})};function s(){a=l.value}function c(m){o.push(m);const g=()=>{const x=o.indexOf(m);x>-1&&o.splice(x,1)};return n.push(g),g}function h(){const{history:m}=window;!m.state||m.replaceState(ve({},m.state,{scroll:Ii()}),"")}function p(){for(const m of n)m();n=[],window.removeEventListener("popstate",r),window.removeEventListener("beforeunload",h)}return window.addEventListener("popstate",r),window.addEventListener("beforeunload",h),{pauseListeners:s,listen:c,destroy:p}}function wn(e,t,l,i=!1,o=!1){return{back:e,current:t,forward:l,replaced:i,position:window.history.length,scroll:o?Ii():null}}function Kh(e){const{history:t,location:l}=window,i={value:kr(e,l)},o={value:t.state};o.value||n(i.value,{back:null,current:i.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function n(s,c,h){const p=e.indexOf("#"),m=p>-1?(l.host&&document.querySelector("base")?e:e.slice(p))+s:Xh()+e+s;try{t[h?"replaceState":"pushState"](c,"",m),o.value=c}catch(g){console.error(g),l[h?"replace":"assign"](m)}}function a(s,c){const h=ve({},t.state,wn(o.value.back,s,o.value.forward,!0),c,{position:o.value.position});n(s,h,!0),i.value=s}function r(s,c){const h=ve({},o.value,t.state,{forward:s,scroll:Ii()});n(h.current,h,!0);const p=ve({},wn(i.value,s,null),{position:h.position+1},c);n(s,p,!1),i.value=s}return{location:i,state:o,push:r,replace:a}}function Gh(e){e=Nh(e);const t=Kh(e),l=qh(e,t.state,t.location,t.replace);function i(n,a=!0){a||l.pauseListeners(),history.go(n)}const o=ve({location:"",base:e,go:i,createHref:$h.bind(null,e)},t,l);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Qh(e){return typeof e=="string"||e&&typeof e=="object"}function vr(e){return typeof e=="string"||typeof e=="symbol"}const mt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},br=Symbol("");var On;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(On||(On={}));function pl(e,t){return ve(new Error,{type:e,[br]:!0},t)}function pt(e,t){return e instanceof Error&&br in e&&(t==null||!!(e.type&t))}const Fn="[^/]+?",Jh={sensitive:!1,strict:!1,start:!0,end:!0},Zh=/[.+*?^${}()[\]/\\]/g;function ed(e,t){const l=ve({},Jh,t),i=[];let o=l.start?"^":"";const n=[];for(const c of e){const h=c.length?[]:[90];l.strict&&!c.length&&(o+="/");for(let p=0;pt.length?t.length===1&&t[0]===40+40?1:-1:0}function ld(e,t){let l=0;const i=e.score,o=t.score;for(;l0&&t[t.length-1]<0}const id={type:0,value:""},od=/[a-zA-Z0-9_]/;function nd(e){if(!e)return[[]];if(e==="/")return[[id]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${l})/"${c}": ${g}`)}let l=0,i=l;const o=[];let n;function a(){n&&o.push(n),n=[]}let r=0,s,c="",h="";function p(){!c||(l===0?n.push({type:0,value:c}):l===1||l===2||l===3?(n.length>1&&(s==="*"||s==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),n.push({type:1,value:c,regexp:h,repeatable:s==="*"||s==="+",optional:s==="*"||s==="?"})):t("Invalid state to consume buffer"),c="")}function m(){c+=s}for(;r{a(_)}:Al}function a(h){if(vr(h)){const p=i.get(h);p&&(i.delete(h),l.splice(l.indexOf(p),1),p.children.forEach(a),p.alias.forEach(a))}else{const p=l.indexOf(h);p>-1&&(l.splice(p,1),h.record.name&&i.delete(h.record.name),h.children.forEach(a),h.alias.forEach(a))}}function r(){return l}function s(h){let p=0;for(;p=0&&(h.record.path!==l[p].record.path||!_r(h,l[p]));)p++;l.splice(p,0,h),h.record.name&&!Mn(h)&&i.set(h.record.name,h)}function c(h,p){let m,g={},x,P;if("name"in h&&h.name){if(m=i.get(h.name),!m)throw pl(1,{location:h});P=m.record.name,g=ve(Dn(p.params,m.keys.filter(_=>!_.optional).map(_=>_.name)),h.params&&Dn(h.params,m.keys.map(_=>_.name))),x=m.stringify(g)}else if("path"in h)x=h.path,m=l.find(_=>_.re.test(x)),m&&(g=m.parse(x),P=m.record.name);else{if(m=p.name?i.get(p.name):l.find(_=>_.re.test(p.path)),!m)throw pl(1,{location:h,currentLocation:p});P=m.record.name,g=ve({},p.params,h.params),x=m.stringify(g)}const E=[];let k=m;for(;k;)E.unshift(k.record),k=k.parent;return{name:P,path:x,params:g,matched:E,meta:hd(E)}}return e.forEach(h=>n(h)),{addRoute:n,resolve:c,removeRoute:a,getRoutes:r,getRecordMatcher:o}}function Dn(e,t){const l={};for(const i of t)i in e&&(l[i]=e[i]);return l}function sd(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:cd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function cd(e){const t={},l=e.props||!1;if("component"in e)t.default=l;else for(const i in e.components)t[i]=typeof l=="boolean"?l:l[i];return t}function Mn(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function hd(e){return e.reduce((t,l)=>ve(t,l.meta),{})}function Hn(e,t){const l={};for(const i in e)l[i]=i in t?t[i]:e[i];return l}function _r(e,t){return t.children.some(l=>l===e||_r(e,l))}const yr=/#/g,dd=/&/g,ud=/\//g,pd=/=/g,md=/\?/g,xr=/\+/g,fd=/%5B/g,gd=/%5D/g,Er=/%5E/g,kd=/%60/g,Cr=/%7B/g,vd=/%7C/g,Rr=/%7D/g,bd=/%20/g;function Fo(e){return encodeURI(""+e).replace(vd,"|").replace(fd,"[").replace(gd,"]")}function _d(e){return Fo(e).replace(Cr,"{").replace(Rr,"}").replace(Er,"^")}function co(e){return Fo(e).replace(xr,"%2B").replace(bd,"+").replace(yr,"%23").replace(dd,"%26").replace(kd,"`").replace(Cr,"{").replace(Rr,"}").replace(Er,"^")}function yd(e){return co(e).replace(pd,"%3D")}function xd(e){return Fo(e).replace(yr,"%23").replace(md,"%3F")}function Ed(e){return e==null?"":xd(e).replace(ud,"%2F")}function fi(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Cd(e){const t={};if(e===""||e==="?")return t;const i=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;on&&co(n)):[i&&co(i)]).forEach(n=>{n!==void 0&&(t+=(t.length?"&":"")+l,n!=null&&(t+="="+n))})}return t}function Rd(e){const t={};for(const l in e){const i=e[l];i!==void 0&&(t[l]=st(i)?i.map(o=>o==null?null:""+o):i==null?i:""+i)}return t}const Pd=Symbol(""),Vn=Symbol(""),wi=Symbol(""),zo=Symbol(""),ho=Symbol("");function _l(){let e=[];function t(i){return e.push(i),()=>{const o=e.indexOf(i);o>-1&&e.splice(o,1)}}function l(){e=[]}return{add:t,list:()=>e,reset:l}}function Tt(e,t,l,i,o){const n=i&&(i.enterCallbacks[o]=i.enterCallbacks[o]||[]);return()=>new Promise((a,r)=>{const s=p=>{p===!1?r(pl(4,{from:l,to:t})):p instanceof Error?r(p):Qh(p)?r(pl(2,{from:t,to:p})):(n&&i.enterCallbacks[o]===n&&typeof p=="function"&&n.push(p),a())},c=e.call(i&&i.instances[o],t,l,s);let h=Promise.resolve(c);e.length<3&&(h=h.then(s)),h.catch(p=>r(p))})}function $i(e,t,l,i){const o=[];for(const n of e)for(const a in n.components){let r=n.components[a];if(!(t!=="beforeRouteEnter"&&!n.instances[a]))if(Ld(r)){const c=(r.__vccOpts||r)[t];c&&o.push(Tt(c,l,i,n,a))}else{let s=r();o.push(()=>s.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${n.path}"`));const h=Fh(c)?c.default:c;n.components[a]=h;const m=(h.__vccOpts||h)[t];return m&&Tt(m,l,i,n,a)()}))}}return o}function Ld(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Nn(e){const t=Me(wi),l=Me(zo),i=Y(()=>t.resolve(O(e.to))),o=Y(()=>{const{matched:s}=i.value,{length:c}=s,h=s[c-1],p=l.matched;if(!h||!p.length)return-1;const m=p.findIndex(ul.bind(null,h));if(m>-1)return m;const g=jn(s[c-2]);return c>1&&jn(h)===g&&p[p.length-1].path!==g?p.findIndex(ul.bind(null,s[c-2])):m}),n=Y(()=>o.value>-1&&wd(l.params,i.value.params)),a=Y(()=>o.value>-1&&o.value===l.matched.length-1&&gr(l.params,i.value.params));function r(s={}){return Id(s)?t[O(e.replace)?"replace":"push"](O(e.to)).catch(Al):Promise.resolve()}return{route:i,href:Y(()=>i.value.href),isActive:n,isExactActive:a,navigate:r}}const Td=ue({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Nn,setup(e,{slots:t}){const l=gl(Nn(e)),{options:i}=Me(wi),o=Y(()=>({[$n(e.activeClass,i.linkActiveClass,"router-link-active")]:l.isActive,[$n(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:l.isExactActive}));return()=>{const n=t.default&&t.default(l);return e.custom?n:he("a",{"aria-current":l.isExactActive?e.ariaCurrentValue:null,href:l.href,onClick:l.navigate,class:o.value},n)}}}),Ad=Td;function Id(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function wd(e,t){for(const l in t){const i=t[l],o=e[l];if(typeof i=="string"){if(i!==o)return!1}else if(!st(o)||o.length!==i.length||i.some((n,a)=>n!==o[a]))return!1}return!0}function jn(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const $n=(e,t,l)=>e!=null?e:t!=null?t:l,Od=ue({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:l}){const i=Me(ho),o=Y(()=>e.route||i.value),n=Me(Vn,0),a=Y(()=>{let c=O(n);const{matched:h}=o.value;let p;for(;(p=h[c])&&!p.components;)c++;return c}),r=Y(()=>o.value.matched[a.value]);Gt(Vn,Y(()=>a.value+1)),Gt(Pd,r),Gt(ho,o);const s=ye();return dt(()=>[s.value,r.value,e.name],([c,h,p],[m,g,x])=>{h&&(h.instances[p]=c,g&&g!==h&&c&&c===m&&(h.leaveGuards.size||(h.leaveGuards=g.leaveGuards),h.updateGuards.size||(h.updateGuards=g.updateGuards))),c&&h&&(!g||!ul(h,g)||!m)&&(h.enterCallbacks[p]||[]).forEach(P=>P(c))},{flush:"post"}),()=>{const c=o.value,h=e.name,p=r.value,m=p&&p.components[h];if(!m)return Yn(l.default,{Component:m,route:c});const g=p.props[h],x=g?g===!0?c.params:typeof g=="function"?g(c):g:null,E=he(m,ve({},x,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(p.instances[h]=null)},ref:s}));return Yn(l.default,{Component:E,route:c})||E}}});function Yn(e,t){if(!e)return null;const l=e(t);return l.length===1?l[0]:l}const Pr=Od;function Fd(e){const t=rd(e.routes,e),l=e.parseQuery||Cd,i=e.stringifyQuery||Sn,o=e.history,n=_l(),a=_l(),r=_l(),s=wa(mt);let c=mt;nl&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const h=Ni.bind(null,R=>""+R),p=Ni.bind(null,Ed),m=Ni.bind(null,fi);function g(R,W){let M,X;return vr(R)?(M=t.getRecordMatcher(R),X=W):X=R,t.addRoute(X,M)}function x(R){const W=t.getRecordMatcher(R);W&&t.removeRoute(W)}function P(){return t.getRoutes().map(R=>R.record)}function E(R){return!!t.getRecordMatcher(R)}function k(R,W){if(W=ve({},W||s.value),typeof R=="string"){const ie=ji(l,R,W.path),u=t.resolve({path:ie.path},W),f=o.createHref(ie.fullPath);return ve(ie,u,{params:m(u.params),hash:fi(ie.hash),redirectedFrom:void 0,href:f})}let M;if("path"in R)M=ve({},R,{path:ji(l,R.path,W.path).path});else{const ie=ve({},R.params);for(const u in ie)ie[u]==null&&delete ie[u];M=ve({},R,{params:p(R.params)}),W.params=p(W.params)}const X=t.resolve(M,W),ge=R.hash||"";X.params=h(m(X.params));const _e=Mh(i,ve({},R,{hash:_d(ge),path:X.path})),ce=o.createHref(_e);return ve({fullPath:_e,hash:ge,query:i===Sn?Rd(R.query):R.query||{}},X,{redirectedFrom:void 0,href:ce})}function _(R){return typeof R=="string"?ji(l,R,s.value.path):ve({},R)}function L(R,W){if(c!==R)return pl(8,{from:W,to:R})}function H(R){return w(R)}function U(R){return H(ve(_(R),{replace:!0}))}function ee(R){const W=R.matched[R.matched.length-1];if(W&&W.redirect){const{redirect:M}=W;let X=typeof M=="function"?M(R):M;return typeof X=="string"&&(X=X.includes("?")||X.includes("#")?X=_(X):{path:X},X.params={}),ve({query:R.query,hash:R.hash,params:"path"in X?{}:R.params},X)}}function w(R,W){const M=c=k(R),X=s.value,ge=R.state,_e=R.force,ce=R.replace===!0,ie=ee(M);if(ie)return w(ve(_(ie),{state:typeof ie=="object"?ve({},ge,ie.state):ge,force:_e,replace:ce}),W||M);const u=M;u.redirectedFrom=W;let f;return!_e&&Hh(i,X,M)&&(f=pl(16,{to:u,from:X}),Ne(X,X,!0,!1)),(f?Promise.resolve(f):q(u,X)).catch(y=>pt(y)?pt(y,2)?y:Ie(y):le(y,u,X)).then(y=>{if(y){if(pt(y,2))return w(ve({replace:ce},_(y.to),{state:typeof y.to=="object"?ve({},ge,y.to.state):ge,force:_e}),W||u)}else y=G(u,X,!0,ce,ge);return B(u,X,y),y})}function v(R,W){const M=L(R,W);return M?Promise.reject(M):Promise.resolve()}function q(R,W){let M;const[X,ge,_e]=zd(R,W);M=$i(X.reverse(),"beforeRouteLeave",R,W);for(const ie of X)ie.leaveGuards.forEach(u=>{M.push(Tt(u,R,W))});const ce=v.bind(null,R,W);return M.push(ce),tl(M).then(()=>{M=[];for(const ie of n.list())M.push(Tt(ie,R,W));return M.push(ce),tl(M)}).then(()=>{M=$i(ge,"beforeRouteUpdate",R,W);for(const ie of ge)ie.updateGuards.forEach(u=>{M.push(Tt(u,R,W))});return M.push(ce),tl(M)}).then(()=>{M=[];for(const ie of R.matched)if(ie.beforeEnter&&!W.matched.includes(ie))if(st(ie.beforeEnter))for(const u of ie.beforeEnter)M.push(Tt(u,R,W));else M.push(Tt(ie.beforeEnter,R,W));return M.push(ce),tl(M)}).then(()=>(R.matched.forEach(ie=>ie.enterCallbacks={}),M=$i(_e,"beforeRouteEnter",R,W),M.push(ce),tl(M))).then(()=>{M=[];for(const ie of a.list())M.push(Tt(ie,R,W));return M.push(ce),tl(M)}).catch(ie=>pt(ie,8)?ie:Promise.reject(ie))}function B(R,W,M){for(const X of r.list())X(R,W,M)}function G(R,W,M,X,ge){const _e=L(R,W);if(_e)return _e;const ce=W===mt,ie=nl?history.state:{};M&&(X||ce?o.replace(R.fullPath,ve({scroll:ce&&ie&&ie.scroll},ge)):o.push(R.fullPath,ge)),s.value=R,Ne(R,W,M,ce),Ie()}let C;function S(){C||(C=o.listen((R,W,M)=>{if(!Vt.listening)return;const X=k(R),ge=ee(X);if(ge){w(ve(ge,{replace:!0}),X).catch(Al);return}c=X;const _e=s.value;nl&&Uh(In(_e.fullPath,M.delta),Ii()),q(X,_e).catch(ce=>pt(ce,12)?ce:pt(ce,2)?(w(ce.to,X).then(ie=>{pt(ie,20)&&!M.delta&&M.type===Hl.pop&&o.go(-1,!1)}).catch(Al),Promise.reject()):(M.delta&&o.go(-M.delta,!1),le(ce,X,_e))).then(ce=>{ce=ce||G(X,_e,!1),ce&&(M.delta&&!pt(ce,8)?o.go(-M.delta,!1):M.type===Hl.pop&&pt(ce,20)&&o.go(-1,!1)),B(X,_e,ce)}).catch(Al)}))}let F=_l(),re=_l(),j;function le(R,W,M){Ie(R);const X=re.list();return X.length?X.forEach(ge=>ge(R,W,M)):console.error(R),Promise.reject(R)}function se(){return j&&s.value!==mt?Promise.resolve():new Promise((R,W)=>{F.add([R,W])})}function Ie(R){return j||(j=!R,S(),F.list().forEach(([W,M])=>R?M(R):W()),F.reset()),R}function Ne(R,W,M,X){const{scrollBehavior:ge}=e;if(!nl||!ge)return Promise.resolve();const _e=!M&&Wh(In(R.fullPath,0))||(X||!M)&&history.state&&history.state.scroll||null;return jl().then(()=>ge(R,W,_e)).then(ce=>ce&&Bh(ce)).catch(ce=>le(ce,R,W))}const Ue=R=>o.go(R);let Ze;const Ye=new Set,Vt={currentRoute:s,listening:!0,addRoute:g,removeRoute:x,hasRoute:E,getRoutes:P,resolve:k,options:e,push:H,replace:U,go:Ue,back:()=>Ue(-1),forward:()=>Ue(1),beforeEach:n.add,beforeResolve:a.add,afterEach:r.add,onError:re.add,isReady:se,install(R){const W=this;R.component("RouterLink",Ad),R.component("RouterView",Pr),R.config.globalProperties.$router=W,Object.defineProperty(R.config.globalProperties,"$route",{enumerable:!0,get:()=>O(s)}),nl&&!Ze&&s.value===mt&&(Ze=!0,H(o.location).catch(ge=>{}));const M={};for(const ge in mt)M[ge]=Y(()=>s.value[ge]);R.provide(wi,W),R.provide(zo,gl(M)),R.provide(ho,s);const X=R.unmount;Ye.add(R),R.unmount=function(){Ye.delete(R),Ye.size<1&&(c=mt,C&&C(),C=null,s.value=mt,Ze=!1,j=!1),X()}}};return Vt}function tl(e){return e.reduce((t,l)=>t.then(()=>l()),Promise.resolve())}function zd(e,t){const l=[],i=[],o=[],n=Math.max(t.matched.length,e.matched.length);for(let a=0;aul(c,r))?i.push(r):l.push(r));const s=e.matched[a];s&&(t.matched.find(c=>ul(c,s))||o.push(s))}return[l,i,o]}function Zt(){return Me(wi)}function St(){return Me(zo)}const Dd=({headerLinkSelector:e,headerAnchorSelector:t,delay:l,offset:i=5})=>{const o=Zt(),a=fr(()=>{var P,E,k,_;const r=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(r-0)m.some(H=>H.hash===L.hash));for(let L=0;L=((E=(P=H.parentElement)==null?void 0:P.offsetTop)!=null?E:0)-i,w=!U||r<((_=(k=U.parentElement)==null?void 0:k.offsetTop)!=null?_:0)-i;if(!(ee&&w))continue;const q=decodeURIComponent(o.currentRoute.value.hash),B=decodeURIComponent(H.hash);if(q===B)return;if(p){for(let G=L+1;G{window.addEventListener("scroll",a)}),Yl(()=>{window.removeEventListener("scroll",a)})},Bn=async(e,t)=>{const{scrollBehavior:l}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t,force:!0}).finally(()=>e.options.scrollBehavior=l)},Md="a.sidebar-item",Hd=".header-anchor",Sd=300,Vd=5,Nd=Ht({setup(){Dd({headerLinkSelector:Md,headerAnchorSelector:Hd,delay:Sd,offset:Vd})}}),Un=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,jd=()=>window.scrollTo({top:0,behavior:"smooth"});const $d=ue({name:"BackToTop",setup(){const e=ye(0),t=Y(()=>e.value>300),l=fr(()=>{e.value=Un()},100);Je(()=>{e.value=Un(),window.addEventListener("scroll",()=>l())});const i=he("div",{class:"back-to-top",onClick:jd});return()=>he(Bl,{name:"back-to-top"},()=>t.value?i:null)}}),Yd=Ht({rootComponents:[$d]});const Bd=he("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[he("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),he("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Ud=ue({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Wl(),l=Y(()=>{var i;return(i=e.locales[t.value])!=null?i:{openInNewWindow:"open in new window"}});return()=>he("span",[Bd,he("span",{class:"external-link-icon-sr-only"},l.value.openInNewWindow)])}}),Wd={"/en/":{openInNewWindow:"open in new window"},"/zh-cn/":{openInNewWindow:"\u5728\u65B0\u7A97\u53E3\u4E2D\u6253\u5F00"},"/":{openInNewWindow:"open in new window"}},Xd=Ht({enhance({app:e}){e.component("ExternalLinkIcon",he(Ud,{locales:Wd}))}});/*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */var Bt=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},i=window.Promise||function(C){function S(){}C(S,S)},o=function(C){var S=C.target;if(S===q){x();return}L.indexOf(S)!==-1&&P({target:S})},n=function(){if(!(U||!v.original)){var C=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(ee-C)>w.scrollOffset&&setTimeout(x,150)}},a=function(C){var S=C.key||C.keyCode;(S==="Escape"||S==="Esc"||S===27)&&x()},r=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C;if(C.background&&(q.style.background=C.background),C.container&&C.container instanceof Object&&(S.container=Bt({},w.container,C.container)),C.template){var F=ii(C.template)?C.template:document.querySelector(C.template);S.template=F}return w=Bt({},w,S),L.forEach(function(re){re.dispatchEvent(ll("medium-zoom:update",{detail:{zoom:B}}))}),B},s=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Bt({},w,C))},c=function(){for(var C=arguments.length,S=Array(C),F=0;F0?S.reduce(function(j,le){return[].concat(j,Xn(le))},[]):L;return re.forEach(function(j){j.classList.remove("medium-zoom-image"),j.dispatchEvent(ll("medium-zoom:detach",{detail:{zoom:B}}))}),L=L.filter(function(j){return re.indexOf(j)===-1}),B},p=function(C,S){var F=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return L.forEach(function(re){re.addEventListener("medium-zoom:"+C,S,F)}),H.push({type:"medium-zoom:"+C,listener:S,options:F}),B},m=function(C,S){var F=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return L.forEach(function(re){re.removeEventListener("medium-zoom:"+C,S,F)}),H=H.filter(function(re){return!(re.type==="medium-zoom:"+C&&re.listener.toString()===S.toString())}),B},g=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C.target,F=function(){var j={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},le=void 0,se=void 0;if(w.container)if(w.container instanceof Object)j=Bt({},j,w.container),le=j.width-j.left-j.right-w.margin*2,se=j.height-j.top-j.bottom-w.margin*2;else{var Ie=ii(w.container)?w.container:document.querySelector(w.container),Ne=Ie.getBoundingClientRect(),Ue=Ne.width,Ze=Ne.height,Ye=Ne.left,Vt=Ne.top;j=Bt({},j,{width:Ue,height:Ze,left:Ye,top:Vt})}le=le||j.width-w.margin*2,se=se||j.height-w.margin*2;var R=v.zoomedHd||v.original,W=Wn(R)?le:R.naturalWidth||le,M=Wn(R)?se:R.naturalHeight||se,X=R.getBoundingClientRect(),ge=X.top,_e=X.left,ce=X.width,ie=X.height,u=Math.min(W,le)/ce,f=Math.min(M,se)/ie,y=Math.min(u,f),A=(-_e+(le-ce)/2+w.margin+j.left)/y,T=(-ge+(se-ie)/2+w.margin+j.top)/y,z="scale("+y+") translate3d("+A+"px, "+T+"px, 0)";v.zoomed.style.transform=z,v.zoomedHd&&(v.zoomedHd.style.transform=z)};return new i(function(re){if(S&&L.indexOf(S)===-1){re(B);return}var j=function Ue(){U=!1,v.zoomed.removeEventListener("transitionend",Ue),v.original.dispatchEvent(ll("medium-zoom:opened",{detail:{zoom:B}})),re(B)};if(v.zoomed){re(B);return}if(S)v.original=S;else if(L.length>0){var le=L;v.original=le[0]}else{re(B);return}if(v.original.dispatchEvent(ll("medium-zoom:open",{detail:{zoom:B}})),ee=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,U=!0,v.zoomed=Gd(v.original),document.body.appendChild(q),w.template){var se=ii(w.template)?w.template:document.querySelector(w.template);v.template=document.createElement("div"),v.template.appendChild(se.content.cloneNode(!0)),document.body.appendChild(v.template)}if(document.body.appendChild(v.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),v.original.classList.add("medium-zoom-image--hidden"),v.zoomed.classList.add("medium-zoom-image--opened"),v.zoomed.addEventListener("click",x),v.zoomed.addEventListener("transitionend",j),v.original.getAttribute("data-zoom-src")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("srcset"),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.src=v.zoomed.getAttribute("data-zoom-src"),v.zoomedHd.onerror=function(){clearInterval(Ie),console.warn("Unable to reach the zoom image target "+v.zoomedHd.src),v.zoomedHd=null,F()};var Ie=setInterval(function(){v.zoomedHd.complete&&(clearInterval(Ie),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",x),document.body.appendChild(v.zoomedHd),F())},10)}else if(v.original.hasAttribute("srcset")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.removeAttribute("loading");var Ne=v.zoomedHd.addEventListener("load",function(){v.zoomedHd.removeEventListener("load",Ne),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",x),document.body.appendChild(v.zoomedHd),F()})}else F()})},x=function(){return new i(function(C){if(U||!v.original){C(B);return}var S=function F(){v.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(v.zoomed),v.zoomedHd&&document.body.removeChild(v.zoomedHd),document.body.removeChild(q),v.zoomed.classList.remove("medium-zoom-image--opened"),v.template&&document.body.removeChild(v.template),U=!1,v.zoomed.removeEventListener("transitionend",F),v.original.dispatchEvent(ll("medium-zoom:closed",{detail:{zoom:B}})),v.original=null,v.zoomed=null,v.zoomedHd=null,v.template=null,C(B)};U=!0,document.body.classList.remove("medium-zoom--opened"),v.zoomed.style.transform="",v.zoomedHd&&(v.zoomedHd.style.transform=""),v.template&&(v.template.style.transition="opacity 150ms",v.template.style.opacity=0),v.original.dispatchEvent(ll("medium-zoom:close",{detail:{zoom:B}})),v.zoomed.addEventListener("transitionend",S)})},P=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C.target;return v.original?x():g({target:S})},E=function(){return w},k=function(){return L},_=function(){return v.original},L=[],H=[],U=!1,ee=0,w=l,v={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?w=t:(t||typeof t=="string")&&c(t),w=Bt({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},w);var q=Kd(w.background);document.addEventListener("click",o),document.addEventListener("keyup",a),document.addEventListener("scroll",n),window.addEventListener("resize",x);var B={open:g,close:x,toggle:P,update:r,clone:s,attach:c,detach:h,on:p,off:m,getOptions:E,getImages:k,getZoomedImage:_};return B};function Jd(e,t){t===void 0&&(t={});var l=t.insertAt;if(!(!e||typeof document>"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",l==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Zd=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Jd(Zd);const eu=Qd,tu=Symbol("mediumZoom");const lu=".theme-default-content > img, .theme-default-content :not(a) > img",iu={},ou=300,nu=Ht({enhance({app:e,router:t}){const l=eu(iu);l.refresh=(i=lu)=>{l.detach(),l.attach(i)},e.provide(tu,l),t.afterEach(()=>{setTimeout(()=>l.refresh(),ou)})}});/**
    + * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
    + * @license MIT
    + */const me={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
    '},status:null,set:e=>{const t=me.isStarted();e=Yi(e,me.settings.minimum,1),me.status=e===1?null:e;const l=me.render(!t),i=l.querySelector(me.settings.barSelector),o=me.settings.speed,n=me.settings.easing;return l.offsetWidth,au(a=>{ti(i,{transform:"translate3d("+qn(e)+"%,0,0)",transition:"all "+o+"ms "+n}),e===1?(ti(l,{transition:"none",opacity:"1"}),l.offsetWidth,setTimeout(function(){ti(l,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){me.remove(),a()},o)},o)):setTimeout(()=>a(),o)}),me},isStarted:()=>typeof me.status=="number",start:()=>{me.status||me.set(0);const e=()=>{setTimeout(()=>{!me.status||(me.trickle(),e())},me.settings.trickleSpeed)};return me.settings.trickle&&e(),me},done:e=>!e&&!me.status?me:me.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=me.status;return t?(typeof e!="number"&&(e=(1-t)*Yi(Math.random()*t,.1,.95)),t=Yi(t+e,0,.994),me.set(t)):me.start()},trickle:()=>me.inc(Math.random()*me.settings.trickleRate),render:e=>{if(me.isRendered())return document.getElementById("nprogress");Kn(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=me.settings.template;const l=t.querySelector(me.settings.barSelector),i=e?"-100":qn(me.status||0),o=document.querySelector(me.settings.parent);return ti(l,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),o!==document.body&&Kn(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{Gn(document.documentElement,"nprogress-busy"),Gn(document.querySelector(me.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&ru(e)},isRendered:()=>!!document.getElementById("nprogress")},Yi=(e,t,l)=>el?l:e,qn=e=>(-1+e)*100,au=function(){const e=[];function t(){const l=e.shift();l&&l(t)}return function(l){e.push(l),e.length===1&&t()}}(),ti=function(){const e=["Webkit","O","Moz","ms"],t={};function l(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(r,s){return s.toUpperCase()})}function i(a){const r=document.body.style;if(a in r)return a;let s=e.length;const c=a.charAt(0).toUpperCase()+a.slice(1);let h;for(;s--;)if(h=e[s]+c,h in r)return h;return a}function o(a){return a=l(a),t[a]||(t[a]=i(a))}function n(a,r,s){r=o(r),a.style[r]=s}return function(a,r){for(const s in r){const c=r[s];c!==void 0&&Object.prototype.hasOwnProperty.call(r,s)&&n(a,s,c)}}}(),Lr=(e,t)=>(typeof e=="string"?e:Do(e)).indexOf(" "+t+" ")>=0,Kn=(e,t)=>{const l=Do(e),i=l+t;Lr(l,t)||(e.className=i.substring(1))},Gn=(e,t)=>{const l=Do(e);if(!Lr(e,t))return;const i=l.replace(" "+t+" "," ");e.className=i.substring(1,i.length-1)},Do=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),ru=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const su=()=>{Je(()=>{const e=Zt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(l=>{t.has(l.path)||me.start()}),e.afterEach(l=>{t.add(l.path),me.done()})})},cu=Ht({setup(){su()}}),hu=JSON.parse(`{"logo":"/images/logo.png","repo":"https://github.com/fankes/YukiHookAPI","docsRepo":"https://github.com/fankes/YukiHookAPI","docsBranch":"master","docsDir":"docs-source/src","editLinkPattern":":repo/edit/:branch/:path","sidebar":{"/en/":[{"text":"Get Started","collapsible":true,"children":["/en/guide/home","/en/guide/knowledge","/en/guide/quick-start","/en/guide/example","/en/guide/move-to-new-api"]},{"text":"Configs","collapsible":true,"children":["/en/config/api-example","/en/config/api-exception","/en/config/xposed-using","/en/config/api-using","/en/config/r8-proguard"]},{"text":"Tools","collapsible":true,"children":["/en/tools/yukihookapi-projectbuilder"]},{"text":"API Document","collapsible":true,"children":["/en/api/home",{"text":"Public API\xA0","collapsible":true,"children":["/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources"]},{"text":"Special Features\xA0","collapsible":true,"children":["/en/api/special-features/reflection","/en/api/special-features/logger","/en/api/special-features/xposed-storage","/en/api/special-features/xposed-channel","/en/api/special-features/host-lifecycle","/en/api/special-features/host-inject"]}]},{"text":"About","collapsible":true,"children":["/en/about/changelog","/en/about/future","/en/about/contacts","/en/about/about"]}],"/zh-cn/":[{"text":"\u5165\u95E8","collapsible":true,"children":["/zh-cn/guide/home","/zh-cn/guide/knowledge","/zh-cn/guide/quick-start","/zh-cn/guide/example","/zh-cn/guide/move-to-new-api"]},{"text":"\u914D\u7F6E","collapsible":true,"children":["/zh-cn/config/api-example","/zh-cn/config/api-exception","/zh-cn/config/xposed-using","/zh-cn/config/api-using","/zh-cn/config/r8-proguard"]},{"text":"\u5DE5\u5177","collapsible":true,"children":["/zh-cn/tools/yukihookapi-projectbuilder"]},{"text":"API \u6587\u6863","collapsible":true,"children":["/zh-cn/api/home",{"text":"Public API\xA0","collapsible":true,"children":["/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources"]},{"text":"\u7279\u8272\u529F\u80FD\xA0","collapsible":true,"children":["/zh-cn/api/special-features/reflection","/zh-cn/api/special-features/logger","/zh-cn/api/special-features/xposed-storage","/zh-cn/api/special-features/xposed-channel","/zh-cn/api/special-features/host-lifecycle","/zh-cn/api/special-features/host-inject"]}]},{"text":"\u5173\u4E8E","collapsible":true,"children":["/zh-cn/about/changelog","/zh-cn/about/future","/zh-cn/about/contacts","/zh-cn/about/about"]}]},"sidebarDepth":2,"locales":{"/en/":{"navbar":[{"text":"Navigation","children":[{"text":"Get Started","children":[{"text":"Introduce","link":"/en/guide/home"},{"text":"Basic Knowledge","link":"/en/guide/knowledge"},{"text":"Quick Start","link":"/en/guide/quick-start"},{"text":"Usage Example","link":"/en/guide/example"},{"text":"Migrate from Xposed API","link":"/en/guide/move-to-new-api"}]},{"text":"Configs","children":[{"text":"API Basic Configs","link":"/en/config/api-example"},{"text":"API Exception Handling","link":"/en/config/api-exception"},{"text":"Use as Xposed Module Configs","link":"/en/config/xposed-using"},{"text":"Use as Hook API Configs","link":"/en/config/api-using"},{"text":"R8 & Proguard Obfuscate","link":"/en/config/r8-proguard"}]},{"text":"Tools","children":[{"text":"YukiHookAPI Project Builder","link":"/en/tools/yukihookapi-projectbuilder"}]},{"text":"API Document","children":[{"text":"Document Introduction","link":"/en/api/home"},{"text":"Public API","link":"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","activeMatch":"/en/api/public/"},{"text":"Special Features","link":"/en/api/special-features/reflection","activeMatch":"/en/api/special-features/"}]},{"text":"About","children":[{"text":"Changelog","link":"/en/about/changelog"},{"text":"Looking for Future","link":"/en/about/future"},{"text":"Contact Us","link":"/en/about/contacts"},{"text":"About this Document","link":"/en/about/about"}]}]},{"text":"Contact Us","link":"/en/about/contacts"}],"selectLanguageText":"English (US)","selectLanguageName":"English","editLinkText":"Edit this page on Github","tip":"Tips","warning":"Notice","danger":"Pay Attention"},"/zh-cn/":{"navbar":[{"text":"\u5BFC\u822A","children":[{"text":"\u5165\u95E8","children":[{"text":"\u4ECB\u7ECD","link":"/zh-cn/guide/home"},{"text":"\u57FA\u7840\u77E5\u8BC6","link":"/zh-cn/guide/knowledge"},{"text":"\u5FEB\u901F\u5F00\u59CB","link":"/zh-cn/guide/quick-start"},{"text":"\u7528\u6CD5\u793A\u4F8B","link":"/zh-cn/guide/example"},{"text":"\u4ECE Xposed API \u8FC1\u79FB","link":"/zh-cn/guide/move-to-new-api"}]},{"text":"\u914D\u7F6E","children":[{"text":"API \u57FA\u672C\u914D\u7F6E","link":"/zh-cn/config/api-example"},{"text":"API \u5F02\u5E38\u5904\u7406","link":"/zh-cn/config/api-exception"},{"text":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","link":"/zh-cn/config/xposed-using"},{"text":"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","link":"/zh-cn/config/api-using"},{"text":"R8 \u4E0E Proguard \u6DF7\u6DC6","link":"/zh-cn/config/r8-proguard"}]},{"text":"\u5DE5\u5177","children":[{"text":"YukiHookAPI \u6784\u5EFA\u5DE5\u5177","link":"/zh-cn/tools/yukihookapi-projectbuilder"}]},{"text":"API \u6587\u6863","children":[{"text":"\u6587\u6863\u4ECB\u7ECD","link":"/zh-cn/api/home"},{"text":"Public API","link":"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","activeMatch":"/zh-cn/api/public/"},{"text":"\u7279\u8272\u529F\u80FD","link":"/zh-cn/api/special-features/reflection","activeMatch":"/zh-cn/api/special-features/"}]},{"text":"\u5173\u4E8E","children":[{"text":"\u66F4\u65B0\u65E5\u5FD7","link":"/zh-cn/about/changelog"},{"text":"\u5C55\u671B\u672A\u6765","link":"/zh-cn/about/future"},{"text":"\u8054\u7CFB\u6211\u4EEC","link":"/zh-cn/about/contacts"},{"text":"\u5173\u4E8E\u6B64\u6587\u6863","link":"/zh-cn/about/about"}]}]},{"text":"\u8054\u7CFB\u6211\u4EEC","link":"/zh-cn/about/contacts"}],"selectLanguageText":"\u7B80\u4F53\u4E2D\u6587 (CN)","selectLanguageName":"\u7B80\u4F53\u4E2D\u6587","editLinkText":"\u5728 Github \u4E0A\u7F16\u8F91\u6B64\u9875","notFound":["\u8FD9\u91CC\u4EC0\u4E48\u90FD\u6CA1\u6709","\u6211\u4EEC\u600E\u4E48\u5230\u8FD9\u6765\u4E86\uFF1F","\u8FD9\u662F\u4E00\u4E2A 404 \u9875\u9762","\u770B\u8D77\u6765\u6211\u4EEC\u8FDB\u5165\u4E86\u9519\u8BEF\u7684\u94FE\u63A5"],"backToHome":"\u56DE\u5230\u9996\u9875","contributorsText":"\u8D21\u732E\u8005","lastUpdatedText":"\u4E0A\u6B21\u66F4\u65B0","tip":"\u5C0F\u63D0\u793A","warning":"\u6CE8\u610F","danger":"\u7279\u522B\u6CE8\u610F","openInNewWindow":"\u5728\u65B0\u7A97\u53E3\u4E2D\u6253\u5F00","toggleColorMode":"\u5207\u6362\u989C\u8272\u6A21\u5F0F"},"/":{"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),Tr=ye(hu),du=()=>Tr;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateThemeData=e=>{Tr.value=e});const Ar=Symbol(""),uu=()=>{const e=Me(Ar);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},pu=(e,t)=>{var l;return{...e,...(l=e.locales)==null?void 0:l[t]}},mu=Ht({enhance({app:e}){const t=du(),l=e._context.provides[No],i=Y(()=>pu(t.value,l.value));e.provide(Ar,i),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return i.value}}})}}),fu=ue({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,l)=>(N(),Z("span",{class:Ke(["badge",e.type]),style:Sl({verticalAlign:e.vertical})},[Re(t.$slots,"default",{},()=>[Mt(ze(e.text),1)])],6))}}),Te=(e,t)=>{const l=e.__vccOpts||e;for(const[i,o]of t)l[i]=o;return l},gu=Te(fu,[["__file","Badge.vue"]]),ku=ue({name:"CodeGroup",setup(e,{slots:t}){const l=ye(-1),i=ye([]),o=(r=l.value)=>{r{r>0?l.value=r-1:l.value=i.value.length-1,i.value[l.value].focus()},a=(r,s)=>{r.key===" "||r.key==="Enter"?(r.preventDefault(),l.value=s):r.key==="ArrowRight"?(r.preventDefault(),o(s)):r.key==="ArrowLeft"&&(r.preventDefault(),n(s))};return()=>{var s;const r=(((s=t.default)==null?void 0:s.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return r.length===0?null:(l.value<0||l.value>r.length-1?(l.value=r.findIndex(c=>c.props.active===""||c.props.active===!0),l.value===-1&&(l.value=0)):r.forEach((c,h)=>{c.props.active=h===l.value}),he("div",{class:"code-group"},[he("div",{class:"code-group__nav"},he("ul",{class:"code-group__ul"},r.map((c,h)=>{const p=h===l.value;return he("li",{class:"code-group__li"},he("button",{ref:m=>{m&&(i.value[h]=m)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":p},ariaPressed:p,ariaExpanded:p,onClick:()=>l.value=h,onKeydown:m=>a(m,h)},c.props.title))}))),r]))}}}),vu=["aria-selected"],bu=ue({name:"CodeGroupItem"}),_u=ue({...bu,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,l)=>(N(),Z("div",{class:Ke(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[Re(t.$slots,"default")],10,vu))}}),yu=Te(_u,[["__file","CodeGroupItem.vue"]]);var Qn;const Ir=typeof window<"u",xu=e=>typeof e=="function",Eu=e=>typeof e=="string",Bi=()=>{};Ir&&((Qn=window==null?void 0:window.navigator)==null?void 0:Qn.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function gi(e){return typeof e=="function"?e():O(e)}function Cu(e,t){function l(...i){e(()=>t.apply(this,i),{fn:t,thisArg:this,args:i})}return l}const wr=e=>e();function Ru(e=wr){const t=ye(!0);function l(){t.value=!1}function i(){t.value=!0}return{isActive:t,pause:l,resume:i,eventFilter:(...n)=>{t.value&&e(...n)}}}function Pu(e){return e}function Or(e){return fs()?(gs(e),!0):!1}function Lu(e,t=!0){wo()?Xa(e):t?e():jl(e)}function Tu(e,t=!0){wo()?Je(e):t?e():jl(e)}function Au(e=!1,t={}){const{truthyValue:l=!0,falsyValue:i=!1}=t,o=De(e),n=ye(e);function a(r){if(arguments.length)return n.value=r,n.value;{const s=gi(l);return n.value=n.value===s?gi(i):s,n.value}}return o?a:[n,a]}var Jn=Object.getOwnPropertySymbols,Iu=Object.prototype.hasOwnProperty,wu=Object.prototype.propertyIsEnumerable,Ou=(e,t)=>{var l={};for(var i in e)Iu.call(e,i)&&t.indexOf(i)<0&&(l[i]=e[i]);if(e!=null&&Jn)for(var i of Jn(e))t.indexOf(i)<0&&wu.call(e,i)&&(l[i]=e[i]);return l};function Fu(e,t,l={}){const i=l,{eventFilter:o=wr}=i,n=Ou(i,["eventFilter"]);return dt(e,Cu(o,t),n)}var zu=Object.defineProperty,Du=Object.defineProperties,Mu=Object.getOwnPropertyDescriptors,ki=Object.getOwnPropertySymbols,Fr=Object.prototype.hasOwnProperty,zr=Object.prototype.propertyIsEnumerable,Zn=(e,t,l)=>t in e?zu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,Hu=(e,t)=>{for(var l in t||(t={}))Fr.call(t,l)&&Zn(e,l,t[l]);if(ki)for(var l of ki(t))zr.call(t,l)&&Zn(e,l,t[l]);return e},Su=(e,t)=>Du(e,Mu(t)),Vu=(e,t)=>{var l={};for(var i in e)Fr.call(e,i)&&t.indexOf(i)<0&&(l[i]=e[i]);if(e!=null&&ki)for(var i of ki(e))t.indexOf(i)<0&&zr.call(e,i)&&(l[i]=e[i]);return l};function Nu(e,t,l={}){const i=l,{eventFilter:o}=i,n=Vu(i,["eventFilter"]),{eventFilter:a,pause:r,resume:s,isActive:c}=Ru(o);return{stop:Fu(e,t,Su(Hu({},n),{eventFilter:a})),pause:r,resume:s,isActive:c}}function ju(e){var t;const l=gi(e);return(t=l==null?void 0:l.$el)!=null?t:l}const vi=Ir?window:void 0;function $u(...e){let t,l,i,o;if(Eu(e[0])?([l,i,o]=e,t=vi):[t,l,i,o]=e,!t)return Bi;let n=Bi;const a=dt(()=>ju(t),s=>{n(),s&&(s.addEventListener(l,i,o),n=()=>{s.removeEventListener(l,i,o),n=Bi})},{immediate:!0,flush:"post"}),r=()=>{a(),n()};return Or(r),r}function Yu(e,t=!1){const l=ye(),i=()=>l.value=Boolean(e());return i(),Tu(i,t),l}function Bu(e,t={}){const{window:l=vi}=t,i=Yu(()=>l&&"matchMedia"in l&&typeof l.matchMedia=="function");let o;const n=ye(!1),a=()=>{!i.value||(o||(o=l.matchMedia(e)),n.value=o.matches)};return Lu(()=>{a(),o&&("addEventListener"in o?o.addEventListener("change",a):o.addListener(a),Or(()=>{"removeEventListener"in o?o.removeEventListener("change",a):o.removeListener(a)}))}),n}const uo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},po="__vueuse_ssr_handlers__";uo[po]=uo[po]||{};const Uu=uo[po];function Wu(e,t){return Uu[e]||t}function Xu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}var qu=Object.defineProperty,ea=Object.getOwnPropertySymbols,Ku=Object.prototype.hasOwnProperty,Gu=Object.prototype.propertyIsEnumerable,ta=(e,t,l)=>t in e?qu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,la=(e,t)=>{for(var l in t||(t={}))Ku.call(t,l)&&ta(e,l,t[l]);if(ea)for(var l of ea(t))Gu.call(t,l)&&ta(e,l,t[l]);return e};const Qu={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Ju(e,t,l,i={}){var o;const{flush:n="pre",deep:a=!0,listenToStorageChanges:r=!0,writeDefaults:s=!0,mergeDefaults:c=!1,shallow:h,window:p=vi,eventFilter:m,onError:g=w=>{console.error(w)}}=i,x=(h?wa:ye)(t);if(!l)try{l=Wu("getDefaultStorage",()=>{var w;return(w=vi)==null?void 0:w.localStorage})()}catch(w){g(w)}if(!l)return x;const P=gi(t),E=Xu(P),k=(o=i.serializer)!=null?o:Qu[E],{pause:_,resume:L}=Nu(x,()=>H(x.value),{flush:n,deep:a,eventFilter:m});return p&&r&&$u(p,"storage",ee),ee(),x;function H(w){try{w==null?l.removeItem(e):l.setItem(e,k.write(w))}catch(v){g(v)}}function U(w){if(!(w&&w.key!==e)){_();try{const v=w?w.newValue:l.getItem(e);if(v==null)return s&&P!==null&&l.setItem(e,k.write(P)),P;if(!w&&c){const q=k.read(v);return xu(c)?c(q,P):E==="object"&&!Array.isArray(q)?la(la({},P),q):q}else return typeof v!="string"?v:k.read(v)}catch(v){g(v)}finally{L()}}}function ee(w){w&&w.key!==e||(x.value=U(w))}}function Zu(e){return Bu("(prefers-color-scheme: dark)",e)}var ia;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(ia||(ia={}));var ep=Object.defineProperty,oa=Object.getOwnPropertySymbols,tp=Object.prototype.hasOwnProperty,lp=Object.prototype.propertyIsEnumerable,na=(e,t,l)=>t in e?ep(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,ip=(e,t)=>{for(var l in t||(t={}))tp.call(t,l)&&na(e,l,t[l]);if(oa)for(var l of oa(t))lp.call(t,l)&&na(e,l,t[l]);return e};const op={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};ip({linear:Pu},op);const $e=()=>uu(),Dr=Symbol(""),Mo=()=>{const e=Me(Dr);if(!e)throw new Error("useDarkMode() is called without provider.");return e},np=()=>{const e=$e(),t=Zu(),l=Ju("vuepress-color-scheme",e.value.colorMode),i=Y({get(){return e.value.colorModeSwitch?l.value==="auto"?t.value:l.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?l.value="auto":l.value=o?"dark":"light"}});Gt(Dr,i),ap(i)},ap=e=>{const t=(l=e.value)=>{const i=window==null?void 0:window.document.querySelector("html");i==null||i.classList.toggle("dark",l)};Je(()=>{dt(e,t,{immediate:!0})}),Li(()=>t())},Mr=(...e)=>{const l=Zt().resolve(...e),i=l.matched[l.matched.length-1];if(!(i!=null&&i.redirect))return l;const{redirect:o}=i,n=ae(o)?o(l):o,a=be(n)?{path:n}:n;return Mr({hash:l.hash,query:l.query,params:l.params,...a})},Ho=e=>{const t=Mr(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Ui=null,yl=null;const rp={wait:()=>Ui,pending:()=>{Ui=new Promise(e=>yl=e)},resolve:()=>{yl==null||yl(),Ui=null,yl=null}},Hr=()=>rp,Sr=Symbol("sidebarItems"),So=()=>{const e=Me(Sr);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},sp=()=>{const e=$e(),t=vt(),l=Y(()=>cp(t.value,e.value));Gt(Sr,l)},cp=(e,t)=>{var o,n,a,r;const l=(n=(o=e.sidebar)!=null?o:t.sidebar)!=null?n:"auto",i=(r=(a=e.sidebarDepth)!=null?a:t.sidebarDepth)!=null?r:2;return e.home||l===!1?[]:l==="auto"?dp(i):te(l)?Vr(l,i):Oo(l)?up(l,i):[]},hp=(e,t)=>({text:e.title,link:e.link,children:Vo(e.children,t)}),Vo=(e,t)=>t>0?e.map(l=>hp(l,t-1)):[],dp=e=>{const t=Ot();return[{text:t.value.title,children:Vo(t.value.headers,e)}]},Vr=(e,t)=>{const l=St(),i=Ot(),o=n=>{var r;let a;if(be(n)?a=Ho(n):a=n,a.children)return{...a,children:a.children.map(s=>o(s))};if(a.link===l.path){const s=((r=i.value.headers[0])==null?void 0:r.level)===1?i.value.headers[0].children:i.value.headers;return{...a,children:Vo(s,t)}}return a};return e.map(n=>o(n))},up=(e,t)=>{var n;const l=St(),i=pr(e,l.path),o=(n=e[i])!=null?n:[];return Vr(o,t)},pp={},mp={class:"theme-default-content"};function fp(e,t){const l=_t("Content");return N(),Z("div",mp,[oe(l)])}const gp=Te(pp,[["render",fp],["__file","HomeContent.vue"]]),kp={key:0,class:"features"},vp=ue({__name:"HomeFeatures",setup(e){const t=vt(),l=Y(()=>te(t.value.features)?t.value.features:[]);return(i,o)=>O(l).length?(N(),Z("div",kp,[(N(!0),Z(Pe,null,zt(O(l),n=>(N(),Z("div",{key:n.title,class:"feature"},[fe("h2",null,ze(n.title),1),fe("p",null,ze(n.details),1)]))),128))])):Ae("v-if",!0)}}),bp=Te(vp,[["__file","HomeFeatures.vue"]]),_p=["innerHTML"],yp=["textContent"],xp=ue({__name:"HomeFooter",setup(e){const t=vt(),l=Y(()=>t.value.footer),i=Y(()=>t.value.footerHtml);return(o,n)=>O(l)?(N(),Z(Pe,{key:0},[Ae(" eslint-disable-next-line vue/no-v-html "),O(i)?(N(),Z("div",{key:0,class:"footer",innerHTML:O(l)},null,8,_p)):(N(),Z("div",{key:1,class:"footer",textContent:ze(O(l))},null,8,yp))],64)):Ae("v-if",!0)}}),Ep=Te(xp,[["__file","HomeFooter.vue"]]),Cp=["href","rel","target","aria-label"],Rp=ue({inheritAttrs:!1}),Pp=ue({...Rp,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,l=St(),i=Gr(),{item:o}=Ei(t),n=Y(()=>Ul(o.value.link)),a=Y(()=>wh(o.value.link)||Oh(o.value.link)),r=Y(()=>{if(!a.value){if(o.value.target)return o.value.target;if(n.value)return"_blank"}}),s=Y(()=>r.value==="_blank"),c=Y(()=>!n.value&&!a.value&&!s.value),h=Y(()=>{if(!a.value){if(o.value.rel)return o.value.rel;if(s.value)return"noopener noreferrer"}}),p=Y(()=>o.value.ariaLabel||o.value.text),m=Y(()=>{const P=Object.keys(i.value.locales);return P.length?!P.some(E=>E===o.value.link):o.value.link!=="/"}),g=Y(()=>m.value?l.path.startsWith(o.value.link):!1),x=Y(()=>c.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(l.path):g.value:!1);return(P,E)=>{const k=_t("RouterLink"),_=_t("AutoLinkExternalIcon");return O(c)?(N(),we(k,no({key:0,class:{"router-link-active":O(x)},to:O(o).link,"aria-label":O(p)},P.$attrs),{default:He(()=>[Re(P.$slots,"before"),Mt(" "+ze(O(o).text)+" ",1),Re(P.$slots,"after")]),_:3},16,["class","to","aria-label"])):(N(),Z("a",no({key:1,class:"external-link",href:O(o).link,rel:O(h),target:O(r),"aria-label":O(p)},P.$attrs),[Re(P.$slots,"before"),Mt(" "+ze(O(o).text)+" ",1),O(s)?(N(),we(_,{key:0})):Ae("v-if",!0),Re(P.$slots,"after")],16,Cp))}}}),kt=Te(Pp,[["__file","AutoLink.vue"]]),Lp={class:"hero"},Tp={key:0,id:"main-title"},Ap={key:1,class:"description"},Ip={key:2,class:"actions"},wp=ue({__name:"HomeHero",setup(e){const t=vt(),l=jo(),i=Mo(),o=Y(()=>i.value&&t.value.heroImageDark!==void 0?t.value.heroImageDark:t.value.heroImage),n=Y(()=>t.value.heroText===null?null:t.value.heroText||l.value.title||"Hello"),a=Y(()=>t.value.heroAlt||n.value||"hero"),r=Y(()=>t.value.tagline===null?null:t.value.tagline||l.value.description||"Welcome to your VuePress site"),s=Y(()=>te(t.value.actions)?t.value.actions.map(({text:h,link:p,type:m="primary"})=>({text:h,link:p,type:m})):[]),c=()=>{if(!o.value)return null;const h=he("img",{src:Yo(o.value),alt:a.value});return t.value.heroImageDark===void 0?h:he($o,()=>h)};return(h,p)=>(N(),Z("header",Lp,[oe(c),O(n)?(N(),Z("h1",Tp,ze(O(n)),1)):Ae("v-if",!0),O(r)?(N(),Z("p",Ap,ze(O(r)),1)):Ae("v-if",!0),O(s).length?(N(),Z("p",Ip,[(N(!0),Z(Pe,null,zt(O(s),m=>(N(),we(kt,{key:m.text,class:Ke(["action-button",[m.type]]),item:m},null,8,["class","item"]))),128))])):Ae("v-if",!0)]))}}),Op=Te(wp,[["__file","HomeHero.vue"]]),Fp={class:"home"},zp=ue({__name:"Home",setup(e){return(t,l)=>(N(),Z("main",Fp,[oe(Op),oe(bp),oe(gp),oe(Ep)]))}}),Dp=Te(zp,[["__file","Home.vue"]]),Mp=ue({__name:"NavbarBrand",setup(e){const t=Wl(),l=jo(),i=$e(),o=Mo(),n=Y(()=>i.value.home||t.value),a=Y(()=>l.value.title),r=Y(()=>o.value&&i.value.logoDark!==void 0?i.value.logoDark:i.value.logo),s=()=>{if(!r.value)return null;const c=he("img",{class:"logo",src:Yo(r.value),alt:a.value});return i.value.logoDark===void 0?c:he($o,()=>c)};return(c,h)=>{const p=_t("RouterLink");return N(),we(p,{to:O(n)},{default:He(()=>[oe(s),O(a)?(N(),Z("span",{key:0,class:Ke(["site-name",{"can-hide":O(r)}])},ze(O(a)),3)):Ae("v-if",!0)]),_:1},8,["to"])}}}),Hp=Te(Mp,[["__file","NavbarBrand.vue"]]),Sp=ue({__name:"DropdownTransition",setup(e){const t=i=>{i.style.height=i.scrollHeight+"px"},l=i=>{i.style.height=""};return(i,o)=>(N(),we(Bl,{name:"dropdown",onEnter:t,onAfterEnter:l,onBeforeLeave:t},{default:He(()=>[Re(i.$slots,"default")]),_:3}))}}),Nr=Te(Sp,[["__file","DropdownTransition.vue"]]),Vp=["aria-label"],Np={class:"title"},jp=fe("span",{class:"arrow down"},null,-1),$p=["aria-label"],Yp={class:"title"},Bp={class:"navbar-dropdown"},Up={class:"navbar-dropdown-subtitle"},Wp={key:1},Xp={class:"navbar-dropdown-subitem-wrapper"},qp=ue({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:l}=Ei(t),i=Y(()=>l.value.ariaLabel||l.value.text),o=ye(!1),n=St();dt(()=>n.path,()=>{o.value=!1});const a=s=>{s.detail===0?o.value=!o.value:o.value=!1},r=(s,c)=>c[c.length-1]===s;return(s,c)=>(N(),Z("div",{class:Ke(["navbar-dropdown-wrapper",{open:o.value}])},[fe("button",{class:"navbar-dropdown-title",type:"button","aria-label":O(i),onClick:a},[fe("span",Np,ze(O(l).text),1),jp],8,Vp),fe("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":O(i),onClick:c[0]||(c[0]=h=>o.value=!o.value)},[fe("span",Yp,ze(O(l).text),1),fe("span",{class:Ke(["arrow",o.value?"down":"right"])},null,2)],8,$p),oe(Nr,null,{default:He(()=>[ci(fe("ul",Bp,[(N(!0),Z(Pe,null,zt(O(l).children,h=>(N(),Z("li",{key:h.text,class:"navbar-dropdown-item"},[h.children?(N(),Z(Pe,{key:0},[fe("h4",Up,[h.link?(N(),we(kt,{key:0,item:h,onFocusout:p=>r(h,O(l).children)&&h.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(N(),Z("span",Wp,ze(h.text),1))]),fe("ul",Xp,[(N(!0),Z(Pe,null,zt(h.children,p=>(N(),Z("li",{key:p.link,class:"navbar-dropdown-subitem"},[oe(kt,{item:p,onFocusout:m=>r(p,h.children)&&r(h,O(l).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(N(),we(kt,{key:1,item:h,onFocusout:p=>r(h,O(l).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[mi,o.value]])]),_:1})],2))}}),Kp=Te(qp,[["__file","NavbarDropdown.vue"]]),aa=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Gp=(e,t)=>{if(t.hash===e)return!0;const l=aa(t.path),i=aa(e);return l===i},jr=(e,t)=>e.link&&Gp(e.link,t)?!0:e.children?e.children.some(l=>jr(l,t)):!1,$r=e=>!Ul(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,Qp={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},Jp=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const l=$r(e);return l!==null?Qp[l]:null},Zp=({docsRepo:e,docsBranch:t,docsDir:l,filePathRelative:i,editLinkPattern:o})=>{if(!i)return null;const n=Jp({docsRepo:e,editLinkPattern:o});return n?n.replace(/:repo/,Ul(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ur(`${dr(l)}/${i}`)):null},em={key:0,class:"navbar-items"},tm=ue({__name:"NavbarItems",setup(e){const t=()=>{const c=Zt(),h=Wl(),p=jo(),m=$e();return Y(()=>{var _,L,H;const g=Object.keys(p.value.locales);if(g.length<2)return[];const x=c.currentRoute.value.path,P=c.currentRoute.value.fullPath,E=c.currentRoute.value.hash;return[{text:(_=m.value.selectLanguageText)!=null?_:"unknown language",ariaLabel:(H=(L=m.value.selectLanguageAriaLabel)!=null?L:m.value.selectLanguageText)!=null?H:"unknown language",children:g.map(U=>{var G,C,S,F,re,j;const ee=(C=(G=p.value.locales)==null?void 0:G[U])!=null?C:{},w=(F=(S=m.value.locales)==null?void 0:S[U])!=null?F:{},v=`${ee.lang}`,q=(re=w.selectLanguageName)!=null?re:v;let B;if(v===p.value.lang)B=P;else{const le=x.replace(h.value,U);c.getRoutes().some(se=>se.path===le)?B=`${le}${E}`:B=(j=w.home)!=null?j:U}return{text:q,link:B}})}]})},l=()=>{const c=$e(),h=Y(()=>c.value.repo),p=Y(()=>h.value?$r(h.value):null),m=Y(()=>h.value&&!Ul(h.value)?`https://github.com/${h.value}`:h.value),g=Y(()=>m.value?c.value.repoLabel?c.value.repoLabel:p.value===null?"Source":p.value:null);return Y(()=>!m.value||!g.value?[]:[{text:g.value,link:m.value}])},i=c=>be(c)?Ho(c):c.children?{...c,children:c.children.map(i)}:c,n=(()=>{const c=$e();return Y(()=>(c.value.navbar||[]).map(i))})(),a=t(),r=l(),s=Y(()=>[...n.value,...a.value,...r.value]);return(c,h)=>O(s).length?(N(),Z("nav",em,[(N(!0),Z(Pe,null,zt(O(s),p=>(N(),Z("div",{key:p.text,class:"navbar-item"},[p.children?(N(),we(Kp,{key:0,item:p},null,8,["item"])):(N(),we(kt,{key:1,item:p},null,8,["item"]))]))),128))])):Ae("v-if",!0)}}),Yr=Te(tm,[["__file","NavbarItems.vue"]]),lm=["title"],im={class:"icon",focusable:"false",viewBox:"0 0 32 32"},om=jc('',9),nm=[om],am={class:"icon",focusable:"false",viewBox:"0 0 32 32"},rm=fe("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),sm=[rm],cm=ue({__name:"ToggleColorModeButton",setup(e){const t=$e(),l=Mo(),i=()=>{l.value=!l.value};return(o,n)=>(N(),Z("button",{class:"toggle-color-mode-button",title:O(t).toggleColorMode,onClick:i},[ci((N(),Z("svg",im,nm,512)),[[mi,!O(l)]]),ci((N(),Z("svg",am,sm,512)),[[mi,O(l)]])],8,lm))}}),hm=Te(cm,[["__file","ToggleColorModeButton.vue"]]),dm=["title"],um=fe("div",{class:"icon","aria-hidden":"true"},[fe("span"),fe("span"),fe("span")],-1),pm=[um],mm=ue({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=$e();return(l,i)=>(N(),Z("div",{class:"toggle-sidebar-button",title:O(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:i[0]||(i[0]=o=>l.$emit("toggle"))},pm,8,dm))}}),fm=Te(mm,[["__file","ToggleSidebarButton.vue"]]),gm=ue({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=$e(),l=ye(null),i=ye(null),o=ye(0),n=Y(()=>o.value?{maxWidth:o.value+"px"}:{});Je(()=>{const s=a(l.value,"paddingLeft")+a(l.value,"paddingRight"),c=()=>{var h;window.innerWidth<=719?o.value=0:o.value=l.value.offsetWidth-s-(((h=i.value)==null?void 0:h.offsetWidth)||0)};c(),window.addEventListener("resize",c,!1),window.addEventListener("orientationchange",c,!1)});function a(r,s){var p,m,g;const c=(g=(m=(p=r==null?void 0:r.ownerDocument)==null?void 0:p.defaultView)==null?void 0:m.getComputedStyle(r,null))==null?void 0:g[s],h=Number.parseInt(c,10);return Number.isNaN(h)?0:h}return(r,s)=>{const c=_t("NavbarSearch");return N(),Z("header",{ref_key:"navbar",ref:l,class:"navbar"},[oe(fm,{onToggle:s[0]||(s[0]=h=>r.$emit("toggle-sidebar"))}),fe("span",{ref_key:"navbarBrand",ref:i},[oe(Hp)],512),fe("div",{class:"navbar-items-wrapper",style:Sl(O(n))},[Re(r.$slots,"before"),oe(Yr,{class:"can-hide"}),Re(r.$slots,"after"),O(t).colorModeSwitch?(N(),we(hm,{key:0})):Ae("v-if",!0),oe(c)],4)],512)}}}),km=Te(gm,[["__file","Navbar.vue"]]),vm={class:"page-meta"},bm={key:0,class:"meta-item edit-link"},_m={key:1,class:"meta-item last-updated"},ym={class:"meta-item-label"},xm={class:"meta-item-info"},Em={key:2,class:"meta-item contributors"},Cm={class:"meta-item-label"},Rm={class:"meta-item-info"},Pm=["title"],Lm=Mt(", "),Tm=ue({__name:"PageMeta",setup(e){const t=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var _,L,H;if(!((L=(_=h.value.editLink)!=null?_:s.value.editLink)!=null?L:!0))return null;const{repo:m,docsRepo:g=m,docsBranch:x="main",docsDir:P="",editLinkText:E}=s.value;if(!g)return null;const k=Zp({docsRepo:g,docsBranch:x,docsDir:P,filePathRelative:c.value.filePathRelative,editLinkPattern:(H=h.value.editLinkPattern)!=null?H:s.value.editLinkPattern});return k?{text:E!=null?E:"Edit this page",link:k}:null})},l=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var g,x,P,E;return!((x=(g=h.value.lastUpdated)!=null?g:s.value.lastUpdated)!=null?x:!0)||!((P=c.value.git)!=null&&P.updatedTime)?null:new Date((E=c.value.git)==null?void 0:E.updatedTime).toLocaleString()})},i=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var m,g,x,P;return((g=(m=h.value.contributors)!=null?m:s.value.contributors)!=null?g:!0)&&(P=(x=c.value.git)==null?void 0:x.contributors)!=null?P:null})},o=$e(),n=t(),a=l(),r=i();return(s,c)=>{const h=_t("ClientOnly");return N(),Z("footer",vm,[O(n)?(N(),Z("div",bm,[oe(kt,{class:"meta-item-label",item:O(n)},null,8,["item"])])):Ae("v-if",!0),O(a)?(N(),Z("div",_m,[fe("span",ym,ze(O(o).lastUpdatedText)+": ",1),oe(h,null,{default:He(()=>[fe("span",xm,ze(O(a)),1)]),_:1})])):Ae("v-if",!0),O(r)&&O(r).length?(N(),Z("div",Em,[fe("span",Cm,ze(O(o).contributorsText)+": ",1),fe("span",Rm,[(N(!0),Z(Pe,null,zt(O(r),(p,m)=>(N(),Z(Pe,{key:m},[fe("span",{class:"contributor",title:`email: ${p.email}`},ze(p.name),9,Pm),m!==O(r).length-1?(N(),Z(Pe,{key:0},[Lm],64)):Ae("v-if",!0)],64))),128))])])):Ae("v-if",!0)])}}}),Am=Te(Tm,[["__file","PageMeta.vue"]]),Im={key:0,class:"page-nav"},wm={class:"inner"},Om={key:0,class:"prev"},Fm={key:1,class:"next"},zm=ue({__name:"PageNav",setup(e){const t=s=>s===!1?null:be(s)?Ho(s):Oo(s)?s:!1,l=(s,c,h)=>{const p=s.findIndex(m=>m.link===c);if(p!==-1){const m=s[p+h];return m!=null&&m.link?m:null}for(const m of s)if(m.children){const g=l(m.children,c,h);if(g)return g}return null},i=vt(),o=So(),n=St(),a=Y(()=>{const s=t(i.value.prev);return s!==!1?s:l(o.value,n.path,-1)}),r=Y(()=>{const s=t(i.value.next);return s!==!1?s:l(o.value,n.path,1)});return(s,c)=>O(a)||O(r)?(N(),Z("nav",Im,[fe("p",wm,[O(a)?(N(),Z("span",Om,[oe(kt,{item:O(a)},null,8,["item"])])):Ae("v-if",!0),O(r)?(N(),Z("span",Fm,[oe(kt,{item:O(r)},null,8,["item"])])):Ae("v-if",!0)])])):Ae("v-if",!0)}}),Dm=Te(zm,[["__file","PageNav.vue"]]),Mm={class:"page"},Hm={class:"theme-default-content"},Sm=ue({__name:"Page",setup(e){return(t,l)=>{const i=_t("Content");return N(),Z("main",Mm,[Re(t.$slots,"top"),fe("div",Hm,[Re(t.$slots,"content-top"),oe(i),Re(t.$slots,"content-bottom")]),oe(Am),oe(Dm),Re(t.$slots,"bottom")])}}}),Vm=Te(Sm,[["__file","Page.vue"]]),Nm=["onKeydown"],jm={class:"sidebar-item-children"},$m=ue({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:l,depth:i}=Ei(t),o=St(),n=Zt(),a=Y(()=>jr(l.value,o)),r=Y(()=>({"sidebar-item":!0,"sidebar-heading":i.value===0,active:a.value,collapsible:l.value.collapsible})),s=Y(()=>l.value.collapsible?a.value:!0),[c,h]=Au(s.value),p=g=>{l.value.collapsible&&(g.preventDefault(),h())},m=n.afterEach(g=>{jl(()=>{c.value=s.value})});return Yl(()=>{m()}),(g,x)=>{var E;const P=_t("SidebarItem",!0);return N(),Z("li",null,[O(l).link?(N(),we(kt,{key:0,class:Ke(O(r)),item:O(l)},null,8,["class","item"])):(N(),Z("p",{key:1,tabindex:"0",class:Ke(O(r)),onClick:p,onKeydown:Eh(p,["enter"])},[Mt(ze(O(l).text)+" ",1),O(l).collapsible?(N(),Z("span",{key:0,class:Ke(["arrow",O(c)?"down":"right"])},null,2)):Ae("v-if",!0)],42,Nm)),(E=O(l).children)!=null&&E.length?(N(),we(Nr,{key:2},{default:He(()=>[ci(fe("ul",jm,[(N(!0),Z(Pe,null,zt(O(l).children,k=>(N(),we(P,{key:`${O(i)}${k.text}${k.link}`,item:k,depth:O(i)+1},null,8,["item","depth"]))),128))],512),[[mi,O(c)]])]),_:1})):Ae("v-if",!0)])}}}),Ym=Te($m,[["__file","SidebarItem.vue"]]),Bm={key:0,class:"sidebar-items"},Um=ue({__name:"SidebarItems",setup(e){const t=St(),l=So();return Je(()=>{dt(()=>t.hash,i=>{const o=document.querySelector(".sidebar");if(!o)return;const n=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${i}"]`);if(!n)return;const{top:a,height:r}=o.getBoundingClientRect(),{top:s,height:c}=n.getBoundingClientRect();sa+r&&n.scrollIntoView(!1)})}),(i,o)=>O(l).length?(N(),Z("ul",Bm,[(N(!0),Z(Pe,null,zt(O(l),n=>(N(),we(Ym,{key:`${n.text}${n.link}`,item:n},null,8,["item"]))),128))])):Ae("v-if",!0)}}),Wm=Te(Um,[["__file","SidebarItems.vue"]]),Xm={class:"sidebar"},qm=ue({__name:"Sidebar",setup(e){return(t,l)=>(N(),Z("aside",Xm,[oe(Yr),Re(t.$slots,"top"),oe(Wm),Re(t.$slots,"bottom")]))}}),Km=Te(qm,[["__file","Sidebar.vue"]]),Gm=ue({__name:"Layout",setup(e){const t=Ot(),l=vt(),i=$e(),o=Y(()=>l.value.navbar!==!1&&i.value.navbar!==!1),n=So(),a=ye(!1),r=E=>{a.value=typeof E=="boolean"?E:!a.value},s={x:0,y:0},c=E=>{s.x=E.changedTouches[0].clientX,s.y=E.changedTouches[0].clientY},h=E=>{const k=E.changedTouches[0].clientX-s.x,_=E.changedTouches[0].clientY-s.y;Math.abs(k)>Math.abs(_)&&Math.abs(k)>40&&(k>0&&s.x<=80?r(!0):r(!1))},p=Y(()=>[{"no-navbar":!o.value,"no-sidebar":!n.value.length,"sidebar-open":a.value},l.value.pageClass]);let m;Je(()=>{m=Zt().afterEach(()=>{r(!1)})}),Li(()=>{m()});const g=Hr(),x=g.resolve,P=g.pending;return(E,k)=>(N(),Z("div",{class:Ke(["theme-container",O(p)]),onTouchstart:c,onTouchend:h},[Re(E.$slots,"navbar",{},()=>[O(o)?(N(),we(km,{key:0,onToggleSidebar:r},{before:He(()=>[Re(E.$slots,"navbar-before")]),after:He(()=>[Re(E.$slots,"navbar-after")]),_:3})):Ae("v-if",!0)]),fe("div",{class:"sidebar-mask",onClick:k[0]||(k[0]=_=>r(!1))}),Re(E.$slots,"sidebar",{},()=>[oe(Km,null,{top:He(()=>[Re(E.$slots,"sidebar-top")]),bottom:He(()=>[Re(E.$slots,"sidebar-bottom")]),_:3})]),Re(E.$slots,"page",{},()=>[O(l).home?(N(),we(Dp,{key:0})):(N(),we(Bl,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:O(x),onBeforeLeave:O(P)},{default:He(()=>[(N(),we(Vm,{key:O(t).path},{top:He(()=>[Re(E.$slots,"page-top")]),"content-top":He(()=>[Re(E.$slots,"page-content-top")]),"content-bottom":He(()=>[Re(E.$slots,"page-content-bottom")]),bottom:He(()=>[Re(E.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),Qm=Te(Gm,[["__file","Layout.vue"]]),Jm={class:"theme-container"},Zm={class:"page"},ef={class:"theme-default-content"},tf=fe("h1",null,"404",-1),lf=ue({__name:"NotFound",setup(e){var r,s,c;const t=Wl(),l=$e(),i=(r=l.value.notFound)!=null?r:["Not Found"],o=()=>i[Math.floor(Math.random()*i.length)],n=(s=l.value.home)!=null?s:t.value,a=(c=l.value.backToHome)!=null?c:"Back to home";return(h,p)=>{const m=_t("RouterLink");return N(),Z("div",Jm,[fe("main",Zm,[fe("div",ef,[tf,fe("blockquote",null,ze(o()),1),oe(m,{to:O(n)},{default:He(()=>[Mt(ze(O(a)),1)]),_:1},8,["to"])])])])}}}),of=Te(lf,[["__file","NotFound.vue"]]);const nf=Ht({enhance({app:e,router:t}){e.component("Badge",gu),e.component("CodeGroup",ku),e.component("CodeGroupItem",yu),e.component("AutoLinkExternalIcon",()=>{const i=e.component("ExternalLinkIcon");return i?he(i):null}),e.component("NavbarSearch",()=>{const i=e.component("Docsearch")||e.component("SearchBox");return i?he(i):null});const l=t.options.scrollBehavior;t.options.scrollBehavior=async(...i)=>(await Hr().wait(),l(...i))},setup(){np(),sp()},layouts:{Layout:Qm,NotFound:of}}),af=(e,t)=>t.some(l=>{if(be(l))return l===e.key;const{key:i,ctrl:o=!1,shift:n=!1,alt:a=!1}=l;return i===e.key&&o===e.ctrlKey&&n===e.shiftKey&&a===e.altKey}),rf=/[^\x00-\x7F]/,sf=e=>e.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t),ra=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),sa=(e,t)=>{const l=t.join(" "),i=sf(e);if(rf.test(e))return i.some(a=>l.toLowerCase().indexOf(a)>-1);const o=e.endsWith(" ");return new RegExp(i.map((a,r)=>i.length===r+1&&!o?`(?=.*\\b${ra(a)})`:`(?=.*\\b${ra(a)}\\b)`).join("")+".+","gi").test(l)},cf=({input:e,hotKeys:t})=>{if(t.value.length===0)return;const l=i=>{!e.value||af(i,t.value)&&!e.value.contains(i.target)&&(i.preventDefault(),e.value.focus())};Je(()=>{document.addEventListener("keydown",l)}),Yl(()=>{document.removeEventListener("keydown",l)})},hf=[{title:"Home",headers:[{level:3,title:"All Hook process in one step, everything is simplified",slug:"all-hook-process-in-one-step-everything-is-simplified",link:"#all-hook-process-in-one-step-everything-is-simplified",children:[]}],path:"/en/",pathLocale:"/en/",extraFields:[]},{title:"\u9996\u9875",headers:[{level:3,title:"\u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410",slug:"\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410",link:"#\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410",children:[]}],path:"/zh-cn/",pathLocale:"/zh-cn/",extraFields:[]},{title:"About this Document",headers:[{level:2,title:"License",slug:"license",link:"#license",children:[]}],path:"/en/about/about.html",pathLocale:"/en/",extraFields:[]},{title:"Changelog",headers:[{level:3,title:"1.1.5 | 2023.01.13",slug:"_1-1-5-2023-01-13",link:"#_1-1-5-2023-01-13",children:[]},{level:3,title:"1.1.4 | 2022.10.04",slug:"_1-1-4-2022-10-04",link:"#_1-1-4-2022-10-04",children:[]},{level:3,title:"1.1.3 | 2022.09.30",slug:"_1-1-3-2022-09-30",link:"#_1-1-3-2022-09-30",children:[]},{level:3,title:"1.1.2 | 2022.09.30",slug:"_1-1-2-2022-09-30",link:"#_1-1-2-2022-09-30",children:[]},{level:3,title:"1.1.1 | 2022.09.28",slug:"_1-1-1-2022-09-28",link:"#_1-1-1-2022-09-28",children:[]},{level:3,title:"1.1.0 | 2022.09.28",slug:"_1-1-0-2022-09-28",link:"#_1-1-0-2022-09-28",children:[]},{level:3,title:"1.0.92 | 2022.05.31",slug:"_1-0-92-2022-05-31",link:"#_1-0-92-2022-05-31",children:[]},{level:3,title:"1.0.91 | 2022.05.29",slug:"_1-0-91-2022-05-29",link:"#_1-0-91-2022-05-29",children:[]},{level:3,title:"1.0.90 | 2022.05.27",slug:"_1-0-90-2022-05-27",link:"#_1-0-90-2022-05-27",children:[]},{level:3,title:"1.0.89 | 2022.05.26",slug:"_1-0-89-2022-05-26",link:"#_1-0-89-2022-05-26",children:[]},{level:3,title:"1.0.88 | 2022.05.25",slug:"_1-0-88-2022-05-25",link:"#_1-0-88-2022-05-25",children:[]},{level:3,title:"1.0.87 | 2022.05.10",slug:"_1-0-87-2022-05-10",link:"#_1-0-87-2022-05-10",children:[]},{level:3,title:"1.0.86 | 2022.05.06",slug:"_1-0-86-2022-05-06",link:"#_1-0-86-2022-05-06",children:[]},{level:3,title:"1.0.85 | 2022.05.04",slug:"_1-0-85-2022-05-04",link:"#_1-0-85-2022-05-04",children:[]},{level:3,title:"1.0.83 | 2022.05.04",slug:"_1-0-83-2022-05-04",link:"#_1-0-83-2022-05-04",children:[]},{level:3,title:"1.0.82 | 2022.05.04",slug:"_1-0-82-2022-05-04",link:"#_1-0-82-2022-05-04",children:[]},{level:3,title:"1.0.81 | 2022.05.04",slug:"_1-0-81-2022-05-04",link:"#_1-0-81-2022-05-04",children:[]},{level:3,title:"1.0.80 | 2022.05.01",slug:"_1-0-80-2022-05-01",link:"#_1-0-80-2022-05-01",children:[]},{level:3,title:"1.0.78 | 2022.04.18",slug:"_1-0-78-2022-04-18",link:"#_1-0-78-2022-04-18",children:[]},{level:3,title:"1.0.77 | 2022.04.15",slug:"_1-0-77-2022-04-15",link:"#_1-0-77-2022-04-15",children:[]},{level:3,title:"1.0.75 | 2022.04.13",slug:"_1-0-75-2022-04-13",link:"#_1-0-75-2022-04-13",children:[]},{level:3,title:"1.0.73 | 2022.04.10",slug:"_1-0-73-2022-04-10",link:"#_1-0-73-2022-04-10",children:[]},{level:3,title:"1.0.72 | 2022.04.09",slug:"_1-0-72-2022-04-09",link:"#_1-0-72-2022-04-09",children:[]},{level:3,title:"1.0.71 | 2022.04.04",slug:"_1-0-71-2022-04-04",link:"#_1-0-71-2022-04-04",children:[]},{level:3,title:"1.0.70 | 2022.04.04",slug:"_1-0-70-2022-04-04",link:"#_1-0-70-2022-04-04",children:[]},{level:3,title:"1.0.69 | 2022.03.30",slug:"_1-0-69-2022-03-30",link:"#_1-0-69-2022-03-30",children:[]},{level:3,title:"1.0.68 | 2022.03.29",slug:"_1-0-68-2022-03-29",link:"#_1-0-68-2022-03-29",children:[]},{level:3,title:"1.0.67 | 2022.03.27",slug:"_1-0-67-2022-03-27",link:"#_1-0-67-2022-03-27",children:[]},{level:3,title:"1.0.66 | 2022.03.25",slug:"_1-0-66-2022-03-25",link:"#_1-0-66-2022-03-25",children:[]},{level:3,title:"1.0.65 | 2022.03.25",slug:"_1-0-65-2022-03-25",link:"#_1-0-65-2022-03-25",children:[]},{level:3,title:"1.0.6 | 2022.03.20",slug:"_1-0-6-2022-03-20",link:"#_1-0-6-2022-03-20",children:[]},{level:3,title:"1.0.55 | 2022.03.18",slug:"_1-0-55-2022-03-18",link:"#_1-0-55-2022-03-18",children:[]},{level:3,title:"1.0.5 | 2022.03.18",slug:"_1-0-5-2022-03-18",link:"#_1-0-5-2022-03-18",children:[]},{level:3,title:"1.0.4 | 2022.03.06",slug:"_1-0-4-2022-03-06",link:"#_1-0-4-2022-03-06",children:[]},{level:3,title:"1.0.3 | 2022.03.02",slug:"_1-0-3-2022-03-02",link:"#_1-0-3-2022-03-02",children:[]},{level:3,title:"1.0.2 | 2022.02.18",slug:"_1-0-2-2022-02-18",link:"#_1-0-2-2022-02-18",children:[]},{level:3,title:"1.0.1 | 2022.02.15",slug:"_1-0-1-2022-02-15",link:"#_1-0-1-2022-02-15",children:[]},{level:3,title:"1.0 | 2022.02.14",slug:"_1-0-2022-02-14",link:"#_1-0-2022-02-14",children:[]}],path:"/en/about/changelog.html",pathLocale:"/en/",extraFields:[]},{title:"Contact Us",headers:[{level:2,title:"Help with Maintenance",slug:"help-with-maintenance",link:"#help-with-maintenance",children:[]}],path:"/en/about/contacts.html",pathLocale:"/en/",extraFields:[]},{title:"Looking for Future",headers:[{level:2,title:"Unresolved Issues",slug:"unresolved-issues",link:"#unresolved-issues",children:[{level:3,title:"YukiHookModulePrefs",slug:"yukihookmoduleprefs",link:"#yukihookmoduleprefs",children:[]}]},{level:2,title:"Future Plans",slug:"future-plans",link:"#future-plans",children:[{level:3,title:"Lite Version Supported for Standalone Use",slug:"lite-version-supported-for-standalone-use",link:"#lite-version-supported-for-standalone-use",children:[]},{level:3,title:"Support for More Hook Framework",slug:"support-for-more-hook-framework",link:"#support-for-more-hook-framework",children:[]}]}],path:"/en/about/future.html",pathLocale:"/en/",extraFields:[]},{title:"Document Introduce",headers:[{level:2,title:"Function Description",slug:"function-description",link:"#function-description",children:[]},{level:2,title:"Function Example Description",slug:"function-example-description",link:"#function-example-description",children:[]},{level:2,title:"Change Record Description",slug:"change-record-description",link:"#change-record-description",children:[]},{level:2,title:"Related Symbols Description",slug:"related-symbols-description",link:"#related-symbols-description",children:[]}],path:"/en/api/home.html",pathLocale:"/en/",extraFields:[]},{title:"API Basic Configs",headers:[{level:2,title:"Function Configs",slug:"function-configs",link:"#function-configs",children:[{level:3,title:"configs Method",slug:"configs-method",link:"#configs-method",children:[]}]},{level:2,title:"Hooker Configs",slug:"hooker-configs",link:"#hooker-configs",children:[{level:3,title:"Created by lambda",slug:"created-by-lambda",link:"#created-by-lambda",children:[]},{level:3,title:"Created by Custom Hooker",slug:"created-by-custom-hooker",link:"#created-by-custom-hooker",children:[]},{level:3,title:"Expansion Features",slug:"expansion-features",link:"#expansion-features",children:[]},{level:3,title:"Precautions",slug:"precautions",link:"#precautions",children:[]}]},{level:2,title:"Precautions when using as Hook API",slug:"precautions-when-using-as-hook-api",link:"#precautions-when-using-as-hook-api",children:[]}],path:"/en/config/api-example.html",pathLocale:"/en/",extraFields:[]},{title:"API Exception Handling",headers:[{level:2,title:"Non-Blocking Exceptions",slug:"non-blocking-exceptions",link:"#non-blocking-exceptions",children:[]},{level:2,title:"Blocking Exceptions",slug:"blocking-exceptions",link:"#blocking-exceptions",children:[]}],path:"/en/config/api-exception.html",pathLocale:"/en/",extraFields:[]},{title:"Use as Hook API Configs",headers:[{level:2,title:"Dependency Configs",slug:"dependency-configs",link:"#dependency-configs",children:[]},{level:2,title:"Entry Configs",slug:"entry-configs",link:"#entry-configs",children:[]},{level:2,title:"Hook Framework",slug:"hook-framework",link:"#hook-framework",children:[{level:3,title:"Pine",slug:"pine",link:"#pine",children:[]},{level:3,title:"SandHook",slug:"sandhook",link:"#sandhook",children:[]},{level:3,title:"Whale",slug:"whale",link:"#whale",children:[]}]}],path:"/en/config/api-using.html",pathLocale:"/en/",extraFields:[]},{title:"R8 & Proguard Obfuscate",headers:[{level:2,title:"R8",slug:"r8",link:"#r8",children:[]},{level:2,title:"Proguard",slug:"proguard",link:"#proguard",children:[]}],path:"/en/config/r8-proguard.html",pathLocale:"/en/",extraFields:[]},{title:"Use as Xposed Module Configs",headers:[{level:2,title:"Dependency Configs",slug:"dependency-configs",link:"#dependency-configs",children:[]},{level:2,title:"Custom Automatic Builder",slug:"custom-automatic-builder",link:"#custom-automatic-builder",children:[{level:3,title:"InjectYukiHookWithXposed Annotation",slug:"injectyukihookwithxposed-annotation",link:"#injectyukihookwithxposed-annotation",children:[]},{level:3,title:"IYukiHookXposedInit Interface",slug:"iyukihookxposedinit-interface",link:"#iyukihookxposedinit-interface",children:[]}]},{level:2,title:"Native Xposed API Events",slug:"native-xposed-api-events",link:"#native-xposed-api-events",children:[]}],path:"/en/config/xposed-using.html",pathLocale:"/en/",extraFields:[]},{title:"Usage Example",headers:[{level:2,title:"Structure Diagram",slug:"structure-diagram",link:"#structure-diagram",children:[]},{level:2,title:"Demo",slug:"demo",link:"#demo",children:[]},{level:2,title:"A Simple Hook Example",slug:"a-simple-hook-example",link:"#a-simple-hook-example",children:[{level:3,title:"Hook App",slug:"hook-app",link:"#hook-app",children:[]},{level:3,title:"Hook Zygote",slug:"hook-zygote",link:"#hook-zygote",children:[]},{level:3,title:"Hook System Framework",slug:"hook-system-framework",link:"#hook-system-framework",children:[]},{level:3,title:"Hook Resources",slug:"hook-resources",link:"#hook-resources",children:[]},{level:3,title:"Remove Hook",slug:"remove-hook",link:"#remove-hook",children:[]}]},{level:2,title:"Exception Handling",slug:"exception-handling",link:"#exception-handling",children:[{level:3,title:"Listen for Exceptions",slug:"listen-for-exceptions",link:"#listen-for-exceptions",children:[]},{level:3,title:"Throw an Exception",slug:"throw-an-exception",link:"#throw-an-exception",children:[]}]},{level:2,title:"Status Monitor",slug:"status-monitor",link:"#status-monitor",children:[]},{level:2,title:"Expansion Usage",slug:"expansion-usage",link:"#expansion-usage",children:[{level:3,title:"Multiple Hosts",slug:"multiple-hosts",link:"#multiple-hosts",children:[]},{level:3,title:"Multiple Processes",slug:"multiple-processes",link:"#multiple-processes",children:[]}]},{level:2,title:"Writing Optimization",slug:"writing-optimization",link:"#writing-optimization",children:[]},{level:2,title:"Xposed Module own Active State",slug:"xposed-module-own-active-state",link:"#xposed-module-own-active-state",children:[]}],path:"/en/guide/example.html",pathLocale:"/en/",extraFields:[]},{title:"Introduce",headers:[{level:2,title:"Background",slug:"background",link:"#background",children:[]},{level:2,title:"Usage",slug:"usage",link:"#usage",children:[]},{level:2,title:"Language Requirement",slug:"language-requirement",link:"#language-requirement",children:[]},{level:2,title:"Source of Inspiration",slug:"source-of-inspiration",link:"#source-of-inspiration",children:[]},{level:2,title:"Suppored Hook Framework",slug:"suppored-hook-framework",link:"#suppored-hook-framework",children:[]}],path:"/en/guide/home.html",pathLocale:"/en/",extraFields:[]},{title:"Basic Knowledge",headers:[{level:2,title:"Related Introduction",slug:"related-introduction",link:"#related-introduction",children:[{level:3,title:"What is Xposed",slug:"what-is-xposed",link:"#what-is-xposed",children:[]},{level:3,title:"What can Xposed do",slug:"what-can-xposed-do",link:"#what-can-xposed-do",children:[]},{level:3,title:"Development Process",slug:"development-process",link:"#development-process",children:[]},{level:3,title:"Derivatives",slug:"derivatives",link:"#derivatives",children:[]},{level:3,title:"What YukiHookAPI does",slug:"what-yukihookapi-does",link:"#what-yukihookapi-does",children:[]}]},{level:2,title:"Let's Started",slug:"let-s-started",link:"#let-s-started",children:[]}],path:"/en/guide/knowledge.html",pathLocale:"/en/",extraFields:[]},{title:"Migrate from Xposed API",headers:[{level:2,title:"Migrate Hook Entry Point",slug:"migrate-hook-entry-point",link:"#migrate-hook-entry-point",children:[]},{level:2,title:"Migrate Hook Method Body",slug:"migrate-hook-method-body",link:"#migrate-hook-method-body",children:[{level:3,title:"Before/After Hook",slug:"before-after-hook",link:"#before-after-hook",children:[]},{level:3,title:"Replace Hook",slug:"replace-hook",link:"#replace-hook",children:[]}]},{level:2,title:"Migrate Other Features",slug:"migrate-other-features",link:"#migrate-other-features",children:[]}],path:"/en/guide/move-to-new-api.html",pathLocale:"/en/",extraFields:[]},{title:"Quick Start",headers:[{level:2,title:"Environment Requirements",slug:"environment-requirements",link:"#environment-requirements",children:[]},{level:2,title:"Automatically Build Project",slug:"automatically-build-project",link:"#automatically-build-project",children:[]},{level:2,title:"Manually Configure Project",slug:"manually-configure-project",link:"#manually-configure-project",children:[{level:3,title:"Create Project",slug:"create-project",link:"#create-project",children:[]},{level:3,title:"Integration Dependencies",slug:"integration-dependencies",link:"#integration-dependencies",children:[]},{level:3,title:"Use as Xposed Module",slug:"use-as-xposed-module",link:"#use-as-xposed-module",children:[]},{level:3,title:"Use as Hook API",slug:"use-as-hook-api",link:"#use-as-hook-api",children:[]}]}],path:"/en/guide/quick-start.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookAPI Project Builder",headers:[{level:2,title:"Get Project",slug:"get-project",link:"#get-project",children:[]},{level:2,title:"Usage",slug:"usage",link:"#usage",children:[{level:3,title:"Basic Usage",slug:"basic-usage",link:"#basic-usage",children:[]},{level:3,title:"Config Template",slug:"config-template",link:"#config-template",children:[]},{level:3,title:"Multilingual Support",slug:"multilingual-support",link:"#multilingual-support",children:[]}]}],path:"/en/tools/yukihookapi-projectbuilder.html",pathLocale:"/en/",extraFields:[]},{title:"\u5173\u4E8E\u6B64\u6587\u6863",headers:[{level:2,title:"License",slug:"license",link:"#license",children:[]}],path:"/zh-cn/about/about.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u66F4\u65B0\u65E5\u5FD7",headers:[{level:3,title:"1.1.5 | 2023.01.13",slug:"_1-1-5-2023-01-13",link:"#_1-1-5-2023-01-13",children:[]},{level:3,title:"1.1.4 | 2022.10.04",slug:"_1-1-4-2022-10-04",link:"#_1-1-4-2022-10-04",children:[]},{level:3,title:"1.1.3 | 2022.09.30",slug:"_1-1-3-2022-09-30",link:"#_1-1-3-2022-09-30",children:[]},{level:3,title:"1.1.2 | 2022.09.30",slug:"_1-1-2-2022-09-30",link:"#_1-1-2-2022-09-30",children:[]},{level:3,title:"1.1.1 | 2022.09.28",slug:"_1-1-1-2022-09-28",link:"#_1-1-1-2022-09-28",children:[]},{level:3,title:"1.1.0 | 2022.09.28",slug:"_1-1-0-2022-09-28",link:"#_1-1-0-2022-09-28",children:[]},{level:3,title:"1.0.92 | 2022.05.31",slug:"_1-0-92-2022-05-31",link:"#_1-0-92-2022-05-31",children:[]},{level:3,title:"1.0.91 | 2022.05.29",slug:"_1-0-91-2022-05-29",link:"#_1-0-91-2022-05-29",children:[]},{level:3,title:"1.0.90 | 2022.05.27",slug:"_1-0-90-2022-05-27",link:"#_1-0-90-2022-05-27",children:[]},{level:3,title:"1.0.89 | 2022.05.26",slug:"_1-0-89-2022-05-26",link:"#_1-0-89-2022-05-26",children:[]},{level:3,title:"1.0.88 | 2022.05.25",slug:"_1-0-88-2022-05-25",link:"#_1-0-88-2022-05-25",children:[]},{level:3,title:"1.0.87 | 2022.05.10",slug:"_1-0-87-2022-05-10",link:"#_1-0-87-2022-05-10",children:[]},{level:3,title:"1.0.86 | 2022.05.06",slug:"_1-0-86-2022-05-06",link:"#_1-0-86-2022-05-06",children:[]},{level:3,title:"1.0.85 | 2022.05.04",slug:"_1-0-85-2022-05-04",link:"#_1-0-85-2022-05-04",children:[]},{level:3,title:"1.0.83 | 2022.05.04",slug:"_1-0-83-2022-05-04",link:"#_1-0-83-2022-05-04",children:[]},{level:3,title:"1.0.82 | 2022.05.04",slug:"_1-0-82-2022-05-04",link:"#_1-0-82-2022-05-04",children:[]},{level:3,title:"1.0.81 | 2022.05.04",slug:"_1-0-81-2022-05-04",link:"#_1-0-81-2022-05-04",children:[]},{level:3,title:"1.0.80 | 2022.05.01",slug:"_1-0-80-2022-05-01",link:"#_1-0-80-2022-05-01",children:[]},{level:3,title:"1.0.78 | 2022.04.18",slug:"_1-0-78-2022-04-18",link:"#_1-0-78-2022-04-18",children:[]},{level:3,title:"1.0.77 | 2022.04.15",slug:"_1-0-77-2022-04-15",link:"#_1-0-77-2022-04-15",children:[]},{level:3,title:"1.0.75 | 2022.04.13",slug:"_1-0-75-2022-04-13",link:"#_1-0-75-2022-04-13",children:[]},{level:3,title:"1.0.73 | 2022.04.10",slug:"_1-0-73-2022-04-10",link:"#_1-0-73-2022-04-10",children:[]},{level:3,title:"1.0.72 | 2022.04.09",slug:"_1-0-72-2022-04-09",link:"#_1-0-72-2022-04-09",children:[]},{level:3,title:"1.0.71 | 2022.04.04",slug:"_1-0-71-2022-04-04",link:"#_1-0-71-2022-04-04",children:[]},{level:3,title:"1.0.70 | 2022.04.04",slug:"_1-0-70-2022-04-04",link:"#_1-0-70-2022-04-04",children:[]},{level:3,title:"1.0.69 | 2022.03.30",slug:"_1-0-69-2022-03-30",link:"#_1-0-69-2022-03-30",children:[]},{level:3,title:"1.0.68 | 2022.03.29",slug:"_1-0-68-2022-03-29",link:"#_1-0-68-2022-03-29",children:[]},{level:3,title:"1.0.67 | 2022.03.27",slug:"_1-0-67-2022-03-27",link:"#_1-0-67-2022-03-27",children:[]},{level:3,title:"1.0.66 | 2022.03.25",slug:"_1-0-66-2022-03-25",link:"#_1-0-66-2022-03-25",children:[]},{level:3,title:"1.0.65 | 2022.03.25",slug:"_1-0-65-2022-03-25",link:"#_1-0-65-2022-03-25",children:[]},{level:3,title:"1.0.6 | 2022.03.20",slug:"_1-0-6-2022-03-20",link:"#_1-0-6-2022-03-20",children:[]},{level:3,title:"1.0.55 | 2022.03.18",slug:"_1-0-55-2022-03-18",link:"#_1-0-55-2022-03-18",children:[]},{level:3,title:"1.0.5 | 2022.03.18",slug:"_1-0-5-2022-03-18",link:"#_1-0-5-2022-03-18",children:[]},{level:3,title:"1.0.4 | 2022.03.06",slug:"_1-0-4-2022-03-06",link:"#_1-0-4-2022-03-06",children:[]},{level:3,title:"1.0.3 | 2022.03.02",slug:"_1-0-3-2022-03-02",link:"#_1-0-3-2022-03-02",children:[]},{level:3,title:"1.0.2 | 2022.02.18",slug:"_1-0-2-2022-02-18",link:"#_1-0-2-2022-02-18",children:[]},{level:3,title:"1.0.1 | 2022.02.15",slug:"_1-0-1-2022-02-15",link:"#_1-0-1-2022-02-15",children:[]},{level:3,title:"1.0 | 2022.02.14",slug:"_1-0-2022-02-14",link:"#_1-0-2022-02-14",children:[]}],path:"/zh-cn/about/changelog.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u8054\u7CFB\u6211\u4EEC",headers:[{level:2,title:"\u52A9\u529B\u7EF4\u62A4",slug:"\u52A9\u529B\u7EF4\u62A4",link:"#\u52A9\u529B\u7EF4\u62A4",children:[]}],path:"/zh-cn/about/contacts.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5C55\u671B\u672A\u6765",headers:[{level:2,title:"\u672A\u89E3\u51B3\u7684\u95EE\u9898",slug:"\u672A\u89E3\u51B3\u7684\u95EE\u9898",link:"#\u672A\u89E3\u51B3\u7684\u95EE\u9898",children:[{level:3,title:"YukiHookModulePrefs",slug:"yukihookmoduleprefs",link:"#yukihookmoduleprefs",children:[]}]},{level:2,title:"\u672A\u6765\u7684\u8BA1\u5212",slug:"\u672A\u6765\u7684\u8BA1\u5212",link:"#\u672A\u6765\u7684\u8BA1\u5212",children:[{level:3,title:"\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684 Lite \u7248\u672C",slug:"\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684-lite-\u7248\u672C",link:"#\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684-lite-\u7248\u672C",children:[]},{level:3,title:"\u652F\u6301\u66F4\u591A Hook Framework",slug:"\u652F\u6301\u66F4\u591A-hook-framework",link:"#\u652F\u6301\u66F4\u591A-hook-framework",children:[]}]}],path:"/zh-cn/about/future.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u6587\u6863\u4ECB\u7ECD",headers:[{level:2,title:"\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",slug:"\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",link:"#\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",children:[]},{level:2,title:"\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",slug:"\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",link:"#\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",children:[]},{level:2,title:"\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",slug:"\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",link:"#\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",children:[]},{level:2,title:"\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",slug:"\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",link:"#\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",children:[]}],path:"/zh-cn/api/home.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"API \u57FA\u672C\u914D\u7F6E",headers:[{level:2,title:"\u529F\u80FD\u914D\u7F6E",slug:"\u529F\u80FD\u914D\u7F6E",link:"#\u529F\u80FD\u914D\u7F6E",children:[{level:3,title:"configs \u65B9\u6CD5",slug:"configs-\u65B9\u6CD5",link:"#configs-\u65B9\u6CD5",children:[]}]},{level:2,title:"Hooker \u914D\u7F6E",slug:"hooker-\u914D\u7F6E",link:"#hooker-\u914D\u7F6E",children:[{level:3,title:"\u901A\u8FC7 lambda \u521B\u5EFA",slug:"\u901A\u8FC7-lambda-\u521B\u5EFA",link:"#\u901A\u8FC7-lambda-\u521B\u5EFA",children:[]},{level:3,title:"\u901A\u8FC7\u81EA\u5B9A\u4E49 Hooker \u521B\u5EFA",slug:"\u901A\u8FC7\u81EA\u5B9A\u4E49-hooker-\u521B\u5EFA",link:"#\u901A\u8FC7\u81EA\u5B9A\u4E49-hooker-\u521B\u5EFA",children:[]},{level:3,title:"\u6269\u5C55\u7279\u6027",slug:"\u6269\u5C55\u7279\u6027",link:"#\u6269\u5C55\u7279\u6027",children:[]},{level:3,title:"\u6CE8\u610F\u4E8B\u9879",slug:"\u6CE8\u610F\u4E8B\u9879",link:"#\u6CE8\u610F\u4E8B\u9879",children:[]}]},{level:2,title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",slug:"\u4F5C\u4E3A-hook-api-\u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",link:"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",children:[]}],path:"/zh-cn/config/api-example.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"API \u5F02\u5E38\u5904\u7406",headers:[{level:2,title:"\u975E\u963B\u65AD\u5F02\u5E38",slug:"\u975E\u963B\u65AD\u5F02\u5E38",link:"#\u975E\u963B\u65AD\u5F02\u5E38",children:[]},{level:2,title:"\u963B\u65AD\u5F02\u5E38",slug:"\u963B\u65AD\u5F02\u5E38",link:"#\u963B\u65AD\u5F02\u5E38",children:[]}],path:"/zh-cn/config/api-exception.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E",headers:[{level:2,title:"\u4F9D\u8D56\u914D\u7F6E",slug:"\u4F9D\u8D56\u914D\u7F6E",link:"#\u4F9D\u8D56\u914D\u7F6E",children:[]},{level:2,title:"\u5165\u53E3\u914D\u7F6E",slug:"\u5165\u53E3\u914D\u7F6E",link:"#\u5165\u53E3\u914D\u7F6E",children:[]},{level:2,title:"Hook Framework",slug:"hook-framework",link:"#hook-framework",children:[{level:3,title:"Pine",slug:"pine",link:"#pine",children:[]},{level:3,title:"SandHook",slug:"sandhook",link:"#sandhook",children:[]},{level:3,title:"Whale",slug:"whale",link:"#whale",children:[]}]}],path:"/zh-cn/config/api-using.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"R8 \u4E0E Proguard \u6DF7\u6DC6",headers:[{level:2,title:"R8",slug:"r8",link:"#r8",children:[]},{level:2,title:"Proguard",slug:"proguard",link:"#proguard",children:[]}],path:"/zh-cn/config/r8-proguard.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E",headers:[{level:2,title:"\u4F9D\u8D56\u914D\u7F6E",slug:"\u4F9D\u8D56\u914D\u7F6E",link:"#\u4F9D\u8D56\u914D\u7F6E",children:[]},{level:2,title:"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",slug:"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",link:"#\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",children:[{level:3,title:"InjectYukiHookWithXposed \u6CE8\u89E3",slug:"injectyukihookwithxposed-\u6CE8\u89E3",link:"#injectyukihookwithxposed-\u6CE8\u89E3",children:[]},{level:3,title:"IYukiHookXposedInit \u63A5\u53E3",slug:"iyukihookxposedinit-\u63A5\u53E3",link:"#iyukihookxposedinit-\u63A5\u53E3",children:[]}]},{level:2,title:"\u539F\u751F Xposed API \u4E8B\u4EF6",slug:"\u539F\u751F-xposed-api-\u4E8B\u4EF6",link:"#\u539F\u751F-xposed-api-\u4E8B\u4EF6",children:[]}],path:"/zh-cn/config/xposed-using.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u7528\u6CD5\u793A\u4F8B",headers:[{level:2,title:"\u7ED3\u6784\u56FE\u89E3",slug:"\u7ED3\u6784\u56FE\u89E3",link:"#\u7ED3\u6784\u56FE\u89E3",children:[]},{level:2,title:"Demo",slug:"demo",link:"#demo",children:[]},{level:2,title:"\u4E00\u4E2A\u7B80\u5355\u7684 Hook \u4F8B\u5B50",slug:"\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50",link:"#\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50",children:[{level:3,title:"Hook APP",slug:"hook-app",link:"#hook-app",children:[]},{level:3,title:"Hook Zygote",slug:"hook-zygote",link:"#hook-zygote",children:[]},{level:3,title:"Hook \u7CFB\u7EDF\u6846\u67B6",slug:"hook-\u7CFB\u7EDF\u6846\u67B6",link:"#hook-\u7CFB\u7EDF\u6846\u67B6",children:[]},{level:3,title:"Hook Resources",slug:"hook-resources",link:"#hook-resources",children:[]},{level:3,title:"\u89E3\u9664 Hook",slug:"\u89E3\u9664-hook",link:"#\u89E3\u9664-hook",children:[]}]},{level:2,title:"\u5F02\u5E38\u5904\u7406",slug:"\u5F02\u5E38\u5904\u7406",link:"#\u5F02\u5E38\u5904\u7406",children:[{level:3,title:"\u76D1\u542C\u5F02\u5E38",slug:"\u76D1\u542C\u5F02\u5E38",link:"#\u76D1\u542C\u5F02\u5E38",children:[]},{level:3,title:"\u629B\u51FA\u5F02\u5E38",slug:"\u629B\u51FA\u5F02\u5E38",link:"#\u629B\u51FA\u5F02\u5E38",children:[]}]},{level:2,title:"\u72B6\u6001\u76D1\u542C",slug:"\u72B6\u6001\u76D1\u542C",link:"#\u72B6\u6001\u76D1\u542C",children:[]},{level:2,title:"\u6269\u5C55\u7528\u6CD5",slug:"\u6269\u5C55\u7528\u6CD5",link:"#\u6269\u5C55\u7528\u6CD5",children:[{level:3,title:"\u591A\u4E2A\u5BBF\u4E3B",slug:"\u591A\u4E2A\u5BBF\u4E3B",link:"#\u591A\u4E2A\u5BBF\u4E3B",children:[]},{level:3,title:"\u591A\u4E2A\u8FDB\u7A0B",slug:"\u591A\u4E2A\u8FDB\u7A0B",link:"#\u591A\u4E2A\u8FDB\u7A0B",children:[]}]},{level:2,title:"\u5199\u6CD5\u4F18\u5316",slug:"\u5199\u6CD5\u4F18\u5316",link:"#\u5199\u6CD5\u4F18\u5316",children:[]},{level:2,title:"Xposed \u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",slug:"xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",link:"#xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",children:[]}],path:"/zh-cn/guide/example.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4ECB\u7ECD",headers:[{level:2,title:"\u80CC\u666F",slug:"\u80CC\u666F",link:"#\u80CC\u666F",children:[]},{level:2,title:"\u7528\u9014",slug:"\u7528\u9014",link:"#\u7528\u9014",children:[]},{level:2,title:"\u8BED\u8A00\u8981\u6C42",slug:"\u8BED\u8A00\u8981\u6C42",link:"#\u8BED\u8A00\u8981\u6C42",children:[]},{level:2,title:"\u7075\u611F\u6765\u6E90",slug:"\u7075\u611F\u6765\u6E90",link:"#\u7075\u611F\u6765\u6E90",children:[]},{level:2,title:"\u652F\u6301\u7684 Hook Framework",slug:"\u652F\u6301\u7684-hook-framework",link:"#\u652F\u6301\u7684-hook-framework",children:[]}],path:"/zh-cn/guide/home.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u57FA\u7840\u77E5\u8BC6",headers:[{level:2,title:"\u76F8\u5173\u4ECB\u7ECD",slug:"\u76F8\u5173\u4ECB\u7ECD",link:"#\u76F8\u5173\u4ECB\u7ECD",children:[{level:3,title:"Xposed \u662F\u4EC0\u4E48",slug:"xposed-\u662F\u4EC0\u4E48",link:"#xposed-\u662F\u4EC0\u4E48",children:[]},{level:3,title:"Xposed \u80FD\u505A\u4EC0\u4E48",slug:"xposed-\u80FD\u505A\u4EC0\u4E48",link:"#xposed-\u80FD\u505A\u4EC0\u4E48",children:[]},{level:3,title:"\u53D1\u5C55\u8FC7\u7A0B",slug:"\u53D1\u5C55\u8FC7\u7A0B",link:"#\u53D1\u5C55\u8FC7\u7A0B",children:[]},{level:3,title:"\u884D\u751F\u4EA7\u54C1",slug:"\u884D\u751F\u4EA7\u54C1",link:"#\u884D\u751F\u4EA7\u54C1",children:[]},{level:3,title:"YukiHookAPI \u505A\u4E86\u4EC0\u4E48",slug:"yukihookapi-\u505A\u4E86\u4EC0\u4E48",link:"#yukihookapi-\u505A\u4E86\u4EC0\u4E48",children:[]}]},{level:2,title:"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",slug:"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",link:"#\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",children:[]}],path:"/zh-cn/guide/knowledge.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4ECE Xposed API \u8FC1\u79FB",headers:[{level:2,title:"\u8FC1\u79FB Hook \u5165\u53E3\u70B9",slug:"\u8FC1\u79FB-hook-\u5165\u53E3\u70B9",link:"#\u8FC1\u79FB-hook-\u5165\u53E3\u70B9",children:[]},{level:2,title:"\u8FC1\u79FB Hook \u65B9\u6CD5\u4F53",slug:"\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53",link:"#\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53",children:[{level:3,title:"Before/After Hook",slug:"before-after-hook",link:"#before-after-hook",children:[]},{level:3,title:"Replace Hook",slug:"replace-hook",link:"#replace-hook",children:[]}]},{level:2,title:"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",slug:"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",link:"#\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",children:[]}],path:"/zh-cn/guide/move-to-new-api.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5FEB\u901F\u5F00\u59CB",headers:[{level:2,title:"\u73AF\u5883\u8981\u6C42",slug:"\u73AF\u5883\u8981\u6C42",link:"#\u73AF\u5883\u8981\u6C42",children:[]},{level:2,title:"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",slug:"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",link:"#\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",children:[]},{level:2,title:"\u624B\u52A8\u914D\u7F6E\u9879\u76EE",slug:"\u624B\u52A8\u914D\u7F6E\u9879\u76EE",link:"#\u624B\u52A8\u914D\u7F6E\u9879\u76EE",children:[{level:3,title:"\u521B\u5EFA\u9879\u76EE",slug:"\u521B\u5EFA\u9879\u76EE",link:"#\u521B\u5EFA\u9879\u76EE",children:[]},{level:3,title:"\u96C6\u6210\u4F9D\u8D56",slug:"\u96C6\u6210\u4F9D\u8D56",link:"#\u96C6\u6210\u4F9D\u8D56",children:[]},{level:3,title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528",slug:"\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528",link:"#\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528",children:[]},{level:3,title:"\u4F5C\u4E3A Hook API \u4F7F\u7528",slug:"\u4F5C\u4E3A-hook-api-\u4F7F\u7528",link:"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528",children:[]}]}],path:"/zh-cn/guide/quick-start.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookAPI \u6784\u5EFA\u5DE5\u5177",headers:[{level:2,title:"\u83B7\u53D6\u9879\u76EE",slug:"\u83B7\u53D6\u9879\u76EE",link:"#\u83B7\u53D6\u9879\u76EE",children:[]},{level:2,title:"\u4F7F\u7528\u65B9\u6CD5",slug:"\u4F7F\u7528\u65B9\u6CD5",link:"#\u4F7F\u7528\u65B9\u6CD5",children:[{level:3,title:"\u57FA\u672C\u7528\u6CD5",slug:"\u57FA\u672C\u7528\u6CD5",link:"#\u57FA\u672C\u7528\u6CD5",children:[]},{level:3,title:"\u914D\u7F6E\u6A21\u677F",slug:"\u914D\u7F6E\u6A21\u677F",link:"#\u914D\u7F6E\u6A21\u677F",children:[]},{level:3,title:"\u591A\u8BED\u8A00\u652F\u6301",slug:"\u591A\u8BED\u8A00\u652F\u6301",link:"#\u591A\u8BED\u8A00\u652F\u6301",children:[]}]}],path:"/zh-cn/tools/yukihookapi-projectbuilder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Host Resource Injection Extension",headers:[{level:2,title:"Inject Module App's Resources",slug:"inject-module-app-s-resources",link:"#inject-module-app-s-resources",children:[]},{level:2,title:"Register Module App's Activity",slug:"register-module-app-s-activity",link:"#register-module-app-s-activity",children:[]},{level:2,title:"Create ContextThemeWrapper Proxy",slug:"create-contextthemewrapper-proxy",link:"#create-contextthemewrapper-proxy",children:[]},{level:2,title:"ClassLoader Conflict Problem",slug:"classloader-conflict-problem",link:"#classloader-conflict-problem",children:[]}],path:"/en/api/special-features/host-inject.html",pathLocale:"/en/",extraFields:[]},{title:"Host Lifecycle Extension",headers:[{level:2,title:"Listener Lifecycle",slug:"listener-lifecycle",link:"#listener-lifecycle",children:[]},{level:2,title:"Register System Broadcast",slug:"register-system-broadcast",link:"#register-system-broadcast",children:[]}],path:"/en/api/special-features/host-lifecycle.html",pathLocale:"/en/",extraFields:[]},{title:"Debug Logs",headers:[{level:2,title:"Normal Logs",slug:"normal-logs",link:"#normal-logs",children:[]},{level:2,title:"Error Logs",slug:"error-logs",link:"#error-logs",children:[]},{level:2,title:"Save Logs and Custom Elements",slug:"save-logs-and-custom-elements",link:"#save-logs-and-custom-elements",children:[]}],path:"/en/api/special-features/logger.html",pathLocale:"/en/",extraFields:[]},{title:"Reflection Extensions",headers:[{level:2,title:"Class Extensions",slug:"class-extensions",link:"#class-extensions",children:[{level:3,title:"Object Conversion",slug:"object-conversion",link:"#object-conversion",children:[]},{level:3,title:"Existential Judgment",slug:"existential-judgment",link:"#existential-judgment",children:[]},{level:3,title:"Vague Search",slug:"vague-search",link:"#vague-search",children:[]}]},{level:2,title:"Member Extensions",slug:"member-extensions",link:"#member-extensions",children:[{level:3,title:"Find and Reflection",slug:"find-and-reflection",link:"#find-and-reflection",children:[]},{level:3,title:"Optional Find Conditions",slug:"optional-find-conditions",link:"#optional-find-conditions",children:[]},{level:3,title:"Find in Super Class",slug:"find-in-super-class",link:"#find-in-super-class",children:[]},{level:3,title:"Vague Find",slug:"vague-find",link:"#vague-find",children:[]},{level:3,title:"Multiple Find",slug:"multiple-find",link:"#multiple-find",children:[]},{level:3,title:"Static Bytecode",slug:"static-bytecode",link:"#static-bytecode",children:[]},{level:3,title:"Obfuscated Bytecode",slug:"obfuscated-bytecode",link:"#obfuscated-bytecode",children:[]},{level:3,title:"Directly Called",slug:"directly-called",link:"#directly-called",children:[]},{level:3,title:"Original Called",slug:"original-called",link:"#original-called",children:[]},{level:3,title:"Find Again",slug:"find-again",link:"#find-again",children:[]},{level:3,title:"Relative Matching",slug:"relative-matching",link:"#relative-matching",children:[]},{level:3,title:"Calling Generics",slug:"calling-generics",link:"#calling-generics",children:[]},{level:3,title:"Pay Attention of Trap",slug:"pay-attention-of-trap",link:"#pay-attention-of-trap",children:[]}]},{level:2,title:"Common Type Extensions",slug:"common-type-extensions",link:"#common-type-extensions",children:[]}],path:"/en/api/special-features/reflection.html",pathLocale:"/en/",extraFields:[]},{title:"Xposed Module and Host Channel",headers:[{level:2,title:"Basic Usage",slug:"basic-usage",link:"#basic-usage",children:[]},{level:2,title:"Determine Module App and Host App Version Match",slug:"determine-module-app-and-host-app-version-match",link:"#determine-module-app-and-host-app-version-match",children:[]},{level:2,title:"Rules for Callback Event Response",slug:"rules-for-callback-event-response",link:"#rules-for-callback-event-response",children:[]},{level:2,title:"Security Instructions",slug:"security-instructions",link:"#security-instructions",children:[]}],path:"/en/api/special-features/xposed-channel.html",pathLocale:"/en/",extraFields:[]},{title:"Xposed Module Data Storage",headers:[{level:2,title:"Use in Activity",slug:"use-in-activity",link:"#use-in-activity",children:[]},{level:2,title:"Use in PreferenceFragment",slug:"use-in-preferencefragment",link:"#use-in-preferencefragment",children:[]}],path:"/en/api/special-features/xposed-storage.html",pathLocale:"/en/",extraFields:[]},{title:"\u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55",headers:[{level:2,title:"\u6CE8\u5165\u6A21\u5757\u8D44\u6E90 (Resources)",slug:"\u6CE8\u5165\u6A21\u5757\u8D44\u6E90-resources",link:"#\u6CE8\u5165\u6A21\u5757\u8D44\u6E90-resources",children:[]},{level:2,title:"\u6CE8\u518C\u6A21\u5757 Activity",slug:"\u6CE8\u518C\u6A21\u5757-activity",link:"#\u6CE8\u518C\u6A21\u5757-activity",children:[]},{level:2,title:"\u521B\u5EFA ContextThemeWrapper \u4EE3\u7406",slug:"\u521B\u5EFA-contextthemewrapper-\u4EE3\u7406",link:"#\u521B\u5EFA-contextthemewrapper-\u4EE3\u7406",children:[]},{level:2,title:"ClassLoader \u51B2\u7A81\u95EE\u9898",slug:"classloader-\u51B2\u7A81\u95EE\u9898",link:"#classloader-\u51B2\u7A81\u95EE\u9898",children:[]}],path:"/zh-cn/api/special-features/host-inject.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55",headers:[{level:2,title:"\u76D1\u542C\u751F\u547D\u5468\u671F",slug:"\u76D1\u542C\u751F\u547D\u5468\u671F",link:"#\u76D1\u542C\u751F\u547D\u5468\u671F",children:[]},{level:2,title:"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",slug:"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",link:"#\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",children:[]}],path:"/zh-cn/api/special-features/host-lifecycle.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u8C03\u8BD5\u65E5\u5FD7",headers:[{level:2,title:"\u666E\u901A\u65E5\u5FD7",slug:"\u666E\u901A\u65E5\u5FD7",link:"#\u666E\u901A\u65E5\u5FD7",children:[]},{level:2,title:"\u9519\u8BEF\u65E5\u5FD7",slug:"\u9519\u8BEF\u65E5\u5FD7",link:"#\u9519\u8BEF\u65E5\u5FD7",children:[]},{level:2,title:"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",slug:"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",link:"#\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",children:[]}],path:"/zh-cn/api/special-features/logger.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55",headers:[{level:2,title:"Class \u6269\u5C55",slug:"class-\u6269\u5C55",link:"#class-\u6269\u5C55",children:[{level:3,title:"\u5BF9\u8C61\u8F6C\u6362",slug:"\u5BF9\u8C61\u8F6C\u6362",link:"#\u5BF9\u8C61\u8F6C\u6362",children:[]},{level:3,title:"\u5B58\u5728\u5224\u65AD",slug:"\u5B58\u5728\u5224\u65AD",link:"#\u5B58\u5728\u5224\u65AD",children:[]},{level:3,title:"\u6A21\u7CCA\u67E5\u627E",slug:"\u6A21\u7CCA\u67E5\u627E",link:"#\u6A21\u7CCA\u67E5\u627E",children:[]}]},{level:2,title:"Member \u6269\u5C55",slug:"member-\u6269\u5C55",link:"#member-\u6269\u5C55",children:[{level:3,title:"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",slug:"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",link:"#\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",children:[]},{level:3,title:"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",slug:"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",link:"#\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",children:[]},{level:3,title:"\u5728\u7236\u7C7B\u67E5\u627E",slug:"\u5728\u7236\u7C7B\u67E5\u627E",link:"#\u5728\u7236\u7C7B\u67E5\u627E",children:[]},{level:3,title:"\u6A21\u7CCA\u67E5\u627E",slug:"\u6A21\u7CCA\u67E5\u627E-1",link:"#\u6A21\u7CCA\u67E5\u627E-1",children:[]},{level:3,title:"\u591A\u91CD\u67E5\u627E",slug:"\u591A\u91CD\u67E5\u627E-1",link:"#\u591A\u91CD\u67E5\u627E-1",children:[]},{level:3,title:"\u9759\u6001\u5B57\u8282\u7801",slug:"\u9759\u6001\u5B57\u8282\u7801",link:"#\u9759\u6001\u5B57\u8282\u7801",children:[]},{level:3,title:"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",slug:"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",link:"#\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",children:[]},{level:3,title:"\u76F4\u63A5\u8C03\u7528",slug:"\u76F4\u63A5\u8C03\u7528",link:"#\u76F4\u63A5\u8C03\u7528",children:[]},{level:3,title:"\u539F\u59CB\u8C03\u7528",slug:"\u539F\u59CB\u8C03\u7528",link:"#\u539F\u59CB\u8C03\u7528",children:[]},{level:3,title:"\u518D\u6B21\u67E5\u627E",slug:"\u518D\u6B21\u67E5\u627E",link:"#\u518D\u6B21\u67E5\u627E",children:[]},{level:3,title:"\u76F8\u5BF9\u5339\u914D",slug:"\u76F8\u5BF9\u5339\u914D",link:"#\u76F8\u5BF9\u5339\u914D",children:[]},{level:3,title:"\u8C03\u7528\u6CDB\u578B",slug:"\u8C03\u7528\u6CDB\u578B",link:"#\u8C03\u7528\u6CDB\u578B",children:[]},{level:3,title:"\u6CE8\u610F\u8BEF\u533A",slug:"\u6CE8\u610F\u8BEF\u533A",link:"#\u6CE8\u610F\u8BEF\u533A",children:[]}]},{level:2,title:"\u5E38\u7528\u7C7B\u578B\u6269\u5C55",slug:"\u5E38\u7528\u7C7B\u578B\u6269\u5C55",link:"#\u5E38\u7528\u7C7B\u578B\u6269\u5C55",children:[]}],path:"/zh-cn/api/special-features/reflection.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865",headers:[{level:2,title:"\u57FA\u672C\u7528\u6CD5",slug:"\u57FA\u672C\u7528\u6CD5",link:"#\u57FA\u672C\u7528\u6CD5",children:[]},{level:2,title:"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",slug:"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",link:"#\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",children:[]},{level:2,title:"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",slug:"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",link:"#\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",children:[]},{level:2,title:"\u5B89\u5168\u6027\u8BF4\u660E",slug:"\u5B89\u5168\u6027\u8BF4\u660E",link:"#\u5B89\u5168\u6027\u8BF4\u660E",children:[]}],path:"/zh-cn/api/special-features/xposed-channel.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8",headers:[{level:2,title:"\u5728 Activity \u4E2D\u4F7F\u7528",slug:"\u5728-activity-\u4E2D\u4F7F\u7528",link:"#\u5728-activity-\u4E2D\u4F7F\u7528",children:[]},{level:2,title:"\u5728 PreferenceFragment \u4E2D\u4F7F\u7528",slug:"\u5728-preferencefragment-\u4E2D\u4F7F\u7528",link:"#\u5728-preferencefragment-\u4E2D\u4F7F\u7528",children:[]}],path:"/zh-cn/api/special-features/xposed-storage.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookAPI - object",headers:[{level:2,title:"API_VERSION_NAME - field",slug:"api-version-name-field",link:"#api-version-name-field",children:[]},{level:2,title:"API_VERSION_CODE - field",slug:"api-version-code-field",link:"#api-version-code-field",children:[]},{level:2,title:"Status - object",slug:"status-object",link:"#status-object",children:[{level:3,title:"compiledTimestamp - field",slug:"compiledtimestamp-field",link:"#compiledtimestamp-field",children:[]},{level:3,title:"isXposedEnvironment - field",slug:"isxposedenvironment-field",link:"#isxposedenvironment-field",children:[]},{level:3,title:"isModuleActive - field",slug:"ismoduleactive-field",link:"#ismoduleactive-field",children:[]},{level:3,title:"isXposedModuleActive - field",slug:"isxposedmoduleactive-field",link:"#isxposedmoduleactive-field",children:[]},{level:3,title:"isTaiChiModuleActive - field",slug:"istaichimoduleactive-field",link:"#istaichimoduleactive-field",children:[]},{level:3,title:"isSupportResourcesHook - field",slug:"issupportresourceshook-field",link:"#issupportresourceshook-field",children:[]},{level:3,title:"Executor - object",slug:"executor-object",link:"#executor-object",children:[]}]},{level:2,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[{level:3,title:"debugLog - method",slug:"debuglog-method",link:"#debuglog-method",children:[]},{level:3,title:"isDebug - field",slug:"isdebug-field",link:"#isdebug-field",children:[]},{level:3,title:"isEnableModulePrefsCache - field",slug:"isenablemoduleprefscache-field",link:"#isenablemoduleprefscache-field",children:[]},{level:3,title:"isEnableModuleAppResourcesCache - field",slug:"isenablemoduleappresourcescache-field",link:"#isenablemoduleappresourcescache-field",children:[]},{level:3,title:"isEnableHookModuleStatus - field",slug:"isenablehookmodulestatus-field",link:"#isenablehookmodulestatus-field",children:[]},{level:3,title:"isEnableHookSharedPreferences - field",slug:"isenablehooksharedpreferences-field",link:"#isenablehooksharedpreferences-field",children:[]},{level:3,title:"isEnableDataChannel - field",slug:"isenabledatachannel-field",link:"#isenabledatachannel-field",children:[]},{level:3,title:"isEnableMemberCache - field",slug:"isenablemembercache-field",link:"#isenablemembercache-field",children:[]}]},{level:2,title:"configs - method",slug:"configs-method",link:"#configs-method",children:[]},{level:2,title:"encase - method",slug:"encase-method",link:"#encase-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookAPI - object",headers:[{level:2,title:"API_VERSION_NAME - field",slug:"api-version-name-field",link:"#api-version-name-field",children:[]},{level:2,title:"API_VERSION_CODE - field",slug:"api-version-code-field",link:"#api-version-code-field",children:[]},{level:2,title:"Status - object",slug:"status-object",link:"#status-object",children:[{level:3,title:"compiledTimestamp - field",slug:"compiledtimestamp-field",link:"#compiledtimestamp-field",children:[]},{level:3,title:"isXposedEnvironment - field",slug:"isxposedenvironment-field",link:"#isxposedenvironment-field",children:[]},{level:3,title:"isModuleActive - field",slug:"ismoduleactive-field",link:"#ismoduleactive-field",children:[]},{level:3,title:"isXposedModuleActive - field",slug:"isxposedmoduleactive-field",link:"#isxposedmoduleactive-field",children:[]},{level:3,title:"isTaiChiModuleActive - field",slug:"istaichimoduleactive-field",link:"#istaichimoduleactive-field",children:[]},{level:3,title:"isSupportResourcesHook - field",slug:"issupportresourceshook-field",link:"#issupportresourceshook-field",children:[]},{level:3,title:"Executor - object",slug:"executor-object",link:"#executor-object",children:[]}]},{level:2,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[{level:3,title:"debugLog - method",slug:"debuglog-method",link:"#debuglog-method",children:[]},{level:3,title:"isDebug - field",slug:"isdebug-field",link:"#isdebug-field",children:[]},{level:3,title:"isEnableModulePrefsCache - field",slug:"isenablemoduleprefscache-field",link:"#isenablemoduleprefscache-field",children:[]},{level:3,title:"isEnableModuleAppResourcesCache - field",slug:"isenablemoduleappresourcescache-field",link:"#isenablemoduleappresourcescache-field",children:[]},{level:3,title:"isEnableHookModuleStatus - field",slug:"isenablehookmodulestatus-field",link:"#isenablehookmodulestatus-field",children:[]},{level:3,title:"isEnableHookSharedPreferences - field",slug:"isenablehooksharedpreferences-field",link:"#isenablehooksharedpreferences-field",children:[]},{level:3,title:"isEnableDataChannel - field",slug:"isenabledatachannel-field",link:"#isenabledatachannel-field",children:[]},{level:3,title:"isEnableMemberCache - field",slug:"isenablemembercache-field",link:"#isenablemembercache-field",children:[]}]},{level:2,title:"configs - method",slug:"configs-method",link:"#configs-method",children:[]},{level:2,title:"encase - method",slug:"encase-method",link:"#encase-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",pathLocale:"/en/",extraFields:[]},{title:"InjectYukiHookWithXposed - annotation",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"CurrentClass - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"generic - method",slug:"generic-method",link:"#generic-method",children:[]},{level:2,title:"generic - method",slug:"generic-method-1",link:"#generic-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"SuperClass - class",slug:"superclass-class",link:"#superclass-class",children:[{level:3,title:"name - field",slug:"name-field-1",link:"#name-field-1",children:[]},{level:3,title:"simpleName - field",slug:"simplename-field-1",link:"#simplename-field-1",children:[]},{level:3,title:"generic - method",slug:"generic-method-2",link:"#generic-method-2",children:[]},{level:3,title:"generic - method",slug:"generic-method-3",link:"#generic-method-3",children:[]},{level:3,title:"field - method",slug:"field-method-1",link:"#field-method-1",children:[]},{level:3,title:"method - method",slug:"method-method-1",link:"#method-method-1",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"GenericClass - class",headers:[{level:2,title:"argument - method",slug:"argument-method",link:"#argument-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookClass - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookResources - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"VariousClass - class",headers:[{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"getOrNull - method",slug:"getornull-method",link:"#getornull-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiMemberHookCreator - class",headers:[{level:2,title:"PRIORITY_DEFAULT - field",slug:"priority-default-field",link:"#priority-default-field",children:[]},{level:2,title:"PRIORITY_LOWEST - field",slug:"priority-lowest-field",link:"#priority-lowest-field",children:[]},{level:2,title:"PRIORITY_HIGHEST - field",slug:"priority-highest-field",link:"#priority-highest-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"injectMember - method",slug:"injectmember-method",link:"#injectmember-method",children:[]},{level:2,title:"useDangerousOperation - method",slug:"usedangerousoperation-method",link:"#usedangerousoperation-method",children:[]},{level:2,title:"MemberHookCreator - class",slug:"memberhookcreator-class",link:"#memberhookcreator-class",children:[{level:3,title:"members - method",slug:"members-method",link:"#members-method",children:[]},{level:3,title:"allMembers - method",slug:"allmembers-method",link:"#allmembers-method",children:[]},{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"HookParam.field - i-ext-method",slug:"hookparam-field-i-ext-method",link:"#hookparam-field-i-ext-method",children:[]},{level:3,title:"HookParam.method - i-ext-method",slug:"hookparam-method-i-ext-method",link:"#hookparam-method-i-ext-method",children:[]},{level:3,title:"HookParam.constructor - i-ext-method",slug:"hookparam-constructor-i-ext-method",link:"#hookparam-constructor-i-ext-method",children:[]},{level:3,title:"HookParam.injectMember - i-ext-method",slug:"hookparam-injectmember-i-ext-method",link:"#hookparam-injectmember-i-ext-method",children:[]},{level:3,title:"beforeHook - method",slug:"beforehook-method",link:"#beforehook-method",children:[]},{level:3,title:"afterHook - method",slug:"afterhook-method",link:"#afterhook-method",children:[]},{level:3,title:"replaceAny - method",slug:"replaceany-method",link:"#replaceany-method",children:[]},{level:3,title:"replaceUnit - method",slug:"replaceunit-method",link:"#replaceunit-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"intercept - method",slug:"intercept-method",link:"#intercept-method",children:[]},{level:3,title:"removeSelf - method",slug:"removeself-method",link:"#removeself-method",children:[]},{level:3,title:"HookCallback - class",slug:"hookcallback-class",link:"#hookcallback-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"by - method",slug:"by-method-1",link:"#by-method-1",children:[]},{level:3,title:"onPrepareHook - method",slug:"onpreparehook-method",link:"#onpreparehook-method",children:[]},{level:3,title:"onHookClassNotFoundFailure - method",slug:"onhookclassnotfoundfailure-method",link:"#onhookclassnotfoundfailure-method",children:[]},{level:3,title:"ignoredHookClassNotFoundFailure - method",slug:"ignoredhookclassnotfoundfailure-method",link:"#ignoredhookclassnotfoundfailure-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResourcesHookCreator - class",headers:[{level:2,title:"injectResource - method",slug:"injectresource-method",link:"#injectresource-method",children:[]},{level:2,title:"ResourcesHookCreator - class",slug:"resourceshookcreator-class",link:"#resourceshookcreator-class",children:[{level:3,title:"resourceId - field",slug:"resourceid-field",link:"#resourceid-field",children:[]},{level:3,title:"conditions - method",slug:"conditions-method",link:"#conditions-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"replaceToModuleResource - method",slug:"replacetomoduleresource-method",link:"#replacetomoduleresource-method",children:[]},{level:3,title:"injectAsLayout - method",slug:"injectaslayout-method",link:"#injectaslayout-method",children:[]},{level:3,title:"ConditionFinder - class",slug:"conditionfinder-class",link:"#conditionfinder-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]},{level:3,title:"onHookingFailure - method",slug:"onhookingfailure-method",link:"#onhookingfailure-method",children:[]},{level:3,title:"ignoredHookingFailure - method",slug:"ignoredhookingfailure-method",link:"#ignoredhookingfailure-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"LoggerFactory - kt",headers:[{level:2,title:"LoggerType - class",slug:"loggertype-class",link:"#loggertype-class",children:[{level:3,title:"LOGD - enum",slug:"logd-enum",link:"#logd-enum",children:[]},{level:3,title:"XPOSED_ENVIRONMENT - enum",slug:"xposed-environment-enum",link:"#xposed-environment-enum",children:[]},{level:3,title:"SCOPE - enum",slug:"scope-enum",link:"#scope-enum",children:[]},{level:3,title:"BOTH - enum",slug:"both-enum",link:"#both-enum",children:[]}]},{level:2,title:"YukiLoggerData - class",slug:"yukiloggerdata-class",link:"#yukiloggerdata-class",children:[]},{level:2,title:"YukiHookLogger - object",slug:"yukihooklogger-object",link:"#yukihooklogger-object",children:[{level:3,title:"inMemoryData - field",slug:"inmemorydata-field",link:"#inmemorydata-field",children:[]},{level:3,title:"contents - field",slug:"contents-field",link:"#contents-field",children:[]},{level:3,title:"contents - method",slug:"contents-method",link:"#contents-method",children:[]},{level:3,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:3,title:"saveToFile - method",slug:"savetofile-method",link:"#savetofile-method",children:[]},{level:3,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[]}]},{level:2,title:"loggerD - method",slug:"loggerd-method",link:"#loggerd-method",children:[]},{level:2,title:"loggerI - method",slug:"loggeri-method",link:"#loggeri-method",children:[]},{level:2,title:"loggerW - method",slug:"loggerw-method",link:"#loggerw-method",children:[]},{level:2,title:"loggerE - method",slug:"loggere-method",link:"#loggere-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ReflectionFactory - kt",headers:[{level:2,title:"MembersType - class",slug:"memberstype-class",link:"#memberstype-class",children:[{level:3,title:"ALL - enum",slug:"all-enum",link:"#all-enum",children:[]},{level:3,title:"METHOD - enum",slug:"method-enum",link:"#method-enum",children:[]},{level:3,title:"CONSTRUCTOR - enum",slug:"constructor-enum",link:"#constructor-enum",children:[]}]},{level:2,title:"ClassLoader.listOfClasses - ext-method",slug:"classloader-listofclasses-ext-method",link:"#classloader-listofclasses-ext-method",children:[]},{level:2,title:"ClassLoader.searchClass - ext-method",slug:"classloader-searchclass-ext-method",link:"#classloader-searchclass-ext-method",children:[]},{level:2,title:"ClassLoader.onLoadClass - ext-method",slug:"classloader-onloadclass-ext-method",link:"#classloader-onloadclass-ext-method",children:[]},{level:2,title:"Class.hasExtends - ext-field",slug:"class-hasextends-ext-field",link:"#class-hasextends-ext-field",children:[]},{level:2,title:"Class?.extends - ext-method",slug:"class-extends-ext-method",link:"#class-extends-ext-method",children:[]},{level:2,title:"Class?.notExtends - ext-method",slug:"class-notextends-ext-method",link:"#class-notextends-ext-method",children:[]},{level:2,title:"Class?.implements - ext-method",slug:"class-implements-ext-method",link:"#class-implements-ext-method",children:[]},{level:2,title:"Class?.notImplements - ext-method",slug:"class-notimplements-ext-method",link:"#class-notimplements-ext-method",children:[]},{level:2,title:"Class.toJavaPrimitiveType - ext-method",slug:"class-tojavaprimitivetype-ext-method",link:"#class-tojavaprimitivetype-ext-method",children:[]},{level:2,title:"String.toClass - ext-method",slug:"string-toclass-ext-method",link:"#string-toclass-ext-method",children:[]},{level:2,title:"String.toClassOrNull - ext-method",slug:"string-toclassornull-ext-method",link:"#string-toclassornull-ext-method",children:[]},{level:2,title:"classOf - method",slug:"classof-method",link:"#classof-method",children:[]},{level:2,title:"String.hasClass - ext-method",slug:"string-hasclass-ext-method",link:"#string-hasclass-ext-method",children:[]},{level:2,title:"Class.hasField - ext-method",slug:"class-hasfield-ext-method",link:"#class-hasfield-ext-method",children:[]},{level:2,title:"Class.hasMethod - ext-method",slug:"class-hasmethod-ext-method",link:"#class-hasmethod-ext-method",children:[]},{level:2,title:"Class.hasConstructor - ext-method",slug:"class-hasconstructor-ext-method",link:"#class-hasconstructor-ext-method",children:[]},{level:2,title:"Member.hasModifiers - ext-method",slug:"member-hasmodifiers-ext-method",link:"#member-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.hasModifiers - ext-method",slug:"class-hasmodifiers-ext-method",link:"#class-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.field - ext-method",slug:"class-field-ext-method",link:"#class-field-ext-method",children:[]},{level:2,title:"Class.method - ext-method",slug:"class-method-ext-method",link:"#class-method-ext-method",children:[]},{level:2,title:"Class.constructor - ext-method",slug:"class-constructor-ext-method",link:"#class-constructor-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method",link:"#class-generic-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method-1",link:"#class-generic-ext-method-1",children:[]},{level:2,title:"Any.current - ext-method",slug:"any-current-ext-method",link:"#any-current-ext-method",children:[]},{level:2,title:"Class.buildOf - ext-method",slug:"class-buildof-ext-method",link:"#class-buildof-ext-method",children:[]},{level:2,title:"Class.allMethods - ext-method",slug:"class-allmethods-ext-method",link:"#class-allmethods-ext-method",children:[]},{level:2,title:"Class.allConstructors - ext-method",slug:"class-allconstructors-ext-method",link:"#class-allconstructors-ext-method",children:[]},{level:2,title:"Class.allFields - ext-method",slug:"class-allfields-ext-method",link:"#class-allfields-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookFactory - kt",headers:[{level:2,title:"IYukiHookXposedInit.configs - ext-method",slug:"iyukihookxposedinit-configs-ext-method",link:"#iyukihookxposedinit-configs-ext-method",children:[]},{level:2,title:"IYukiHookXposedInit.encase - ext-method",slug:"iyukihookxposedinit-encase-ext-method",link:"#iyukihookxposedinit-encase-ext-method",children:[]},{level:2,title:"Context.modulePrefs - ext-field",slug:"context-moduleprefs-ext-field",link:"#context-moduleprefs-ext-field",children:[]},{level:2,title:"Context.modulePrefs - ext-method",slug:"context-moduleprefs-ext-method",link:"#context-moduleprefs-ext-method",children:[]},{level:2,title:"Context.dataChannel - ext-method",slug:"context-datachannel-ext-method",link:"#context-datachannel-ext-method",children:[]},{level:2,title:"Context.processName - ext-field",slug:"context-processname-ext-field",link:"#context-processname-ext-field",children:[]},{level:2,title:"Context+Resources.injectModuleAppResources - ext-method",slug:"context-resources-injectmoduleappresources-ext-method",link:"#context-resources-injectmoduleappresources-ext-method",children:[]},{level:2,title:"Context.registerModuleAppActivities - ext-method",slug:"context-registermoduleappactivities-ext-method",link:"#context-registermoduleappactivities-ext-method",children:[]},{level:2,title:"Context.applyModuleTheme - ext-method",slug:"context-applymoduletheme-ext-method",link:"#context-applymoduletheme-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookParam - class",headers:[{level:2,title:"args - field",slug:"args-field",link:"#args-field",children:[]},{level:2,title:"instance - field",slug:"instance-field",link:"#instance-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"member - field",slug:"member-field",link:"#member-field",children:[]},{level:2,title:"method - field",slug:"method-field",link:"#method-field",children:[]},{level:2,title:"constructor - field",slug:"constructor-field",link:"#constructor-field",children:[]},{level:2,title:"result - field",slug:"result-field",link:"#result-field",children:[]},{level:2,title:"dataExtra - field",slug:"dataextra-field",link:"#dataextra-field",children:[]},{level:2,title:"hasThrowable - field",slug:"hasthrowable-field",link:"#hasthrowable-field",children:[]},{level:2,title:"throwable - field",slug:"throwable-field",link:"#throwable-field",children:[]},{level:2,title:"Throwable.throwToApp - i-ext-method",slug:"throwable-throwtoapp-i-ext-method",link:"#throwable-throwtoapp-i-ext-method",children:[]},{level:2,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:2,title:"instance - method",slug:"instance-method",link:"#instance-method",children:[]},{level:2,title:"args - method",slug:"args-method",link:"#args-method",children:[]},{level:2,title:"args - method",slug:"args-method-1",link:"#args-method-1",children:[]},{level:2,title:"callOriginal - method",slug:"calloriginal-method",link:"#calloriginal-method",children:[]},{level:2,title:"invokeOriginal - method",slug:"invokeoriginal-method",link:"#invokeoriginal-method",children:[]},{level:2,title:"resultTrue - method",slug:"resulttrue-method",link:"#resulttrue-method",children:[]},{level:2,title:"resultFalse - method",slug:"resultfalse-method",link:"#resultfalse-method",children:[]},{level:2,title:"resultNull - method",slug:"resultnull-method",link:"#resultnull-method",children:[]},{level:2,title:"ArgsIndexCondition - class",slug:"argsindexcondition-class",link:"#argsindexcondition-class",children:[{level:3,title:"first - method",slug:"first-method",link:"#first-method",children:[]},{level:3,title:"last - method",slug:"last-method",link:"#last-method",children:[]}]},{level:2,title:"ArgsModifyer - class",slug:"argsmodifyer-class",link:"#argsmodifyer-class",children:[{level:3,title:"cast - method",slug:"cast-method",link:"#cast-method",children:[]},{level:3,title:"byte - method",slug:"byte-method",link:"#byte-method",children:[]},{level:3,title:"int - method",slug:"int-method",link:"#int-method",children:[]},{level:3,title:"long - method",slug:"long-method",link:"#long-method",children:[]},{level:3,title:"short - method",slug:"short-method",link:"#short-method",children:[]},{level:3,title:"double - method",slug:"double-method",link:"#double-method",children:[]},{level:3,title:"float - method",slug:"float-method",link:"#float-method",children:[]},{level:3,title:"string - method",slug:"string-method",link:"#string-method",children:[]},{level:3,title:"char - method",slug:"char-method",link:"#char-method",children:[]},{level:3,title:"boolean - method",slug:"boolean-method",link:"#boolean-method",children:[]},{level:3,title:"any - method",slug:"any-method",link:"#any-method",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]},{level:3,title:"set - method",slug:"set-method",link:"#set-method",children:[]},{level:3,title:"setNull - method",slug:"setnull-method",link:"#setnull-method",children:[]},{level:3,title:"setTrue - method",slug:"settrue-method",link:"#settrue-method",children:[]},{level:3,title:"setFalse - method",slug:"setfalse-method",link:"#setfalse-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"PackageParam - class",headers:[{level:2,title:"appClassLoader - field",slug:"appclassloader-field",link:"#appclassloader-field",children:[]},{level:2,title:"appInfo - field",slug:"appinfo-field",link:"#appinfo-field",children:[]},{level:2,title:"appUserId - field",slug:"appuserid-field",link:"#appuserid-field",children:[]},{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]},{level:2,title:"appResources - field",slug:"appresources-field",link:"#appresources-field",children:[]},{level:2,title:"systemContext - field",slug:"systemcontext-field",link:"#systemcontext-field",children:[]},{level:2,title:"processName - field",slug:"processname-field",link:"#processname-field",children:[]},{level:2,title:"packageName - field",slug:"packagename-field",link:"#packagename-field",children:[]},{level:2,title:"isFirstApplication - field",slug:"isfirstapplication-field",link:"#isfirstapplication-field",children:[]},{level:2,title:"mainProcessName - field",slug:"mainprocessname-field",link:"#mainprocessname-field",children:[]},{level:2,title:"moduleAppFilePath - field",slug:"moduleappfilepath-field",link:"#moduleappfilepath-field",children:[]},{level:2,title:"moduleAppResources - field",slug:"moduleappresources-field",link:"#moduleappresources-field",children:[]},{level:2,title:"prefs - field",slug:"prefs-field",link:"#prefs-field",children:[]},{level:2,title:"prefs - method",slug:"prefs-method",link:"#prefs-method",children:[]},{level:2,title:"dataChannel - field",slug:"datachannel-field",link:"#datachannel-field",children:[]},{level:2,title:"resources - method",slug:"resources-method",link:"#resources-method",children:[]},{level:2,title:"refreshModuleAppResources - method",slug:"refreshmoduleappresources-method",link:"#refreshmoduleappresources-method",children:[]},{level:2,title:"onAppLifecycle - method",slug:"onapplifecycle-method",link:"#onapplifecycle-method",children:[]},{level:2,title:"loadApp - method",slug:"loadapp-method",link:"#loadapp-method",children:[]},{level:2,title:"loadZygote - method",slug:"loadzygote-method",link:"#loadzygote-method",children:[]},{level:2,title:"loadSystem - method",slug:"loadsystem-method",link:"#loadsystem-method",children:[]},{level:2,title:"withProcess - method",slug:"withprocess-method",link:"#withprocess-method",children:[]},{level:2,title:"loadHooker - method",slug:"loadhooker-method",link:"#loadhooker-method",children:[]},{level:2,title:"searchClass - method",slug:"searchclass-method",link:"#searchclass-method",children:[]},{level:2,title:"String+VariousClass.toClass - i-ext-method",slug:"string-variousclass-toclass-i-ext-method",link:"#string-variousclass-toclass-i-ext-method",children:[]},{level:2,title:"String+VariousClass.toClassOrNull - i-ext-method",slug:"string-variousclass-toclassornull-i-ext-method",link:"#string-variousclass-toclassornull-i-ext-method",children:[]},{level:2,title:"String.hasClass - i-ext-method",slug:"string-hasclass-i-ext-method",link:"#string-hasclass-i-ext-method",children:[]},{level:2,title:"findClass - method",slug:"findclass-method",link:"#findclass-method",children:[]},{level:2,title:"String+Class+VariousClass+HookClass.hook - i-ext-method",slug:"string-class-variousclass-hookclass-hook-i-ext-method",link:"#string-class-variousclass-hookclass-hook-i-ext-method",children:[]},{level:2,title:"HookResources.hook - i-ext-method",slug:"hookresources-hook-i-ext-method",link:"#hookresources-hook-i-ext-method",children:[]},{level:2,title:"AppLifecycle - class",slug:"applifecycle-class",link:"#applifecycle-class",children:[{level:3,title:"attachBaseContext - method",slug:"attachbasecontext-method",link:"#attachbasecontext-method",children:[]},{level:3,title:"onCreate - method",slug:"oncreate-method",link:"#oncreate-method",children:[]},{level:3,title:"onTerminate - method",slug:"onterminate-method",link:"#onterminate-method",children:[]},{level:3,title:"onLowMemory - method",slug:"onlowmemory-method",link:"#onlowmemory-method",children:[]},{level:3,title:"onTrimMemory - method",slug:"ontrimmemory-method",link:"#ontrimmemory-method",children:[]},{level:3,title:"onConfigurationChanged - method",slug:"onconfigurationchanged-method",link:"#onconfigurationchanged-method",children:[]},{level:3,title:"registerReceiver - method",slug:"registerreceiver-method",link:"#registerreceiver-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiBaseHooker - class",headers:[{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"InjectYukiHookWithXposed - annotation",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",pathLocale:"/en/",extraFields:[]},{title:"CurrentClass - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"generic - method",slug:"generic-method",link:"#generic-method",children:[]},{level:2,title:"generic - method",slug:"generic-method-1",link:"#generic-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"SuperClass - class",slug:"superclass-class",link:"#superclass-class",children:[{level:3,title:"name - field",slug:"name-field-1",link:"#name-field-1",children:[]},{level:3,title:"simpleName - field",slug:"simplename-field-1",link:"#simplename-field-1",children:[]},{level:3,title:"generic - method",slug:"generic-method-2",link:"#generic-method-2",children:[]},{level:3,title:"generic - method",slug:"generic-method-3",link:"#generic-method-3",children:[]},{level:3,title:"field - method",slug:"field-method-1",link:"#field-method-1",children:[]},{level:3,title:"method - method",slug:"method-method-1",link:"#method-method-1",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",pathLocale:"/en/",extraFields:[]},{title:"GenericClass - class",headers:[{level:2,title:"argument - method",slug:"argument-method",link:"#argument-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",pathLocale:"/en/",extraFields:[]},{title:"HookClass - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",pathLocale:"/en/",extraFields:[]},{title:"HookResources - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",pathLocale:"/en/",extraFields:[]},{title:"VariousClass - class",headers:[{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"getOrNull - method",slug:"getornull-method",link:"#getornull-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",pathLocale:"/en/",extraFields:[]},{title:"YukiMemberHookCreator - class",headers:[{level:2,title:"PRIORITY_DEFAULT - field",slug:"priority-default-field",link:"#priority-default-field",children:[]},{level:2,title:"PRIORITY_LOWEST - field",slug:"priority-lowest-field",link:"#priority-lowest-field",children:[]},{level:2,title:"PRIORITY_HIGHEST - field",slug:"priority-highest-field",link:"#priority-highest-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"injectMember - method",slug:"injectmember-method",link:"#injectmember-method",children:[]},{level:2,title:"useDangerousOperation - method",slug:"usedangerousoperation-method",link:"#usedangerousoperation-method",children:[]},{level:2,title:"MemberHookCreator - class",slug:"memberhookcreator-class",link:"#memberhookcreator-class",children:[{level:3,title:"members - method",slug:"members-method",link:"#members-method",children:[]},{level:3,title:"allMembers - method",slug:"allmembers-method",link:"#allmembers-method",children:[]},{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"HookParam.field - i-ext-method",slug:"hookparam-field-i-ext-method",link:"#hookparam-field-i-ext-method",children:[]},{level:3,title:"HookParam.method - i-ext-method",slug:"hookparam-method-i-ext-method",link:"#hookparam-method-i-ext-method",children:[]},{level:3,title:"HookParam.constructor - i-ext-method",slug:"hookparam-constructor-i-ext-method",link:"#hookparam-constructor-i-ext-method",children:[]},{level:3,title:"HookParam.injectMember - i-ext-method",slug:"hookparam-injectmember-i-ext-method",link:"#hookparam-injectmember-i-ext-method",children:[]},{level:3,title:"beforeHook - method",slug:"beforehook-method",link:"#beforehook-method",children:[]},{level:3,title:"afterHook - method",slug:"afterhook-method",link:"#afterhook-method",children:[]},{level:3,title:"replaceAny - method",slug:"replaceany-method",link:"#replaceany-method",children:[]},{level:3,title:"replaceUnit - method",slug:"replaceunit-method",link:"#replaceunit-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"intercept - method",slug:"intercept-method",link:"#intercept-method",children:[]},{level:3,title:"removeSelf - method",slug:"removeself-method",link:"#removeself-method",children:[]},{level:3,title:"HookCallback - class",slug:"hookcallback-class",link:"#hookcallback-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"by - method",slug:"by-method-1",link:"#by-method-1",children:[]},{level:3,title:"onPrepareHook - method",slug:"onpreparehook-method",link:"#onpreparehook-method",children:[]},{level:3,title:"onHookClassNotFoundFailure - method",slug:"onhookclassnotfoundfailure-method",link:"#onhookclassnotfoundfailure-method",children:[]},{level:3,title:"ignoredHookClassNotFoundFailure - method",slug:"ignoredhookclassnotfoundfailure-method",link:"#ignoredhookclassnotfoundfailure-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResourcesHookCreator - class",headers:[{level:2,title:"injectResource - method",slug:"injectresource-method",link:"#injectresource-method",children:[]},{level:2,title:"ResourcesHookCreator - class",slug:"resourceshookcreator-class",link:"#resourceshookcreator-class",children:[{level:3,title:"resourceId - field",slug:"resourceid-field",link:"#resourceid-field",children:[]},{level:3,title:"conditions - method",slug:"conditions-method",link:"#conditions-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"replaceToModuleResource - method",slug:"replacetomoduleresource-method",link:"#replacetomoduleresource-method",children:[]},{level:3,title:"injectAsLayout - method",slug:"injectaslayout-method",link:"#injectaslayout-method",children:[]},{level:3,title:"ConditionFinder - class",slug:"conditionfinder-class",link:"#conditionfinder-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]},{level:3,title:"onHookingFailure - method",slug:"onhookingfailure-method",link:"#onhookingfailure-method",children:[]},{level:3,title:"ignoredHookingFailure - method",slug:"ignoredhookingfailure-method",link:"#ignoredhookingfailure-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",pathLocale:"/en/",extraFields:[]},{title:"YukiBaseHooker - class",headers:[{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",pathLocale:"/en/",extraFields:[]},{title:"ReflectionFactory - kt",headers:[{level:2,title:"MembersType - class",slug:"memberstype-class",link:"#memberstype-class",children:[{level:3,title:"ALL - enum",slug:"all-enum",link:"#all-enum",children:[]},{level:3,title:"METHOD - enum",slug:"method-enum",link:"#method-enum",children:[]},{level:3,title:"CONSTRUCTOR - enum",slug:"constructor-enum",link:"#constructor-enum",children:[]}]},{level:2,title:"ClassLoader.listOfClasses - ext-method",slug:"classloader-listofclasses-ext-method",link:"#classloader-listofclasses-ext-method",children:[]},{level:2,title:"ClassLoader.searchClass - ext-method",slug:"classloader-searchclass-ext-method",link:"#classloader-searchclass-ext-method",children:[]},{level:2,title:"ClassLoader.onLoadClass - ext-method",slug:"classloader-onloadclass-ext-method",link:"#classloader-onloadclass-ext-method",children:[]},{level:2,title:"Class.hasExtends - ext-field",slug:"class-hasextends-ext-field",link:"#class-hasextends-ext-field",children:[]},{level:2,title:"Class?.extends - ext-method",slug:"class-extends-ext-method",link:"#class-extends-ext-method",children:[]},{level:2,title:"Class?.notExtends - ext-method",slug:"class-notextends-ext-method",link:"#class-notextends-ext-method",children:[]},{level:2,title:"Class?.implements - ext-method",slug:"class-implements-ext-method",link:"#class-implements-ext-method",children:[]},{level:2,title:"Class?.notImplements - ext-method",slug:"class-notimplements-ext-method",link:"#class-notimplements-ext-method",children:[]},{level:2,title:"Class.toJavaPrimitiveType - ext-method",slug:"class-tojavaprimitivetype-ext-method",link:"#class-tojavaprimitivetype-ext-method",children:[]},{level:2,title:"String.toClass - ext-method",slug:"string-toclass-ext-method",link:"#string-toclass-ext-method",children:[]},{level:2,title:"String.toClassOrNull - ext-method",slug:"string-toclassornull-ext-method",link:"#string-toclassornull-ext-method",children:[]},{level:2,title:"classOf - method",slug:"classof-method",link:"#classof-method",children:[]},{level:2,title:"String.hasClass - ext-method",slug:"string-hasclass-ext-method",link:"#string-hasclass-ext-method",children:[]},{level:2,title:"Class.hasField - ext-method",slug:"class-hasfield-ext-method",link:"#class-hasfield-ext-method",children:[]},{level:2,title:"Class.hasMethod - ext-method",slug:"class-hasmethod-ext-method",link:"#class-hasmethod-ext-method",children:[]},{level:2,title:"Class.hasConstructor - ext-method",slug:"class-hasconstructor-ext-method",link:"#class-hasconstructor-ext-method",children:[]},{level:2,title:"Member.hasModifiers - ext-method",slug:"member-hasmodifiers-ext-method",link:"#member-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.hasModifiers - ext-method",slug:"class-hasmodifiers-ext-method",link:"#class-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.field - ext-method",slug:"class-field-ext-method",link:"#class-field-ext-method",children:[]},{level:2,title:"Class.method - ext-method",slug:"class-method-ext-method",link:"#class-method-ext-method",children:[]},{level:2,title:"Class.constructor - ext-method",slug:"class-constructor-ext-method",link:"#class-constructor-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method",link:"#class-generic-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method-1",link:"#class-generic-ext-method-1",children:[]},{level:2,title:"Any.current - ext-method",slug:"any-current-ext-method",link:"#any-current-ext-method",children:[]},{level:2,title:"Class.buildOf - ext-method",slug:"class-buildof-ext-method",link:"#class-buildof-ext-method",children:[]},{level:2,title:"Class.allMethods - ext-method",slug:"class-allmethods-ext-method",link:"#class-allmethods-ext-method",children:[]},{level:2,title:"Class.allConstructors - ext-method",slug:"class-allconstructors-ext-method",link:"#class-allconstructors-ext-method",children:[]},{level:2,title:"Class.allFields - ext-method",slug:"class-allfields-ext-method",link:"#class-allfields-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookFactory - kt",headers:[{level:2,title:"IYukiHookXposedInit.configs - ext-method",slug:"iyukihookxposedinit-configs-ext-method",link:"#iyukihookxposedinit-configs-ext-method",children:[]},{level:2,title:"IYukiHookXposedInit.encase - ext-method",slug:"iyukihookxposedinit-encase-ext-method",link:"#iyukihookxposedinit-encase-ext-method",children:[]},{level:2,title:"Context.modulePrefs - ext-field",slug:"context-moduleprefs-ext-field",link:"#context-moduleprefs-ext-field",children:[]},{level:2,title:"Context.modulePrefs - ext-method",slug:"context-moduleprefs-ext-method",link:"#context-moduleprefs-ext-method",children:[]},{level:2,title:"Context.dataChannel - ext-method",slug:"context-datachannel-ext-method",link:"#context-datachannel-ext-method",children:[]},{level:2,title:"Context.processName - ext-field",slug:"context-processname-ext-field",link:"#context-processname-ext-field",children:[]},{level:2,title:"Context+Resources.injectModuleAppResources - ext-method",slug:"context-resources-injectmoduleappresources-ext-method",link:"#context-resources-injectmoduleappresources-ext-method",children:[]},{level:2,title:"Context.registerModuleAppActivities - ext-method",slug:"context-registermoduleappactivities-ext-method",link:"#context-registermoduleappactivities-ext-method",children:[]},{level:2,title:"Context.applyModuleTheme - ext-method",slug:"context-applymoduletheme-ext-method",link:"#context-applymoduletheme-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",pathLocale:"/en/",extraFields:[]},{title:"LoggerFactory - kt",headers:[{level:2,title:"LoggerType - class",slug:"loggertype-class",link:"#loggertype-class",children:[{level:3,title:"LOGD - enum",slug:"logd-enum",link:"#logd-enum",children:[]},{level:3,title:"XPOSED_ENVIRONMENT - enum",slug:"xposed-environment-enum",link:"#xposed-environment-enum",children:[]},{level:3,title:"SCOPE - enum",slug:"scope-enum",link:"#scope-enum",children:[]},{level:3,title:"BOTH - enum",slug:"both-enum",link:"#both-enum",children:[]}]},{level:2,title:"YukiLoggerData - class",slug:"yukiloggerdata-class",link:"#yukiloggerdata-class",children:[]},{level:2,title:"YukiHookLogger - object",slug:"yukihooklogger-object",link:"#yukihooklogger-object",children:[{level:3,title:"inMemoryData - field",slug:"inmemorydata-field",link:"#inmemorydata-field",children:[]},{level:3,title:"contents - field",slug:"contents-field",link:"#contents-field",children:[]},{level:3,title:"contents - method",slug:"contents-method",link:"#contents-method",children:[]},{level:3,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:3,title:"saveToFile - method",slug:"savetofile-method",link:"#savetofile-method",children:[]},{level:3,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[]}]},{level:2,title:"loggerD - method",slug:"loggerd-method",link:"#loggerd-method",children:[]},{level:2,title:"loggerI - method",slug:"loggeri-method",link:"#loggeri-method",children:[]},{level:2,title:"loggerW - method",slug:"loggerw-method",link:"#loggerw-method",children:[]},{level:2,title:"loggerE - method",slug:"loggere-method",link:"#loggere-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",pathLocale:"/en/",extraFields:[]},{title:"HookParam - class",headers:[{level:2,title:"args - field",slug:"args-field",link:"#args-field",children:[]},{level:2,title:"instance - field",slug:"instance-field",link:"#instance-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"member - field",slug:"member-field",link:"#member-field",children:[]},{level:2,title:"method - field",slug:"method-field",link:"#method-field",children:[]},{level:2,title:"constructor - field",slug:"constructor-field",link:"#constructor-field",children:[]},{level:2,title:"result - field",slug:"result-field",link:"#result-field",children:[]},{level:2,title:"dataExtra - field",slug:"dataextra-field",link:"#dataextra-field",children:[]},{level:2,title:"hasThrowable - field",slug:"hasthrowable-field",link:"#hasthrowable-field",children:[]},{level:2,title:"throwable - field",slug:"throwable-field",link:"#throwable-field",children:[]},{level:2,title:"Throwable.throwToApp - i-ext-method",slug:"throwable-throwtoapp-i-ext-method",link:"#throwable-throwtoapp-i-ext-method",children:[]},{level:2,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:2,title:"instance - method",slug:"instance-method",link:"#instance-method",children:[]},{level:2,title:"args - method",slug:"args-method",link:"#args-method",children:[]},{level:2,title:"args - method",slug:"args-method-1",link:"#args-method-1",children:[]},{level:2,title:"callOriginal - method",slug:"calloriginal-method",link:"#calloriginal-method",children:[]},{level:2,title:"invokeOriginal - method",slug:"invokeoriginal-method",link:"#invokeoriginal-method",children:[]},{level:2,title:"resultTrue - method",slug:"resulttrue-method",link:"#resulttrue-method",children:[]},{level:2,title:"resultFalse - method",slug:"resultfalse-method",link:"#resultfalse-method",children:[]},{level:2,title:"resultNull - method",slug:"resultnull-method",link:"#resultnull-method",children:[]},{level:2,title:"ArgsIndexCondition - class",slug:"argsindexcondition-class",link:"#argsindexcondition-class",children:[{level:3,title:"first - method",slug:"first-method",link:"#first-method",children:[]},{level:3,title:"last - method",slug:"last-method",link:"#last-method",children:[]}]},{level:2,title:"ArgsModifyer - class",slug:"argsmodifyer-class",link:"#argsmodifyer-class",children:[{level:3,title:"cast - method",slug:"cast-method",link:"#cast-method",children:[]},{level:3,title:"byte - method",slug:"byte-method",link:"#byte-method",children:[]},{level:3,title:"int - method",slug:"int-method",link:"#int-method",children:[]},{level:3,title:"long - method",slug:"long-method",link:"#long-method",children:[]},{level:3,title:"short - method",slug:"short-method",link:"#short-method",children:[]},{level:3,title:"double - method",slug:"double-method",link:"#double-method",children:[]},{level:3,title:"float - method",slug:"float-method",link:"#float-method",children:[]},{level:3,title:"string - method",slug:"string-method",link:"#string-method",children:[]},{level:3,title:"char - method",slug:"char-method",link:"#char-method",children:[]},{level:3,title:"boolean - method",slug:"boolean-method",link:"#boolean-method",children:[]},{level:3,title:"any - method",slug:"any-method",link:"#any-method",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]},{level:3,title:"set - method",slug:"set-method",link:"#set-method",children:[]},{level:3,title:"setNull - method",slug:"setnull-method",link:"#setnull-method",children:[]},{level:3,title:"setTrue - method",slug:"settrue-method",link:"#settrue-method",children:[]},{level:3,title:"setFalse - method",slug:"setfalse-method",link:"#setfalse-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",pathLocale:"/en/",extraFields:[]},{title:"PackageParam - class",headers:[{level:2,title:"appClassLoader - field",slug:"appclassloader-field",link:"#appclassloader-field",children:[]},{level:2,title:"appInfo - field",slug:"appinfo-field",link:"#appinfo-field",children:[]},{level:2,title:"appUserId - field",slug:"appuserid-field",link:"#appuserid-field",children:[]},{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]},{level:2,title:"appResources - field",slug:"appresources-field",link:"#appresources-field",children:[]},{level:2,title:"systemContext - field",slug:"systemcontext-field",link:"#systemcontext-field",children:[]},{level:2,title:"processName - field",slug:"processname-field",link:"#processname-field",children:[]},{level:2,title:"packageName - field",slug:"packagename-field",link:"#packagename-field",children:[]},{level:2,title:"isFirstApplication - field",slug:"isfirstapplication-field",link:"#isfirstapplication-field",children:[]},{level:2,title:"mainProcessName - field",slug:"mainprocessname-field",link:"#mainprocessname-field",children:[]},{level:2,title:"moduleAppFilePath - field",slug:"moduleappfilepath-field",link:"#moduleappfilepath-field",children:[]},{level:2,title:"moduleAppResources - field",slug:"moduleappresources-field",link:"#moduleappresources-field",children:[]},{level:2,title:"prefs - field",slug:"prefs-field",link:"#prefs-field",children:[]},{level:2,title:"prefs - method",slug:"prefs-method",link:"#prefs-method",children:[]},{level:2,title:"dataChannel - field",slug:"datachannel-field",link:"#datachannel-field",children:[]},{level:2,title:"resources - method",slug:"resources-method",link:"#resources-method",children:[]},{level:2,title:"refreshModuleAppResources - method",slug:"refreshmoduleappresources-method",link:"#refreshmoduleappresources-method",children:[]},{level:2,title:"onAppLifecycle - method",slug:"onapplifecycle-method",link:"#onapplifecycle-method",children:[]},{level:2,title:"loadApp - method",slug:"loadapp-method",link:"#loadapp-method",children:[]},{level:2,title:"loadZygote - method",slug:"loadzygote-method",link:"#loadzygote-method",children:[]},{level:2,title:"loadSystem - method",slug:"loadsystem-method",link:"#loadsystem-method",children:[]},{level:2,title:"withProcess - method",slug:"withprocess-method",link:"#withprocess-method",children:[]},{level:2,title:"loadHooker - method",slug:"loadhooker-method",link:"#loadhooker-method",children:[]},{level:2,title:"searchClass - method",slug:"searchclass-method",link:"#searchclass-method",children:[]},{level:2,title:"String+VariousClass.toClass - i-ext-method",slug:"string-variousclass-toclass-i-ext-method",link:"#string-variousclass-toclass-i-ext-method",children:[]},{level:2,title:"String+VariousClass.toClassOrNull - i-ext-method",slug:"string-variousclass-toclassornull-i-ext-method",link:"#string-variousclass-toclassornull-i-ext-method",children:[]},{level:2,title:"String.hasClass - i-ext-method",slug:"string-hasclass-i-ext-method",link:"#string-hasclass-i-ext-method",children:[]},{level:2,title:"findClass - method",slug:"findclass-method",link:"#findclass-method",children:[]},{level:2,title:"String+Class+VariousClass+HookClass.hook - i-ext-method",slug:"string-class-variousclass-hookclass-hook-i-ext-method",link:"#string-class-variousclass-hookclass-hook-i-ext-method",children:[]},{level:2,title:"HookResources.hook - i-ext-method",slug:"hookresources-hook-i-ext-method",link:"#hookresources-hook-i-ext-method",children:[]},{level:2,title:"AppLifecycle - class",slug:"applifecycle-class",link:"#applifecycle-class",children:[{level:3,title:"attachBaseContext - method",slug:"attachbasecontext-method",link:"#attachbasecontext-method",children:[]},{level:3,title:"onCreate - method",slug:"oncreate-method",link:"#oncreate-method",children:[]},{level:3,title:"onTerminate - method",slug:"onterminate-method",link:"#onterminate-method",children:[]},{level:3,title:"onLowMemory - method",slug:"onlowmemory-method",link:"#onlowmemory-method",children:[]},{level:3,title:"onTrimMemory - method",slug:"ontrimmemory-method",link:"#ontrimmemory-method",children:[]},{level:3,title:"onConfigurationChanged - method",slug:"onconfigurationchanged-method",link:"#onconfigurationchanged-method",children:[]},{level:3,title:"registerReceiver - method",slug:"registerreceiver-method",link:"#registerreceiver-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",pathLocale:"/en/",extraFields:[]},{title:"ComponentTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"GraphicsTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ViewTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"DefinedTypeFactory - kt",headers:[{level:2,title:"VagueType - field",slug:"vaguetype-field",link:"#vaguetype-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"VariableTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleApplication - class",headers:[{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookDataChannel - class",headers:[{level:2,title:"NameSpace - class",slug:"namespace-class",link:"#namespace-class",children:[{level:3,title:"with - method",slug:"with-method",link:"#with-method",children:[]},{level:3,title:"allowSendTooLargeData - method",slug:"allowsendtoolargedata-method",link:"#allowsendtoolargedata-method",children:[]},{level:3,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:3,title:"put - method",slug:"put-method-1",link:"#put-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"wait - method",slug:"wait-method-1",link:"#wait-method-1",children:[]},{level:3,title:"checkingVersionEquals - method",slug:"checkingversionequals-method",link:"#checkingversionequals-method",children:[]},{level:3,title:"obtainLoggerInMemoryData - method",slug:"obtainloggerinmemorydata-method",link:"#obtainloggerinmemorydata-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookModulePrefs - class",headers:[{level:2,title:"isPreferencesAvailable - field",slug:"ispreferencesavailable-field",link:"#ispreferencesavailable-field",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"direct - method",slug:"direct-method",link:"#direct-method",children:[]},{level:2,title:"getString - method",slug:"getstring-method",link:"#getstring-method",children:[]},{level:2,title:"getStringSet - method",slug:"getstringset-method",link:"#getstringset-method",children:[]},{level:2,title:"getBoolean - method",slug:"getboolean-method",link:"#getboolean-method",children:[]},{level:2,title:"getInt - method",slug:"getint-method",link:"#getint-method",children:[]},{level:2,title:"getLong - method",slug:"getlong-method",link:"#getlong-method",children:[]},{level:2,title:"getFloat - method",slug:"getfloat-method",link:"#getfloat-method",children:[]},{level:2,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:2,title:"remove - method",slug:"remove-method",link:"#remove-method",children:[]},{level:2,title:"remove - method",slug:"remove-method-1",link:"#remove-method-1",children:[]},{level:2,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:2,title:"putString - method",slug:"putstring-method",link:"#putstring-method",children:[]},{level:2,title:"putStringSet - method",slug:"putstringset-method",link:"#putstringset-method",children:[]},{level:2,title:"putBoolean - method",slug:"putboolean-method",link:"#putboolean-method",children:[]},{level:2,title:"putInt - method",slug:"putint-method",link:"#putint-method",children:[]},{level:2,title:"putLong - method",slug:"putlong-method",link:"#putlong-method",children:[]},{level:2,title:"putFloat - method",slug:"putfloat-method",link:"#putfloat-method",children:[]},{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:2,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"IYukiHookXposedInit - interface",headers:[{level:2,title:"onInit - method",slug:"oninit-method",link:"#oninit-method",children:[]},{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]},{level:2,title:"onXposedEvent - method",slug:"onxposedevent-method",link:"#onxposedevent-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ComponentTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"GraphicsTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"ViewTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"DefinedTypeFactory - kt",headers:[{level:2,title:"VagueType - field",slug:"vaguetype-field",link:"#vaguetype-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"VariableTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleApplication - class",headers:[{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookDataChannel - class",headers:[{level:2,title:"NameSpace - class",slug:"namespace-class",link:"#namespace-class",children:[{level:3,title:"with - method",slug:"with-method",link:"#with-method",children:[]},{level:3,title:"allowSendTooLargeData - method",slug:"allowsendtoolargedata-method",link:"#allowsendtoolargedata-method",children:[]},{level:3,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:3,title:"put - method",slug:"put-method-1",link:"#put-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"wait - method",slug:"wait-method-1",link:"#wait-method-1",children:[]},{level:3,title:"checkingVersionEquals - method",slug:"checkingversionequals-method",link:"#checkingversionequals-method",children:[]},{level:3,title:"obtainLoggerInMemoryData - method",slug:"obtainloggerinmemorydata-method",link:"#obtainloggerinmemorydata-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookModulePrefs - class",headers:[{level:2,title:"isPreferencesAvailable - field",slug:"ispreferencesavailable-field",link:"#ispreferencesavailable-field",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"direct - method",slug:"direct-method",link:"#direct-method",children:[]},{level:2,title:"getString - method",slug:"getstring-method",link:"#getstring-method",children:[]},{level:2,title:"getStringSet - method",slug:"getstringset-method",link:"#getstringset-method",children:[]},{level:2,title:"getBoolean - method",slug:"getboolean-method",link:"#getboolean-method",children:[]},{level:2,title:"getInt - method",slug:"getint-method",link:"#getint-method",children:[]},{level:2,title:"getLong - method",slug:"getlong-method",link:"#getlong-method",children:[]},{level:2,title:"getFloat - method",slug:"getfloat-method",link:"#getfloat-method",children:[]},{level:2,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:2,title:"remove - method",slug:"remove-method",link:"#remove-method",children:[]},{level:2,title:"remove - method",slug:"remove-method-1",link:"#remove-method-1",children:[]},{level:2,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:2,title:"putString - method",slug:"putstring-method",link:"#putstring-method",children:[]},{level:2,title:"putStringSet - method",slug:"putstringset-method",link:"#putstringset-method",children:[]},{level:2,title:"putBoolean - method",slug:"putboolean-method",link:"#putboolean-method",children:[]},{level:2,title:"putInt - method",slug:"putint-method",link:"#putint-method",children:[]},{level:2,title:"putLong - method",slug:"putlong-method",link:"#putlong-method",children:[]},{level:2,title:"putFloat - method",slug:"putfloat-method",link:"#putfloat-method",children:[]},{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:2,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",pathLocale:"/en/",extraFields:[]},{title:"IYukiHookXposedInit - interface",headers:[{level:2,title:"onInit - method",slug:"oninit-method",link:"#oninit-method",children:[]},{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]},{level:2,title:"onXposedEvent - method",slug:"onxposedevent-method",link:"#onxposedevent-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",pathLocale:"/en/",extraFields:[]},{title:"BaseFinder - class",headers:[{level:2,title:"BaseFinder.IndexTypeCondition - class",slug:"basefinder-indextypecondition-class",link:"#basefinder-indextypecondition-class",children:[{level:3,title:"index - method",slug:"index-method",link:"#index-method",children:[]},{level:3,title:"index - method",slug:"index-method-1",link:"#index-method-1",children:[]},{level:3,title:"IndexTypeConditionSort - class",slug:"indextypeconditionsort-class",link:"#indextypeconditionsort-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"DexClassFinder - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}]},{level:2,title:"fullName - field",slug:"fullname-field",link:"#fullname-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"singleName - field",slug:"singlename-field",link:"#singlename-field",children:[]},{level:2,title:"from - method",slug:"from-method",link:"#from-method",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method",link:"#fullname-method",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method",link:"#simplename-method",children:[]},{level:2,title:"singleName - method",slug:"singlename-method",link:"#singlename-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method-1",link:"#fullname-method-1",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method-1",link:"#simplename-method-1",children:[]},{level:2,title:"singleName - method",slug:"singlename-method-1",link:"#singlename-method-1",children:[]},{level:2,title:"extends - method",slug:"extends-method",link:"#extends-method",children:[]},{level:2,title:"extends - method",slug:"extends-method-1",link:"#extends-method-1",children:[]},{level:2,title:"implements - method",slug:"implements-method",link:"#implements-method",children:[]},{level:2,title:"implements - method",slug:"implements-method-1",link:"#implements-method-1",children:[]},{level:2,title:"anonymous - method",slug:"anonymous-method",link:"#anonymous-method",children:[]},{level:2,title:"noExtends - method",slug:"noextends-method",link:"#noextends-method",children:[]},{level:2,title:"noImplements - method",slug:"noimplements-method",link:"#noimplements-method",children:[]},{level:2,title:"noSuper - method",slug:"nosuper-method",link:"#nosuper-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method",link:"#enclosing-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method-1",link:"#enclosing-method-1",children:[]},{level:2,title:"FromPackageRules - class",slug:"frompackagerules-class",link:"#frompackagerules-class",children:[{level:3,title:"absolute - method",slug:"absolute-method",link:"#absolute-method",children:[]}]},{level:2,title:"ClassNameRules - class",slug:"classnamerules-class",link:"#classnamerules-class",children:[{level:3,title:"optional - method",slug:"optional-method",link:"#optional-method",children:[]}]},{level:2,title:"member - method",slug:"member-method",link:"#member-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:2,title:"Result - class",slug:"result-class",link:"#result-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"onNoClassDefFoundError - method",slug:"onnoclassdeffounderror-method",link:"#onnoclassdeffounderror-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ConstructorFinder - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method",link:"#onnosuchconstructor-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method-1",link:"#onnosuchconstructor-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"FieldFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]},{level:2,title:"type - method",slug:"type-method-1",link:"#type-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchField - method",slug:"onnosuchfield-method",link:"#onnosuchfield-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MethodFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]},{level:2,title:"returnType - method",slug:"returntype-method-1",link:"#returntype-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method",link:"#onnosuchmethod-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method-1",link:"#onnosuchmethod-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiModuleResources - class",headers:[{level:2,title:"fwd - method",slug:"fwd-method",link:"#fwd-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResForwarder - class",headers:[{level:2,title:"id - field",slug:"id-field",link:"#id-field",children:[]},{level:2,title:"resources - field",slug:"resources-field",link:"#resources-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResources - class",headers:[{level:2,title:"LayoutInflatedParam - class",slug:"layoutinflatedparam-class",link:"#layoutinflatedparam-class",children:[{level:3,title:"variantName - field",slug:"variantname-field",link:"#variantname-field",children:[]},{level:3,title:"currentView - field",slug:"currentview-field",link:"#currentview-field",children:[]},{level:3,title:"findViewByIdentifier - method",slug:"findviewbyidentifier-method",link:"#findviewbyidentifier-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiXposedEvent - object",headers:[{level:2,title:"events - method",slug:"events-method",link:"#events-method",children:[]},{level:2,title:"onInitZygote - method",slug:"oninitzygote-method",link:"#oninitzygote-method",children:[]},{level:2,title:"onHandleLoadPackage - method",slug:"onhandleloadpackage-method",link:"#onhandleloadpackage-method",children:[]},{level:2,title:"onHandleInitPackageResources - method",slug:"onhandleinitpackageresources-method",link:"#onhandleinitpackageresources-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ChannelData - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ChannelPriority - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleClassLoader - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"excludeHostClasses - method",slug:"excludehostclasses-method",link:"#excludehostclasses-method",children:[]},{level:3,title:"excludeModuleClasses - method",slug:"excludemoduleclasses-method",link:"#excludemoduleclasses-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"PrefsData - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModulePreferenceFragment - class",headers:[{level:2,title:"onCreatePreferencesInModuleApp - method",slug:"oncreatepreferencesinmoduleapp-method",link:"#oncreatepreferencesinmoduleapp-method",children:[]},{level:2,title:"onSharedPreferenceChanged - method",slug:"onsharedpreferencechanged-method",link:"#onsharedpreferencechanged-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"BaseFinder - class",headers:[{level:2,title:"BaseFinder.IndexTypeCondition - class",slug:"basefinder-indextypecondition-class",link:"#basefinder-indextypecondition-class",children:[{level:3,title:"index - method",slug:"index-method",link:"#index-method",children:[]},{level:3,title:"index - method",slug:"index-method-1",link:"#index-method-1",children:[]},{level:3,title:"IndexTypeConditionSort - class",slug:"indextypeconditionsort-class",link:"#indextypeconditionsort-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",pathLocale:"/en/",extraFields:[]},{title:"DexClassFinder - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}]},{level:2,title:"fullName - field",slug:"fullname-field",link:"#fullname-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"singleName - field",slug:"singlename-field",link:"#singlename-field",children:[]},{level:2,title:"from - method",slug:"from-method",link:"#from-method",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method",link:"#fullname-method",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method",link:"#simplename-method",children:[]},{level:2,title:"singleName - method",slug:"singlename-method",link:"#singlename-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method-1",link:"#fullname-method-1",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method-1",link:"#simplename-method-1",children:[]},{level:2,title:"singleName - method",slug:"singlename-method-1",link:"#singlename-method-1",children:[]},{level:2,title:"extends - method",slug:"extends-method",link:"#extends-method",children:[]},{level:2,title:"extends - method",slug:"extends-method-1",link:"#extends-method-1",children:[]},{level:2,title:"implements - method",slug:"implements-method",link:"#implements-method",children:[]},{level:2,title:"implements - method",slug:"implements-method-1",link:"#implements-method-1",children:[]},{level:2,title:"anonymous - method",slug:"anonymous-method",link:"#anonymous-method",children:[]},{level:2,title:"noExtends - method",slug:"noextends-method",link:"#noextends-method",children:[]},{level:2,title:"noImplements - method",slug:"noimplements-method",link:"#noimplements-method",children:[]},{level:2,title:"noSuper - method",slug:"nosuper-method",link:"#nosuper-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method",link:"#enclosing-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method-1",link:"#enclosing-method-1",children:[]},{level:2,title:"FromPackageRules - class",slug:"frompackagerules-class",link:"#frompackagerules-class",children:[{level:3,title:"absolute - method",slug:"absolute-method",link:"#absolute-method",children:[]}]},{level:2,title:"ClassNameRules - class",slug:"classnamerules-class",link:"#classnamerules-class",children:[{level:3,title:"optional - method",slug:"optional-method",link:"#optional-method",children:[]}]},{level:2,title:"member - method",slug:"member-method",link:"#member-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:2,title:"Result - class",slug:"result-class",link:"#result-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"onNoClassDefFoundError - method",slug:"onnoclassdeffounderror-method",link:"#onnoclassdeffounderror-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",pathLocale:"/en/",extraFields:[]},{title:"ConstructorFinder - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method",link:"#onnosuchconstructor-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method-1",link:"#onnosuchconstructor-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",pathLocale:"/en/",extraFields:[]},{title:"FieldFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]},{level:2,title:"type - method",slug:"type-method-1",link:"#type-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchField - method",slug:"onnosuchfield-method",link:"#onnosuchfield-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",pathLocale:"/en/",extraFields:[]},{title:"MethodFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]},{level:2,title:"returnType - method",slug:"returntype-method-1",link:"#returntype-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method",link:"#onnosuchmethod-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method-1",link:"#onnosuchmethod-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",pathLocale:"/en/",extraFields:[]},{title:"YukiModuleResources - class",headers:[{level:2,title:"fwd - method",slug:"fwd-method",link:"#fwd-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResForwarder - class",headers:[{level:2,title:"id - field",slug:"id-field",link:"#id-field",children:[]},{level:2,title:"resources - field",slug:"resources-field",link:"#resources-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResources - class",headers:[{level:2,title:"LayoutInflatedParam - class",slug:"layoutinflatedparam-class",link:"#layoutinflatedparam-class",children:[{level:3,title:"variantName - field",slug:"variantname-field",link:"#variantname-field",children:[]},{level:3,title:"currentView - field",slug:"currentview-field",link:"#currentview-field",children:[]},{level:3,title:"findViewByIdentifier - method",slug:"findviewbyidentifier-method",link:"#findviewbyidentifier-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",pathLocale:"/en/",extraFields:[]},{title:"YukiXposedEvent - object",headers:[{level:2,title:"events - method",slug:"events-method",link:"#events-method",children:[]},{level:2,title:"onInitZygote - method",slug:"oninitzygote-method",link:"#oninitzygote-method",children:[]},{level:2,title:"onHandleLoadPackage - method",slug:"onhandleloadpackage-method",link:"#onhandleloadpackage-method",children:[]},{level:2,title:"onHandleInitPackageResources - method",slug:"onhandleinitpackageresources-method",link:"#onhandleinitpackageresources-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",pathLocale:"/en/",extraFields:[]},{title:"ChannelData - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",pathLocale:"/en/",extraFields:[]},{title:"ChannelPriority - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleClassLoader - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"excludeHostClasses - method",slug:"excludehostclasses-method",link:"#excludehostclasses-method",children:[]},{level:3,title:"excludeModuleClasses - method",slug:"excludemoduleclasses-method",link:"#excludemoduleclasses-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",pathLocale:"/en/",extraFields:[]},{title:"PrefsData - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",pathLocale:"/en/",extraFields:[]},{title:"ModulePreferenceFragment - class",headers:[{level:2,title:"onCreatePreferencesInModuleApp - method",slug:"oncreatepreferencesinmoduleapp-method",link:"#oncreatepreferencesinmoduleapp-method",children:[]},{level:2,title:"onSharedPreferenceChanged - method",slug:"onsharedpreferencechanged-method",link:"#onsharedpreferencechanged-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",pathLocale:"/en/",extraFields:[]},{title:"CountRules - class",headers:[{level:2,title:"Int.isZero - i-ext-method",slug:"int-iszero-i-ext-method",link:"#int-iszero-i-ext-method",children:[]},{level:2,title:"Int.moreThan - i-ext-method",slug:"int-morethan-i-ext-method",link:"#int-morethan-i-ext-method",children:[]},{level:2,title:"Int.lessThan - i-ext-method",slug:"int-lessthan-i-ext-method",link:"#int-lessthan-i-ext-method",children:[]},{level:2,title:"Int.inInterval - i-ext-method",slug:"int-ininterval-i-ext-method",link:"#int-ininterval-i-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModifierRules - class",headers:[{level:2,title:"isPublic - i-ext-field",slug:"ispublic-i-ext-field",link:"#ispublic-i-ext-field",children:[]},{level:2,title:"isPrivate - i-ext-field",slug:"isprivate-i-ext-field",link:"#isprivate-i-ext-field",children:[]},{level:2,title:"isProtected - i-ext-field",slug:"isprotected-i-ext-field",link:"#isprotected-i-ext-field",children:[]},{level:2,title:"isStatic - i-ext-field",slug:"isstatic-i-ext-field",link:"#isstatic-i-ext-field",children:[]},{level:2,title:"isFinal - i-ext-field",slug:"isfinal-i-ext-field",link:"#isfinal-i-ext-field",children:[]},{level:2,title:"isSynchronized - i-ext-field",slug:"issynchronized-i-ext-field",link:"#issynchronized-i-ext-field",children:[]},{level:2,title:"isVolatile - i-ext-field",slug:"isvolatile-i-ext-field",link:"#isvolatile-i-ext-field",children:[]},{level:2,title:"isTransient - i-ext-field",slug:"istransient-i-ext-field",link:"#istransient-i-ext-field",children:[]},{level:2,title:"isNative - i-ext-field",slug:"isnative-i-ext-field",link:"#isnative-i-ext-field",children:[]},{level:2,title:"isInterface - i-ext-field",slug:"isinterface-i-ext-field",link:"#isinterface-i-ext-field",children:[]},{level:2,title:"isAbstract - i-ext-field",slug:"isabstract-i-ext-field",link:"#isabstract-i-ext-field",children:[]},{level:2,title:"isStrict - i-ext-field",slug:"isstrict-i-ext-field",link:"#isstrict-i-ext-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"NameRules - class",headers:[{level:2,title:"String.isSynthetic - i-ext-method",slug:"string-issynthetic-i-ext-method",link:"#string-issynthetic-i-ext-method",children:[]},{level:2,title:"String.isOnlySymbols - i-ext-method",slug:"string-isonlysymbols-i-ext-method",link:"#string-isonlysymbols-i-ext-method",children:[]},{level:2,title:"String.isOnlyLetters - i-ext-method",slug:"string-isonlyletters-i-ext-method",link:"#string-isonlyletters-i-ext-method",children:[]},{level:2,title:"String.isOnlyNumbers - i-ext-method",slug:"string-isonlynumbers-i-ext-method",link:"#string-isonlynumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLettersNumbers - i-ext-method",slug:"string-isonlylettersnumbers-i-ext-method",link:"#string-isonlylettersnumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLowercase - i-ext-method",slug:"string-isonlylowercase-i-ext-method",link:"#string-isonlylowercase-i-ext-method",children:[]},{level:2,title:"String.isOnlyUppercase - i-ext-method",slug:"string-isonlyuppercase-i-ext-method",link:"#string-isonlyuppercase-i-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ObjectRules - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ConstructorRules - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"FieldRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MemberRules - class",headers:[{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MethodRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleAppActivity - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleAppCompatActivity - class",headers:[{level:2,title:"moduleTheme - field",slug:"moduletheme-field",link:"#moduletheme-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleContextThemeWrapper - class",headers:[{level:2,title:"applyConfiguration - method",slug:"applyconfiguration-method",link:"#applyconfiguration-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"CountRules - class",headers:[{level:2,title:"Int.isZero - i-ext-method",slug:"int-iszero-i-ext-method",link:"#int-iszero-i-ext-method",children:[]},{level:2,title:"Int.moreThan - i-ext-method",slug:"int-morethan-i-ext-method",link:"#int-morethan-i-ext-method",children:[]},{level:2,title:"Int.lessThan - i-ext-method",slug:"int-lessthan-i-ext-method",link:"#int-lessthan-i-ext-method",children:[]},{level:2,title:"Int.inInterval - i-ext-method",slug:"int-ininterval-i-ext-method",link:"#int-ininterval-i-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",pathLocale:"/en/",extraFields:[]},{title:"ModifierRules - class",headers:[{level:2,title:"isPublic - i-ext-field",slug:"ispublic-i-ext-field",link:"#ispublic-i-ext-field",children:[]},{level:2,title:"isPrivate - i-ext-field",slug:"isprivate-i-ext-field",link:"#isprivate-i-ext-field",children:[]},{level:2,title:"isProtected - i-ext-field",slug:"isprotected-i-ext-field",link:"#isprotected-i-ext-field",children:[]},{level:2,title:"isStatic - i-ext-field",slug:"isstatic-i-ext-field",link:"#isstatic-i-ext-field",children:[]},{level:2,title:"isFinal - i-ext-field",slug:"isfinal-i-ext-field",link:"#isfinal-i-ext-field",children:[]},{level:2,title:"isSynchronized - i-ext-field",slug:"issynchronized-i-ext-field",link:"#issynchronized-i-ext-field",children:[]},{level:2,title:"isVolatile - i-ext-field",slug:"isvolatile-i-ext-field",link:"#isvolatile-i-ext-field",children:[]},{level:2,title:"isTransient - i-ext-field",slug:"istransient-i-ext-field",link:"#istransient-i-ext-field",children:[]},{level:2,title:"isNative - i-ext-field",slug:"isnative-i-ext-field",link:"#isnative-i-ext-field",children:[]},{level:2,title:"isInterface - i-ext-field",slug:"isinterface-i-ext-field",link:"#isinterface-i-ext-field",children:[]},{level:2,title:"isAbstract - i-ext-field",slug:"isabstract-i-ext-field",link:"#isabstract-i-ext-field",children:[]},{level:2,title:"isStrict - i-ext-field",slug:"isstrict-i-ext-field",link:"#isstrict-i-ext-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",pathLocale:"/en/",extraFields:[]},{title:"NameRules - class",headers:[{level:2,title:"String.isSynthetic - i-ext-method",slug:"string-issynthetic-i-ext-method",link:"#string-issynthetic-i-ext-method",children:[]},{level:2,title:"String.isOnlySymbols - i-ext-method",slug:"string-isonlysymbols-i-ext-method",link:"#string-isonlysymbols-i-ext-method",children:[]},{level:2,title:"String.isOnlyLetters - i-ext-method",slug:"string-isonlyletters-i-ext-method",link:"#string-isonlyletters-i-ext-method",children:[]},{level:2,title:"String.isOnlyNumbers - i-ext-method",slug:"string-isonlynumbers-i-ext-method",link:"#string-isonlynumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLettersNumbers - i-ext-method",slug:"string-isonlylettersnumbers-i-ext-method",link:"#string-isonlylettersnumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLowercase - i-ext-method",slug:"string-isonlylowercase-i-ext-method",link:"#string-isonlylowercase-i-ext-method",children:[]},{level:2,title:"String.isOnlyUppercase - i-ext-method",slug:"string-isonlyuppercase-i-ext-method",link:"#string-isonlyuppercase-i-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",pathLocale:"/en/",extraFields:[]},{title:"ObjectRules - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html",pathLocale:"/en/",extraFields:[]},{title:"ConstructorRules - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",pathLocale:"/en/",extraFields:[]},{title:"FieldRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",pathLocale:"/en/",extraFields:[]},{title:"MemberRules - class",headers:[{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",pathLocale:"/en/",extraFields:[]},{title:"MethodRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"param - method",slug:"param-method-1",link:"#param-method-1",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleAppActivity - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleAppCompatActivity - class",headers:[{level:2,title:"moduleTheme - field",slug:"moduletheme-field",link:"#moduletheme-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleContextThemeWrapper - class",headers:[{level:2,title:"applyConfiguration - method",slug:"applyconfiguration-method",link:"#applyconfiguration-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",pathLocale:"/en/",extraFields:[]},{title:"MemberRulesResult - class",headers:[{level:2,title:"none - method",slug:"none-method",link:"#none-method",children:[]},{level:2,title:"count - method",slug:"count-method",link:"#count-method",children:[]},{level:2,title:"count - method",slug:"count-method-1",link:"#count-method-1",children:[]},{level:2,title:"count - method",slug:"count-method-2",link:"#count-method-2",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MemberRulesResult - class",headers:[{level:2,title:"none - method",slug:"none-method",link:"#none-method",children:[]},{level:2,title:"count - method",slug:"count-method",link:"#count-method",children:[]},{level:2,title:"count - method",slug:"count-method-1",link:"#count-method-1",children:[]},{level:2,title:"count - method",slug:"count-method-2",link:"#count-method-2",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",pathLocale:"/en/",extraFields:[]},{title:"",headers:[],path:"/404.html",pathLocale:"/",extraFields:[]}],Br=ye(hf),df=()=>Br;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateSearchIndex=e=>{Br.value=e});const uf=({searchIndex:e,routeLocale:t,query:l,maxSuggestions:i})=>{const o=Y(()=>e.value.filter(n=>n.pathLocale===t.value));return Y(()=>{const n=l.value.trim().toLowerCase();if(!n)return[];const a=[],r=(s,c)=>{sa(n,[c.title])&&a.push({link:`${s.path}#${c.slug}`,title:s.title,header:c.title});for(const h of c.children){if(a.length>=i.value)return;r(s,h)}};for(const s of o.value){if(a.length>=i.value)break;if(sa(n,[s.title,...s.extraFields])){a.push({link:s.path,title:s.title});continue}for(const c of s.headers){if(a.length>=i.value)break;r(s,c)}}return a})},pf=e=>{const t=ye(0);return{focusIndex:t,focusNext:()=>{t.value{t.value>0?t.value-=1:t.value=e.value.length-1}}},mf=ue({name:"SearchBox",props:{locales:{type:Object,required:!1,default:()=>({})},hotKeys:{type:Array,required:!1,default:()=>[]},maxSuggestions:{type:Number,required:!1,default:5}},setup(e){const{locales:t,hotKeys:l,maxSuggestions:i}=Ei(e),o=Zt(),n=Wl(),a=df(),r=ye(null),s=ye(!1),c=ye(""),h=Y(()=>{var L;return(L=t.value[n.value])!=null?L:{}}),p=uf({searchIndex:a,routeLocale:n,query:c,maxSuggestions:i}),{focusIndex:m,focusNext:g,focusPrev:x}=pf(p);cf({input:r,hotKeys:l});const P=Y(()=>s.value&&!!p.value.length),E=()=>{!P.value||x()},k=()=>{!P.value||g()},_=L=>{if(!P.value)return;const H=p.value[L];!H||o.push(H.link).then(()=>{c.value="",m.value=0})};return()=>he("form",{class:"search-box",role:"search"},[he("input",{ref:r,type:"search",placeholder:h.value.placeholder,autocomplete:"off",spellcheck:!1,value:c.value,onFocus:()=>s.value=!0,onBlur:()=>s.value=!1,onInput:L=>c.value=L.target.value,onKeydown:L=>{switch(L.key){case"ArrowUp":{E();break}case"ArrowDown":{k();break}case"Enter":{L.preventDefault(),_(m.value);break}}}}),P.value&&he("ul",{class:"suggestions",onMouseleave:()=>m.value=-1},p.value.map(({link:L,title:H,header:U},ee)=>he("li",{class:["suggestion",{focus:m.value===ee}],onMouseenter:()=>m.value=ee,onMousedown:()=>_(ee)},he("a",{href:L,onClick:w=>w.preventDefault()},[he("span",{class:"page-title"},H),U&&he("span",{class:"page-header"},`> ${U}`)]))))])}});const ff={"/en/":{placeholder:"Search"},"/zh-cn/":{placeholder:"\u641C\u7D22"}},gf=["s","/"],kf=5,vf=Ht({enhance({app:e}){e.component("SearchBox",t=>he(mf,{locales:ff,hotKeys:gf,maxSuggestions:kf,...t}))}}),oi=[Nd,Yd,Xd,nu,cu,mu,nf,vf];var Ur=ye(es),Wr=Co({key:"",path:"",title:"",lang:"",frontmatter:{},excerpt:"",headers:[]}),gt=ye(Wr),Ot=()=>gt;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updatePageData=e=>{Ur.value[e.key]=()=>Promise.resolve(e),e.key===gt.value.key&&(gt.value=e)});var Xr=Symbol(""),vt=()=>{const e=Me(Xr);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},qr=Symbol(""),bf=()=>{const e=Me(qr);if(!e)throw new Error("usePageHead() is called without provider.");return e},_f=Symbol(""),Kr=Symbol(""),yf=()=>{const e=Me(Kr);if(!e)throw new Error("usePageLang() is called without provider.");return e},No=Symbol(""),Wl=()=>{const e=Me(No);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},At=ye(Th),Gr=()=>At;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateSiteData=e=>{At.value=e});var Qr=Symbol(""),jo=()=>{const e=Me(Qr);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},xf=Symbol(""),Ut=gl({resolvePageData:async e=>{const t=Ur.value[e],l=await(t==null?void 0:t());return l!=null?l:Wr},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,l)=>{const i=be(t.description)?t.description:l.description,o=[...te(t.head)?t.head:[],...l.head,["title",{},e],["meta",{name:"description",content:i}]];return Ih(o)},resolvePageHeadTitle:(e,t)=>`${e.title?`${e.title} | `:""}${t.title}`,resolvePageLang:e=>e.lang||"en",resolveRouteLocale:(e,t)=>pr(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),$o=ue({name:"ClientOnly",setup(e,t){const l=ye(!1);return Je(()=>{l.value=!0}),()=>{var i,o;return l.value?(o=(i=t.slots).default)==null?void 0:o.call(i):null}}}),Ef=ue({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=Ot(),l=Y(()=>mr[e.pageKey||t.value.key]);return()=>l.value?he(l.value):he("div","404 Not Found")}}),Cf="Layout",Rf="NotFound",Pf=oi.reduce((e,t)=>({...e,...t.layouts}),{}),ca=ue({name:"Vuepress",setup(){const e=Ot(),t=Y(()=>{let l;if(e.value.path){const i=e.value.frontmatter.layout;be(i)?l=i:l=Cf}else l=Rf;return Pf[l]});return()=>he(t.value)}}),Yo=e=>Ul(e)?e:`${Gr().value.base}${ur(e)}`;const Lf=[["v-8daa1a0e","/",{title:""},["/index.html","/index.md"]],["v-2d0a870d","/en/",{title:"Home"},["/en/index.html","/en/index.md"]],["v-c0c85b84","/zh-cn/",{title:"\u9996\u9875"},["/zh-cn/index.html","/zh-cn/index.md"]],["v-7a15fe3b","/en/about/about.html",{title:"About this Document"},["/en/about/about","/en/about/about.md"]],["v-3f851d14","/en/about/changelog.html",{title:"Changelog"},["/en/about/changelog","/en/about/changelog.md"]],["v-193cf592","/en/about/contacts.html",{title:"Contact Us"},["/en/about/contacts","/en/about/contacts.md"]],["v-ae7b83f2","/en/about/future.html",{title:"Looking for Future"},["/en/about/future","/en/about/future.md"]],["v-64fc7bb8","/en/api/home.html",{title:"Document Introduce"},["/en/api/home","/en/api/home.md"]],["v-9cfea7fc","/en/config/api-example.html",{title:"API Basic Configs"},["/en/config/api-example","/en/config/api-example.md"]],["v-72c12b7d","/en/config/api-exception.html",{title:"API Exception Handling"},["/en/config/api-exception","/en/config/api-exception.md"]],["v-793879e8","/en/config/api-using.html",{title:"Use as Hook API Configs"},["/en/config/api-using","/en/config/api-using.md"]],["v-29d6c1ba","/en/config/r8-proguard.html",{title:"R8 & Proguard Obfuscate"},["/en/config/r8-proguard","/en/config/r8-proguard.md"]],["v-24e71de7","/en/config/xposed-using.html",{title:"Use as Xposed Module Configs"},["/en/config/xposed-using","/en/config/xposed-using.md"]],["v-7b22efaf","/en/guide/example.html",{title:"Usage Example"},["/en/guide/example","/en/guide/example.md"]],["v-efb45d4c","/en/guide/home.html",{title:"Introduce"},["/en/guide/home","/en/guide/home.md"]],["v-277b35ca","/en/guide/knowledge.html",{title:"Basic Knowledge"},["/en/guide/knowledge","/en/guide/knowledge.md"]],["v-77d752a2","/en/guide/move-to-new-api.html",{title:"Migrate from Xposed API"},["/en/guide/move-to-new-api","/en/guide/move-to-new-api.md"]],["v-72889797","/en/guide/quick-start.html",{title:"Quick Start"},["/en/guide/quick-start","/en/guide/quick-start.md"]],["v-55c11626","/en/tools/yukihookapi-projectbuilder.html",{title:"YukiHookAPI Project Builder"},["/en/tools/yukihookapi-projectbuilder","/en/tools/yukihookapi-projectbuilder.md"]],["v-41967128","/zh-cn/about/about.html",{title:"\u5173\u4E8E\u6B64\u6587\u6863"},["/zh-cn/about/about","/zh-cn/about/about.md"]],["v-0e6c3476","/zh-cn/about/changelog.html",{title:"\u66F4\u65B0\u65E5\u5FD7"},["/zh-cn/about/changelog","/zh-cn/about/changelog.md"]],["v-6cf86266","/zh-cn/about/contacts.html",{title:"\u8054\u7CFB\u6211\u4EEC"},["/zh-cn/about/contacts","/zh-cn/about/contacts.md"]],["v-3106ca14","/zh-cn/about/future.html",{title:"\u5C55\u671B\u672A\u6765"},["/zh-cn/about/future","/zh-cn/about/future.md"]],["v-c8deafb2","/zh-cn/api/home.html",{title:"\u6587\u6863\u4ECB\u7ECD"},["/zh-cn/api/home","/zh-cn/api/home.md"]],["v-c6114c9e","/zh-cn/config/api-example.html",{title:"API \u57FA\u672C\u914D\u7F6E"},["/zh-cn/config/api-example","/zh-cn/config/api-example.md"]],["v-5b43296c","/zh-cn/config/api-exception.html",{title:"API \u5F02\u5E38\u5904\u7406"},["/zh-cn/config/api-exception","/zh-cn/config/api-exception.md"]],["v-2ee67152","/zh-cn/config/api-using.html",{title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E"},["/zh-cn/config/api-using","/zh-cn/config/api-using.md"]],["v-154d6f69","/zh-cn/config/r8-proguard.html",{title:"R8 \u4E0E Proguard \u6DF7\u6DC6"},["/zh-cn/config/r8-proguard","/zh-cn/config/r8-proguard.md"]],["v-af73b3d0","/zh-cn/config/xposed-using.html",{title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E"},["/zh-cn/config/xposed-using","/zh-cn/config/xposed-using.md"]],["v-13b430a0","/zh-cn/guide/example.html",{title:"\u7528\u6CD5\u793A\u4F8B"},["/zh-cn/guide/example","/zh-cn/guide/example.md"]],["v-6a609e09","/zh-cn/guide/home.html",{title:"\u4ECB\u7ECD"},["/zh-cn/guide/home","/zh-cn/guide/home.md"]],["v-b4f1a468","/zh-cn/guide/knowledge.html",{title:"\u57FA\u7840\u77E5\u8BC6"},["/zh-cn/guide/knowledge","/zh-cn/guide/knowledge.md"]],["v-c0d5dada","/zh-cn/guide/move-to-new-api.html",{title:"\u4ECE Xposed API \u8FC1\u79FB"},["/zh-cn/guide/move-to-new-api","/zh-cn/guide/move-to-new-api.md"]],["v-24840ff0","/zh-cn/guide/quick-start.html",{title:"\u5FEB\u901F\u5F00\u59CB"},["/zh-cn/guide/quick-start","/zh-cn/guide/quick-start.md"]],["v-a2fab4d6","/zh-cn/tools/yukihookapi-projectbuilder.html",{title:"YukiHookAPI \u6784\u5EFA\u5DE5\u5177"},["/zh-cn/tools/yukihookapi-projectbuilder","/zh-cn/tools/yukihookapi-projectbuilder.md"]],["v-12042f1f","/en/api/special-features/host-inject.html",{title:"Host Resource Injection Extension"},["/en/api/special-features/host-inject","/en/api/special-features/host-inject.md"]],["v-deaff1d0","/en/api/special-features/host-lifecycle.html",{title:"Host Lifecycle Extension"},["/en/api/special-features/host-lifecycle","/en/api/special-features/host-lifecycle.md"]],["v-33c1dc26","/en/api/special-features/logger.html",{title:"Debug Logs"},["/en/api/special-features/logger","/en/api/special-features/logger.md"]],["v-581ddb9c","/en/api/special-features/reflection.html",{title:"Reflection Extensions"},["/en/api/special-features/reflection","/en/api/special-features/reflection.md"]],["v-2e6ad66c","/en/api/special-features/xposed-channel.html",{title:"Xposed Module and Host Channel"},["/en/api/special-features/xposed-channel","/en/api/special-features/xposed-channel.md"]],["v-68bebbf4","/en/api/special-features/xposed-storage.html",{title:"Xposed Module Data Storage"},["/en/api/special-features/xposed-storage","/en/api/special-features/xposed-storage.md"]],["v-6ac5be8e","/zh-cn/api/special-features/host-inject.html",{title:"\u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55"},["/zh-cn/api/special-features/host-inject","/zh-cn/api/special-features/host-inject.md"]],["v-357a8d49","/zh-cn/api/special-features/host-lifecycle.html",{title:"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55"},["/zh-cn/api/special-features/host-lifecycle","/zh-cn/api/special-features/host-lifecycle.md"]],["v-1f0f591e","/zh-cn/api/special-features/logger.html",{title:"\u8C03\u8BD5\u65E5\u5FD7"},["/zh-cn/api/special-features/logger","/zh-cn/api/special-features/logger.md"]],["v-001858e3","/zh-cn/api/special-features/reflection.html",{title:"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55"},["/zh-cn/api/special-features/reflection","/zh-cn/api/special-features/reflection.md"]],["v-598546c6","/zh-cn/api/special-features/xposed-channel.html",{title:"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865"},["/zh-cn/api/special-features/xposed-channel","/zh-cn/api/special-features/xposed-channel.md"]],["v-0d914225","/zh-cn/api/special-features/xposed-storage.html",{title:"Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8"},["/zh-cn/api/special-features/xposed-storage","/zh-cn/api/special-features/xposed-storage.md"]],["v-6931cb54","/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",{title:"YukiHookAPI - object"},["/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"]],["v-053599a5","/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",{title:"YukiHookAPI - object"},["/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"]],["v-30f3ba1e","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",{title:"InjectYukiHookWithXposed - annotation"},["/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.md"]],["v-6e47300f","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",{title:"CurrentClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.md"]],["v-69c1c226","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",{title:"GenericClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"]],["v-735374af","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",{title:"HookClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.md"]],["v-1c516d22","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",{title:"HookResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.md"]],["v-66735bfe","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",{title:"VariousClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"]],["v-3ac40680","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",{title:"YukiMemberHookCreator - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"]],["v-5e81af42","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",{title:"YukiResourcesHookCreator - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"]],["v-004a009e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",{title:"LoggerFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"]],["v-213d88b3","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",{title:"ReflectionFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"]],["v-448e9585","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",{title:"YukiHookFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"]],["v-75a9b636","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",{title:"HookParam - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"]],["v-100b529c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",{title:"PackageParam - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"]],["v-516df326","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",{title:"YukiBaseHooker - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.md"]],["v-818b3ca6","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",{title:"InjectYukiHookWithXposed - annotation"},["/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.md"]],["v-b6a815c4","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",{title:"CurrentClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.md"]],["v-0183e3fc","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",{title:"GenericClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"]],["v-57506200","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",{title:"HookClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.md"]],["v-9af56c1a","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",{title:"HookResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.md"]],["v-032b1710","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",{title:"VariousClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"]],["v-71147891","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",{title:"YukiMemberHookCreator - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"]],["v-5ed1ceee","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",{title:"YukiResourcesHookCreator - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"]],["v-e288ce96","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",{title:"YukiBaseHooker - class"},["/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.md"]],["v-0d0fcec2","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",{title:"ReflectionFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"]],["v-65091354","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",{title:"YukiHookFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"]],["v-36aec5ad","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",{title:"LoggerFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"]],["v-60cbe1b4","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",{title:"HookParam - class"},["/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"]],["v-b381a126","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",{title:"PackageParam - class"},["/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"]],["v-5e874c45","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",{title:"ComponentTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.md"]],["v-4ea62475","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",{title:"GraphicsTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.md"]],["v-ef79cde2","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",{title:"ViewTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.md"]],["v-5acc12ab","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",{title:"DefinedTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.md"]],["v-14ec8671","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",{title:"VariableTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.md"]],["v-4709ad58","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",{title:"ModuleApplication - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.md"]],["v-632be8ee","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",{title:"YukiHookDataChannel - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"]],["v-5858709e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",{title:"YukiHookModulePrefs - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"]],["v-763140ee","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",{title:"IYukiHookXposedInit - interface"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.md"]],["v-8293d958","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",{title:"ComponentTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.md"]],["v-7b0abf86","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",{title:"GraphicsTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.md"]],["v-5309e4a0","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",{title:"ViewTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.md"]],["v-a2615d0c","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",{title:"DefinedTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.md"]],["v-ba01a600","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",{title:"VariableTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.md"]],["v-7fec5836","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",{title:"ModuleApplication - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.md"]],["v-7414265a","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",{title:"YukiHookDataChannel - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"]],["v-003862c2","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",{title:"YukiHookModulePrefs - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"]],["v-1d680acc","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",{title:"IYukiHookXposedInit - interface"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.md"]],["v-0f719471","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",{title:"BaseFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.md"]],["v-45111efc","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",{title:"DexClassFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.md"]],["v-1e2cbc9c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",{title:"ConstructorFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"]],["v-22449c48","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",{title:"FieldFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"]],["v-fd738322","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",{title:"MethodFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"]],["v-3d943532","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",{title:"YukiModuleResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.md"]],["v-526c4200","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",{title:"YukiResForwarder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.md"]],["v-68541dca","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",{title:"YukiResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.md"]],["v-0a4de82f","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",{title:"YukiXposedEvent - object"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.md"]],["v-493d37f6","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",{title:"ChannelData - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"]],["v-b57870de","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html",{title:"ChannelPriority - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.md"]],["v-4b468415","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",{title:"ModuleClassLoader - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.md"]],["v-d99f7f36","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",{title:"PrefsData - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"]],["v-53bcae06","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",{title:"ModulePreferenceFragment - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.md"]],["v-4fca92c0","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",{title:"BaseFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.md"]],["v-2a898c66","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",{title:"DexClassFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.md"]],["v-a71937aa","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",{title:"ConstructorFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"]],["v-42e0f0ab","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",{title:"FieldFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"]],["v-a4aa4d00","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",{title:"MethodFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"]],["v-0f1e3594","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",{title:"YukiModuleResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.md"]],["v-35faec91","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",{title:"YukiResForwarder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.md"]],["v-2c04b82a","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",{title:"YukiResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.md"]],["v-19e7277e","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",{title:"YukiXposedEvent - object"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.md"]],["v-2f64a2d4","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",{title:"ChannelData - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"]],["v-87027140","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html",{title:"ChannelPriority - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.md"]],["v-2d4e0da6","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",{title:"ModuleClassLoader - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.md"]],["v-58ed8298","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",{title:"PrefsData - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"]],["v-23e1a817","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",{title:"ModulePreferenceFragment - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.md"]],["v-1b2ad030","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",{title:"CountRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.md"]],["v-547a3c3c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",{title:"ModifierRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.md"]],["v-58c26516","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",{title:"NameRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.md"]],["v-80fd32ec","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html",{title:"ObjectRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.md"]],["v-a42f54a4","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",{title:"ConstructorRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"]],["v-3e67a42e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",{title:"FieldRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"]],["v-2cab152c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",{title:"MemberRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.md"]],["v-5388621e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",{title:"MethodRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"]],["v-1446bdca","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",{title:"ModuleAppActivity - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md"]],["v-c7cef530","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",{title:"ModuleAppCompatActivity - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md"]],["v-44efb702","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",{title:"ModuleContextThemeWrapper - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.md"]],["v-52995ef7","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",{title:"CountRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.md"]],["v-8d5ce71a","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",{title:"ModifierRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.md"]],["v-f5b1ffb2","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",{title:"NameRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.md"]],["v-652b815b","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html",{title:"ObjectRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.md"]],["v-08b70f7f","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",{title:"ConstructorRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"]],["v-21f64ebf","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",{title:"FieldRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"]],["v-77f11cf9","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",{title:"MemberRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.md"]],["v-64827680","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",{title:"MethodRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"]],["v-2d5d16db","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",{title:"ModuleAppActivity - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md"]],["v-cadbe48e","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",{title:"ModuleAppCompatActivity - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md"]],["v-78731c50","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",{title:"ModuleContextThemeWrapper - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.md"]],["v-b8000f3a","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",{title:"MemberRulesResult - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.md"]],["v-5e375d98","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",{title:"MemberRulesResult - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var Tf=()=>Lf.reduce((e,[t,l,i,o])=>(e.push({name:t,path:l,component:ca,meta:i},...o.map(n=>({path:n,redirect:l}))),e),[{name:"404",path:"/:catchAll(.*)",component:ca}]),Af=Gh,If=()=>{const e=Fd({history:Af(dr(At.value.base)),routes:Tf(),scrollBehavior:(t,l,i)=>i||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,l)=>{var i;(t.path!==l.path||l===mt)&&([gt.value]=await Promise.all([Ut.resolvePageData(t.name),(i=mr[t.name])==null?void 0:i.__asyncLoader()]))}),e},wf=e=>{e.component("ClientOnly",$o),e.component("Content",Ef)},Of=(e,t)=>{const l=Y(()=>Ut.resolveRouteLocale(At.value.locales,t.currentRoute.value.path)),i=Y(()=>Ut.resolveSiteLocaleData(At.value,l.value)),o=Y(()=>Ut.resolvePageFrontmatter(gt.value)),n=Y(()=>Ut.resolvePageHeadTitle(gt.value,i.value)),a=Y(()=>Ut.resolvePageHead(n.value,o.value,i.value)),r=Y(()=>Ut.resolvePageLang(gt.value));return e.provide(No,l),e.provide(Qr,i),e.provide(Xr,o),e.provide(_f,n),e.provide(qr,a),e.provide(Kr,r),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>o.value},$head:{get:()=>a.value},$headTitle:{get:()=>n.value},$lang:{get:()=>r.value},$page:{get:()=>gt.value},$routeLocale:{get:()=>l.value},$site:{get:()=>At.value},$siteLocale:{get:()=>i.value},$withBase:{get:()=>Yo}}),{pageData:gt,pageFrontmatter:o,pageHead:a,pageHeadTitle:n,pageLang:r,routeLocale:l,siteData:At,siteLocaleData:i}},Ff=()=>{const e=St(),t=bf(),l=yf(),i=ye([]),o=()=>{t.value.forEach(a=>{const r=zf(a);r&&i.value.push(r)})},n=()=>{document.documentElement.lang=l.value,i.value.forEach(a=>{a.parentNode===document.head&&document.head.removeChild(a)}),i.value.splice(0,i.value.length),t.value.forEach(a=>{const r=Df(a);r!==null&&(document.head.appendChild(r),i.value.push(r))})};Gt(xf,n),Je(()=>{o(),n(),dt(()=>e.path,()=>n())})},zf=([e,t,l=""])=>{const i=Object.entries(t).map(([r,s])=>be(s)?`[${r}="${s}"]`:s===!0?`[${r}]`:"").join(""),o=`head > ${e}${i}`;return Array.from(document.querySelectorAll(o)).find(r=>r.innerText===l)||null},Df=([e,t,l])=>{if(!be(e))return null;const i=document.createElement(e);return Oo(t)&&Object.entries(t).forEach(([o,n])=>{be(n)?i.setAttribute(o,n):n===!0&&i.setAttribute(o,"")}),be(l)&&i.appendChild(document.createTextNode(l)),i},Mf=Ph,Hf=async()=>{var l;const e=Mf({name:"VuepressApp",setup(){var i;Ff();for(const o of oi)(i=o.setup)==null||i.call(o);return()=>[he(Pr),...oi.flatMap(({rootComponents:o=[]})=>o.map(n=>he(n)))]}}),t=If();wf(e),Of(e,t);for(const i of oi)await((l=i.enhance)==null?void 0:l.call(i,{app:e,router:t,siteData:At}));return e.use(t),{app:e,router:t}};Hf().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Te as _,jc as a,fe as b,Z as c,Hf as createVueApp,oe as d,Mt as e,N as o,_t as r,He as w}; diff --git a/docs/assets/app.99fcdd51.js b/docs/assets/app.99fcdd51.js deleted file mode 100644 index 393a2e6b0..000000000 --- a/docs/assets/app.99fcdd51.js +++ /dev/null @@ -1,10 +0,0 @@ -const Zr="modulepreload",Jr=function(e){return"/YukiHookAPI/"+e},Xo={},d=function(t,l,i){return!l||l.length===0?t():Promise.all(l.map(o=>{if(o=Jr(o),o in Xo)return;Xo[o]=!0;const n=o.endsWith(".css"),a=n?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${a}`))return;const r=document.createElement("link");if(r.rel=n?"stylesheet":Zr,n||(r.as="script",r.crossOrigin=""),r.href=o,document.head.appendChild(r),n)return new Promise((s,c)=>{r.addEventListener("load",s),r.addEventListener("error",()=>c(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},es={"v-8daa1a0e":()=>d(()=>import("./index.html.1b76ac9e.js"),[]).then(({data:e})=>e),"v-2d0a870d":()=>d(()=>import("./index.html.872aa7a1.js"),[]).then(({data:e})=>e),"v-c0c85b84":()=>d(()=>import("./index.html.6cc32291.js"),[]).then(({data:e})=>e),"v-7a15fe3b":()=>d(()=>import("./about.html.7638d3a2.js"),[]).then(({data:e})=>e),"v-3f851d14":()=>d(()=>import("./changelog.html.88d98aec.js"),[]).then(({data:e})=>e),"v-193cf592":()=>d(()=>import("./contacts.html.5dc8225c.js"),[]).then(({data:e})=>e),"v-ae7b83f2":()=>d(()=>import("./future.html.94bd226b.js"),[]).then(({data:e})=>e),"v-64fc7bb8":()=>d(()=>import("./home.html.f6b9c2a4.js"),[]).then(({data:e})=>e),"v-9cfea7fc":()=>d(()=>import("./api-example.html.47c311e0.js"),[]).then(({data:e})=>e),"v-72c12b7d":()=>d(()=>import("./api-exception.html.7f0c42da.js"),[]).then(({data:e})=>e),"v-793879e8":()=>d(()=>import("./api-using.html.c794f69e.js"),[]).then(({data:e})=>e),"v-29d6c1ba":()=>d(()=>import("./r8-proguard.html.15e04e11.js"),[]).then(({data:e})=>e),"v-24e71de7":()=>d(()=>import("./xposed-using.html.cd65195d.js"),[]).then(({data:e})=>e),"v-7b22efaf":()=>d(()=>import("./example.html.a036bda1.js"),[]).then(({data:e})=>e),"v-efb45d4c":()=>d(()=>import("./home.html.f6f658d0.js"),[]).then(({data:e})=>e),"v-277b35ca":()=>d(()=>import("./knowledge.html.7104405e.js"),[]).then(({data:e})=>e),"v-77d752a2":()=>d(()=>import("./move-to-new-api.html.78f39fa5.js"),[]).then(({data:e})=>e),"v-72889797":()=>d(()=>import("./quick-start.html.e309979a.js"),[]).then(({data:e})=>e),"v-55c11626":()=>d(()=>import("./yukihookapi-projectbuilder.html.ed4fa356.js"),[]).then(({data:e})=>e),"v-41967128":()=>d(()=>import("./about.html.c0115524.js"),[]).then(({data:e})=>e),"v-0e6c3476":()=>d(()=>import("./changelog.html.858036fa.js"),[]).then(({data:e})=>e),"v-6cf86266":()=>d(()=>import("./contacts.html.3df7cacf.js"),[]).then(({data:e})=>e),"v-3106ca14":()=>d(()=>import("./future.html.2cf8d6de.js"),[]).then(({data:e})=>e),"v-c8deafb2":()=>d(()=>import("./home.html.cad3998c.js"),[]).then(({data:e})=>e),"v-c6114c9e":()=>d(()=>import("./api-example.html.f5361b1b.js"),[]).then(({data:e})=>e),"v-5b43296c":()=>d(()=>import("./api-exception.html.f33af1c3.js"),[]).then(({data:e})=>e),"v-2ee67152":()=>d(()=>import("./api-using.html.0a59e2e0.js"),[]).then(({data:e})=>e),"v-154d6f69":()=>d(()=>import("./r8-proguard.html.683a5429.js"),[]).then(({data:e})=>e),"v-af73b3d0":()=>d(()=>import("./xposed-using.html.557dcdf1.js"),[]).then(({data:e})=>e),"v-13b430a0":()=>d(()=>import("./example.html.13ac887a.js"),[]).then(({data:e})=>e),"v-6a609e09":()=>d(()=>import("./home.html.4d8cac8a.js"),[]).then(({data:e})=>e),"v-b4f1a468":()=>d(()=>import("./knowledge.html.1352f5de.js"),[]).then(({data:e})=>e),"v-c0d5dada":()=>d(()=>import("./move-to-new-api.html.508c5312.js"),[]).then(({data:e})=>e),"v-24840ff0":()=>d(()=>import("./quick-start.html.eacb83f2.js"),[]).then(({data:e})=>e),"v-a2fab4d6":()=>d(()=>import("./yukihookapi-projectbuilder.html.d499d226.js"),[]).then(({data:e})=>e),"v-12042f1f":()=>d(()=>import("./host-inject.html.8e7a6aa7.js"),[]).then(({data:e})=>e),"v-deaff1d0":()=>d(()=>import("./host-lifecycle.html.412bbdd6.js"),[]).then(({data:e})=>e),"v-33c1dc26":()=>d(()=>import("./logger.html.f841b55d.js"),[]).then(({data:e})=>e),"v-581ddb9c":()=>d(()=>import("./reflection.html.ff24950f.js"),[]).then(({data:e})=>e),"v-2e6ad66c":()=>d(()=>import("./xposed-channel.html.96712a39.js"),[]).then(({data:e})=>e),"v-68bebbf4":()=>d(()=>import("./xposed-storage.html.c35a7041.js"),[]).then(({data:e})=>e),"v-6ac5be8e":()=>d(()=>import("./host-inject.html.77802245.js"),[]).then(({data:e})=>e),"v-357a8d49":()=>d(()=>import("./host-lifecycle.html.09c0b222.js"),[]).then(({data:e})=>e),"v-1f0f591e":()=>d(()=>import("./logger.html.c841577b.js"),[]).then(({data:e})=>e),"v-001858e3":()=>d(()=>import("./reflection.html.2e612549.js"),[]).then(({data:e})=>e),"v-598546c6":()=>d(()=>import("./xposed-channel.html.b798a8f8.js"),[]).then(({data:e})=>e),"v-0d914225":()=>d(()=>import("./xposed-storage.html.5fd9a913.js"),[]).then(({data:e})=>e),"v-053599a5":()=>d(()=>import("./YukiHookAPI.html.77b2a461.js"),[]).then(({data:e})=>e),"v-6931cb54":()=>d(()=>import("./YukiHookAPI.html.476693ca.js"),[]).then(({data:e})=>e),"v-818b3ca6":()=>d(()=>import("./InjectYukiHookWithXposed.html.56391530.js"),[]).then(({data:e})=>e),"v-b6a815c4":()=>d(()=>import("./CurrentClass.html.16c29272.js"),[]).then(({data:e})=>e),"v-0183e3fc":()=>d(()=>import("./GenericClass.html.7b666428.js"),[]).then(({data:e})=>e),"v-57506200":()=>d(()=>import("./HookClass.html.52e59cf0.js"),[]).then(({data:e})=>e),"v-9af56c1a":()=>d(()=>import("./HookResources.html.2486cf29.js"),[]).then(({data:e})=>e),"v-032b1710":()=>d(()=>import("./VariousClass.html.bd237fa4.js"),[]).then(({data:e})=>e),"v-71147891":()=>d(()=>import("./YukiMemberHookCreator.html.d3b181da.js"),[]).then(({data:e})=>e),"v-5ed1ceee":()=>d(()=>import("./YukiResourcesHookCreator.html.8aaa9934.js"),[]).then(({data:e})=>e),"v-e288ce96":()=>d(()=>import("./YukiBaseHooker.html.99eec744.js"),[]).then(({data:e})=>e),"v-0d0fcec2":()=>d(()=>import("./ReflectionFactory.html.7c031771.js"),[]).then(({data:e})=>e),"v-65091354":()=>d(()=>import("./YukiHookFactory.html.61db5860.js"),[]).then(({data:e})=>e),"v-36aec5ad":()=>d(()=>import("./LoggerFactory.html.5acb1c04.js"),[]).then(({data:e})=>e),"v-30f3ba1e":()=>d(()=>import("./InjectYukiHookWithXposed.html.cf9b500d.js"),[]).then(({data:e})=>e),"v-60cbe1b4":()=>d(()=>import("./HookParam.html.b19d4ad2.js"),[]).then(({data:e})=>e),"v-b381a126":()=>d(()=>import("./PackageParam.html.5e695f66.js"),[]).then(({data:e})=>e),"v-6e47300f":()=>d(()=>import("./CurrentClass.html.641fcd58.js"),[]).then(({data:e})=>e),"v-69c1c226":()=>d(()=>import("./GenericClass.html.3a0e1ac6.js"),[]).then(({data:e})=>e),"v-735374af":()=>d(()=>import("./HookClass.html.486aa6ea.js"),[]).then(({data:e})=>e),"v-1c516d22":()=>d(()=>import("./HookResources.html.4f07fd98.js"),[]).then(({data:e})=>e),"v-66735bfe":()=>d(()=>import("./VariousClass.html.7c81aa10.js"),[]).then(({data:e})=>e),"v-3ac40680":()=>d(()=>import("./YukiMemberHookCreator.html.37dcaec4.js"),[]).then(({data:e})=>e),"v-5e81af42":()=>d(()=>import("./YukiResourcesHookCreator.html.46168b72.js"),[]).then(({data:e})=>e),"v-516df326":()=>d(()=>import("./YukiBaseHooker.html.b68236f9.js"),[]).then(({data:e})=>e),"v-213d88b3":()=>d(()=>import("./ReflectionFactory.html.a7379f4b.js"),[]).then(({data:e})=>e),"v-448e9585":()=>d(()=>import("./YukiHookFactory.html.64f654a6.js"),[]).then(({data:e})=>e),"v-004a009e":()=>d(()=>import("./LoggerFactory.html.b8bfff32.js"),[]).then(({data:e})=>e),"v-75a9b636":()=>d(()=>import("./HookParam.html.f98d02d2.js"),[]).then(({data:e})=>e),"v-100b529c":()=>d(()=>import("./PackageParam.html.9385a8d2.js"),[]).then(({data:e})=>e),"v-8293d958":()=>d(()=>import("./ComponentTypeFactory.html.5af05d7d.js"),[]).then(({data:e})=>e),"v-7b0abf86":()=>d(()=>import("./GraphicsTypeFactory.html.a3936b7c.js"),[]).then(({data:e})=>e),"v-5309e4a0":()=>d(()=>import("./ViewTypeFactory.html.7da3eef4.js"),[]).then(({data:e})=>e),"v-a2615d0c":()=>d(()=>import("./DefinedTypeFactory.html.8137c32c.js"),[]).then(({data:e})=>e),"v-ba01a600":()=>d(()=>import("./VariableTypeFactory.html.d4c9dbd1.js"),[]).then(({data:e})=>e),"v-7fec5836":()=>d(()=>import("./ModuleApplication.html.57573770.js"),[]).then(({data:e})=>e),"v-7414265a":()=>d(()=>import("./YukiHookDataChannel.html.6f5cc6e1.js"),[]).then(({data:e})=>e),"v-003862c2":()=>d(()=>import("./YukiHookModulePrefs.html.e0f278fe.js"),[]).then(({data:e})=>e),"v-1d680acc":()=>d(()=>import("./IYukiHookXposedInit.html.b37a852b.js"),[]).then(({data:e})=>e),"v-5e874c45":()=>d(()=>import("./ComponentTypeFactory.html.0026a7b8.js"),[]).then(({data:e})=>e),"v-4ea62475":()=>d(()=>import("./GraphicsTypeFactory.html.bfb4e259.js"),[]).then(({data:e})=>e),"v-ef79cde2":()=>d(()=>import("./ViewTypeFactory.html.612b6202.js"),[]).then(({data:e})=>e),"v-5acc12ab":()=>d(()=>import("./DefinedTypeFactory.html.ba3bdd0b.js"),[]).then(({data:e})=>e),"v-14ec8671":()=>d(()=>import("./VariableTypeFactory.html.550d3346.js"),[]).then(({data:e})=>e),"v-4709ad58":()=>d(()=>import("./ModuleApplication.html.a386b8db.js"),[]).then(({data:e})=>e),"v-632be8ee":()=>d(()=>import("./YukiHookDataChannel.html.3b0eec14.js"),[]).then(({data:e})=>e),"v-5858709e":()=>d(()=>import("./YukiHookModulePrefs.html.5eb62ec3.js"),[]).then(({data:e})=>e),"v-763140ee":()=>d(()=>import("./IYukiHookXposedInit.html.78a55860.js"),[]).then(({data:e})=>e),"v-4fca92c0":()=>d(()=>import("./BaseFinder.html.a5dbb7a7.js"),[]).then(({data:e})=>e),"v-2a898c66":()=>d(()=>import("./DexClassFinder.html.5d8e12f0.js"),[]).then(({data:e})=>e),"v-a71937aa":()=>d(()=>import("./ConstructorFinder.html.0c13dc47.js"),[]).then(({data:e})=>e),"v-42e0f0ab":()=>d(()=>import("./FieldFinder.html.4410e26c.js"),[]).then(({data:e})=>e),"v-a4aa4d00":()=>d(()=>import("./MethodFinder.html.97f89f93.js"),[]).then(({data:e})=>e),"v-0f1e3594":()=>d(()=>import("./YukiModuleResources.html.e5c5fb30.js"),[]).then(({data:e})=>e),"v-35faec91":()=>d(()=>import("./YukiResForwarder.html.4e23df75.js"),[]).then(({data:e})=>e),"v-2c04b82a":()=>d(()=>import("./YukiResources.html.afb6fb92.js"),[]).then(({data:e})=>e),"v-19e7277e":()=>d(()=>import("./YukiXposedEvent.html.560fa41c.js"),[]).then(({data:e})=>e),"v-2f64a2d4":()=>d(()=>import("./ChannelData.html.f8f818f6.js"),[]).then(({data:e})=>e),"v-2d4e0da6":()=>d(()=>import("./ModuleClassLoader.html.2ddf88b6.js"),[]).then(({data:e})=>e),"v-58ed8298":()=>d(()=>import("./PrefsData.html.dfd7c23c.js"),[]).then(({data:e})=>e),"v-23e1a817":()=>d(()=>import("./ModulePreferenceFragment.html.764fecc3.js"),[]).then(({data:e})=>e),"v-0f719471":()=>d(()=>import("./BaseFinder.html.8f275c85.js"),[]).then(({data:e})=>e),"v-45111efc":()=>d(()=>import("./DexClassFinder.html.78c5f805.js"),[]).then(({data:e})=>e),"v-1e2cbc9c":()=>d(()=>import("./ConstructorFinder.html.7de4f560.js"),[]).then(({data:e})=>e),"v-22449c48":()=>d(()=>import("./FieldFinder.html.25713065.js"),[]).then(({data:e})=>e),"v-fd738322":()=>d(()=>import("./MethodFinder.html.03ce70ab.js"),[]).then(({data:e})=>e),"v-3d943532":()=>d(()=>import("./YukiModuleResources.html.d8e27a7f.js"),[]).then(({data:e})=>e),"v-526c4200":()=>d(()=>import("./YukiResForwarder.html.0dadd8db.js"),[]).then(({data:e})=>e),"v-68541dca":()=>d(()=>import("./YukiResources.html.7b0a4824.js"),[]).then(({data:e})=>e),"v-0a4de82f":()=>d(()=>import("./YukiXposedEvent.html.a93ee4ef.js"),[]).then(({data:e})=>e),"v-493d37f6":()=>d(()=>import("./ChannelData.html.194718a1.js"),[]).then(({data:e})=>e),"v-4b468415":()=>d(()=>import("./ModuleClassLoader.html.0388bffd.js"),[]).then(({data:e})=>e),"v-d99f7f36":()=>d(()=>import("./PrefsData.html.d3cf97f9.js"),[]).then(({data:e})=>e),"v-53bcae06":()=>d(()=>import("./ModulePreferenceFragment.html.0c7dadc7.js"),[]).then(({data:e})=>e),"v-52995ef7":()=>d(()=>import("./CountRules.html.2d5ab94d.js"),[]).then(({data:e})=>e),"v-8d5ce71a":()=>d(()=>import("./ModifierRules.html.c36dff17.js"),[]).then(({data:e})=>e),"v-f5b1ffb2":()=>d(()=>import("./NameRules.html.00ac96fb.js"),[]).then(({data:e})=>e),"v-08b70f7f":()=>d(()=>import("./ConstructorRules.html.d62bae6c.js"),[]).then(({data:e})=>e),"v-21f64ebf":()=>d(()=>import("./FieldRules.html.9b04521f.js"),[]).then(({data:e})=>e),"v-77f11cf9":()=>d(()=>import("./MemberRules.html.a071b3c6.js"),[]).then(({data:e})=>e),"v-64827680":()=>d(()=>import("./MethodRules.html.c10f9770.js"),[]).then(({data:e})=>e),"v-2d5d16db":()=>d(()=>import("./ModuleAppActivity.html.90d3c4e6.js"),[]).then(({data:e})=>e),"v-cadbe48e":()=>d(()=>import("./ModuleAppCompatActivity.html.a20d9206.js"),[]).then(({data:e})=>e),"v-78731c50":()=>d(()=>import("./ModuleContextThemeWrapper.html.0879426b.js"),[]).then(({data:e})=>e),"v-1b2ad030":()=>d(()=>import("./CountRules.html.2639d392.js"),[]).then(({data:e})=>e),"v-547a3c3c":()=>d(()=>import("./ModifierRules.html.f7582dc2.js"),[]).then(({data:e})=>e),"v-58c26516":()=>d(()=>import("./NameRules.html.47e512e4.js"),[]).then(({data:e})=>e),"v-a42f54a4":()=>d(()=>import("./ConstructorRules.html.f8d7dd83.js"),[]).then(({data:e})=>e),"v-3e67a42e":()=>d(()=>import("./FieldRules.html.6858f0d6.js"),[]).then(({data:e})=>e),"v-2cab152c":()=>d(()=>import("./MemberRules.html.b3e5d297.js"),[]).then(({data:e})=>e),"v-5388621e":()=>d(()=>import("./MethodRules.html.146b27be.js"),[]).then(({data:e})=>e),"v-1446bdca":()=>d(()=>import("./ModuleAppActivity.html.09451ff7.js"),[]).then(({data:e})=>e),"v-c7cef530":()=>d(()=>import("./ModuleAppCompatActivity.html.dd9e40e9.js"),[]).then(({data:e})=>e),"v-44efb702":()=>d(()=>import("./ModuleContextThemeWrapper.html.229a46ac.js"),[]).then(({data:e})=>e),"v-5e375d98":()=>d(()=>import("./MemberRulesResult.html.e79843c3.js"),[]).then(({data:e})=>e),"v-b8000f3a":()=>d(()=>import("./MemberRulesResult.html.58e81c94.js"),[]).then(({data:e})=>e),"v-3706649a":()=>d(()=>import("./404.html.c038a05a.js"),[]).then(({data:e})=>e)};function mo(e,t){const l=Object.create(null),i=e.split(",");for(let o=0;o!!l[o.toLowerCase()]:o=>!!l[o]}const ts="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",ls=mo(ts);function ha(e){return!!e||e===""}function Sl(e){if(te(e)){const t={};for(let l=0;l{if(l){const i=l.split(os);i.length>1&&(t[i[0].trim()]=i[1].trim())}}),t}function Ke(e){let t="";if(be(e))t=e;else if(te(e))for(let l=0;lbe(e)?e:e==null?"":te(e)||Oe(e)&&(e.toString===ma||!ae(e.toString))?JSON.stringify(e,da,2):String(e),da=(e,t)=>t&&t.__v_isRef?da(e,t.value):rl(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((l,[i,o])=>(l[`${i} =>`]=o,l),{})}:ua(t)?{[`Set(${t.size})`]:[...t.values()]}:Oe(t)&&!te(t)&&!fa(t)?String(t):t,Ce={},al=[],rt=()=>{},as=()=>!1,rs=/^on[^a-z]/,Vl=e=>rs.test(e),fo=e=>e.startsWith("onUpdate:"),Se=Object.assign,go=(e,t)=>{const l=e.indexOf(t);l>-1&&e.splice(l,1)},ss=Object.prototype.hasOwnProperty,de=(e,t)=>ss.call(e,t),te=Array.isArray,rl=e=>bi(e)==="[object Map]",ua=e=>bi(e)==="[object Set]",ae=e=>typeof e=="function",be=e=>typeof e=="string",ko=e=>typeof e=="symbol",Oe=e=>e!==null&&typeof e=="object",pa=e=>Oe(e)&&ae(e.then)&&ae(e.catch),ma=Object.prototype.toString,bi=e=>ma.call(e),cs=e=>bi(e).slice(8,-1),fa=e=>bi(e)==="[object Object]",vo=e=>be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Cl=mo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),_i=e=>{const t=Object.create(null);return l=>t[l]||(t[l]=e(l))},hs=/-(\w)/g,ut=_i(e=>e.replace(hs,(t,l)=>l?l.toUpperCase():"")),ds=/\B([A-Z])/g,Zt=_i(e=>e.replace(ds,"-$1").toLowerCase()),yi=_i(e=>e.charAt(0).toUpperCase()+e.slice(1)),Oi=_i(e=>e?`on${yi(e)}`:""),wl=(e,t)=>!Object.is(e,t),Fi=(e,t)=>{for(let l=0;l{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:l})},ga=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let qo;const us=()=>qo||(qo=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});let Xe;class ps{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Xe&&(this.parent=Xe,this.index=(Xe.scopes||(Xe.scopes=[])).push(this)-1)}run(t){if(this.active){const l=Xe;try{return Xe=this,t()}finally{Xe=l}}}on(){Xe=this}off(){Xe=this.parent}stop(t){if(this.active){let l,i;for(l=0,i=this.effects.length;l{const t=new Set(e);return t.w=0,t.n=0,t},ka=e=>(e.w&Ft)>0,va=e=>(e.n&Ft)>0,ks=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let l=0;for(let i=0;i{(c==="length"||c>=i)&&r.push(s)});else switch(l!==void 0&&r.push(a.get(l)),t){case"add":te(e)?vo(l)&&r.push(a.get("length")):(r.push(a.get(Kt)),rl(e)&&r.push(a.get(qi)));break;case"delete":te(e)||(r.push(a.get(Kt)),rl(e)&&r.push(a.get(qi)));break;case"set":rl(e)&&r.push(a.get(Kt));break}if(r.length===1)r[0]&&Ki(r[0]);else{const s=[];for(const c of r)c&&s.push(...c);Ki(bo(s))}}function Ki(e,t){const l=te(e)?e:[...e];for(const i of l)i.computed&&Go(i);for(const i of l)i.computed||Go(i)}function Go(e,t){(e!==nt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const bs=mo("__proto__,__v_isRef,__isVue"),ya=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ko)),_s=yo(),ys=yo(!1,!0),xs=yo(!0),Qo=Es();function Es(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...l){const i=ke(this);for(let n=0,a=this.length;n{e[t]=function(...l){ml();const i=ke(this)[t].apply(this,l);return fl(),i}}),e}function yo(e=!1,t=!1){return function(i,o,n){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&n===(e?t?Vs:La:t?Ra:Ca).get(i))return i;const a=te(i);if(!e&&a&&de(Qo,o))return Reflect.get(Qo,o,n);const r=Reflect.get(i,o,n);return(ko(o)?ya.has(o):bs(o))||(e||Qe(i,"get",o),t)?r:De(r)?a&&vo(o)?r:r.value:Oe(r)?e?Co(r):gl(r):r}}const Cs=xa(),Rs=xa(!0);function xa(e=!1){return function(l,i,o,n){let a=l[i];if(Ol(a)&&De(a)&&!De(o))return!1;if(!e&&!Ol(o)&&(Gi(o)||(o=ke(o),a=ke(a)),!te(l)&&De(a)&&!De(o)))return a.value=o,!0;const r=te(l)&&vo(i)?Number(i)e,xi=e=>Reflect.getPrototypeOf(e);function Xl(e,t,l=!1,i=!1){e=e.__v_raw;const o=ke(e),n=ke(t);l||(t!==n&&Qe(o,"get",t),Qe(o,"get",n));const{has:a}=xi(o),r=i?xo:l?Lo:Fl;if(a.call(o,t))return r(e.get(t));if(a.call(o,n))return r(e.get(n));e!==o&&e.get(t)}function ql(e,t=!1){const l=this.__v_raw,i=ke(l),o=ke(e);return t||(e!==o&&Qe(i,"has",e),Qe(i,"has",o)),e===o?l.has(e):l.has(e)||l.has(o)}function Kl(e,t=!1){return e=e.__v_raw,!t&&Qe(ke(e),"iterate",Kt),Reflect.get(e,"size",e)}function Zo(e){e=ke(e);const t=ke(this);return xi(t).has.call(t,e)||(t.add(e),bt(t,"add",e,e)),this}function Jo(e,t){t=ke(t);const l=ke(this),{has:i,get:o}=xi(l);let n=i.call(l,e);n||(e=ke(e),n=i.call(l,e));const a=o.call(l,e);return l.set(e,t),n?wl(t,a)&&bt(l,"set",e,t):bt(l,"add",e,t),this}function en(e){const t=ke(this),{has:l,get:i}=xi(t);let o=l.call(t,e);o||(e=ke(e),o=l.call(t,e)),i&&i.call(t,e);const n=t.delete(e);return o&&bt(t,"delete",e,void 0),n}function tn(){const e=ke(this),t=e.size!==0,l=e.clear();return t&&bt(e,"clear",void 0,void 0),l}function Gl(e,t){return function(i,o){const n=this,a=n.__v_raw,r=ke(a),s=t?xo:e?Lo:Fl;return!e&&Qe(r,"iterate",Kt),a.forEach((c,h)=>i.call(o,s(c),s(h),n))}}function Ql(e,t,l){return function(...i){const o=this.__v_raw,n=ke(o),a=rl(n),r=e==="entries"||e===Symbol.iterator&&a,s=e==="keys"&&a,c=o[e](...i),h=l?xo:t?Lo:Fl;return!t&&Qe(n,"iterate",s?qi:Kt),{next(){const{value:p,done:m}=c.next();return m?{value:p,done:m}:{value:r?[h(p[0]),h(p[1])]:h(p),done:m}},[Symbol.iterator](){return this}}}}function xt(e){return function(...t){return e==="delete"?!1:this}}function ws(){const e={get(n){return Xl(this,n)},get size(){return Kl(this)},has:ql,add:Zo,set:Jo,delete:en,clear:tn,forEach:Gl(!1,!1)},t={get(n){return Xl(this,n,!1,!0)},get size(){return Kl(this)},has:ql,add:Zo,set:Jo,delete:en,clear:tn,forEach:Gl(!1,!0)},l={get(n){return Xl(this,n,!0)},get size(){return Kl(this,!0)},has(n){return ql.call(this,n,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Gl(!0,!1)},i={get(n){return Xl(this,n,!0,!0)},get size(){return Kl(this,!0)},has(n){return ql.call(this,n,!0)},add:xt("add"),set:xt("set"),delete:xt("delete"),clear:xt("clear"),forEach:Gl(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(n=>{e[n]=Ql(n,!1,!1),l[n]=Ql(n,!0,!1),t[n]=Ql(n,!1,!0),i[n]=Ql(n,!0,!0)}),[e,l,t,i]}const[Os,Fs,zs,Ds]=ws();function Eo(e,t){const l=t?e?Ds:zs:e?Fs:Os;return(i,o,n)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?i:Reflect.get(de(l,o)&&o in i?l:i,o,n)}const Ms={get:Eo(!1,!1)},Hs={get:Eo(!1,!0)},Ss={get:Eo(!0,!1)},Ca=new WeakMap,Ra=new WeakMap,La=new WeakMap,Vs=new WeakMap;function Ns(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function js(e){return e.__v_skip||!Object.isExtensible(e)?0:Ns(cs(e))}function gl(e){return Ol(e)?e:Ro(e,!1,Ea,Ms,Ca)}function $s(e){return Ro(e,!1,Is,Hs,Ra)}function Co(e){return Ro(e,!0,Ts,Ss,La)}function Ro(e,t,l,i,o){if(!Oe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const n=o.get(e);if(n)return n;const a=js(e);if(a===0)return e;const r=new Proxy(e,a===2?i:l);return o.set(e,r),r}function sl(e){return Ol(e)?sl(e.__v_raw):!!(e&&e.__v_isReactive)}function Ol(e){return!!(e&&e.__v_isReadonly)}function Gi(e){return!!(e&&e.__v_isShallow)}function Pa(e){return sl(e)||Ol(e)}function ke(e){const t=e&&e.__v_raw;return t?ke(t):e}function Aa(e){return ni(e,"__v_skip",!0),e}const Fl=e=>Oe(e)?gl(e):e,Lo=e=>Oe(e)?Co(e):e;function Ta(e){It&&nt&&(e=ke(e),_a(e.dep||(e.dep=bo())))}function Ia(e,t){e=ke(e),e.dep&&Ki(e.dep)}function De(e){return!!(e&&e.__v_isRef===!0)}function ye(e){return Oa(e,!1)}function wa(e){return Oa(e,!0)}function Oa(e,t){return De(e)?e:new Ys(e,t)}class Ys{constructor(t,l){this.__v_isShallow=l,this.dep=void 0,this.__v_isRef=!0,this._rawValue=l?t:ke(t),this._value=l?t:Fl(t)}get value(){return Ta(this),this._value}set value(t){t=this.__v_isShallow?t:ke(t),wl(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:Fl(t),Ia(this))}}function O(e){return De(e)?e.value:e}const Bs={get:(e,t,l)=>O(Reflect.get(e,t,l)),set:(e,t,l,i)=>{const o=e[t];return De(o)&&!De(l)?(o.value=l,!0):Reflect.set(e,t,l,i)}};function Fa(e){return sl(e)?e:new Proxy(e,Bs)}function Ei(e){const t=te(e)?new Array(e.length):{};for(const l in e)t[l]=Ws(e,l);return t}class Us{constructor(t,l,i){this._object=t,this._key=l,this._defaultValue=i,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Ws(e,t,l){const i=e[t];return De(i)?i:new Us(e,t,l)}class Xs{constructor(t,l,i,o){this._setter=l,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new _o(t,()=>{this._dirty||(this._dirty=!0,Ia(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=i}get value(){const t=ke(this);return Ta(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function qs(e,t,l=!1){let i,o;const n=ae(e);return n?(i=e,o=rt):(i=e.get,o=e.set),new Xs(i,o,n||!o,l)}function wt(e,t,l,i){let o;try{o=i?e(...i):e()}catch(n){Nl(n,t,l)}return o}function lt(e,t,l,i){if(ae(e)){const n=wt(e,t,l,i);return n&&pa(n)&&n.catch(a=>{Nl(a,t,l)}),n}const o=[];for(let n=0;n>>1;zl(qe[i])ft&&qe.splice(t,1)}function Ma(e,t,l,i){te(e)?l.push(...e):(!t||!t.includes(e,e.allowRecurse?i+1:i))&&l.push(e),Da()}function Zs(e){Ma(e,El,Rl,il)}function Js(e){Ma(e,Lt,Ll,ol)}function Ci(e,t=null){if(Rl.length){for(Zi=t,El=[...new Set(Rl)],Rl.length=0,il=0;ilzl(l)-zl(i)),ol=0;ole.id==null?1/0:e.id;function Ha(e){Qi=!1,ai=!0,Ci(e),qe.sort((l,i)=>zl(l)-zl(i));const t=rt;try{for(ft=0;ftg.trim())),p&&(o=l.map(ga))}let r,s=i[r=Oi(t)]||i[r=Oi(ut(t))];!s&&n&&(s=i[r=Oi(Zt(t))]),s&<(s,e,6,o);const c=i[r+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[r])return;e.emitted[r]=!0,lt(c,e,6,o)}}function Sa(e,t,l=!1){const i=t.emitsCache,o=i.get(e);if(o!==void 0)return o;const n=e.emits;let a={},r=!1;if(!ae(e)){const s=c=>{const h=Sa(c,t,!0);h&&(r=!0,Se(a,h))};!l&&t.mixins.length&&t.mixins.forEach(s),e.extends&&s(e.extends),e.mixins&&e.mixins.forEach(s)}return!n&&!r?(i.set(e,null),null):(te(n)?n.forEach(s=>a[s]=null):Se(a,n),i.set(e,a),a)}function Ri(e,t){return!e||!Vl(t)?!1:(t=t.slice(2).replace(/Once$/,""),de(e,t[0].toLowerCase()+t.slice(1))||de(e,Zt(t))||de(e,t))}let Ve=null,Va=null;function si(e){const t=Ve;return Ve=e,Va=e&&e.type.__scopeId||null,t}function He(e,t=Ve,l){if(!t||e._n)return e;const i=(...o)=>{i._d&&pn(-1);const n=si(t),a=e(...o);return si(n),i._d&&pn(1),a};return i._n=!0,i._c=!0,i._d=!0,i}function zi(e){const{type:t,vnode:l,proxy:i,withProxy:o,props:n,propsOptions:[a],slots:r,attrs:s,emit:c,render:h,renderCache:p,data:m,setupState:g,ctx:x,inheritAttrs:L}=e;let E,k;const b=si(e);try{if(l.shapeFlag&4){const H=o||i;E=ot(h.call(H,H,p,n,g,m,x)),k=s}else{const H=t;E=ot(H.length>1?H(n,{attrs:s,slots:r,emit:c}):H(n,null)),k=t.props?s:tc(s)}}catch(H){Al.length=0,Nl(H,e,1),E=oe(Ge)}let P=E;if(k&&L!==!1){const H=Object.keys(k),{shapeFlag:U}=P;H.length&&U&7&&(a&&H.some(fo)&&(k=lc(k,a)),P=Dt(P,k))}return l.dirs&&(P=Dt(P),P.dirs=P.dirs?P.dirs.concat(l.dirs):l.dirs),l.transition&&(P.transition=l.transition),E=P,si(b),E}const tc=e=>{let t;for(const l in e)(l==="class"||l==="style"||Vl(l))&&((t||(t={}))[l]=e[l]);return t},lc=(e,t)=>{const l={};for(const i in e)(!fo(i)||!(i.slice(9)in t))&&(l[i]=e[i]);return l};function ic(e,t,l){const{props:i,children:o,component:n}=e,{props:a,children:r,patchFlag:s}=t,c=n.emitsOptions;if(t.dirs||t.transition)return!0;if(l&&s>=0){if(s&1024)return!0;if(s&16)return i?ln(i,a,c):!!a;if(s&8){const h=t.dynamicProps;for(let p=0;pe.__isSuspense;function Na(e,t){t&&t.pendingBranch?te(e)?t.effects.push(...e):t.effects.push(e):Js(e)}function Gt(e,t){if(Fe){let l=Fe.provides;const i=Fe.parent&&Fe.parent.provides;i===l&&(l=Fe.provides=Object.create(i)),l[e]=t}}function Me(e,t,l=!1){const i=Fe||Ve;if(i){const o=i.parent==null?i.vnode.appContext&&i.vnode.appContext.provides:i.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return l&&ae(t)?t.call(i.proxy):t}}const on={};function dt(e,t,l){return ja(e,t,l)}function ja(e,t,{immediate:l,deep:i,flush:o,onTrack:n,onTrigger:a}=Ce){const r=Fe;let s,c=!1,h=!1;if(De(e)?(s=()=>e.value,c=Gi(e)):sl(e)?(s=()=>e,i=!0):te(e)?(h=!0,c=e.some(k=>sl(k)||Gi(k)),s=()=>e.map(k=>{if(De(k))return k.value;if(sl(k))return qt(k);if(ae(k))return wt(k,r,2)})):ae(e)?t?s=()=>wt(e,r,2):s=()=>{if(!(r&&r.isUnmounted))return p&&p(),lt(e,r,3,[m])}:s=rt,t&&i){const k=s;s=()=>qt(k())}let p,m=k=>{p=E.onStop=()=>{wt(k,r,4)}};if(dl)return m=rt,t?l&<(t,r,3,[s(),h?[]:void 0,m]):s(),rt;let g=h?[]:on;const x=()=>{if(!!E.active)if(t){const k=E.run();(i||c||(h?k.some((b,P)=>wl(b,g[P])):wl(k,g)))&&(p&&p(),lt(t,r,3,[k,g===on?void 0:g,m]),g=k)}else E.run()};x.allowRecurse=!!t;let L;o==="sync"?L=x:o==="post"?L=()=>Be(x,r&&r.suspense):L=()=>Zs(x);const E=new _o(s,L);return t?l?x():g=E.run():o==="post"?Be(E.run.bind(E),r&&r.suspense):E.run(),()=>{E.stop(),r&&r.scope&&go(r.scope.effects,E)}}function ac(e,t,l){const i=this.proxy,o=be(e)?e.includes(".")?$a(i,e):()=>i[e]:e.bind(i,i);let n;ae(t)?n=t:(n=t.handler,l=t);const a=Fe;hl(this);const r=ja(o,n.bind(i),l);return a?hl(a):Qt(),r}function $a(e,t){const l=t.split(".");return()=>{let i=e;for(let o=0;o{qt(l,t)});else if(fa(e))for(const l in e)qt(e[l],t);return e}function rc(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ze(()=>{e.isMounted=!0}),Yl(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],sc={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},setup(e,{slots:t}){const l=wo(),i=rc();let o;return()=>{const n=t.default&&Ua(t.default(),!0);if(!n||!n.length)return;let a=n[0];if(n.length>1){for(const L of n)if(L.type!==Ge){a=L;break}}const r=ke(e),{mode:s}=r;if(i.isLeaving)return Di(a);const c=nn(a);if(!c)return Di(a);const h=Ji(c,r,i,l);eo(c,h);const p=l.subTree,m=p&&nn(p);let g=!1;const{getTransitionKey:x}=c.type;if(x){const L=x();o===void 0?o=L:L!==o&&(o=L,g=!0)}if(m&&m.type!==Ge&&(!Wt(c,m)||g)){const L=Ji(m,r,i,l);if(eo(m,L),s==="out-in")return i.isLeaving=!0,L.afterLeave=()=>{i.isLeaving=!1,l.update()},Di(a);s==="in-out"&&c.type!==Ge&&(L.delayLeave=(E,k,b)=>{const P=Ba(i,m);P[String(m.key)]=m,E._leaveCb=()=>{k(),E._leaveCb=void 0,delete h.delayedLeave},h.delayedLeave=b})}return a}}},Ya=sc;function Ba(e,t){const{leavingVNodes:l}=e;let i=l.get(t.type);return i||(i=Object.create(null),l.set(t.type,i)),i}function Ji(e,t,l,i){const{appear:o,mode:n,persisted:a=!1,onBeforeEnter:r,onEnter:s,onAfterEnter:c,onEnterCancelled:h,onBeforeLeave:p,onLeave:m,onAfterLeave:g,onLeaveCancelled:x,onBeforeAppear:L,onAppear:E,onAfterAppear:k,onAppearCancelled:b}=t,P=String(e.key),H=Ba(l,e),U=(v,q)=>{v&<(v,i,9,q)},ee=(v,q)=>{const B=q[1];U(v,q),te(v)?v.every(G=>G.length<=1)&&B():v.length<=1&&B()},w={mode:n,persisted:a,beforeEnter(v){let q=r;if(!l.isMounted)if(o)q=L||r;else return;v._leaveCb&&v._leaveCb(!0);const B=H[P];B&&Wt(e,B)&&B.el._leaveCb&&B.el._leaveCb(),U(q,[v])},enter(v){let q=s,B=c,G=h;if(!l.isMounted)if(o)q=E||s,B=k||c,G=b||h;else return;let C=!1;const S=v._enterCb=F=>{C||(C=!0,F?U(G,[v]):U(B,[v]),w.delayedLeave&&w.delayedLeave(),v._enterCb=void 0)};q?ee(q,[v,S]):S()},leave(v,q){const B=String(e.key);if(v._enterCb&&v._enterCb(!0),l.isUnmounting)return q();U(p,[v]);let G=!1;const C=v._leaveCb=S=>{G||(G=!0,q(),S?U(x,[v]):U(g,[v]),v._leaveCb=void 0,H[B]===e&&delete H[B])};H[B]=e,m?ee(m,[v,C]):C()},clone(v){return Ji(v,t,l,i)}};return w}function Di(e){if($l(e))return e=Dt(e),e.children=null,e}function nn(e){return $l(e)?e.children?e.children[0]:void 0:e}function eo(e,t){e.shapeFlag&6&&e.component?eo(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ua(e,t=!1,l){let i=[],o=0;for(let n=0;n1)for(let n=0;n!!e.type.__asyncLoader;function _(e){ae(e)&&(e={loader:e});const{loader:t,loadingComponent:l,errorComponent:i,delay:o=200,timeout:n,suspensible:a=!0,onError:r}=e;let s=null,c,h=0;const p=()=>(h++,s=null,m()),m=()=>{let g;return s||(g=s=t().catch(x=>{if(x=x instanceof Error?x:new Error(String(x)),r)return new Promise((L,E)=>{r(x,()=>L(p()),()=>E(x),h+1)});throw x}).then(x=>g!==s&&s?s:(x&&(x.__esModule||x[Symbol.toStringTag]==="Module")&&(x=x.default),c=x,x)))};return ue({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return c},setup(){const g=Fe;if(c)return()=>Mi(c,g);const x=b=>{s=null,Nl(b,g,13,!i)};if(a&&g.suspense||dl)return m().then(b=>()=>Mi(b,g)).catch(b=>(x(b),()=>i?oe(i,{error:b}):null));const L=ye(!1),E=ye(),k=ye(!!o);return o&&setTimeout(()=>{k.value=!1},o),n!=null&&setTimeout(()=>{if(!L.value&&!E.value){const b=new Error(`Async component timed out after ${n}ms.`);x(b),E.value=b}},n),m().then(()=>{L.value=!0,g.parent&&$l(g.parent.vnode)&&Ao(g.parent.update)}).catch(b=>{x(b),E.value=b}),()=>{if(L.value&&c)return Mi(c,g);if(E.value&&i)return oe(i,{error:E.value});if(l&&!k.value)return oe(l)}}})}function Mi(e,{vnode:{ref:t,props:l,children:i,shapeFlag:o},parent:n}){const a=oe(e,l,i);return a.ref=t,a}const $l=e=>e.type.__isKeepAlive;function cc(e,t){Wa(e,"a",t)}function hc(e,t){Wa(e,"da",t)}function Wa(e,t,l=Fe){const i=e.__wdc||(e.__wdc=()=>{let o=l;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Li(t,i,l),l){let o=l.parent;for(;o&&o.parent;)$l(o.parent.vnode)&&dc(i,t,l,o),o=o.parent}}function dc(e,t,l,i){const o=Li(t,e,i,!0);Pi(()=>{go(i[t],o)},l)}function Li(e,t,l=Fe,i=!1){if(l){const o=l[e]||(l[e]=[]),n=t.__weh||(t.__weh=(...a)=>{if(l.isUnmounted)return;ml(),hl(l);const r=lt(t,l,e,a);return Qt(),fl(),r});return i?o.unshift(n):o.push(n),n}}const yt=e=>(t,l=Fe)=>(!dl||e==="sp")&&Li(e,t,l),Xa=yt("bm"),Ze=yt("m"),uc=yt("bu"),pc=yt("u"),Yl=yt("bum"),Pi=yt("um"),mc=yt("sp"),fc=yt("rtg"),gc=yt("rtc");function kc(e,t=Fe){Li("ec",e,t)}function ci(e,t){const l=Ve;if(l===null)return e;const i=Ti(l)||l.proxy,o=e.dirs||(e.dirs=[]);for(let n=0;nt(a,r,void 0,n&&n[r]));else{const a=Object.keys(e);o=new Array(a.length);for(let r=0,s=a.length;rpi(t)?!(t.type===Ge||t.type===Le&&!Ka(t.children)):!0)?e:null}const to=e=>e?rr(e)?Ti(e)||e.proxy:to(e.parent):null,hi=Se(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>to(e.parent),$root:e=>to(e.root),$emit:e=>e.emit,$options:e=>Qa(e),$forceUpdate:e=>e.f||(e.f=()=>Ao(e.update)),$nextTick:e=>e.n||(e.n=jl.bind(e.proxy)),$watch:e=>ac.bind(e)}),_c={get({_:e},t){const{ctx:l,setupState:i,data:o,props:n,accessCache:a,type:r,appContext:s}=e;let c;if(t[0]!=="$"){const g=a[t];if(g!==void 0)switch(g){case 1:return i[t];case 2:return o[t];case 4:return l[t];case 3:return n[t]}else{if(i!==Ce&&de(i,t))return a[t]=1,i[t];if(o!==Ce&&de(o,t))return a[t]=2,o[t];if((c=e.propsOptions[0])&&de(c,t))return a[t]=3,n[t];if(l!==Ce&&de(l,t))return a[t]=4,l[t];lo&&(a[t]=0)}}const h=hi[t];let p,m;if(h)return t==="$attrs"&&Qe(e,"get",t),h(e);if((p=r.__cssModules)&&(p=p[t]))return p;if(l!==Ce&&de(l,t))return a[t]=4,l[t];if(m=s.config.globalProperties,de(m,t))return m[t]},set({_:e},t,l){const{data:i,setupState:o,ctx:n}=e;return o!==Ce&&de(o,t)?(o[t]=l,!0):i!==Ce&&de(i,t)?(i[t]=l,!0):de(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(n[t]=l,!0)},has({_:{data:e,setupState:t,accessCache:l,ctx:i,appContext:o,propsOptions:n}},a){let r;return!!l[a]||e!==Ce&&de(e,a)||t!==Ce&&de(t,a)||(r=n[0])&&de(r,a)||de(i,a)||de(hi,a)||de(o.config.globalProperties,a)},defineProperty(e,t,l){return l.get!=null?e._.accessCache[t]=0:de(l,"value")&&this.set(e,t,l.value,null),Reflect.defineProperty(e,t,l)}};let lo=!0;function yc(e){const t=Qa(e),l=e.proxy,i=e.ctx;lo=!1,t.beforeCreate&&rn(t.beforeCreate,e,"bc");const{data:o,computed:n,methods:a,watch:r,provide:s,inject:c,created:h,beforeMount:p,mounted:m,beforeUpdate:g,updated:x,activated:L,deactivated:E,beforeDestroy:k,beforeUnmount:b,destroyed:P,unmounted:H,render:U,renderTracked:ee,renderTriggered:w,errorCaptured:v,serverPrefetch:q,expose:B,inheritAttrs:G,components:C,directives:S,filters:F}=t;if(c&&xc(c,i,null,e.appContext.config.unwrapInjectedRef),a)for(const le in a){const se=a[le];ae(se)&&(i[le]=se.bind(l))}if(o){const le=o.call(l,l);Oe(le)&&(e.data=gl(le))}if(lo=!0,n)for(const le in n){const se=n[le],Ie=ae(se)?se.bind(l,l):ae(se.get)?se.get.bind(l,l):rt,Ne=!ae(se)&&ae(se.set)?se.set.bind(l):rt,Ue=Y({get:Ie,set:Ne});Object.defineProperty(i,le,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:Je=>Ue.value=Je})}if(r)for(const le in r)Ga(r[le],i,l,le);if(s){const le=ae(s)?s.call(l):s;Reflect.ownKeys(le).forEach(se=>{Gt(se,le[se])})}h&&rn(h,e,"c");function j(le,se){te(se)?se.forEach(Ie=>le(Ie.bind(l))):se&&le(se.bind(l))}if(j(Xa,p),j(Ze,m),j(uc,g),j(pc,x),j(cc,L),j(hc,E),j(kc,v),j(gc,ee),j(fc,w),j(Yl,b),j(Pi,H),j(mc,q),te(B))if(B.length){const le=e.exposed||(e.exposed={});B.forEach(se=>{Object.defineProperty(le,se,{get:()=>l[se],set:Ie=>l[se]=Ie})})}else e.exposed||(e.exposed={});U&&e.render===rt&&(e.render=U),G!=null&&(e.inheritAttrs=G),C&&(e.components=C),S&&(e.directives=S)}function xc(e,t,l=rt,i=!1){te(e)&&(e=io(e));for(const o in e){const n=e[o];let a;Oe(n)?"default"in n?a=Me(n.from||o,n.default,!0):a=Me(n.from||o):a=Me(n),De(a)&&i?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>a.value,set:r=>a.value=r}):t[o]=a}}function rn(e,t,l){lt(te(e)?e.map(i=>i.bind(t.proxy)):e.bind(t.proxy),t,l)}function Ga(e,t,l,i){const o=i.includes(".")?$a(l,i):()=>l[i];if(be(e)){const n=t[e];ae(n)&&dt(o,n)}else if(ae(e))dt(o,e.bind(l));else if(Oe(e))if(te(e))e.forEach(n=>Ga(n,t,l,i));else{const n=ae(e.handler)?e.handler.bind(l):t[e.handler];ae(n)&&dt(o,n,e)}}function Qa(e){const t=e.type,{mixins:l,extends:i}=t,{mixins:o,optionsCache:n,config:{optionMergeStrategies:a}}=e.appContext,r=n.get(t);let s;return r?s=r:!o.length&&!l&&!i?s=t:(s={},o.length&&o.forEach(c=>di(s,c,a,!0)),di(s,t,a)),n.set(t,s),s}function di(e,t,l,i=!1){const{mixins:o,extends:n}=t;n&&di(e,n,l,!0),o&&o.forEach(a=>di(e,a,l,!0));for(const a in t)if(!(i&&a==="expose")){const r=Ec[a]||l&&l[a];e[a]=r?r(e[a],t[a]):t[a]}return e}const Ec={data:sn,props:Yt,emits:Yt,methods:Yt,computed:Yt,beforeCreate:je,created:je,beforeMount:je,mounted:je,beforeUpdate:je,updated:je,beforeDestroy:je,beforeUnmount:je,destroyed:je,unmounted:je,activated:je,deactivated:je,errorCaptured:je,serverPrefetch:je,components:Yt,directives:Yt,watch:Rc,provide:sn,inject:Cc};function sn(e,t){return t?e?function(){return Se(ae(e)?e.call(this,this):e,ae(t)?t.call(this,this):t)}:t:e}function Cc(e,t){return Yt(io(e),io(t))}function io(e){if(te(e)){const t={};for(let l=0;l0)&&!(a&16)){if(a&8){const h=e.vnode.dynamicProps;for(let p=0;p{s=!0;const[m,g]=Ja(p,t,!0);Se(a,m),g&&r.push(...g)};!l&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!n&&!s)return i.set(e,al),al;if(te(n))for(let h=0;h-1,g[1]=L<0||x-1||de(g,"default"))&&r.push(p)}}}const c=[a,r];return i.set(e,c),c}function cn(e){return e[0]!=="$"}function hn(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function dn(e,t){return hn(e)===hn(t)}function un(e,t){return te(t)?t.findIndex(l=>dn(l,e)):ae(t)&&dn(t,e)?0:-1}const er=e=>e[0]==="_"||e==="$stable",To=e=>te(e)?e.map(ot):[ot(e)],Ac=(e,t,l)=>{if(t._n)return t;const i=He((...o)=>To(t(...o)),l);return i._c=!1,i},tr=(e,t,l)=>{const i=e._ctx;for(const o in e){if(er(o))continue;const n=e[o];if(ae(n))t[o]=Ac(o,n,i);else if(n!=null){const a=To(n);t[o]=()=>a}}},lr=(e,t)=>{const l=To(t);e.slots.default=()=>l},Tc=(e,t)=>{if(e.vnode.shapeFlag&32){const l=t._;l?(e.slots=ke(t),ni(t,"_",l)):tr(t,e.slots={})}else e.slots={},t&&lr(e,t);ni(e.slots,Ai,1)},Ic=(e,t,l)=>{const{vnode:i,slots:o}=e;let n=!0,a=Ce;if(i.shapeFlag&32){const r=t._;r?l&&r===1?n=!1:(Se(o,t),!l&&r===1&&delete o._):(n=!t.$stable,tr(t,o)),a=t}else t&&(lr(e,t),a={default:1});if(n)for(const r in o)!er(r)&&!(r in a)&&delete o[r]};function ir(){return{app:null,config:{isNativeTag:as,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let wc=0;function Oc(e,t){return function(i,o=null){ae(i)||(i=Object.assign({},i)),o!=null&&!Oe(o)&&(o=null);const n=ir(),a=new Set;let r=!1;const s=n.app={_uid:wc++,_component:i,_props:o,_container:null,_context:n,_instance:null,version:Qc,get config(){return n.config},set config(c){},use(c,...h){return a.has(c)||(c&&ae(c.install)?(a.add(c),c.install(s,...h)):ae(c)&&(a.add(c),c(s,...h))),s},mixin(c){return n.mixins.includes(c)||n.mixins.push(c),s},component(c,h){return h?(n.components[c]=h,s):n.components[c]},directive(c,h){return h?(n.directives[c]=h,s):n.directives[c]},mount(c,h,p){if(!r){const m=oe(i,o);return m.appContext=n,h&&t?t(m,c):e(m,c,p),r=!0,s._container=c,c.__vue_app__=s,Ti(m.component)||m.component.proxy}},unmount(){r&&(e(null,s._container),delete s._container.__vue_app__)},provide(c,h){return n.provides[c]=h,s}};return s}}function ui(e,t,l,i,o=!1){if(te(e)){e.forEach((m,g)=>ui(m,t&&(te(t)?t[g]:t),l,i,o));return}if(cl(i)&&!o)return;const n=i.shapeFlag&4?Ti(i.component)||i.component.proxy:i.el,a=o?null:n,{i:r,r:s}=e,c=t&&t.r,h=r.refs===Ce?r.refs={}:r.refs,p=r.setupState;if(c!=null&&c!==s&&(be(c)?(h[c]=null,de(p,c)&&(p[c]=null)):De(c)&&(c.value=null)),ae(s))wt(s,r,12,[a,h]);else{const m=be(s),g=De(s);if(m||g){const x=()=>{if(e.f){const L=m?h[s]:s.value;o?te(L)&&go(L,n):te(L)?L.includes(n)||L.push(n):m?(h[s]=[n],de(p,s)&&(p[s]=h[s])):(s.value=[n],e.k&&(h[e.k]=s.value))}else m?(h[s]=a,de(p,s)&&(p[s]=a)):g&&(s.value=a,e.k&&(h[e.k]=a))};a?(x.id=-1,Be(x,l)):x()}}}let Et=!1;const Zl=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Jl=e=>e.nodeType===8;function Fc(e){const{mt:t,p:l,o:{patchProp:i,createText:o,nextSibling:n,parentNode:a,remove:r,insert:s,createComment:c}}=e,h=(k,b)=>{if(!b.hasChildNodes()){l(null,k,b),ri(),b._vnode=k;return}Et=!1,p(b.firstChild,k,null,null,null),ri(),b._vnode=k,Et&&console.error("Hydration completed but contains mismatches.")},p=(k,b,P,H,U,ee=!1)=>{const w=Jl(k)&&k.data==="[",v=()=>L(k,b,P,H,U,w),{type:q,ref:B,shapeFlag:G,patchFlag:C}=b,S=k.nodeType;b.el=k,C===-2&&(ee=!1,b.dynamicChildren=null);let F=null;switch(q){case Dl:S!==3?b.children===""?(s(b.el=o(""),a(k),k),F=k):F=v():(k.data!==b.children&&(Et=!0,k.data=b.children),F=n(k));break;case Ge:S!==8||w?F=v():F=n(k);break;case Pl:if(S!==1&&S!==3)F=v();else{F=k;const re=!b.children.length;for(let j=0;j{ee=ee||!!b.dynamicChildren;const{type:w,props:v,patchFlag:q,shapeFlag:B,dirs:G}=b,C=w==="input"&&G||w==="option";if(C||q!==-1){if(G&&ht(b,null,P,"created"),v)if(C||!ee||q&48)for(const F in v)(C&&F.endsWith("value")||Vl(F)&&!Cl(F))&&i(k,F,null,v[F],!1,void 0,P);else v.onClick&&i(k,"onClick",null,v.onClick,!1,void 0,P);let S;if((S=v&&v.onVnodeBeforeMount)&&tt(S,P,b),G&&ht(b,null,P,"beforeMount"),((S=v&&v.onVnodeMounted)||G)&&Na(()=>{S&&tt(S,P,b),G&&ht(b,null,P,"mounted")},H),B&16&&!(v&&(v.innerHTML||v.textContent))){let F=g(k.firstChild,b,k,P,H,U,ee);for(;F;){Et=!0;const re=F;F=F.nextSibling,r(re)}}else B&8&&k.textContent!==b.children&&(Et=!0,k.textContent=b.children)}return k.nextSibling},g=(k,b,P,H,U,ee,w)=>{w=w||!!b.dynamicChildren;const v=b.children,q=v.length;for(let B=0;B{const{slotScopeIds:w}=b;w&&(U=U?U.concat(w):w);const v=a(k),q=g(n(k),b,v,P,H,U,ee);return q&&Jl(q)&&q.data==="]"?n(b.anchor=q):(Et=!0,s(b.anchor=c("]"),v,q),q)},L=(k,b,P,H,U,ee)=>{if(Et=!0,b.el=null,ee){const q=E(k);for(;;){const B=n(k);if(B&&B!==q)r(B);else break}}const w=n(k),v=a(k);return r(k),l(null,b,v,w,P,H,Zl(v),U),w},E=k=>{let b=0;for(;k;)if(k=n(k),k&&Jl(k)&&(k.data==="["&&b++,k.data==="]")){if(b===0)return n(k);b--}return k};return[h,p]}const Be=Na;function zc(e){return Dc(e,Fc)}function Dc(e,t){const l=us();l.__VUE__=!0;const{insert:i,remove:o,patchProp:n,createElement:a,createText:r,createComment:s,setText:c,setElementText:h,parentNode:p,nextSibling:m,setScopeId:g=rt,cloneNode:x,insertStaticContent:L}=e,E=(u,f,y,T=null,A=null,z=null,$=!1,D=null,V=!!f.dynamicChildren)=>{if(u===f)return;u&&!Wt(u,f)&&(T=X(u),Ye(u,A,z,!0),u=null),f.patchFlag===-2&&(V=!1,f.dynamicChildren=null);const{type:I,ref:Q,shapeFlag:K}=f;switch(I){case Dl:k(u,f,y,T);break;case Ge:b(u,f,y,T);break;case Pl:u==null&&P(f,y,T,$);break;case Le:S(u,f,y,T,A,z,$,D,V);break;default:K&1?ee(u,f,y,T,A,z,$,D,V):K&6?F(u,f,y,T,A,z,$,D,V):(K&64||K&128)&&I.process(u,f,y,T,A,z,$,D,V,_e)}Q!=null&&A&&ui(Q,u&&u.ref,z,f||u,!f)},k=(u,f,y,T)=>{if(u==null)i(f.el=r(f.children),y,T);else{const A=f.el=u.el;f.children!==u.children&&c(A,f.children)}},b=(u,f,y,T)=>{u==null?i(f.el=s(f.children||""),y,T):f.el=u.el},P=(u,f,y,T)=>{[u.el,u.anchor]=L(u.children,f,y,T,u.el,u.anchor)},H=({el:u,anchor:f},y,T)=>{let A;for(;u&&u!==f;)A=m(u),i(u,y,T),u=A;i(f,y,T)},U=({el:u,anchor:f})=>{let y;for(;u&&u!==f;)y=m(u),o(u),u=y;o(f)},ee=(u,f,y,T,A,z,$,D,V)=>{$=$||f.type==="svg",u==null?w(f,y,T,A,z,$,D,V):B(u,f,A,z,$,D,V)},w=(u,f,y,T,A,z,$,D)=>{let V,I;const{type:Q,props:K,shapeFlag:Z,transition:ne,patchFlag:pe,dirs:xe}=u;if(u.el&&x!==void 0&&pe===-1)V=u.el=x(u.el);else{if(V=u.el=a(u.type,z,K&&K.is,K),Z&8?h(V,u.children):Z&16&&q(u.children,V,null,T,A,z&&Q!=="foreignObject",$,D),xe&&ht(u,null,T,"created"),K){for(const Pe in K)Pe!=="value"&&!Cl(Pe)&&n(V,Pe,null,K[Pe],z,u.children,T,A,M);"value"in K&&n(V,"value",null,K.value),(I=K.onVnodeBeforeMount)&&tt(I,T,u)}v(V,u,u.scopeId,$,T)}xe&&ht(u,null,T,"beforeMount");const Ee=(!A||A&&!A.pendingBranch)&&ne&&!ne.persisted;Ee&&ne.beforeEnter(V),i(V,f,y),((I=K&&K.onVnodeMounted)||Ee||xe)&&Be(()=>{I&&tt(I,T,u),Ee&&ne.enter(V),xe&&ht(u,null,T,"mounted")},A)},v=(u,f,y,T,A)=>{if(y&&g(u,y),T)for(let z=0;z{for(let I=V;I{const D=f.el=u.el;let{patchFlag:V,dynamicChildren:I,dirs:Q}=f;V|=u.patchFlag&16;const K=u.props||Ce,Z=f.props||Ce;let ne;y&&Nt(y,!1),(ne=Z.onVnodeBeforeUpdate)&&tt(ne,y,f,u),Q&&ht(f,u,y,"beforeUpdate"),y&&Nt(y,!0);const pe=A&&f.type!=="foreignObject";if(I?G(u.dynamicChildren,I,D,y,T,pe,z):$||Ie(u,f,D,null,y,T,pe,z,!1),V>0){if(V&16)C(D,f,K,Z,y,T,A);else if(V&2&&K.class!==Z.class&&n(D,"class",null,Z.class,A),V&4&&n(D,"style",K.style,Z.style,A),V&8){const xe=f.dynamicProps;for(let Ee=0;Ee{ne&&tt(ne,y,f,u),Q&&ht(f,u,y,"updated")},T)},G=(u,f,y,T,A,z,$)=>{for(let D=0;D{if(y!==T){for(const D in T){if(Cl(D))continue;const V=T[D],I=y[D];V!==I&&D!=="value"&&n(u,D,I,V,$,f.children,A,z,M)}if(y!==Ce)for(const D in y)!Cl(D)&&!(D in T)&&n(u,D,y[D],null,$,f.children,A,z,M);"value"in T&&n(u,"value",y.value,T.value)}},S=(u,f,y,T,A,z,$,D,V)=>{const I=f.el=u?u.el:r(""),Q=f.anchor=u?u.anchor:r("");let{patchFlag:K,dynamicChildren:Z,slotScopeIds:ne}=f;ne&&(D=D?D.concat(ne):ne),u==null?(i(I,y,T),i(Q,y,T),q(f.children,y,Q,A,z,$,D,V)):K>0&&K&64&&Z&&u.dynamicChildren?(G(u.dynamicChildren,Z,y,A,z,$,D),(f.key!=null||A&&f===A.subTree)&&or(u,f,!0)):Ie(u,f,y,Q,A,z,$,D,V)},F=(u,f,y,T,A,z,$,D,V)=>{f.slotScopeIds=D,u==null?f.shapeFlag&512?A.ctx.activate(f,y,T,$,V):re(f,y,T,A,z,$,V):j(u,f,V)},re=(u,f,y,T,A,z,$)=>{const D=u.component=Bc(u,T,A);if($l(u)&&(D.ctx.renderer=_e),Uc(D),D.asyncDep){if(A&&A.registerDep(D,le),!u.el){const V=D.subTree=oe(Ge);b(null,V,f,y)}return}le(D,u,f,y,A,z,$)},j=(u,f,y)=>{const T=f.component=u.component;if(ic(u,f,y))if(T.asyncDep&&!T.asyncResolved){se(T,f,y);return}else T.next=f,Qs(T.update),T.update();else f.el=u.el,T.vnode=f},le=(u,f,y,T,A,z,$)=>{const D=()=>{if(u.isMounted){let{next:Q,bu:K,u:Z,parent:ne,vnode:pe}=u,xe=Q,Ee;Nt(u,!1),Q?(Q.el=pe.el,se(u,Q,$)):Q=pe,K&&Fi(K),(Ee=Q.props&&Q.props.onVnodeBeforeUpdate)&&tt(Ee,ne,Q,pe),Nt(u,!0);const Pe=zi(u),it=u.subTree;u.subTree=Pe,E(it,Pe,p(it.el),X(it),u,A,z),Q.el=Pe.el,xe===null&&oc(u,Pe.el),Z&&Be(Z,A),(Ee=Q.props&&Q.props.onVnodeUpdated)&&Be(()=>tt(Ee,ne,Q,pe),A)}else{let Q;const{el:K,props:Z}=f,{bm:ne,m:pe,parent:xe}=u,Ee=cl(f);if(Nt(u,!1),ne&&Fi(ne),!Ee&&(Q=Z&&Z.onVnodeBeforeMount)&&tt(Q,xe,f),Nt(u,!0),K&&ie){const Pe=()=>{u.subTree=zi(u),ie(K,u.subTree,u,A,null)};Ee?f.type.__asyncLoader().then(()=>!u.isUnmounted&&Pe()):Pe()}else{const Pe=u.subTree=zi(u);E(null,Pe,y,T,u,A,z),f.el=Pe.el}if(pe&&Be(pe,A),!Ee&&(Q=Z&&Z.onVnodeMounted)){const Pe=f;Be(()=>tt(Q,xe,Pe),A)}(f.shapeFlag&256||xe&&cl(xe.vnode)&&xe.vnode.shapeFlag&256)&&u.a&&Be(u.a,A),u.isMounted=!0,f=y=T=null}},V=u.effect=new _o(D,()=>Ao(I),u.scope),I=u.update=()=>V.run();I.id=u.uid,Nt(u,!0),I()},se=(u,f,y)=>{f.component=u;const T=u.vnode.props;u.vnode=f,u.next=null,Pc(u,f.props,T,y),Ic(u,f.children,y),ml(),Ci(void 0,u.update),fl()},Ie=(u,f,y,T,A,z,$,D,V=!1)=>{const I=u&&u.children,Q=u?u.shapeFlag:0,K=f.children,{patchFlag:Z,shapeFlag:ne}=f;if(Z>0){if(Z&128){Ue(I,K,y,T,A,z,$,D,V);return}else if(Z&256){Ne(I,K,y,T,A,z,$,D,V);return}}ne&8?(Q&16&&M(I,A,z),K!==I&&h(y,K)):Q&16?ne&16?Ue(I,K,y,T,A,z,$,D,V):M(I,A,z,!0):(Q&8&&h(y,""),ne&16&&q(K,y,T,A,z,$,D,V))},Ne=(u,f,y,T,A,z,$,D,V)=>{u=u||al,f=f||al;const I=u.length,Q=f.length,K=Math.min(I,Q);let Z;for(Z=0;ZQ?M(u,A,z,!0,!1,K):q(f,y,T,A,z,$,D,V,K)},Ue=(u,f,y,T,A,z,$,D,V)=>{let I=0;const Q=f.length;let K=u.length-1,Z=Q-1;for(;I<=K&&I<=Z;){const ne=u[I],pe=f[I]=V?Pt(f[I]):ot(f[I]);if(Wt(ne,pe))E(ne,pe,y,null,A,z,$,D,V);else break;I++}for(;I<=K&&I<=Z;){const ne=u[K],pe=f[Z]=V?Pt(f[Z]):ot(f[Z]);if(Wt(ne,pe))E(ne,pe,y,null,A,z,$,D,V);else break;K--,Z--}if(I>K){if(I<=Z){const ne=Z+1,pe=neZ)for(;I<=K;)Ye(u[I],A,z,!0),I++;else{const ne=I,pe=I,xe=new Map;for(I=pe;I<=Z;I++){const We=f[I]=V?Pt(f[I]):ot(f[I]);We.key!=null&&xe.set(We.key,I)}let Ee,Pe=0;const it=Z-pe+1;let el=!1,Bo=0;const kl=new Array(it);for(I=0;I=it){Ye(We,A,z,!0);continue}let ct;if(We.key!=null)ct=xe.get(We.key);else for(Ee=pe;Ee<=Z;Ee++)if(kl[Ee-pe]===0&&Wt(We,f[Ee])){ct=Ee;break}ct===void 0?Ye(We,A,z,!0):(kl[ct-pe]=I+1,ct>=Bo?Bo=ct:el=!0,E(We,f[ct],y,null,A,z,$,D,V),Pe++)}const Uo=el?Mc(kl):al;for(Ee=Uo.length-1,I=it-1;I>=0;I--){const We=pe+I,ct=f[We],Wo=We+1{const{el:z,type:$,transition:D,children:V,shapeFlag:I}=u;if(I&6){Je(u.component.subTree,f,y,T);return}if(I&128){u.suspense.move(f,y,T);return}if(I&64){$.move(u,f,y,_e);return}if($===Le){i(z,f,y);for(let K=0;KD.enter(z),A);else{const{leave:K,delayLeave:Z,afterLeave:ne}=D,pe=()=>i(z,f,y),xe=()=>{K(z,()=>{pe(),ne&&ne()})};Z?Z(z,pe,xe):xe()}else i(z,f,y)},Ye=(u,f,y,T=!1,A=!1)=>{const{type:z,props:$,ref:D,children:V,dynamicChildren:I,shapeFlag:Q,patchFlag:K,dirs:Z}=u;if(D!=null&&ui(D,null,y,u,!0),Q&256){f.ctx.deactivate(u);return}const ne=Q&1&&Z,pe=!cl(u);let xe;if(pe&&(xe=$&&$.onVnodeBeforeUnmount)&&tt(xe,f,u),Q&6)W(u.component,y,T);else{if(Q&128){u.suspense.unmount(y,T);return}ne&&ht(u,null,f,"beforeUnmount"),Q&64?u.type.remove(u,f,y,A,_e,T):I&&(z!==Le||K>0&&K&64)?M(I,f,y,!1,!0):(z===Le&&K&384||!A&&Q&16)&&M(V,f,y),T&&Vt(u)}(pe&&(xe=$&&$.onVnodeUnmounted)||ne)&&Be(()=>{xe&&tt(xe,f,u),ne&&ht(u,null,f,"unmounted")},y)},Vt=u=>{const{type:f,el:y,anchor:T,transition:A}=u;if(f===Le){R(y,T);return}if(f===Pl){U(u);return}const z=()=>{o(y),A&&!A.persisted&&A.afterLeave&&A.afterLeave()};if(u.shapeFlag&1&&A&&!A.persisted){const{leave:$,delayLeave:D}=A,V=()=>$(y,z);D?D(u.el,z,V):V()}else z()},R=(u,f)=>{let y;for(;u!==f;)y=m(u),o(u),u=y;o(f)},W=(u,f,y)=>{const{bum:T,scope:A,update:z,subTree:$,um:D}=u;T&&Fi(T),A.stop(),z&&(z.active=!1,Ye($,u,f,y)),D&&Be(D,f),Be(()=>{u.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},M=(u,f,y,T=!1,A=!1,z=0)=>{for(let $=z;$u.shapeFlag&6?X(u.component.subTree):u.shapeFlag&128?u.suspense.next():m(u.anchor||u.el),ge=(u,f,y)=>{u==null?f._vnode&&Ye(f._vnode,null,null,!0):E(f._vnode||null,u,f,null,null,null,y),ri(),f._vnode=u},_e={p:E,um:Ye,m:Je,r:Vt,mt:re,mc:q,pc:Ie,pbc:G,n:X,o:e};let ce,ie;return t&&([ce,ie]=t(_e)),{render:ge,hydrate:ce,createApp:Oc(ge,ce)}}function Nt({effect:e,update:t},l){e.allowRecurse=t.allowRecurse=l}function or(e,t,l=!1){const i=e.children,o=t.children;if(te(i)&&te(o))for(let n=0;n>1,e[l[r]]0&&(t[i]=l[n-1]),l[n]=i)}}for(n=l.length,a=l[n-1];n-- >0;)l[n]=a,a=t[a];return l}const Hc=e=>e.__isTeleport,Le=Symbol(void 0),Dl=Symbol(void 0),Ge=Symbol(void 0),Pl=Symbol(void 0),Al=[];let at=null;function N(e=!1){Al.push(at=e?null:[])}function Sc(){Al.pop(),at=Al[Al.length-1]||null}let Ml=1;function pn(e){Ml+=e}function nr(e){return e.dynamicChildren=Ml>0?at||al:null,Sc(),Ml>0&&at&&at.push(e),e}function J(e,t,l,i,o,n){return nr(fe(e,t,l,i,o,n,!0))}function we(e,t,l,i,o){return nr(oe(e,t,l,i,o,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function Wt(e,t){return e.type===t.type&&e.key===t.key}const Ai="__vInternal",ar=({key:e})=>e!=null?e:null,li=({ref:e,ref_key:t,ref_for:l})=>e!=null?be(e)||De(e)||ae(e)?{i:Ve,r:e,k:t,f:!!l}:e:null;function fe(e,t=null,l=null,i=0,o=null,n=e===Le?0:1,a=!1,r=!1){const s={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ar(t),ref:t&&li(t),scopeId:Va,slotScopeIds:null,children:l,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:n,patchFlag:i,dynamicProps:o,dynamicChildren:null,appContext:null};return r?(Io(s,l),n&128&&e.normalize(s)):l&&(s.shapeFlag|=be(l)?8:16),Ml>0&&!a&&at&&(s.patchFlag>0||n&6)&&s.patchFlag!==32&&at.push(s),s}const oe=Vc;function Vc(e,t=null,l=null,i=0,o=null,n=!1){if((!e||e===vc)&&(e=Ge),pi(e)){const r=Dt(e,t,!0);return l&&Io(r,l),Ml>0&&!n&&at&&(r.shapeFlag&6?at[at.indexOf(e)]=r:at.push(r)),r.patchFlag|=-2,r}if(Gc(e)&&(e=e.__vccOpts),t){t=Nc(t);let{class:r,style:s}=t;r&&!be(r)&&(t.class=Ke(r)),Oe(s)&&(Pa(s)&&!te(s)&&(s=Se({},s)),t.style=Sl(s))}const a=be(e)?1:nc(e)?128:Hc(e)?64:Oe(e)?4:ae(e)?2:0;return fe(e,t,l,i,o,a,n,!0)}function Nc(e){return e?Pa(e)||Ai in e?Se({},e):e:null}function Dt(e,t,l=!1){const{props:i,ref:o,patchFlag:n,children:a}=e,r=t?no(i||{},t):i;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:r,key:r&&ar(r),ref:t&&t.ref?l&&o?te(o)?o.concat(li(t)):[o,li(t)]:li(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Le?n===-1?16:n|16:n,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Dt(e.ssContent),ssFallback:e.ssFallback&&Dt(e.ssFallback),el:e.el,anchor:e.anchor}}function Mt(e=" ",t=0){return oe(Dl,null,e,t)}function jc(e,t){const l=oe(Pl,null,e);return l.staticCount=t,l}function Te(e="",t=!1){return t?(N(),we(Ge,null,e)):oe(Ge,null,e)}function ot(e){return e==null||typeof e=="boolean"?oe(Ge):te(e)?oe(Le,null,e.slice()):typeof e=="object"?Pt(e):oe(Dl,null,String(e))}function Pt(e){return e.el===null||e.memo?e:Dt(e)}function Io(e,t){let l=0;const{shapeFlag:i}=e;if(t==null)t=null;else if(te(t))l=16;else if(typeof t=="object")if(i&65){const o=t.default;o&&(o._c&&(o._d=!1),Io(e,o()),o._c&&(o._d=!0));return}else{l=32;const o=t._;!o&&!(Ai in t)?t._ctx=Ve:o===3&&Ve&&(Ve.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ae(t)?(t={default:t,_ctx:Ve},l=32):(t=String(t),i&64?(l=16,t=[Mt(t)]):l=8);e.children=t,e.shapeFlag|=l}function no(...e){const t={};for(let l=0;lFe||Ve,hl=e=>{Fe=e,e.scope.on()},Qt=()=>{Fe&&Fe.scope.off(),Fe=null};function rr(e){return e.vnode.shapeFlag&4}let dl=!1;function Uc(e,t=!1){dl=t;const{props:l,children:i}=e.vnode,o=rr(e);Lc(e,l,o,t),Tc(e,i);const n=o?Wc(e,t):void 0;return dl=!1,n}function Wc(e,t){const l=e.type;e.accessCache=Object.create(null),e.proxy=Aa(new Proxy(e.ctx,_c));const{setup:i}=l;if(i){const o=e.setupContext=i.length>1?qc(e):null;hl(e),ml();const n=wt(i,e,0,[e.props,o]);if(fl(),Qt(),pa(n)){if(n.then(Qt,Qt),t)return n.then(a=>{mn(e,a,t)}).catch(a=>{Nl(a,e,0)});e.asyncDep=n}else mn(e,n,t)}else sr(e,t)}function mn(e,t,l){ae(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Oe(t)&&(e.setupState=Fa(t)),sr(e,l)}let fn;function sr(e,t,l){const i=e.type;if(!e.render){if(!t&&fn&&!i.render){const o=i.template;if(o){const{isCustomElement:n,compilerOptions:a}=e.appContext.config,{delimiters:r,compilerOptions:s}=i,c=Se(Se({isCustomElement:n,delimiters:r},a),s);i.render=fn(o,c)}}e.render=i.render||rt}hl(e),ml(),yc(e),fl(),Qt()}function Xc(e){return new Proxy(e.attrs,{get(t,l){return Qe(e,"get","$attrs"),t[l]}})}function qc(e){const t=i=>{e.exposed=i||{}};let l;return{get attrs(){return l||(l=Xc(e))},slots:e.slots,emit:e.emit,expose:t}}function Ti(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Fa(Aa(e.exposed)),{get(t,l){if(l in t)return t[l];if(l in hi)return hi[l](e)}}))}function Kc(e,t=!0){return ae(e)?e.displayName||e.name:e.name||t&&e.__name}function Gc(e){return ae(e)&&"__vccOpts"in e}const Y=(e,t)=>qs(e,t,dl);function he(e,t,l){const i=arguments.length;return i===2?Oe(t)&&!te(t)?pi(t)?oe(e,null,[t]):oe(e,t):oe(e,null,t):(i>3?l=Array.prototype.slice.call(arguments,2):i===3&&pi(l)&&(l=[l]),oe(e,t,l))}const Qc="3.2.37",Zc="http://www.w3.org/2000/svg",Xt=typeof document<"u"?document:null,gn=Xt&&Xt.createElement("template"),Jc={insert:(e,t,l)=>{t.insertBefore(e,l||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,l,i)=>{const o=t?Xt.createElementNS(Zc,e):Xt.createElement(e,l?{is:l}:void 0);return e==="select"&&i&&i.multiple!=null&&o.setAttribute("multiple",i.multiple),o},createText:e=>Xt.createTextNode(e),createComment:e=>Xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,l,i,o,n){const a=l?l.previousSibling:t.lastChild;if(o&&(o===n||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),l),!(o===n||!(o=o.nextSibling)););else{gn.innerHTML=i?`${e}`:e;const r=gn.content;if(i){const s=r.firstChild;for(;s.firstChild;)r.appendChild(s.firstChild);r.removeChild(s)}t.insertBefore(r,l)}return[a?a.nextSibling:t.firstChild,l?l.previousSibling:t.lastChild]}};function eh(e,t,l){const i=e._vtc;i&&(t=(t?[t,...i]:[...i]).join(" ")),t==null?e.removeAttribute("class"):l?e.setAttribute("class",t):e.className=t}function th(e,t,l){const i=e.style,o=be(l);if(l&&!o){for(const n in l)ao(i,n,l[n]);if(t&&!be(t))for(const n in t)l[n]==null&&ao(i,n,"")}else{const n=i.display;o?t!==l&&(i.cssText=l):t&&e.removeAttribute("style"),"_vod"in e&&(i.display=n)}}const kn=/\s*!important$/;function ao(e,t,l){if(te(l))l.forEach(i=>ao(e,t,i));else if(l==null&&(l=""),t.startsWith("--"))e.setProperty(t,l);else{const i=lh(e,t);kn.test(l)?e.setProperty(Zt(i),l.replace(kn,""),"important"):e[i]=l}}const vn=["Webkit","Moz","ms"],Hi={};function lh(e,t){const l=Hi[t];if(l)return l;let i=ut(t);if(i!=="filter"&&i in e)return Hi[t]=i;i=yi(i);for(let o=0;o{let e=Date.now,t=!1;if(typeof window<"u"){Date.now()>document.createEvent("Event").timeStamp&&(e=performance.now.bind(performance));const l=navigator.userAgent.match(/firefox\/(\d+)/i);t=!!(l&&Number(l[1])<=53)}return[e,t]})();let ro=0;const ah=Promise.resolve(),rh=()=>{ro=0},sh=()=>ro||(ah.then(rh),ro=cr());function ch(e,t,l,i){e.addEventListener(t,l,i)}function hh(e,t,l,i){e.removeEventListener(t,l,i)}function dh(e,t,l,i,o=null){const n=e._vei||(e._vei={}),a=n[t];if(i&&a)a.value=i;else{const[r,s]=uh(t);if(i){const c=n[t]=ph(i,o);ch(e,r,c,s)}else a&&(hh(e,r,a,s),n[t]=void 0)}}const _n=/(?:Once|Passive|Capture)$/;function uh(e){let t;if(_n.test(e)){t={};let l;for(;l=e.match(_n);)e=e.slice(0,e.length-l[0].length),t[l[0].toLowerCase()]=!0}return[Zt(e.slice(2)),t]}function ph(e,t){const l=i=>{const o=i.timeStamp||cr();(nh||o>=l.attached-1)&<(mh(i,l.value),t,5,[i])};return l.value=e,l.attached=sh(),l}function mh(e,t){if(te(t)){const l=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{l.call(e),e._stopped=!0},t.map(i=>o=>!o._stopped&&i&&i(o))}else return t}const yn=/^on[a-z]/,fh=(e,t,l,i,o=!1,n,a,r,s)=>{t==="class"?eh(e,i,o):t==="style"?th(e,l,i):Vl(t)?fo(t)||dh(e,t,l,i,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):gh(e,t,i,o))?oh(e,t,i,n,a,r,s):(t==="true-value"?e._trueValue=i:t==="false-value"&&(e._falseValue=i),ih(e,t,i,o))};function gh(e,t,l,i){return i?!!(t==="innerHTML"||t==="textContent"||t in e&&yn.test(t)&&ae(l)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||yn.test(t)&&be(l)?!1:t in e}const Ct="transition",vl="animation",Bl=(e,{slots:t})=>he(Ya,kh(e),t);Bl.displayName="Transition";const hr={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Bl.props=Se({},Ya.props,hr);const jt=(e,t=[])=>{te(e)?e.forEach(l=>l(...t)):e&&e(...t)},xn=e=>e?te(e)?e.some(t=>t.length>1):e.length>1:!1;function kh(e){const t={};for(const C in e)C in hr||(t[C]=e[C]);if(e.css===!1)return t;const{name:l="v",type:i,duration:o,enterFromClass:n=`${l}-enter-from`,enterActiveClass:a=`${l}-enter-active`,enterToClass:r=`${l}-enter-to`,appearFromClass:s=n,appearActiveClass:c=a,appearToClass:h=r,leaveFromClass:p=`${l}-leave-from`,leaveActiveClass:m=`${l}-leave-active`,leaveToClass:g=`${l}-leave-to`}=e,x=vh(o),L=x&&x[0],E=x&&x[1],{onBeforeEnter:k,onEnter:b,onEnterCancelled:P,onLeave:H,onLeaveCancelled:U,onBeforeAppear:ee=k,onAppear:w=b,onAppearCancelled:v=P}=t,q=(C,S,F)=>{$t(C,S?h:r),$t(C,S?c:a),F&&F()},B=(C,S)=>{C._isLeaving=!1,$t(C,p),$t(C,g),$t(C,m),S&&S()},G=C=>(S,F)=>{const re=C?w:b,j=()=>q(S,C,F);jt(re,[S,j]),En(()=>{$t(S,C?s:n),Rt(S,C?h:r),xn(re)||Cn(S,i,L,j)})};return Se(t,{onBeforeEnter(C){jt(k,[C]),Rt(C,n),Rt(C,a)},onBeforeAppear(C){jt(ee,[C]),Rt(C,s),Rt(C,c)},onEnter:G(!1),onAppear:G(!0),onLeave(C,S){C._isLeaving=!0;const F=()=>B(C,S);Rt(C,p),yh(),Rt(C,m),En(()=>{!C._isLeaving||($t(C,p),Rt(C,g),xn(H)||Cn(C,i,E,F))}),jt(H,[C,F])},onEnterCancelled(C){q(C,!1),jt(P,[C])},onAppearCancelled(C){q(C,!0),jt(v,[C])},onLeaveCancelled(C){B(C),jt(U,[C])}})}function vh(e){if(e==null)return null;if(Oe(e))return[Si(e.enter),Si(e.leave)];{const t=Si(e);return[t,t]}}function Si(e){return ga(e)}function Rt(e,t){t.split(/\s+/).forEach(l=>l&&e.classList.add(l)),(e._vtc||(e._vtc=new Set)).add(t)}function $t(e,t){t.split(/\s+/).forEach(i=>i&&e.classList.remove(i));const{_vtc:l}=e;l&&(l.delete(t),l.size||(e._vtc=void 0))}function En(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let bh=0;function Cn(e,t,l,i){const o=e._endId=++bh,n=()=>{o===e._endId&&i()};if(l)return setTimeout(n,l);const{type:a,timeout:r,propCount:s}=_h(e,t);if(!a)return i();const c=a+"end";let h=0;const p=()=>{e.removeEventListener(c,m),n()},m=g=>{g.target===e&&++h>=s&&p()};setTimeout(()=>{h(l[x]||"").split(", "),o=i(Ct+"Delay"),n=i(Ct+"Duration"),a=Rn(o,n),r=i(vl+"Delay"),s=i(vl+"Duration"),c=Rn(r,s);let h=null,p=0,m=0;t===Ct?a>0&&(h=Ct,p=a,m=n.length):t===vl?c>0&&(h=vl,p=c,m=s.length):(p=Math.max(a,c),h=p>0?a>c?Ct:vl:null,m=h?h===Ct?n.length:s.length:0);const g=h===Ct&&/\b(transform|all)(,|$)/.test(l[Ct+"Property"]);return{type:h,timeout:p,propCount:m,hasTransform:g}}function Rn(e,t){for(;e.lengthLn(l)+Ln(e[i])))}function Ln(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function yh(){return document.body.offsetHeight}const xh={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Eh=(e,t)=>l=>{if(!("key"in l))return;const i=Zt(l.key);if(t.some(o=>o===i||xh[o]===i))return e(l)},mi={beforeMount(e,{value:t},{transition:l}){e._vod=e.style.display==="none"?"":e.style.display,l&&t?l.beforeEnter(e):bl(e,t)},mounted(e,{value:t},{transition:l}){l&&t&&l.enter(e)},updated(e,{value:t,oldValue:l},{transition:i}){!t!=!l&&(i?t?(i.beforeEnter(e),bl(e,!0),i.enter(e)):i.leave(e,()=>{bl(e,!1)}):bl(e,t))},beforeUnmount(e,{value:t}){bl(e,t)}};function bl(e,t){e.style.display=t?e._vod:"none"}const Ch=Se({patchProp:fh},Jc);let Vi,Pn=!1;function Rh(){return Vi=Pn?Vi:zc(Ch),Pn=!0,Vi}const Lh=(...e)=>{const t=Rh().createApp(...e),{mount:l}=t;return t.mount=i=>{const o=Ph(i);if(o)return l(o,!0,o instanceof SVGElement)},t};function Ph(e){return be(e)?document.querySelector(e):e}const Ah=JSON.parse('{"base":"/YukiHookAPI/","lang":"en-US","title":"Yuki Hook API","description":"An efficient Kotlin version of the Xposed Hook API","head":[["link",{"rel":"icon","href":"/YukiHookAPI/images/logo.png"}]],"locales":{"/en/":{"lang":"en-US","description":"An efficient Kotlin version of the Xposed Hook API"},"/zh-cn/":{"lang":"zh-CN","description":"\u4E00\u4E2A\u4F7F\u7528 Kotlin \u91CD\u6784\u7684\u8F7B\u91CF\u3001\u9AD8\u6548\u3001\u7A33\u5B9A\u7684 Xposed Hook API"}}}');var Th=([e,t,l])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,l]),Ih=e=>{const t=new Set,l=[];return e.forEach(i=>{const o=Th(i);t.has(o)||(t.add(o),l.push(i))}),l},Ul=e=>/^(https?:)?\/\//.test(e),wh=e=>/^mailto:/.test(e),Oh=e=>/^tel:/.test(e),Oo=e=>Object.prototype.toString.call(e)==="[object Object]",dr=e=>e.replace(/\/$/,""),ur=e=>e.replace(/^\//,""),pr=(e,t)=>{const l=Object.keys(e).sort((i,o)=>{const n=o.split("/").length-i.split("/").length;return n!==0?n:o.length-i.length});for(const i of l)if(t.startsWith(i))return i;return"/"};const mr={"v-8daa1a0e":_(()=>d(()=>import("./index.html.e1a0a108.js"),[])),"v-2d0a870d":_(()=>d(()=>import("./index.html.2ea35cea.js"),[])),"v-c0c85b84":_(()=>d(()=>import("./index.html.0e1e0a04.js"),[])),"v-7a15fe3b":_(()=>d(()=>import("./about.html.31fb9bcd.js"),[])),"v-3f851d14":_(()=>d(()=>import("./changelog.html.f7e20a5d.js"),[])),"v-193cf592":_(()=>d(()=>import("./contacts.html.3d7caa0e.js"),[])),"v-ae7b83f2":_(()=>d(()=>import("./future.html.373b372f.js"),[])),"v-64fc7bb8":_(()=>d(()=>import("./home.html.6ee3debd.js"),[])),"v-9cfea7fc":_(()=>d(()=>import("./api-example.html.7a4a6adf.js"),[])),"v-72c12b7d":_(()=>d(()=>import("./api-exception.html.cd46328b.js"),[])),"v-793879e8":_(()=>d(()=>import("./api-using.html.52d29a3e.js"),[])),"v-29d6c1ba":_(()=>d(()=>import("./r8-proguard.html.3e207302.js"),[])),"v-24e71de7":_(()=>d(()=>import("./xposed-using.html.59211920.js"),[])),"v-7b22efaf":_(()=>d(()=>import("./example.html.27a92a09.js"),[])),"v-efb45d4c":_(()=>d(()=>import("./home.html.63ebf7b8.js"),[])),"v-277b35ca":_(()=>d(()=>import("./knowledge.html.50976213.js"),[])),"v-77d752a2":_(()=>d(()=>import("./move-to-new-api.html.45e76cd4.js"),[])),"v-72889797":_(()=>d(()=>import("./quick-start.html.b66f71d7.js"),[])),"v-55c11626":_(()=>d(()=>import("./yukihookapi-projectbuilder.html.0e3e500d.js"),[])),"v-41967128":_(()=>d(()=>import("./about.html.d844c71e.js"),[])),"v-0e6c3476":_(()=>d(()=>import("./changelog.html.379566e7.js"),[])),"v-6cf86266":_(()=>d(()=>import("./contacts.html.0c1be9b2.js"),[])),"v-3106ca14":_(()=>d(()=>import("./future.html.1187acab.js"),[])),"v-c8deafb2":_(()=>d(()=>import("./home.html.f11cb486.js"),[])),"v-c6114c9e":_(()=>d(()=>import("./api-example.html.0f0dfccf.js"),[])),"v-5b43296c":_(()=>d(()=>import("./api-exception.html.066f0dc6.js"),[])),"v-2ee67152":_(()=>d(()=>import("./api-using.html.61ecfdd2.js"),[])),"v-154d6f69":_(()=>d(()=>import("./r8-proguard.html.6013d73f.js"),[])),"v-af73b3d0":_(()=>d(()=>import("./xposed-using.html.873df271.js"),[])),"v-13b430a0":_(()=>d(()=>import("./example.html.f72f0f04.js"),[])),"v-6a609e09":_(()=>d(()=>import("./home.html.bf707b4b.js"),[])),"v-b4f1a468":_(()=>d(()=>import("./knowledge.html.7539105b.js"),[])),"v-c0d5dada":_(()=>d(()=>import("./move-to-new-api.html.99d85464.js"),[])),"v-24840ff0":_(()=>d(()=>import("./quick-start.html.1d7f6624.js"),[])),"v-a2fab4d6":_(()=>d(()=>import("./yukihookapi-projectbuilder.html.6785eea5.js"),[])),"v-12042f1f":_(()=>d(()=>import("./host-inject.html.9e3097f8.js"),[])),"v-deaff1d0":_(()=>d(()=>import("./host-lifecycle.html.fe173b3e.js"),[])),"v-33c1dc26":_(()=>d(()=>import("./logger.html.6370ce77.js"),[])),"v-581ddb9c":_(()=>d(()=>import("./reflection.html.31159190.js"),[])),"v-2e6ad66c":_(()=>d(()=>import("./xposed-channel.html.4864ff1b.js"),[])),"v-68bebbf4":_(()=>d(()=>import("./xposed-storage.html.f78666ac.js"),[])),"v-6ac5be8e":_(()=>d(()=>import("./host-inject.html.5ae0aeb9.js"),[])),"v-357a8d49":_(()=>d(()=>import("./host-lifecycle.html.ed922d2c.js"),[])),"v-1f0f591e":_(()=>d(()=>import("./logger.html.9fbe7076.js"),[])),"v-001858e3":_(()=>d(()=>import("./reflection.html.4d705ea1.js"),[])),"v-598546c6":_(()=>d(()=>import("./xposed-channel.html.e26f5994.js"),[])),"v-0d914225":_(()=>d(()=>import("./xposed-storage.html.3cad78fc.js"),[])),"v-053599a5":_(()=>d(()=>import("./YukiHookAPI.html.423ff5d5.js"),[])),"v-6931cb54":_(()=>d(()=>import("./YukiHookAPI.html.52aa5899.js"),[])),"v-818b3ca6":_(()=>d(()=>import("./InjectYukiHookWithXposed.html.7e7e596c.js"),[])),"v-b6a815c4":_(()=>d(()=>import("./CurrentClass.html.8b40838c.js"),[])),"v-0183e3fc":_(()=>d(()=>import("./GenericClass.html.81e862b7.js"),[])),"v-57506200":_(()=>d(()=>import("./HookClass.html.e17b98a3.js"),[])),"v-9af56c1a":_(()=>d(()=>import("./HookResources.html.78582f9b.js"),[])),"v-032b1710":_(()=>d(()=>import("./VariousClass.html.40fd0a28.js"),[])),"v-71147891":_(()=>d(()=>import("./YukiMemberHookCreator.html.b90d4528.js"),[])),"v-5ed1ceee":_(()=>d(()=>import("./YukiResourcesHookCreator.html.4985f81e.js"),[])),"v-e288ce96":_(()=>d(()=>import("./YukiBaseHooker.html.ade84104.js"),[])),"v-0d0fcec2":_(()=>d(()=>import("./ReflectionFactory.html.0b0fdaba.js"),[])),"v-65091354":_(()=>d(()=>import("./YukiHookFactory.html.233ed606.js"),[])),"v-36aec5ad":_(()=>d(()=>import("./LoggerFactory.html.b69954d3.js"),[])),"v-30f3ba1e":_(()=>d(()=>import("./InjectYukiHookWithXposed.html.50a0e9ff.js"),[])),"v-60cbe1b4":_(()=>d(()=>import("./HookParam.html.b72403ea.js"),[])),"v-b381a126":_(()=>d(()=>import("./PackageParam.html.f4ec4919.js"),[])),"v-6e47300f":_(()=>d(()=>import("./CurrentClass.html.7154b0ad.js"),[])),"v-69c1c226":_(()=>d(()=>import("./GenericClass.html.d5c74ff7.js"),[])),"v-735374af":_(()=>d(()=>import("./HookClass.html.8c45a8ee.js"),[])),"v-1c516d22":_(()=>d(()=>import("./HookResources.html.505eac26.js"),[])),"v-66735bfe":_(()=>d(()=>import("./VariousClass.html.26df03a1.js"),[])),"v-3ac40680":_(()=>d(()=>import("./YukiMemberHookCreator.html.148a1429.js"),[])),"v-5e81af42":_(()=>d(()=>import("./YukiResourcesHookCreator.html.0a994d9e.js"),[])),"v-516df326":_(()=>d(()=>import("./YukiBaseHooker.html.d407e53d.js"),[])),"v-213d88b3":_(()=>d(()=>import("./ReflectionFactory.html.b1a986a7.js"),[])),"v-448e9585":_(()=>d(()=>import("./YukiHookFactory.html.b68c21d1.js"),[])),"v-004a009e":_(()=>d(()=>import("./LoggerFactory.html.c27c8365.js"),[])),"v-75a9b636":_(()=>d(()=>import("./HookParam.html.0ea0d120.js"),[])),"v-100b529c":_(()=>d(()=>import("./PackageParam.html.8c9c140e.js"),[])),"v-8293d958":_(()=>d(()=>import("./ComponentTypeFactory.html.0c913ae3.js"),[])),"v-7b0abf86":_(()=>d(()=>import("./GraphicsTypeFactory.html.c87070a1.js"),[])),"v-5309e4a0":_(()=>d(()=>import("./ViewTypeFactory.html.b429be07.js"),[])),"v-a2615d0c":_(()=>d(()=>import("./DefinedTypeFactory.html.d1c53dd5.js"),[])),"v-ba01a600":_(()=>d(()=>import("./VariableTypeFactory.html.9fceba3f.js"),[])),"v-7fec5836":_(()=>d(()=>import("./ModuleApplication.html.b6666040.js"),[])),"v-7414265a":_(()=>d(()=>import("./YukiHookDataChannel.html.edaeb594.js"),[])),"v-003862c2":_(()=>d(()=>import("./YukiHookModulePrefs.html.bdd6b713.js"),[])),"v-1d680acc":_(()=>d(()=>import("./IYukiHookXposedInit.html.ceb84101.js"),[])),"v-5e874c45":_(()=>d(()=>import("./ComponentTypeFactory.html.7e04a8b3.js"),[])),"v-4ea62475":_(()=>d(()=>import("./GraphicsTypeFactory.html.7de8d5a4.js"),[])),"v-ef79cde2":_(()=>d(()=>import("./ViewTypeFactory.html.52d860fb.js"),[])),"v-5acc12ab":_(()=>d(()=>import("./DefinedTypeFactory.html.3ff07e63.js"),[])),"v-14ec8671":_(()=>d(()=>import("./VariableTypeFactory.html.b28309cb.js"),[])),"v-4709ad58":_(()=>d(()=>import("./ModuleApplication.html.0947d2e6.js"),[])),"v-632be8ee":_(()=>d(()=>import("./YukiHookDataChannel.html.3db91b76.js"),[])),"v-5858709e":_(()=>d(()=>import("./YukiHookModulePrefs.html.aad74b54.js"),[])),"v-763140ee":_(()=>d(()=>import("./IYukiHookXposedInit.html.c8afa33e.js"),[])),"v-4fca92c0":_(()=>d(()=>import("./BaseFinder.html.ad905538.js"),[])),"v-2a898c66":_(()=>d(()=>import("./DexClassFinder.html.db21690b.js"),[])),"v-a71937aa":_(()=>d(()=>import("./ConstructorFinder.html.2c738cf8.js"),[])),"v-42e0f0ab":_(()=>d(()=>import("./FieldFinder.html.9d8f7b17.js"),[])),"v-a4aa4d00":_(()=>d(()=>import("./MethodFinder.html.417d29b0.js"),[])),"v-0f1e3594":_(()=>d(()=>import("./YukiModuleResources.html.f47310a8.js"),[])),"v-35faec91":_(()=>d(()=>import("./YukiResForwarder.html.62d9bea1.js"),[])),"v-2c04b82a":_(()=>d(()=>import("./YukiResources.html.8cdff557.js"),[])),"v-19e7277e":_(()=>d(()=>import("./YukiXposedEvent.html.5f49c197.js"),[])),"v-2f64a2d4":_(()=>d(()=>import("./ChannelData.html.35215702.js"),[])),"v-2d4e0da6":_(()=>d(()=>import("./ModuleClassLoader.html.7b5cc225.js"),[])),"v-58ed8298":_(()=>d(()=>import("./PrefsData.html.ca16253d.js"),[])),"v-23e1a817":_(()=>d(()=>import("./ModulePreferenceFragment.html.f7ecd440.js"),[])),"v-0f719471":_(()=>d(()=>import("./BaseFinder.html.e92b3674.js"),[])),"v-45111efc":_(()=>d(()=>import("./DexClassFinder.html.d84667d3.js"),[])),"v-1e2cbc9c":_(()=>d(()=>import("./ConstructorFinder.html.73258725.js"),[])),"v-22449c48":_(()=>d(()=>import("./FieldFinder.html.7b0651b9.js"),[])),"v-fd738322":_(()=>d(()=>import("./MethodFinder.html.0e730b7b.js"),[])),"v-3d943532":_(()=>d(()=>import("./YukiModuleResources.html.10f2c38d.js"),[])),"v-526c4200":_(()=>d(()=>import("./YukiResForwarder.html.234358d5.js"),[])),"v-68541dca":_(()=>d(()=>import("./YukiResources.html.8651ca84.js"),[])),"v-0a4de82f":_(()=>d(()=>import("./YukiXposedEvent.html.04a50775.js"),[])),"v-493d37f6":_(()=>d(()=>import("./ChannelData.html.2e6c6569.js"),[])),"v-4b468415":_(()=>d(()=>import("./ModuleClassLoader.html.dd180fc9.js"),[])),"v-d99f7f36":_(()=>d(()=>import("./PrefsData.html.fc0793be.js"),[])),"v-53bcae06":_(()=>d(()=>import("./ModulePreferenceFragment.html.03eaf777.js"),[])),"v-52995ef7":_(()=>d(()=>import("./CountRules.html.3361aff7.js"),[])),"v-8d5ce71a":_(()=>d(()=>import("./ModifierRules.html.a23f860d.js"),[])),"v-f5b1ffb2":_(()=>d(()=>import("./NameRules.html.1ac92120.js"),[])),"v-08b70f7f":_(()=>d(()=>import("./ConstructorRules.html.89ac6cea.js"),[])),"v-21f64ebf":_(()=>d(()=>import("./FieldRules.html.d12c9b1b.js"),[])),"v-77f11cf9":_(()=>d(()=>import("./MemberRules.html.bfe09c90.js"),[])),"v-64827680":_(()=>d(()=>import("./MethodRules.html.181e5e4f.js"),[])),"v-2d5d16db":_(()=>d(()=>import("./ModuleAppActivity.html.31db2b27.js"),[])),"v-cadbe48e":_(()=>d(()=>import("./ModuleAppCompatActivity.html.d6ea50a2.js"),[])),"v-78731c50":_(()=>d(()=>import("./ModuleContextThemeWrapper.html.5f49ff05.js"),[])),"v-1b2ad030":_(()=>d(()=>import("./CountRules.html.64b9467a.js"),[])),"v-547a3c3c":_(()=>d(()=>import("./ModifierRules.html.5e136d47.js"),[])),"v-58c26516":_(()=>d(()=>import("./NameRules.html.eb726c41.js"),[])),"v-a42f54a4":_(()=>d(()=>import("./ConstructorRules.html.8f57ac81.js"),[])),"v-3e67a42e":_(()=>d(()=>import("./FieldRules.html.0cbc7d43.js"),[])),"v-2cab152c":_(()=>d(()=>import("./MemberRules.html.a94d7ce4.js"),[])),"v-5388621e":_(()=>d(()=>import("./MethodRules.html.3a185a29.js"),[])),"v-1446bdca":_(()=>d(()=>import("./ModuleAppActivity.html.f8671049.js"),[])),"v-c7cef530":_(()=>d(()=>import("./ModuleAppCompatActivity.html.6fd72462.js"),[])),"v-44efb702":_(()=>d(()=>import("./ModuleContextThemeWrapper.html.5e67972f.js"),[])),"v-5e375d98":_(()=>d(()=>import("./MemberRulesResult.html.2769b569.js"),[])),"v-b8000f3a":_(()=>d(()=>import("./MemberRulesResult.html.c69c4756.js"),[])),"v-3706649a":_(()=>d(()=>import("./404.html.4241c760.js"),[]))};var Ht=(e={})=>e;function fr(e,t,l){var i,o,n;t===void 0&&(t=50),l===void 0&&(l={});var a=(i=l.isImmediate)!=null&&i,r=(o=l.callback)!=null&&o,s=l.maxWait,c=Date.now(),h=[];function p(){if(s!==void 0){var g=Date.now()-c;if(g+t>=s)return s-g}return t}var m=function(){var g=[].slice.call(arguments),x=this;return new Promise(function(L,E){var k=a&&n===void 0;if(n!==void 0&&clearTimeout(n),n=setTimeout(function(){if(n=void 0,c=Date.now(),!a){var P=e.apply(x,g);r&&r(P),h.forEach(function(H){return(0,H.resolve)(P)}),h=[]}},p()),k){var b=e.apply(x,g);return r&&r(b),L(b)}h.push({resolve:L,reject:E})})};return m.cancel=function(g){n!==void 0&&clearTimeout(n),h.forEach(function(x){return(0,x.reject)(g)}),h=[]},m}/*! - * vue-router v4.1.5 - * (c) 2022 Eduardo San Martin Morote - * @license MIT - */const nl=typeof window<"u";function Fh(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ve=Object.assign;function Ni(e,t){const l={};for(const i in t){const o=t[i];l[i]=st(o)?o.map(e):e(o)}return l}const Tl=()=>{},st=Array.isArray,zh=/\/$/,Dh=e=>e.replace(zh,"");function ji(e,t,l="/"){let i,o={},n="",a="";const r=t.indexOf("#");let s=t.indexOf("?");return r=0&&(s=-1),s>-1&&(i=t.slice(0,s),n=t.slice(s+1,r>-1?r:t.length),o=e(n)),r>-1&&(i=i||t.slice(0,r),a=t.slice(r,t.length)),i=Vh(i!=null?i:t,l),{fullPath:i+(n&&"?")+n+a,path:i,query:o,hash:a}}function Mh(e,t){const l=t.query?e(t.query):"";return t.path+(l&&"?")+l+(t.hash||"")}function An(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Hh(e,t,l){const i=t.matched.length-1,o=l.matched.length-1;return i>-1&&i===o&&ul(t.matched[i],l.matched[o])&&gr(t.params,l.params)&&e(t.query)===e(l.query)&&t.hash===l.hash}function ul(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function gr(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const l in e)if(!Sh(e[l],t[l]))return!1;return!0}function Sh(e,t){return st(e)?Tn(e,t):st(t)?Tn(t,e):e===t}function Tn(e,t){return st(t)?e.length===t.length&&e.every((l,i)=>l===t[i]):e.length===1&&e[0]===t}function Vh(e,t){if(e.startsWith("/"))return e;if(!e)return t;const l=t.split("/"),i=e.split("/");let o=l.length-1,n,a;for(n=0;n1&&o--;else break;return l.slice(0,o).join("/")+"/"+i.slice(n-(n===i.length?1:0)).join("/")}var Hl;(function(e){e.pop="pop",e.push="push"})(Hl||(Hl={}));var Il;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Il||(Il={}));function Nh(e){if(!e)if(nl){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Dh(e)}const jh=/^[^#]+#/;function $h(e,t){return e.replace(jh,"#")+t}function Yh(e,t){const l=document.documentElement.getBoundingClientRect(),i=e.getBoundingClientRect();return{behavior:t.behavior,left:i.left-l.left-(t.left||0),top:i.top-l.top-(t.top||0)}}const Ii=()=>({left:window.pageXOffset,top:window.pageYOffset});function Bh(e){let t;if("el"in e){const l=e.el,i=typeof l=="string"&&l.startsWith("#"),o=typeof l=="string"?i?document.getElementById(l.slice(1)):document.querySelector(l):l;if(!o)return;t=Yh(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function In(e,t){return(history.state?history.state.position-t:-1)+e}const so=new Map;function Uh(e,t){so.set(e,t)}function Wh(e){const t=so.get(e);return so.delete(e),t}let Xh=()=>location.protocol+"//"+location.host;function kr(e,t){const{pathname:l,search:i,hash:o}=t,n=e.indexOf("#");if(n>-1){let r=o.includes(e.slice(n))?e.slice(n).length:1,s=o.slice(r);return s[0]!=="/"&&(s="/"+s),An(s,"")}return An(l,e)+i+o}function qh(e,t,l,i){let o=[],n=[],a=null;const r=({state:m})=>{const g=kr(e,location),x=l.value,L=t.value;let E=0;if(m){if(l.value=g,t.value=m,a&&a===x){a=null;return}E=L?m.position-L.position:0}else i(g);o.forEach(k=>{k(l.value,x,{delta:E,type:Hl.pop,direction:E?E>0?Il.forward:Il.back:Il.unknown})})};function s(){a=l.value}function c(m){o.push(m);const g=()=>{const x=o.indexOf(m);x>-1&&o.splice(x,1)};return n.push(g),g}function h(){const{history:m}=window;!m.state||m.replaceState(ve({},m.state,{scroll:Ii()}),"")}function p(){for(const m of n)m();n=[],window.removeEventListener("popstate",r),window.removeEventListener("beforeunload",h)}return window.addEventListener("popstate",r),window.addEventListener("beforeunload",h),{pauseListeners:s,listen:c,destroy:p}}function wn(e,t,l,i=!1,o=!1){return{back:e,current:t,forward:l,replaced:i,position:window.history.length,scroll:o?Ii():null}}function Kh(e){const{history:t,location:l}=window,i={value:kr(e,l)},o={value:t.state};o.value||n(i.value,{back:null,current:i.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function n(s,c,h){const p=e.indexOf("#"),m=p>-1?(l.host&&document.querySelector("base")?e:e.slice(p))+s:Xh()+e+s;try{t[h?"replaceState":"pushState"](c,"",m),o.value=c}catch(g){console.error(g),l[h?"replace":"assign"](m)}}function a(s,c){const h=ve({},t.state,wn(o.value.back,s,o.value.forward,!0),c,{position:o.value.position});n(s,h,!0),i.value=s}function r(s,c){const h=ve({},o.value,t.state,{forward:s,scroll:Ii()});n(h.current,h,!0);const p=ve({},wn(i.value,s,null),{position:h.position+1},c);n(s,p,!1),i.value=s}return{location:i,state:o,push:r,replace:a}}function Gh(e){e=Nh(e);const t=Kh(e),l=qh(e,t.state,t.location,t.replace);function i(n,a=!0){a||l.pauseListeners(),history.go(n)}const o=ve({location:"",base:e,go:i,createHref:$h.bind(null,e)},t,l);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function Qh(e){return typeof e=="string"||e&&typeof e=="object"}function vr(e){return typeof e=="string"||typeof e=="symbol"}const mt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},br=Symbol("");var On;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(On||(On={}));function pl(e,t){return ve(new Error,{type:e,[br]:!0},t)}function pt(e,t){return e instanceof Error&&br in e&&(t==null||!!(e.type&t))}const Fn="[^/]+?",Zh={sensitive:!1,strict:!1,start:!0,end:!0},Jh=/[.+*?^${}()[\]/\\]/g;function ed(e,t){const l=ve({},Zh,t),i=[];let o=l.start?"^":"";const n=[];for(const c of e){const h=c.length?[]:[90];l.strict&&!c.length&&(o+="/");for(let p=0;pt.length?t.length===1&&t[0]===40+40?1:-1:0}function ld(e,t){let l=0;const i=e.score,o=t.score;for(;l0&&t[t.length-1]<0}const id={type:0,value:""},od=/[a-zA-Z0-9_]/;function nd(e){if(!e)return[[]];if(e==="/")return[[id]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${l})/"${c}": ${g}`)}let l=0,i=l;const o=[];let n;function a(){n&&o.push(n),n=[]}let r=0,s,c="",h="";function p(){!c||(l===0?n.push({type:0,value:c}):l===1||l===2||l===3?(n.length>1&&(s==="*"||s==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),n.push({type:1,value:c,regexp:h,repeatable:s==="*"||s==="+",optional:s==="*"||s==="?"})):t("Invalid state to consume buffer"),c="")}function m(){c+=s}for(;r{a(b)}:Tl}function a(h){if(vr(h)){const p=i.get(h);p&&(i.delete(h),l.splice(l.indexOf(p),1),p.children.forEach(a),p.alias.forEach(a))}else{const p=l.indexOf(h);p>-1&&(l.splice(p,1),h.record.name&&i.delete(h.record.name),h.children.forEach(a),h.alias.forEach(a))}}function r(){return l}function s(h){let p=0;for(;p=0&&(h.record.path!==l[p].record.path||!_r(h,l[p]));)p++;l.splice(p,0,h),h.record.name&&!Mn(h)&&i.set(h.record.name,h)}function c(h,p){let m,g={},x,L;if("name"in h&&h.name){if(m=i.get(h.name),!m)throw pl(1,{location:h});L=m.record.name,g=ve(Dn(p.params,m.keys.filter(b=>!b.optional).map(b=>b.name)),h.params&&Dn(h.params,m.keys.map(b=>b.name))),x=m.stringify(g)}else if("path"in h)x=h.path,m=l.find(b=>b.re.test(x)),m&&(g=m.parse(x),L=m.record.name);else{if(m=p.name?i.get(p.name):l.find(b=>b.re.test(p.path)),!m)throw pl(1,{location:h,currentLocation:p});L=m.record.name,g=ve({},p.params,h.params),x=m.stringify(g)}const E=[];let k=m;for(;k;)E.unshift(k.record),k=k.parent;return{name:L,path:x,params:g,matched:E,meta:hd(E)}}return e.forEach(h=>n(h)),{addRoute:n,resolve:c,removeRoute:a,getRoutes:r,getRecordMatcher:o}}function Dn(e,t){const l={};for(const i of t)i in e&&(l[i]=e[i]);return l}function sd(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:cd(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function cd(e){const t={},l=e.props||!1;if("component"in e)t.default=l;else for(const i in e.components)t[i]=typeof l=="boolean"?l:l[i];return t}function Mn(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function hd(e){return e.reduce((t,l)=>ve(t,l.meta),{})}function Hn(e,t){const l={};for(const i in e)l[i]=i in t?t[i]:e[i];return l}function _r(e,t){return t.children.some(l=>l===e||_r(e,l))}const yr=/#/g,dd=/&/g,ud=/\//g,pd=/=/g,md=/\?/g,xr=/\+/g,fd=/%5B/g,gd=/%5D/g,Er=/%5E/g,kd=/%60/g,Cr=/%7B/g,vd=/%7C/g,Rr=/%7D/g,bd=/%20/g;function Fo(e){return encodeURI(""+e).replace(vd,"|").replace(fd,"[").replace(gd,"]")}function _d(e){return Fo(e).replace(Cr,"{").replace(Rr,"}").replace(Er,"^")}function co(e){return Fo(e).replace(xr,"%2B").replace(bd,"+").replace(yr,"%23").replace(dd,"%26").replace(kd,"`").replace(Cr,"{").replace(Rr,"}").replace(Er,"^")}function yd(e){return co(e).replace(pd,"%3D")}function xd(e){return Fo(e).replace(yr,"%23").replace(md,"%3F")}function Ed(e){return e==null?"":xd(e).replace(ud,"%2F")}function fi(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Cd(e){const t={};if(e===""||e==="?")return t;const i=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;on&&co(n)):[i&&co(i)]).forEach(n=>{n!==void 0&&(t+=(t.length?"&":"")+l,n!=null&&(t+="="+n))})}return t}function Rd(e){const t={};for(const l in e){const i=e[l];i!==void 0&&(t[l]=st(i)?i.map(o=>o==null?null:""+o):i==null?i:""+i)}return t}const Ld=Symbol(""),Vn=Symbol(""),wi=Symbol(""),zo=Symbol(""),ho=Symbol("");function _l(){let e=[];function t(i){return e.push(i),()=>{const o=e.indexOf(i);o>-1&&e.splice(o,1)}}function l(){e=[]}return{add:t,list:()=>e,reset:l}}function At(e,t,l,i,o){const n=i&&(i.enterCallbacks[o]=i.enterCallbacks[o]||[]);return()=>new Promise((a,r)=>{const s=p=>{p===!1?r(pl(4,{from:l,to:t})):p instanceof Error?r(p):Qh(p)?r(pl(2,{from:t,to:p})):(n&&i.enterCallbacks[o]===n&&typeof p=="function"&&n.push(p),a())},c=e.call(i&&i.instances[o],t,l,s);let h=Promise.resolve(c);e.length<3&&(h=h.then(s)),h.catch(p=>r(p))})}function $i(e,t,l,i){const o=[];for(const n of e)for(const a in n.components){let r=n.components[a];if(!(t!=="beforeRouteEnter"&&!n.instances[a]))if(Pd(r)){const c=(r.__vccOpts||r)[t];c&&o.push(At(c,l,i,n,a))}else{let s=r();o.push(()=>s.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${n.path}"`));const h=Fh(c)?c.default:c;n.components[a]=h;const m=(h.__vccOpts||h)[t];return m&&At(m,l,i,n,a)()}))}}return o}function Pd(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Nn(e){const t=Me(wi),l=Me(zo),i=Y(()=>t.resolve(O(e.to))),o=Y(()=>{const{matched:s}=i.value,{length:c}=s,h=s[c-1],p=l.matched;if(!h||!p.length)return-1;const m=p.findIndex(ul.bind(null,h));if(m>-1)return m;const g=jn(s[c-2]);return c>1&&jn(h)===g&&p[p.length-1].path!==g?p.findIndex(ul.bind(null,s[c-2])):m}),n=Y(()=>o.value>-1&&wd(l.params,i.value.params)),a=Y(()=>o.value>-1&&o.value===l.matched.length-1&&gr(l.params,i.value.params));function r(s={}){return Id(s)?t[O(e.replace)?"replace":"push"](O(e.to)).catch(Tl):Promise.resolve()}return{route:i,href:Y(()=>i.value.href),isActive:n,isExactActive:a,navigate:r}}const Ad=ue({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Nn,setup(e,{slots:t}){const l=gl(Nn(e)),{options:i}=Me(wi),o=Y(()=>({[$n(e.activeClass,i.linkActiveClass,"router-link-active")]:l.isActive,[$n(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:l.isExactActive}));return()=>{const n=t.default&&t.default(l);return e.custom?n:he("a",{"aria-current":l.isExactActive?e.ariaCurrentValue:null,href:l.href,onClick:l.navigate,class:o.value},n)}}}),Td=Ad;function Id(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function wd(e,t){for(const l in t){const i=t[l],o=e[l];if(typeof i=="string"){if(i!==o)return!1}else if(!st(o)||o.length!==i.length||i.some((n,a)=>n!==o[a]))return!1}return!0}function jn(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const $n=(e,t,l)=>e!=null?e:t!=null?t:l,Od=ue({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:l}){const i=Me(ho),o=Y(()=>e.route||i.value),n=Me(Vn,0),a=Y(()=>{let c=O(n);const{matched:h}=o.value;let p;for(;(p=h[c])&&!p.components;)c++;return c}),r=Y(()=>o.value.matched[a.value]);Gt(Vn,Y(()=>a.value+1)),Gt(Ld,r),Gt(ho,o);const s=ye();return dt(()=>[s.value,r.value,e.name],([c,h,p],[m,g,x])=>{h&&(h.instances[p]=c,g&&g!==h&&c&&c===m&&(h.leaveGuards.size||(h.leaveGuards=g.leaveGuards),h.updateGuards.size||(h.updateGuards=g.updateGuards))),c&&h&&(!g||!ul(h,g)||!m)&&(h.enterCallbacks[p]||[]).forEach(L=>L(c))},{flush:"post"}),()=>{const c=o.value,h=e.name,p=r.value,m=p&&p.components[h];if(!m)return Yn(l.default,{Component:m,route:c});const g=p.props[h],x=g?g===!0?c.params:typeof g=="function"?g(c):g:null,E=he(m,ve({},x,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(p.instances[h]=null)},ref:s}));return Yn(l.default,{Component:E,route:c})||E}}});function Yn(e,t){if(!e)return null;const l=e(t);return l.length===1?l[0]:l}const Lr=Od;function Fd(e){const t=rd(e.routes,e),l=e.parseQuery||Cd,i=e.stringifyQuery||Sn,o=e.history,n=_l(),a=_l(),r=_l(),s=wa(mt);let c=mt;nl&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const h=Ni.bind(null,R=>""+R),p=Ni.bind(null,Ed),m=Ni.bind(null,fi);function g(R,W){let M,X;return vr(R)?(M=t.getRecordMatcher(R),X=W):X=R,t.addRoute(X,M)}function x(R){const W=t.getRecordMatcher(R);W&&t.removeRoute(W)}function L(){return t.getRoutes().map(R=>R.record)}function E(R){return!!t.getRecordMatcher(R)}function k(R,W){if(W=ve({},W||s.value),typeof R=="string"){const ie=ji(l,R,W.path),u=t.resolve({path:ie.path},W),f=o.createHref(ie.fullPath);return ve(ie,u,{params:m(u.params),hash:fi(ie.hash),redirectedFrom:void 0,href:f})}let M;if("path"in R)M=ve({},R,{path:ji(l,R.path,W.path).path});else{const ie=ve({},R.params);for(const u in ie)ie[u]==null&&delete ie[u];M=ve({},R,{params:p(R.params)}),W.params=p(W.params)}const X=t.resolve(M,W),ge=R.hash||"";X.params=h(m(X.params));const _e=Mh(i,ve({},R,{hash:_d(ge),path:X.path})),ce=o.createHref(_e);return ve({fullPath:_e,hash:ge,query:i===Sn?Rd(R.query):R.query||{}},X,{redirectedFrom:void 0,href:ce})}function b(R){return typeof R=="string"?ji(l,R,s.value.path):ve({},R)}function P(R,W){if(c!==R)return pl(8,{from:W,to:R})}function H(R){return w(R)}function U(R){return H(ve(b(R),{replace:!0}))}function ee(R){const W=R.matched[R.matched.length-1];if(W&&W.redirect){const{redirect:M}=W;let X=typeof M=="function"?M(R):M;return typeof X=="string"&&(X=X.includes("?")||X.includes("#")?X=b(X):{path:X},X.params={}),ve({query:R.query,hash:R.hash,params:"path"in X?{}:R.params},X)}}function w(R,W){const M=c=k(R),X=s.value,ge=R.state,_e=R.force,ce=R.replace===!0,ie=ee(M);if(ie)return w(ve(b(ie),{state:typeof ie=="object"?ve({},ge,ie.state):ge,force:_e,replace:ce}),W||M);const u=M;u.redirectedFrom=W;let f;return!_e&&Hh(i,X,M)&&(f=pl(16,{to:u,from:X}),Ne(X,X,!0,!1)),(f?Promise.resolve(f):q(u,X)).catch(y=>pt(y)?pt(y,2)?y:Ie(y):le(y,u,X)).then(y=>{if(y){if(pt(y,2))return w(ve({replace:ce},b(y.to),{state:typeof y.to=="object"?ve({},ge,y.to.state):ge,force:_e}),W||u)}else y=G(u,X,!0,ce,ge);return B(u,X,y),y})}function v(R,W){const M=P(R,W);return M?Promise.reject(M):Promise.resolve()}function q(R,W){let M;const[X,ge,_e]=zd(R,W);M=$i(X.reverse(),"beforeRouteLeave",R,W);for(const ie of X)ie.leaveGuards.forEach(u=>{M.push(At(u,R,W))});const ce=v.bind(null,R,W);return M.push(ce),tl(M).then(()=>{M=[];for(const ie of n.list())M.push(At(ie,R,W));return M.push(ce),tl(M)}).then(()=>{M=$i(ge,"beforeRouteUpdate",R,W);for(const ie of ge)ie.updateGuards.forEach(u=>{M.push(At(u,R,W))});return M.push(ce),tl(M)}).then(()=>{M=[];for(const ie of R.matched)if(ie.beforeEnter&&!W.matched.includes(ie))if(st(ie.beforeEnter))for(const u of ie.beforeEnter)M.push(At(u,R,W));else M.push(At(ie.beforeEnter,R,W));return M.push(ce),tl(M)}).then(()=>(R.matched.forEach(ie=>ie.enterCallbacks={}),M=$i(_e,"beforeRouteEnter",R,W),M.push(ce),tl(M))).then(()=>{M=[];for(const ie of a.list())M.push(At(ie,R,W));return M.push(ce),tl(M)}).catch(ie=>pt(ie,8)?ie:Promise.reject(ie))}function B(R,W,M){for(const X of r.list())X(R,W,M)}function G(R,W,M,X,ge){const _e=P(R,W);if(_e)return _e;const ce=W===mt,ie=nl?history.state:{};M&&(X||ce?o.replace(R.fullPath,ve({scroll:ce&&ie&&ie.scroll},ge)):o.push(R.fullPath,ge)),s.value=R,Ne(R,W,M,ce),Ie()}let C;function S(){C||(C=o.listen((R,W,M)=>{if(!Vt.listening)return;const X=k(R),ge=ee(X);if(ge){w(ve(ge,{replace:!0}),X).catch(Tl);return}c=X;const _e=s.value;nl&&Uh(In(_e.fullPath,M.delta),Ii()),q(X,_e).catch(ce=>pt(ce,12)?ce:pt(ce,2)?(w(ce.to,X).then(ie=>{pt(ie,20)&&!M.delta&&M.type===Hl.pop&&o.go(-1,!1)}).catch(Tl),Promise.reject()):(M.delta&&o.go(-M.delta,!1),le(ce,X,_e))).then(ce=>{ce=ce||G(X,_e,!1),ce&&(M.delta&&!pt(ce,8)?o.go(-M.delta,!1):M.type===Hl.pop&&pt(ce,20)&&o.go(-1,!1)),B(X,_e,ce)}).catch(Tl)}))}let F=_l(),re=_l(),j;function le(R,W,M){Ie(R);const X=re.list();return X.length?X.forEach(ge=>ge(R,W,M)):console.error(R),Promise.reject(R)}function se(){return j&&s.value!==mt?Promise.resolve():new Promise((R,W)=>{F.add([R,W])})}function Ie(R){return j||(j=!R,S(),F.list().forEach(([W,M])=>R?M(R):W()),F.reset()),R}function Ne(R,W,M,X){const{scrollBehavior:ge}=e;if(!nl||!ge)return Promise.resolve();const _e=!M&&Wh(In(R.fullPath,0))||(X||!M)&&history.state&&history.state.scroll||null;return jl().then(()=>ge(R,W,_e)).then(ce=>ce&&Bh(ce)).catch(ce=>le(ce,R,W))}const Ue=R=>o.go(R);let Je;const Ye=new Set,Vt={currentRoute:s,listening:!0,addRoute:g,removeRoute:x,hasRoute:E,getRoutes:L,resolve:k,options:e,push:H,replace:U,go:Ue,back:()=>Ue(-1),forward:()=>Ue(1),beforeEach:n.add,beforeResolve:a.add,afterEach:r.add,onError:re.add,isReady:se,install(R){const W=this;R.component("RouterLink",Td),R.component("RouterView",Lr),R.config.globalProperties.$router=W,Object.defineProperty(R.config.globalProperties,"$route",{enumerable:!0,get:()=>O(s)}),nl&&!Je&&s.value===mt&&(Je=!0,H(o.location).catch(ge=>{}));const M={};for(const ge in mt)M[ge]=Y(()=>s.value[ge]);R.provide(wi,W),R.provide(zo,gl(M)),R.provide(ho,s);const X=R.unmount;Ye.add(R),R.unmount=function(){Ye.delete(R),Ye.size<1&&(c=mt,C&&C(),C=null,s.value=mt,Je=!1,j=!1),X()}}};return Vt}function tl(e){return e.reduce((t,l)=>t.then(()=>l()),Promise.resolve())}function zd(e,t){const l=[],i=[],o=[],n=Math.max(t.matched.length,e.matched.length);for(let a=0;aul(c,r))?i.push(r):l.push(r));const s=e.matched[a];s&&(t.matched.find(c=>ul(c,s))||o.push(s))}return[l,i,o]}function Jt(){return Me(wi)}function St(){return Me(zo)}const Dd=({headerLinkSelector:e,headerAnchorSelector:t,delay:l,offset:i=5})=>{const o=Jt(),a=fr(()=>{var L,E,k,b;const r=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(r-0)m.some(H=>H.hash===P.hash));for(let P=0;P=((E=(L=H.parentElement)==null?void 0:L.offsetTop)!=null?E:0)-i,w=!U||r<((b=(k=U.parentElement)==null?void 0:k.offsetTop)!=null?b:0)-i;if(!(ee&&w))continue;const q=decodeURIComponent(o.currentRoute.value.hash),B=decodeURIComponent(H.hash);if(q===B)return;if(p){for(let G=P+1;G{window.addEventListener("scroll",a)}),Yl(()=>{window.removeEventListener("scroll",a)})},Bn=async(e,t)=>{const{scrollBehavior:l}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t,force:!0}).finally(()=>e.options.scrollBehavior=l)},Md="a.sidebar-item",Hd=".header-anchor",Sd=300,Vd=5,Nd=Ht({setup(){Dd({headerLinkSelector:Md,headerAnchorSelector:Hd,delay:Sd,offset:Vd})}}),Un=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,jd=()=>window.scrollTo({top:0,behavior:"smooth"});const $d=ue({name:"BackToTop",setup(){const e=ye(0),t=Y(()=>e.value>300),l=fr(()=>{e.value=Un()},100);Ze(()=>{e.value=Un(),window.addEventListener("scroll",()=>l())});const i=he("div",{class:"back-to-top",onClick:jd});return()=>he(Bl,{name:"back-to-top"},()=>t.value?i:null)}}),Yd=Ht({rootComponents:[$d]});const Bd=he("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[he("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),he("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Ud=ue({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=Wl(),l=Y(()=>{var i;return(i=e.locales[t.value])!=null?i:{openInNewWindow:"open in new window"}});return()=>he("span",[Bd,he("span",{class:"external-link-icon-sr-only"},l.value.openInNewWindow)])}}),Wd={"/en/":{openInNewWindow:"open in new window"},"/zh-cn/":{openInNewWindow:"\u5728\u65B0\u7A97\u53E3\u4E2D\u6253\u5F00"},"/":{openInNewWindow:"open in new window"}},Xd=Ht({enhance({app:e}){e.component("ExternalLinkIcon",he(Ud,{locales:Wd}))}});/*! medium-zoom 1.0.6 | MIT License | https://github.com/francoischalifour/medium-zoom */var Bt=Object.assign||function(e){for(var t=1;t1&&arguments[1]!==void 0?arguments[1]:{},i=window.Promise||function(C){function S(){}C(S,S)},o=function(C){var S=C.target;if(S===q){x();return}P.indexOf(S)!==-1&&L({target:S})},n=function(){if(!(U||!v.original)){var C=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(ee-C)>w.scrollOffset&&setTimeout(x,150)}},a=function(C){var S=C.key||C.keyCode;(S==="Escape"||S==="Esc"||S===27)&&x()},r=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C;if(C.background&&(q.style.background=C.background),C.container&&C.container instanceof Object&&(S.container=Bt({},w.container,C.container)),C.template){var F=ii(C.template)?C.template:document.querySelector(C.template);S.template=F}return w=Bt({},w,S),P.forEach(function(re){re.dispatchEvent(ll("medium-zoom:update",{detail:{zoom:B}}))}),B},s=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return e(Bt({},w,C))},c=function(){for(var C=arguments.length,S=Array(C),F=0;F0?S.reduce(function(j,le){return[].concat(j,Xn(le))},[]):P;return re.forEach(function(j){j.classList.remove("medium-zoom-image"),j.dispatchEvent(ll("medium-zoom:detach",{detail:{zoom:B}}))}),P=P.filter(function(j){return re.indexOf(j)===-1}),B},p=function(C,S){var F=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return P.forEach(function(re){re.addEventListener("medium-zoom:"+C,S,F)}),H.push({type:"medium-zoom:"+C,listener:S,options:F}),B},m=function(C,S){var F=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return P.forEach(function(re){re.removeEventListener("medium-zoom:"+C,S,F)}),H=H.filter(function(re){return!(re.type==="medium-zoom:"+C&&re.listener.toString()===S.toString())}),B},g=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C.target,F=function(){var j={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},le=void 0,se=void 0;if(w.container)if(w.container instanceof Object)j=Bt({},j,w.container),le=j.width-j.left-j.right-w.margin*2,se=j.height-j.top-j.bottom-w.margin*2;else{var Ie=ii(w.container)?w.container:document.querySelector(w.container),Ne=Ie.getBoundingClientRect(),Ue=Ne.width,Je=Ne.height,Ye=Ne.left,Vt=Ne.top;j=Bt({},j,{width:Ue,height:Je,left:Ye,top:Vt})}le=le||j.width-w.margin*2,se=se||j.height-w.margin*2;var R=v.zoomedHd||v.original,W=Wn(R)?le:R.naturalWidth||le,M=Wn(R)?se:R.naturalHeight||se,X=R.getBoundingClientRect(),ge=X.top,_e=X.left,ce=X.width,ie=X.height,u=Math.min(W,le)/ce,f=Math.min(M,se)/ie,y=Math.min(u,f),T=(-_e+(le-ce)/2+w.margin+j.left)/y,A=(-ge+(se-ie)/2+w.margin+j.top)/y,z="scale("+y+") translate3d("+T+"px, "+A+"px, 0)";v.zoomed.style.transform=z,v.zoomedHd&&(v.zoomedHd.style.transform=z)};return new i(function(re){if(S&&P.indexOf(S)===-1){re(B);return}var j=function Ue(){U=!1,v.zoomed.removeEventListener("transitionend",Ue),v.original.dispatchEvent(ll("medium-zoom:opened",{detail:{zoom:B}})),re(B)};if(v.zoomed){re(B);return}if(S)v.original=S;else if(P.length>0){var le=P;v.original=le[0]}else{re(B);return}if(v.original.dispatchEvent(ll("medium-zoom:open",{detail:{zoom:B}})),ee=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,U=!0,v.zoomed=Gd(v.original),document.body.appendChild(q),w.template){var se=ii(w.template)?w.template:document.querySelector(w.template);v.template=document.createElement("div"),v.template.appendChild(se.content.cloneNode(!0)),document.body.appendChild(v.template)}if(document.body.appendChild(v.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),v.original.classList.add("medium-zoom-image--hidden"),v.zoomed.classList.add("medium-zoom-image--opened"),v.zoomed.addEventListener("click",x),v.zoomed.addEventListener("transitionend",j),v.original.getAttribute("data-zoom-src")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("srcset"),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.src=v.zoomed.getAttribute("data-zoom-src"),v.zoomedHd.onerror=function(){clearInterval(Ie),console.warn("Unable to reach the zoom image target "+v.zoomedHd.src),v.zoomedHd=null,F()};var Ie=setInterval(function(){v.zoomedHd.complete&&(clearInterval(Ie),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",x),document.body.appendChild(v.zoomedHd),F())},10)}else if(v.original.hasAttribute("srcset")){v.zoomedHd=v.zoomed.cloneNode(),v.zoomedHd.removeAttribute("sizes"),v.zoomedHd.removeAttribute("loading");var Ne=v.zoomedHd.addEventListener("load",function(){v.zoomedHd.removeEventListener("load",Ne),v.zoomedHd.classList.add("medium-zoom-image--opened"),v.zoomedHd.addEventListener("click",x),document.body.appendChild(v.zoomedHd),F()})}else F()})},x=function(){return new i(function(C){if(U||!v.original){C(B);return}var S=function F(){v.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(v.zoomed),v.zoomedHd&&document.body.removeChild(v.zoomedHd),document.body.removeChild(q),v.zoomed.classList.remove("medium-zoom-image--opened"),v.template&&document.body.removeChild(v.template),U=!1,v.zoomed.removeEventListener("transitionend",F),v.original.dispatchEvent(ll("medium-zoom:closed",{detail:{zoom:B}})),v.original=null,v.zoomed=null,v.zoomedHd=null,v.template=null,C(B)};U=!0,document.body.classList.remove("medium-zoom--opened"),v.zoomed.style.transform="",v.zoomedHd&&(v.zoomedHd.style.transform=""),v.template&&(v.template.style.transition="opacity 150ms",v.template.style.opacity=0),v.original.dispatchEvent(ll("medium-zoom:close",{detail:{zoom:B}})),v.zoomed.addEventListener("transitionend",S)})},L=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=C.target;return v.original?x():g({target:S})},E=function(){return w},k=function(){return P},b=function(){return v.original},P=[],H=[],U=!1,ee=0,w=l,v={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(t)==="[object Object]"?w=t:(t||typeof t=="string")&&c(t),w=Bt({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},w);var q=Kd(w.background);document.addEventListener("click",o),document.addEventListener("keyup",a),document.addEventListener("scroll",n),window.addEventListener("resize",x);var B={open:g,close:x,toggle:L,update:r,clone:s,attach:c,detach:h,on:p,off:m,getOptions:E,getImages:k,getZoomedImage:b};return B};function Zd(e,t){t===void 0&&(t={});var l=t.insertAt;if(!(!e||typeof document>"u")){var i=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",l==="top"&&i.firstChild?i.insertBefore(o,i.firstChild):i.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var Jd=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Zd(Jd);const eu=Qd,tu=Symbol("mediumZoom");const lu=".theme-default-content > img, .theme-default-content :not(a) > img",iu={},ou=300,nu=Ht({enhance({app:e,router:t}){const l=eu(iu);l.refresh=(i=lu)=>{l.detach(),l.attach(i)},e.provide(tu,l),t.afterEach(()=>{setTimeout(()=>l.refresh(),ou)})}});/** - * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT - */const me={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
    '},status:null,set:e=>{const t=me.isStarted();e=Yi(e,me.settings.minimum,1),me.status=e===1?null:e;const l=me.render(!t),i=l.querySelector(me.settings.barSelector),o=me.settings.speed,n=me.settings.easing;return l.offsetWidth,au(a=>{ti(i,{transform:"translate3d("+qn(e)+"%,0,0)",transition:"all "+o+"ms "+n}),e===1?(ti(l,{transition:"none",opacity:"1"}),l.offsetWidth,setTimeout(function(){ti(l,{transition:"all "+o+"ms linear",opacity:"0"}),setTimeout(function(){me.remove(),a()},o)},o)):setTimeout(()=>a(),o)}),me},isStarted:()=>typeof me.status=="number",start:()=>{me.status||me.set(0);const e=()=>{setTimeout(()=>{!me.status||(me.trickle(),e())},me.settings.trickleSpeed)};return me.settings.trickle&&e(),me},done:e=>!e&&!me.status?me:me.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=me.status;return t?(typeof e!="number"&&(e=(1-t)*Yi(Math.random()*t,.1,.95)),t=Yi(t+e,0,.994),me.set(t)):me.start()},trickle:()=>me.inc(Math.random()*me.settings.trickleRate),render:e=>{if(me.isRendered())return document.getElementById("nprogress");Kn(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=me.settings.template;const l=t.querySelector(me.settings.barSelector),i=e?"-100":qn(me.status||0),o=document.querySelector(me.settings.parent);return ti(l,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),o!==document.body&&Kn(o,"nprogress-custom-parent"),o==null||o.appendChild(t),t},remove:()=>{Gn(document.documentElement,"nprogress-busy"),Gn(document.querySelector(me.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&ru(e)},isRendered:()=>!!document.getElementById("nprogress")},Yi=(e,t,l)=>el?l:e,qn=e=>(-1+e)*100,au=function(){const e=[];function t(){const l=e.shift();l&&l(t)}return function(l){e.push(l),e.length===1&&t()}}(),ti=function(){const e=["Webkit","O","Moz","ms"],t={};function l(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(r,s){return s.toUpperCase()})}function i(a){const r=document.body.style;if(a in r)return a;let s=e.length;const c=a.charAt(0).toUpperCase()+a.slice(1);let h;for(;s--;)if(h=e[s]+c,h in r)return h;return a}function o(a){return a=l(a),t[a]||(t[a]=i(a))}function n(a,r,s){r=o(r),a.style[r]=s}return function(a,r){for(const s in r){const c=r[s];c!==void 0&&Object.prototype.hasOwnProperty.call(r,s)&&n(a,s,c)}}}(),Pr=(e,t)=>(typeof e=="string"?e:Do(e)).indexOf(" "+t+" ")>=0,Kn=(e,t)=>{const l=Do(e),i=l+t;Pr(l,t)||(e.className=i.substring(1))},Gn=(e,t)=>{const l=Do(e);if(!Pr(e,t))return;const i=l.replace(" "+t+" "," ");e.className=i.substring(1,i.length-1)},Do=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),ru=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const su=()=>{Ze(()=>{const e=Jt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(l=>{t.has(l.path)||me.start()}),e.afterEach(l=>{t.add(l.path),me.done()})})},cu=Ht({setup(){su()}}),hu=JSON.parse(`{"logo":"/images/logo.png","repo":"https://github.com/fankes/YukiHookAPI","docsRepo":"https://github.com/fankes/YukiHookAPI","docsBranch":"master","docsDir":"docs-source/src","editLinkPattern":":repo/edit/:branch/:path","sidebar":{"/en/":[{"text":"Get Started","collapsible":true,"children":["/en/guide/home","/en/guide/knowledge","/en/guide/quick-start","/en/guide/example","/en/guide/move-to-new-api"]},{"text":"Configs","collapsible":true,"children":["/en/config/api-example","/en/config/api-exception","/en/config/xposed-using","/en/config/api-using","/en/config/r8-proguard"]},{"text":"Tools","collapsible":true,"children":["/en/tools/yukihookapi-projectbuilder"]},{"text":"API Document","collapsible":true,"children":["/en/api/home",{"text":"Public API\xA0","collapsible":true,"children":["/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources"]},{"text":"Special Features\xA0","collapsible":true,"children":["/en/api/special-features/reflection","/en/api/special-features/logger","/en/api/special-features/xposed-storage","/en/api/special-features/xposed-channel","/en/api/special-features/host-lifecycle","/en/api/special-features/host-inject"]}]},{"text":"About","collapsible":true,"children":["/en/about/changelog","/en/about/future","/en/about/contacts","/en/about/about"]}],"/zh-cn/":[{"text":"\u5165\u95E8","collapsible":true,"children":["/zh-cn/guide/home","/zh-cn/guide/knowledge","/zh-cn/guide/quick-start","/zh-cn/guide/example","/zh-cn/guide/move-to-new-api"]},{"text":"\u914D\u7F6E","collapsible":true,"children":["/zh-cn/config/api-example","/zh-cn/config/api-exception","/zh-cn/config/xposed-using","/zh-cn/config/api-using","/zh-cn/config/r8-proguard"]},{"text":"\u5DE5\u5177","collapsible":true,"children":["/zh-cn/tools/yukihookapi-projectbuilder"]},{"text":"API \u6587\u6863","collapsible":true,"children":["/zh-cn/api/home",{"text":"Public API\xA0","collapsible":true,"children":["/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources"]},{"text":"\u7279\u8272\u529F\u80FD\xA0","collapsible":true,"children":["/zh-cn/api/special-features/reflection","/zh-cn/api/special-features/logger","/zh-cn/api/special-features/xposed-storage","/zh-cn/api/special-features/xposed-channel","/zh-cn/api/special-features/host-lifecycle","/zh-cn/api/special-features/host-inject"]}]},{"text":"\u5173\u4E8E","collapsible":true,"children":["/zh-cn/about/changelog","/zh-cn/about/future","/zh-cn/about/contacts","/zh-cn/about/about"]}]},"sidebarDepth":2,"locales":{"/en/":{"navbar":[{"text":"Navigation","children":[{"text":"Get Started","children":[{"text":"Introduce","link":"/en/guide/home"},{"text":"Basic Knowledge","link":"/en/guide/knowledge"},{"text":"Quick Start","link":"/en/guide/quick-start"},{"text":"Usage Example","link":"/en/guide/example"},{"text":"Migrate from Xposed API","link":"/en/guide/move-to-new-api"}]},{"text":"Configs","children":[{"text":"API Basic Configs","link":"/en/config/api-example"},{"text":"API Exception Handling","link":"/en/config/api-exception"},{"text":"Use as Xposed Module Configs","link":"/en/config/xposed-using"},{"text":"Use as Hook API Configs","link":"/en/config/api-using"},{"text":"R8 & Proguard Obfuscate","link":"/en/config/r8-proguard"}]},{"text":"Tools","children":[{"text":"YukiHookAPI Project Builder","link":"/en/tools/yukihookapi-projectbuilder"}]},{"text":"API Document","children":[{"text":"Document Introduction","link":"/en/api/home"},{"text":"Public API","link":"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","activeMatch":"/en/api/public/"},{"text":"Special Features","link":"/en/api/special-features/reflection","activeMatch":"/en/api/special-features/"}]},{"text":"About","children":[{"text":"Changelog","link":"/en/about/changelog"},{"text":"Looking for Future","link":"/en/about/future"},{"text":"Contact Us","link":"/en/about/contacts"},{"text":"About this Document","link":"/en/about/about"}]}]},{"text":"Contact Us","link":"/en/about/contacts"}],"selectLanguageText":"English (US)","selectLanguageName":"English","editLinkText":"Edit this page on Github","tip":"Tips","warning":"Notice","danger":"Pay Attention"},"/zh-cn/":{"navbar":[{"text":"\u5BFC\u822A","children":[{"text":"\u5165\u95E8","children":[{"text":"\u4ECB\u7ECD","link":"/zh-cn/guide/home"},{"text":"\u57FA\u7840\u77E5\u8BC6","link":"/zh-cn/guide/knowledge"},{"text":"\u5FEB\u901F\u5F00\u59CB","link":"/zh-cn/guide/quick-start"},{"text":"\u7528\u6CD5\u793A\u4F8B","link":"/zh-cn/guide/example"},{"text":"\u4ECE Xposed API \u8FC1\u79FB","link":"/zh-cn/guide/move-to-new-api"}]},{"text":"\u914D\u7F6E","children":[{"text":"API \u57FA\u672C\u914D\u7F6E","link":"/zh-cn/config/api-example"},{"text":"API \u5F02\u5E38\u5904\u7406","link":"/zh-cn/config/api-exception"},{"text":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","link":"/zh-cn/config/xposed-using"},{"text":"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","link":"/zh-cn/config/api-using"},{"text":"R8 \u4E0E Proguard \u6DF7\u6DC6","link":"/zh-cn/config/r8-proguard"}]},{"text":"\u5DE5\u5177","children":[{"text":"YukiHookAPI \u6784\u5EFA\u5DE5\u5177","link":"/zh-cn/tools/yukihookapi-projectbuilder"}]},{"text":"API \u6587\u6863","children":[{"text":"\u6587\u6863\u4ECB\u7ECD","link":"/zh-cn/api/home"},{"text":"Public API","link":"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","activeMatch":"/zh-cn/api/public/"},{"text":"\u7279\u8272\u529F\u80FD","link":"/zh-cn/api/special-features/reflection","activeMatch":"/zh-cn/api/special-features/"}]},{"text":"\u5173\u4E8E","children":[{"text":"\u66F4\u65B0\u65E5\u5FD7","link":"/zh-cn/about/changelog"},{"text":"\u5C55\u671B\u672A\u6765","link":"/zh-cn/about/future"},{"text":"\u8054\u7CFB\u6211\u4EEC","link":"/zh-cn/about/contacts"},{"text":"\u5173\u4E8E\u6B64\u6587\u6863","link":"/zh-cn/about/about"}]}]},{"text":"\u8054\u7CFB\u6211\u4EEC","link":"/zh-cn/about/contacts"}],"selectLanguageText":"\u7B80\u4F53\u4E2D\u6587 (CN)","selectLanguageName":"\u7B80\u4F53\u4E2D\u6587","editLinkText":"\u5728 Github \u4E0A\u7F16\u8F91\u6B64\u9875","notFound":["\u8FD9\u91CC\u4EC0\u4E48\u90FD\u6CA1\u6709","\u6211\u4EEC\u600E\u4E48\u5230\u8FD9\u6765\u4E86\uFF1F","\u8FD9\u662F\u4E00\u4E2A 404 \u9875\u9762","\u770B\u8D77\u6765\u6211\u4EEC\u8FDB\u5165\u4E86\u9519\u8BEF\u7684\u94FE\u63A5"],"backToHome":"\u56DE\u5230\u9996\u9875","contributorsText":"\u8D21\u732E\u8005","lastUpdatedText":"\u4E0A\u6B21\u66F4\u65B0","tip":"\u5C0F\u63D0\u793A","warning":"\u6CE8\u610F","danger":"\u7279\u522B\u6CE8\u610F","openInNewWindow":"\u5728\u65B0\u7A97\u53E3\u4E2D\u6253\u5F00","toggleColorMode":"\u5207\u6362\u989C\u8272\u6A21\u5F0F"},"/":{"selectLanguageName":"English"}},"colorMode":"auto","colorModeSwitch":true,"navbar":[],"selectLanguageText":"Languages","selectLanguageAriaLabel":"Select language","editLink":true,"editLinkText":"Edit this page","lastUpdated":true,"lastUpdatedText":"Last Updated","contributors":true,"contributorsText":"Contributors","notFound":["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],"backToHome":"Take me home","openInNewWindow":"open in new window","toggleColorMode":"toggle color mode","toggleSidebar":"toggle sidebar"}`),Ar=ye(hu),du=()=>Ar;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateThemeData=e=>{Ar.value=e});const Tr=Symbol(""),uu=()=>{const e=Me(Tr);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},pu=(e,t)=>{var l;return{...e,...(l=e.locales)==null?void 0:l[t]}},mu=Ht({enhance({app:e}){const t=du(),l=e._context.provides[No],i=Y(()=>pu(t.value,l.value));e.provide(Tr,i),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return i.value}}})}}),fu=ue({__name:"Badge",props:{type:{type:String,required:!1,default:"tip"},text:{type:String,required:!1,default:""},vertical:{type:String,required:!1,default:void 0}},setup(e){return(t,l)=>(N(),J("span",{class:Ke(["badge",e.type]),style:Sl({verticalAlign:e.vertical})},[Re(t.$slots,"default",{},()=>[Mt(ze(e.text),1)])],6))}}),Ae=(e,t)=>{const l=e.__vccOpts||e;for(const[i,o]of t)l[i]=o;return l},gu=Ae(fu,[["__file","Badge.vue"]]),ku=ue({name:"CodeGroup",setup(e,{slots:t}){const l=ye(-1),i=ye([]),o=(r=l.value)=>{r{r>0?l.value=r-1:l.value=i.value.length-1,i.value[l.value].focus()},a=(r,s)=>{r.key===" "||r.key==="Enter"?(r.preventDefault(),l.value=s):r.key==="ArrowRight"?(r.preventDefault(),o(s)):r.key==="ArrowLeft"&&(r.preventDefault(),n(s))};return()=>{var s;const r=(((s=t.default)==null?void 0:s.call(t))||[]).filter(c=>c.type.name==="CodeGroupItem").map(c=>(c.props===null&&(c.props={}),c));return r.length===0?null:(l.value<0||l.value>r.length-1?(l.value=r.findIndex(c=>c.props.active===""||c.props.active===!0),l.value===-1&&(l.value=0)):r.forEach((c,h)=>{c.props.active=h===l.value}),he("div",{class:"code-group"},[he("div",{class:"code-group__nav"},he("ul",{class:"code-group__ul"},r.map((c,h)=>{const p=h===l.value;return he("li",{class:"code-group__li"},he("button",{ref:m=>{m&&(i.value[h]=m)},class:{"code-group__nav-tab":!0,"code-group__nav-tab-active":p},ariaPressed:p,ariaExpanded:p,onClick:()=>l.value=h,onKeydown:m=>a(m,h)},c.props.title))}))),r]))}}}),vu=["aria-selected"],bu=ue({name:"CodeGroupItem"}),_u=ue({...bu,props:{title:{type:String,required:!0},active:{type:Boolean,required:!1,default:!1}},setup(e){return(t,l)=>(N(),J("div",{class:Ke(["code-group-item",{"code-group-item__active":e.active}]),"aria-selected":e.active},[Re(t.$slots,"default")],10,vu))}}),yu=Ae(_u,[["__file","CodeGroupItem.vue"]]);var Qn;const Ir=typeof window<"u",xu=e=>typeof e=="function",Eu=e=>typeof e=="string",Bi=()=>{};Ir&&((Qn=window==null?void 0:window.navigator)==null?void 0:Qn.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function gi(e){return typeof e=="function"?e():O(e)}function Cu(e,t){function l(...i){e(()=>t.apply(this,i),{fn:t,thisArg:this,args:i})}return l}const wr=e=>e();function Ru(e=wr){const t=ye(!0);function l(){t.value=!1}function i(){t.value=!0}return{isActive:t,pause:l,resume:i,eventFilter:(...n)=>{t.value&&e(...n)}}}function Lu(e){return e}function Or(e){return fs()?(gs(e),!0):!1}function Pu(e,t=!0){wo()?Xa(e):t?e():jl(e)}function Au(e,t=!0){wo()?Ze(e):t?e():jl(e)}function Tu(e=!1,t={}){const{truthyValue:l=!0,falsyValue:i=!1}=t,o=De(e),n=ye(e);function a(r){if(arguments.length)return n.value=r,n.value;{const s=gi(l);return n.value=n.value===s?gi(i):s,n.value}}return o?a:[n,a]}var Zn=Object.getOwnPropertySymbols,Iu=Object.prototype.hasOwnProperty,wu=Object.prototype.propertyIsEnumerable,Ou=(e,t)=>{var l={};for(var i in e)Iu.call(e,i)&&t.indexOf(i)<0&&(l[i]=e[i]);if(e!=null&&Zn)for(var i of Zn(e))t.indexOf(i)<0&&wu.call(e,i)&&(l[i]=e[i]);return l};function Fu(e,t,l={}){const i=l,{eventFilter:o=wr}=i,n=Ou(i,["eventFilter"]);return dt(e,Cu(o,t),n)}var zu=Object.defineProperty,Du=Object.defineProperties,Mu=Object.getOwnPropertyDescriptors,ki=Object.getOwnPropertySymbols,Fr=Object.prototype.hasOwnProperty,zr=Object.prototype.propertyIsEnumerable,Jn=(e,t,l)=>t in e?zu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,Hu=(e,t)=>{for(var l in t||(t={}))Fr.call(t,l)&&Jn(e,l,t[l]);if(ki)for(var l of ki(t))zr.call(t,l)&&Jn(e,l,t[l]);return e},Su=(e,t)=>Du(e,Mu(t)),Vu=(e,t)=>{var l={};for(var i in e)Fr.call(e,i)&&t.indexOf(i)<0&&(l[i]=e[i]);if(e!=null&&ki)for(var i of ki(e))t.indexOf(i)<0&&zr.call(e,i)&&(l[i]=e[i]);return l};function Nu(e,t,l={}){const i=l,{eventFilter:o}=i,n=Vu(i,["eventFilter"]),{eventFilter:a,pause:r,resume:s,isActive:c}=Ru(o);return{stop:Fu(e,t,Su(Hu({},n),{eventFilter:a})),pause:r,resume:s,isActive:c}}function ju(e){var t;const l=gi(e);return(t=l==null?void 0:l.$el)!=null?t:l}const vi=Ir?window:void 0;function $u(...e){let t,l,i,o;if(Eu(e[0])?([l,i,o]=e,t=vi):[t,l,i,o]=e,!t)return Bi;let n=Bi;const a=dt(()=>ju(t),s=>{n(),s&&(s.addEventListener(l,i,o),n=()=>{s.removeEventListener(l,i,o),n=Bi})},{immediate:!0,flush:"post"}),r=()=>{a(),n()};return Or(r),r}function Yu(e,t=!1){const l=ye(),i=()=>l.value=Boolean(e());return i(),Au(i,t),l}function Bu(e,t={}){const{window:l=vi}=t,i=Yu(()=>l&&"matchMedia"in l&&typeof l.matchMedia=="function");let o;const n=ye(!1),a=()=>{!i.value||(o||(o=l.matchMedia(e)),n.value=o.matches)};return Pu(()=>{a(),o&&("addEventListener"in o?o.addEventListener("change",a):o.addListener(a),Or(()=>{"removeEventListener"in o?o.removeEventListener("change",a):o.removeListener(a)}))}),n}const uo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},po="__vueuse_ssr_handlers__";uo[po]=uo[po]||{};const Uu=uo[po];function Wu(e,t){return Uu[e]||t}function Xu(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}var qu=Object.defineProperty,ea=Object.getOwnPropertySymbols,Ku=Object.prototype.hasOwnProperty,Gu=Object.prototype.propertyIsEnumerable,ta=(e,t,l)=>t in e?qu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,la=(e,t)=>{for(var l in t||(t={}))Ku.call(t,l)&&ta(e,l,t[l]);if(ea)for(var l of ea(t))Gu.call(t,l)&&ta(e,l,t[l]);return e};const Qu={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Zu(e,t,l,i={}){var o;const{flush:n="pre",deep:a=!0,listenToStorageChanges:r=!0,writeDefaults:s=!0,mergeDefaults:c=!1,shallow:h,window:p=vi,eventFilter:m,onError:g=w=>{console.error(w)}}=i,x=(h?wa:ye)(t);if(!l)try{l=Wu("getDefaultStorage",()=>{var w;return(w=vi)==null?void 0:w.localStorage})()}catch(w){g(w)}if(!l)return x;const L=gi(t),E=Xu(L),k=(o=i.serializer)!=null?o:Qu[E],{pause:b,resume:P}=Nu(x,()=>H(x.value),{flush:n,deep:a,eventFilter:m});return p&&r&&$u(p,"storage",ee),ee(),x;function H(w){try{w==null?l.removeItem(e):l.setItem(e,k.write(w))}catch(v){g(v)}}function U(w){if(!(w&&w.key!==e)){b();try{const v=w?w.newValue:l.getItem(e);if(v==null)return s&&L!==null&&l.setItem(e,k.write(L)),L;if(!w&&c){const q=k.read(v);return xu(c)?c(q,L):E==="object"&&!Array.isArray(q)?la(la({},L),q):q}else return typeof v!="string"?v:k.read(v)}catch(v){g(v)}finally{P()}}}function ee(w){w&&w.key!==e||(x.value=U(w))}}function Ju(e){return Bu("(prefers-color-scheme: dark)",e)}var ia;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(ia||(ia={}));var ep=Object.defineProperty,oa=Object.getOwnPropertySymbols,tp=Object.prototype.hasOwnProperty,lp=Object.prototype.propertyIsEnumerable,na=(e,t,l)=>t in e?ep(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,ip=(e,t)=>{for(var l in t||(t={}))tp.call(t,l)&&na(e,l,t[l]);if(oa)for(var l of oa(t))lp.call(t,l)&&na(e,l,t[l]);return e};const op={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};ip({linear:Lu},op);const $e=()=>uu(),Dr=Symbol(""),Mo=()=>{const e=Me(Dr);if(!e)throw new Error("useDarkMode() is called without provider.");return e},np=()=>{const e=$e(),t=Ju(),l=Zu("vuepress-color-scheme",e.value.colorMode),i=Y({get(){return e.value.colorModeSwitch?l.value==="auto"?t.value:l.value==="dark":e.value.colorMode==="dark"},set(o){o===t.value?l.value="auto":l.value=o?"dark":"light"}});Gt(Dr,i),ap(i)},ap=e=>{const t=(l=e.value)=>{const i=window==null?void 0:window.document.querySelector("html");i==null||i.classList.toggle("dark",l)};Ze(()=>{dt(e,t,{immediate:!0})}),Pi(()=>t())},Mr=(...e)=>{const l=Jt().resolve(...e),i=l.matched[l.matched.length-1];if(!(i!=null&&i.redirect))return l;const{redirect:o}=i,n=ae(o)?o(l):o,a=be(n)?{path:n}:n;return Mr({hash:l.hash,query:l.query,params:l.params,...a})},Ho=e=>{const t=Mr(encodeURI(e));return{text:t.meta.title||e,link:t.name==="404"?e:t.fullPath}};let Ui=null,yl=null;const rp={wait:()=>Ui,pending:()=>{Ui=new Promise(e=>yl=e)},resolve:()=>{yl==null||yl(),Ui=null,yl=null}},Hr=()=>rp,Sr=Symbol("sidebarItems"),So=()=>{const e=Me(Sr);if(!e)throw new Error("useSidebarItems() is called without provider.");return e},sp=()=>{const e=$e(),t=vt(),l=Y(()=>cp(t.value,e.value));Gt(Sr,l)},cp=(e,t)=>{var o,n,a,r;const l=(n=(o=e.sidebar)!=null?o:t.sidebar)!=null?n:"auto",i=(r=(a=e.sidebarDepth)!=null?a:t.sidebarDepth)!=null?r:2;return e.home||l===!1?[]:l==="auto"?dp(i):te(l)?Vr(l,i):Oo(l)?up(l,i):[]},hp=(e,t)=>({text:e.title,link:e.link,children:Vo(e.children,t)}),Vo=(e,t)=>t>0?e.map(l=>hp(l,t-1)):[],dp=e=>{const t=Ot();return[{text:t.value.title,children:Vo(t.value.headers,e)}]},Vr=(e,t)=>{const l=St(),i=Ot(),o=n=>{var r;let a;if(be(n)?a=Ho(n):a=n,a.children)return{...a,children:a.children.map(s=>o(s))};if(a.link===l.path){const s=((r=i.value.headers[0])==null?void 0:r.level)===1?i.value.headers[0].children:i.value.headers;return{...a,children:Vo(s,t)}}return a};return e.map(n=>o(n))},up=(e,t)=>{var n;const l=St(),i=pr(e,l.path),o=(n=e[i])!=null?n:[];return Vr(o,t)},pp={},mp={class:"theme-default-content"};function fp(e,t){const l=_t("Content");return N(),J("div",mp,[oe(l)])}const gp=Ae(pp,[["render",fp],["__file","HomeContent.vue"]]),kp={key:0,class:"features"},vp=ue({__name:"HomeFeatures",setup(e){const t=vt(),l=Y(()=>te(t.value.features)?t.value.features:[]);return(i,o)=>O(l).length?(N(),J("div",kp,[(N(!0),J(Le,null,zt(O(l),n=>(N(),J("div",{key:n.title,class:"feature"},[fe("h2",null,ze(n.title),1),fe("p",null,ze(n.details),1)]))),128))])):Te("v-if",!0)}}),bp=Ae(vp,[["__file","HomeFeatures.vue"]]),_p=["innerHTML"],yp=["textContent"],xp=ue({__name:"HomeFooter",setup(e){const t=vt(),l=Y(()=>t.value.footer),i=Y(()=>t.value.footerHtml);return(o,n)=>O(l)?(N(),J(Le,{key:0},[Te(" eslint-disable-next-line vue/no-v-html "),O(i)?(N(),J("div",{key:0,class:"footer",innerHTML:O(l)},null,8,_p)):(N(),J("div",{key:1,class:"footer",textContent:ze(O(l))},null,8,yp))],64)):Te("v-if",!0)}}),Ep=Ae(xp,[["__file","HomeFooter.vue"]]),Cp=["href","rel","target","aria-label"],Rp=ue({inheritAttrs:!1}),Lp=ue({...Rp,__name:"AutoLink",props:{item:{type:Object,required:!0}},setup(e){const t=e,l=St(),i=Gr(),{item:o}=Ei(t),n=Y(()=>Ul(o.value.link)),a=Y(()=>wh(o.value.link)||Oh(o.value.link)),r=Y(()=>{if(!a.value){if(o.value.target)return o.value.target;if(n.value)return"_blank"}}),s=Y(()=>r.value==="_blank"),c=Y(()=>!n.value&&!a.value&&!s.value),h=Y(()=>{if(!a.value){if(o.value.rel)return o.value.rel;if(s.value)return"noopener noreferrer"}}),p=Y(()=>o.value.ariaLabel||o.value.text),m=Y(()=>{const L=Object.keys(i.value.locales);return L.length?!L.some(E=>E===o.value.link):o.value.link!=="/"}),g=Y(()=>m.value?l.path.startsWith(o.value.link):!1),x=Y(()=>c.value?o.value.activeMatch?new RegExp(o.value.activeMatch).test(l.path):g.value:!1);return(L,E)=>{const k=_t("RouterLink"),b=_t("AutoLinkExternalIcon");return O(c)?(N(),we(k,no({key:0,class:{"router-link-active":O(x)},to:O(o).link,"aria-label":O(p)},L.$attrs),{default:He(()=>[Re(L.$slots,"before"),Mt(" "+ze(O(o).text)+" ",1),Re(L.$slots,"after")]),_:3},16,["class","to","aria-label"])):(N(),J("a",no({key:1,class:"external-link",href:O(o).link,rel:O(h),target:O(r),"aria-label":O(p)},L.$attrs),[Re(L.$slots,"before"),Mt(" "+ze(O(o).text)+" ",1),O(s)?(N(),we(b,{key:0})):Te("v-if",!0),Re(L.$slots,"after")],16,Cp))}}}),kt=Ae(Lp,[["__file","AutoLink.vue"]]),Pp={class:"hero"},Ap={key:0,id:"main-title"},Tp={key:1,class:"description"},Ip={key:2,class:"actions"},wp=ue({__name:"HomeHero",setup(e){const t=vt(),l=jo(),i=Mo(),o=Y(()=>i.value&&t.value.heroImageDark!==void 0?t.value.heroImageDark:t.value.heroImage),n=Y(()=>t.value.heroText===null?null:t.value.heroText||l.value.title||"Hello"),a=Y(()=>t.value.heroAlt||n.value||"hero"),r=Y(()=>t.value.tagline===null?null:t.value.tagline||l.value.description||"Welcome to your VuePress site"),s=Y(()=>te(t.value.actions)?t.value.actions.map(({text:h,link:p,type:m="primary"})=>({text:h,link:p,type:m})):[]),c=()=>{if(!o.value)return null;const h=he("img",{src:Yo(o.value),alt:a.value});return t.value.heroImageDark===void 0?h:he($o,()=>h)};return(h,p)=>(N(),J("header",Pp,[oe(c),O(n)?(N(),J("h1",Ap,ze(O(n)),1)):Te("v-if",!0),O(r)?(N(),J("p",Tp,ze(O(r)),1)):Te("v-if",!0),O(s).length?(N(),J("p",Ip,[(N(!0),J(Le,null,zt(O(s),m=>(N(),we(kt,{key:m.text,class:Ke(["action-button",[m.type]]),item:m},null,8,["class","item"]))),128))])):Te("v-if",!0)]))}}),Op=Ae(wp,[["__file","HomeHero.vue"]]),Fp={class:"home"},zp=ue({__name:"Home",setup(e){return(t,l)=>(N(),J("main",Fp,[oe(Op),oe(bp),oe(gp),oe(Ep)]))}}),Dp=Ae(zp,[["__file","Home.vue"]]),Mp=ue({__name:"NavbarBrand",setup(e){const t=Wl(),l=jo(),i=$e(),o=Mo(),n=Y(()=>i.value.home||t.value),a=Y(()=>l.value.title),r=Y(()=>o.value&&i.value.logoDark!==void 0?i.value.logoDark:i.value.logo),s=()=>{if(!r.value)return null;const c=he("img",{class:"logo",src:Yo(r.value),alt:a.value});return i.value.logoDark===void 0?c:he($o,()=>c)};return(c,h)=>{const p=_t("RouterLink");return N(),we(p,{to:O(n)},{default:He(()=>[oe(s),O(a)?(N(),J("span",{key:0,class:Ke(["site-name",{"can-hide":O(r)}])},ze(O(a)),3)):Te("v-if",!0)]),_:1},8,["to"])}}}),Hp=Ae(Mp,[["__file","NavbarBrand.vue"]]),Sp=ue({__name:"DropdownTransition",setup(e){const t=i=>{i.style.height=i.scrollHeight+"px"},l=i=>{i.style.height=""};return(i,o)=>(N(),we(Bl,{name:"dropdown",onEnter:t,onAfterEnter:l,onBeforeLeave:t},{default:He(()=>[Re(i.$slots,"default")]),_:3}))}}),Nr=Ae(Sp,[["__file","DropdownTransition.vue"]]),Vp=["aria-label"],Np={class:"title"},jp=fe("span",{class:"arrow down"},null,-1),$p=["aria-label"],Yp={class:"title"},Bp={class:"navbar-dropdown"},Up={class:"navbar-dropdown-subtitle"},Wp={key:1},Xp={class:"navbar-dropdown-subitem-wrapper"},qp=ue({__name:"NavbarDropdown",props:{item:{type:Object,required:!0}},setup(e){const t=e,{item:l}=Ei(t),i=Y(()=>l.value.ariaLabel||l.value.text),o=ye(!1),n=St();dt(()=>n.path,()=>{o.value=!1});const a=s=>{s.detail===0?o.value=!o.value:o.value=!1},r=(s,c)=>c[c.length-1]===s;return(s,c)=>(N(),J("div",{class:Ke(["navbar-dropdown-wrapper",{open:o.value}])},[fe("button",{class:"navbar-dropdown-title",type:"button","aria-label":O(i),onClick:a},[fe("span",Np,ze(O(l).text),1),jp],8,Vp),fe("button",{class:"navbar-dropdown-title-mobile",type:"button","aria-label":O(i),onClick:c[0]||(c[0]=h=>o.value=!o.value)},[fe("span",Yp,ze(O(l).text),1),fe("span",{class:Ke(["arrow",o.value?"down":"right"])},null,2)],8,$p),oe(Nr,null,{default:He(()=>[ci(fe("ul",Bp,[(N(!0),J(Le,null,zt(O(l).children,h=>(N(),J("li",{key:h.text,class:"navbar-dropdown-item"},[h.children?(N(),J(Le,{key:0},[fe("h4",Up,[h.link?(N(),we(kt,{key:0,item:h,onFocusout:p=>r(h,O(l).children)&&h.children.length===0&&(o.value=!1)},null,8,["item","onFocusout"])):(N(),J("span",Wp,ze(h.text),1))]),fe("ul",Xp,[(N(!0),J(Le,null,zt(h.children,p=>(N(),J("li",{key:p.link,class:"navbar-dropdown-subitem"},[oe(kt,{item:p,onFocusout:m=>r(p,h.children)&&r(h,O(l).children)&&(o.value=!1)},null,8,["item","onFocusout"])]))),128))])],64)):(N(),we(kt,{key:1,item:h,onFocusout:p=>r(h,O(l).children)&&(o.value=!1)},null,8,["item","onFocusout"]))]))),128))],512),[[mi,o.value]])]),_:1})],2))}}),Kp=Ae(qp,[["__file","NavbarDropdown.vue"]]),aa=e=>decodeURI(e).replace(/#.*$/,"").replace(/(index)?\.(md|html)$/,""),Gp=(e,t)=>{if(t.hash===e)return!0;const l=aa(t.path),i=aa(e);return l===i},jr=(e,t)=>e.link&&Gp(e.link,t)?!0:e.children?e.children.some(l=>jr(l,t)):!1,$r=e=>!Ul(e)||/github\.com/.test(e)?"GitHub":/bitbucket\.org/.test(e)?"Bitbucket":/gitlab\.com/.test(e)?"GitLab":/gitee\.com/.test(e)?"Gitee":null,Qp={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},Zp=({docsRepo:e,editLinkPattern:t})=>{if(t)return t;const l=$r(e);return l!==null?Qp[l]:null},Jp=({docsRepo:e,docsBranch:t,docsDir:l,filePathRelative:i,editLinkPattern:o})=>{if(!i)return null;const n=Zp({docsRepo:e,editLinkPattern:o});return n?n.replace(/:repo/,Ul(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,ur(`${dr(l)}/${i}`)):null},em={key:0,class:"navbar-items"},tm=ue({__name:"NavbarItems",setup(e){const t=()=>{const c=Jt(),h=Wl(),p=jo(),m=$e();return Y(()=>{var b,P,H;const g=Object.keys(p.value.locales);if(g.length<2)return[];const x=c.currentRoute.value.path,L=c.currentRoute.value.fullPath,E=c.currentRoute.value.hash;return[{text:(b=m.value.selectLanguageText)!=null?b:"unknown language",ariaLabel:(H=(P=m.value.selectLanguageAriaLabel)!=null?P:m.value.selectLanguageText)!=null?H:"unknown language",children:g.map(U=>{var G,C,S,F,re,j;const ee=(C=(G=p.value.locales)==null?void 0:G[U])!=null?C:{},w=(F=(S=m.value.locales)==null?void 0:S[U])!=null?F:{},v=`${ee.lang}`,q=(re=w.selectLanguageName)!=null?re:v;let B;if(v===p.value.lang)B=L;else{const le=x.replace(h.value,U);c.getRoutes().some(se=>se.path===le)?B=`${le}${E}`:B=(j=w.home)!=null?j:U}return{text:q,link:B}})}]})},l=()=>{const c=$e(),h=Y(()=>c.value.repo),p=Y(()=>h.value?$r(h.value):null),m=Y(()=>h.value&&!Ul(h.value)?`https://github.com/${h.value}`:h.value),g=Y(()=>m.value?c.value.repoLabel?c.value.repoLabel:p.value===null?"Source":p.value:null);return Y(()=>!m.value||!g.value?[]:[{text:g.value,link:m.value}])},i=c=>be(c)?Ho(c):c.children?{...c,children:c.children.map(i)}:c,n=(()=>{const c=$e();return Y(()=>(c.value.navbar||[]).map(i))})(),a=t(),r=l(),s=Y(()=>[...n.value,...a.value,...r.value]);return(c,h)=>O(s).length?(N(),J("nav",em,[(N(!0),J(Le,null,zt(O(s),p=>(N(),J("div",{key:p.text,class:"navbar-item"},[p.children?(N(),we(Kp,{key:0,item:p},null,8,["item"])):(N(),we(kt,{key:1,item:p},null,8,["item"]))]))),128))])):Te("v-if",!0)}}),Yr=Ae(tm,[["__file","NavbarItems.vue"]]),lm=["title"],im={class:"icon",focusable:"false",viewBox:"0 0 32 32"},om=jc('',9),nm=[om],am={class:"icon",focusable:"false",viewBox:"0 0 32 32"},rm=fe("path",{d:"M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z",fill:"currentColor"},null,-1),sm=[rm],cm=ue({__name:"ToggleColorModeButton",setup(e){const t=$e(),l=Mo(),i=()=>{l.value=!l.value};return(o,n)=>(N(),J("button",{class:"toggle-color-mode-button",title:O(t).toggleColorMode,onClick:i},[ci((N(),J("svg",im,nm,512)),[[mi,!O(l)]]),ci((N(),J("svg",am,sm,512)),[[mi,O(l)]])],8,lm))}}),hm=Ae(cm,[["__file","ToggleColorModeButton.vue"]]),dm=["title"],um=fe("div",{class:"icon","aria-hidden":"true"},[fe("span"),fe("span"),fe("span")],-1),pm=[um],mm=ue({__name:"ToggleSidebarButton",emits:["toggle"],setup(e){const t=$e();return(l,i)=>(N(),J("div",{class:"toggle-sidebar-button",title:O(t).toggleSidebar,"aria-expanded":"false",role:"button",tabindex:"0",onClick:i[0]||(i[0]=o=>l.$emit("toggle"))},pm,8,dm))}}),fm=Ae(mm,[["__file","ToggleSidebarButton.vue"]]),gm=ue({__name:"Navbar",emits:["toggle-sidebar"],setup(e){const t=$e(),l=ye(null),i=ye(null),o=ye(0),n=Y(()=>o.value?{maxWidth:o.value+"px"}:{});Ze(()=>{const s=a(l.value,"paddingLeft")+a(l.value,"paddingRight"),c=()=>{var h;window.innerWidth<=719?o.value=0:o.value=l.value.offsetWidth-s-(((h=i.value)==null?void 0:h.offsetWidth)||0)};c(),window.addEventListener("resize",c,!1),window.addEventListener("orientationchange",c,!1)});function a(r,s){var p,m,g;const c=(g=(m=(p=r==null?void 0:r.ownerDocument)==null?void 0:p.defaultView)==null?void 0:m.getComputedStyle(r,null))==null?void 0:g[s],h=Number.parseInt(c,10);return Number.isNaN(h)?0:h}return(r,s)=>{const c=_t("NavbarSearch");return N(),J("header",{ref_key:"navbar",ref:l,class:"navbar"},[oe(fm,{onToggle:s[0]||(s[0]=h=>r.$emit("toggle-sidebar"))}),fe("span",{ref_key:"navbarBrand",ref:i},[oe(Hp)],512),fe("div",{class:"navbar-items-wrapper",style:Sl(O(n))},[Re(r.$slots,"before"),oe(Yr,{class:"can-hide"}),Re(r.$slots,"after"),O(t).colorModeSwitch?(N(),we(hm,{key:0})):Te("v-if",!0),oe(c)],4)],512)}}}),km=Ae(gm,[["__file","Navbar.vue"]]),vm={class:"page-meta"},bm={key:0,class:"meta-item edit-link"},_m={key:1,class:"meta-item last-updated"},ym={class:"meta-item-label"},xm={class:"meta-item-info"},Em={key:2,class:"meta-item contributors"},Cm={class:"meta-item-label"},Rm={class:"meta-item-info"},Lm=["title"],Pm=Mt(", "),Am=ue({__name:"PageMeta",setup(e){const t=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var b,P,H;if(!((P=(b=h.value.editLink)!=null?b:s.value.editLink)!=null?P:!0))return null;const{repo:m,docsRepo:g=m,docsBranch:x="main",docsDir:L="",editLinkText:E}=s.value;if(!g)return null;const k=Jp({docsRepo:g,docsBranch:x,docsDir:L,filePathRelative:c.value.filePathRelative,editLinkPattern:(H=h.value.editLinkPattern)!=null?H:s.value.editLinkPattern});return k?{text:E!=null?E:"Edit this page",link:k}:null})},l=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var g,x,L,E;return!((x=(g=h.value.lastUpdated)!=null?g:s.value.lastUpdated)!=null?x:!0)||!((L=c.value.git)!=null&&L.updatedTime)?null:new Date((E=c.value.git)==null?void 0:E.updatedTime).toLocaleString()})},i=()=>{const s=$e(),c=Ot(),h=vt();return Y(()=>{var m,g,x,L;return((g=(m=h.value.contributors)!=null?m:s.value.contributors)!=null?g:!0)&&(L=(x=c.value.git)==null?void 0:x.contributors)!=null?L:null})},o=$e(),n=t(),a=l(),r=i();return(s,c)=>{const h=_t("ClientOnly");return N(),J("footer",vm,[O(n)?(N(),J("div",bm,[oe(kt,{class:"meta-item-label",item:O(n)},null,8,["item"])])):Te("v-if",!0),O(a)?(N(),J("div",_m,[fe("span",ym,ze(O(o).lastUpdatedText)+": ",1),oe(h,null,{default:He(()=>[fe("span",xm,ze(O(a)),1)]),_:1})])):Te("v-if",!0),O(r)&&O(r).length?(N(),J("div",Em,[fe("span",Cm,ze(O(o).contributorsText)+": ",1),fe("span",Rm,[(N(!0),J(Le,null,zt(O(r),(p,m)=>(N(),J(Le,{key:m},[fe("span",{class:"contributor",title:`email: ${p.email}`},ze(p.name),9,Lm),m!==O(r).length-1?(N(),J(Le,{key:0},[Pm],64)):Te("v-if",!0)],64))),128))])])):Te("v-if",!0)])}}}),Tm=Ae(Am,[["__file","PageMeta.vue"]]),Im={key:0,class:"page-nav"},wm={class:"inner"},Om={key:0,class:"prev"},Fm={key:1,class:"next"},zm=ue({__name:"PageNav",setup(e){const t=s=>s===!1?null:be(s)?Ho(s):Oo(s)?s:!1,l=(s,c,h)=>{const p=s.findIndex(m=>m.link===c);if(p!==-1){const m=s[p+h];return m!=null&&m.link?m:null}for(const m of s)if(m.children){const g=l(m.children,c,h);if(g)return g}return null},i=vt(),o=So(),n=St(),a=Y(()=>{const s=t(i.value.prev);return s!==!1?s:l(o.value,n.path,-1)}),r=Y(()=>{const s=t(i.value.next);return s!==!1?s:l(o.value,n.path,1)});return(s,c)=>O(a)||O(r)?(N(),J("nav",Im,[fe("p",wm,[O(a)?(N(),J("span",Om,[oe(kt,{item:O(a)},null,8,["item"])])):Te("v-if",!0),O(r)?(N(),J("span",Fm,[oe(kt,{item:O(r)},null,8,["item"])])):Te("v-if",!0)])])):Te("v-if",!0)}}),Dm=Ae(zm,[["__file","PageNav.vue"]]),Mm={class:"page"},Hm={class:"theme-default-content"},Sm=ue({__name:"Page",setup(e){return(t,l)=>{const i=_t("Content");return N(),J("main",Mm,[Re(t.$slots,"top"),fe("div",Hm,[Re(t.$slots,"content-top"),oe(i),Re(t.$slots,"content-bottom")]),oe(Tm),oe(Dm),Re(t.$slots,"bottom")])}}}),Vm=Ae(Sm,[["__file","Page.vue"]]),Nm=["onKeydown"],jm={class:"sidebar-item-children"},$m=ue({__name:"SidebarItem",props:{item:{type:Object,required:!0},depth:{type:Number,required:!1,default:0}},setup(e){const t=e,{item:l,depth:i}=Ei(t),o=St(),n=Jt(),a=Y(()=>jr(l.value,o)),r=Y(()=>({"sidebar-item":!0,"sidebar-heading":i.value===0,active:a.value,collapsible:l.value.collapsible})),s=Y(()=>l.value.collapsible?a.value:!0),[c,h]=Tu(s.value),p=g=>{l.value.collapsible&&(g.preventDefault(),h())},m=n.afterEach(g=>{jl(()=>{c.value=s.value})});return Yl(()=>{m()}),(g,x)=>{var E;const L=_t("SidebarItem",!0);return N(),J("li",null,[O(l).link?(N(),we(kt,{key:0,class:Ke(O(r)),item:O(l)},null,8,["class","item"])):(N(),J("p",{key:1,tabindex:"0",class:Ke(O(r)),onClick:p,onKeydown:Eh(p,["enter"])},[Mt(ze(O(l).text)+" ",1),O(l).collapsible?(N(),J("span",{key:0,class:Ke(["arrow",O(c)?"down":"right"])},null,2)):Te("v-if",!0)],42,Nm)),(E=O(l).children)!=null&&E.length?(N(),we(Nr,{key:2},{default:He(()=>[ci(fe("ul",jm,[(N(!0),J(Le,null,zt(O(l).children,k=>(N(),we(L,{key:`${O(i)}${k.text}${k.link}`,item:k,depth:O(i)+1},null,8,["item","depth"]))),128))],512),[[mi,O(c)]])]),_:1})):Te("v-if",!0)])}}}),Ym=Ae($m,[["__file","SidebarItem.vue"]]),Bm={key:0,class:"sidebar-items"},Um=ue({__name:"SidebarItems",setup(e){const t=St(),l=So();return Ze(()=>{dt(()=>t.hash,i=>{const o=document.querySelector(".sidebar");if(!o)return;const n=document.querySelector(`.sidebar a.sidebar-item[href="${t.path}${i}"]`);if(!n)return;const{top:a,height:r}=o.getBoundingClientRect(),{top:s,height:c}=n.getBoundingClientRect();sa+r&&n.scrollIntoView(!1)})}),(i,o)=>O(l).length?(N(),J("ul",Bm,[(N(!0),J(Le,null,zt(O(l),n=>(N(),we(Ym,{key:`${n.text}${n.link}`,item:n},null,8,["item"]))),128))])):Te("v-if",!0)}}),Wm=Ae(Um,[["__file","SidebarItems.vue"]]),Xm={class:"sidebar"},qm=ue({__name:"Sidebar",setup(e){return(t,l)=>(N(),J("aside",Xm,[oe(Yr),Re(t.$slots,"top"),oe(Wm),Re(t.$slots,"bottom")]))}}),Km=Ae(qm,[["__file","Sidebar.vue"]]),Gm=ue({__name:"Layout",setup(e){const t=Ot(),l=vt(),i=$e(),o=Y(()=>l.value.navbar!==!1&&i.value.navbar!==!1),n=So(),a=ye(!1),r=E=>{a.value=typeof E=="boolean"?E:!a.value},s={x:0,y:0},c=E=>{s.x=E.changedTouches[0].clientX,s.y=E.changedTouches[0].clientY},h=E=>{const k=E.changedTouches[0].clientX-s.x,b=E.changedTouches[0].clientY-s.y;Math.abs(k)>Math.abs(b)&&Math.abs(k)>40&&(k>0&&s.x<=80?r(!0):r(!1))},p=Y(()=>[{"no-navbar":!o.value,"no-sidebar":!n.value.length,"sidebar-open":a.value},l.value.pageClass]);let m;Ze(()=>{m=Jt().afterEach(()=>{r(!1)})}),Pi(()=>{m()});const g=Hr(),x=g.resolve,L=g.pending;return(E,k)=>(N(),J("div",{class:Ke(["theme-container",O(p)]),onTouchstart:c,onTouchend:h},[Re(E.$slots,"navbar",{},()=>[O(o)?(N(),we(km,{key:0,onToggleSidebar:r},{before:He(()=>[Re(E.$slots,"navbar-before")]),after:He(()=>[Re(E.$slots,"navbar-after")]),_:3})):Te("v-if",!0)]),fe("div",{class:"sidebar-mask",onClick:k[0]||(k[0]=b=>r(!1))}),Re(E.$slots,"sidebar",{},()=>[oe(Km,null,{top:He(()=>[Re(E.$slots,"sidebar-top")]),bottom:He(()=>[Re(E.$slots,"sidebar-bottom")]),_:3})]),Re(E.$slots,"page",{},()=>[O(l).home?(N(),we(Dp,{key:0})):(N(),we(Bl,{key:1,name:"fade-slide-y",mode:"out-in",onBeforeEnter:O(x),onBeforeLeave:O(L)},{default:He(()=>[(N(),we(Vm,{key:O(t).path},{top:He(()=>[Re(E.$slots,"page-top")]),"content-top":He(()=>[Re(E.$slots,"page-content-top")]),"content-bottom":He(()=>[Re(E.$slots,"page-content-bottom")]),bottom:He(()=>[Re(E.$slots,"page-bottom")]),_:3}))]),_:3},8,["onBeforeEnter","onBeforeLeave"]))])],34))}}),Qm=Ae(Gm,[["__file","Layout.vue"]]),Zm={class:"theme-container"},Jm={class:"page"},ef={class:"theme-default-content"},tf=fe("h1",null,"404",-1),lf=ue({__name:"NotFound",setup(e){var r,s,c;const t=Wl(),l=$e(),i=(r=l.value.notFound)!=null?r:["Not Found"],o=()=>i[Math.floor(Math.random()*i.length)],n=(s=l.value.home)!=null?s:t.value,a=(c=l.value.backToHome)!=null?c:"Back to home";return(h,p)=>{const m=_t("RouterLink");return N(),J("div",Zm,[fe("main",Jm,[fe("div",ef,[tf,fe("blockquote",null,ze(o()),1),oe(m,{to:O(n)},{default:He(()=>[Mt(ze(O(a)),1)]),_:1},8,["to"])])])])}}}),of=Ae(lf,[["__file","NotFound.vue"]]);const nf=Ht({enhance({app:e,router:t}){e.component("Badge",gu),e.component("CodeGroup",ku),e.component("CodeGroupItem",yu),e.component("AutoLinkExternalIcon",()=>{const i=e.component("ExternalLinkIcon");return i?he(i):null}),e.component("NavbarSearch",()=>{const i=e.component("Docsearch")||e.component("SearchBox");return i?he(i):null});const l=t.options.scrollBehavior;t.options.scrollBehavior=async(...i)=>(await Hr().wait(),l(...i))},setup(){np(),sp()},layouts:{Layout:Qm,NotFound:of}}),af=(e,t)=>t.some(l=>{if(be(l))return l===e.key;const{key:i,ctrl:o=!1,shift:n=!1,alt:a=!1}=l;return i===e.key&&o===e.ctrlKey&&n===e.shiftKey&&a===e.altKey}),rf=/[^\x00-\x7F]/,sf=e=>e.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t),ra=e=>e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),sa=(e,t)=>{const l=t.join(" "),i=sf(e);if(rf.test(e))return i.some(a=>l.toLowerCase().indexOf(a)>-1);const o=e.endsWith(" ");return new RegExp(i.map((a,r)=>i.length===r+1&&!o?`(?=.*\\b${ra(a)})`:`(?=.*\\b${ra(a)}\\b)`).join("")+".+","gi").test(l)},cf=({input:e,hotKeys:t})=>{if(t.value.length===0)return;const l=i=>{!e.value||af(i,t.value)&&!e.value.contains(i.target)&&(i.preventDefault(),e.value.focus())};Ze(()=>{document.addEventListener("keydown",l)}),Yl(()=>{document.removeEventListener("keydown",l)})},hf=[{title:"Home",headers:[{level:3,title:"All Hook process in one step, everything is simplified",slug:"all-hook-process-in-one-step-everything-is-simplified",link:"#all-hook-process-in-one-step-everything-is-simplified",children:[]}],path:"/en/",pathLocale:"/en/",extraFields:[]},{title:"\u9996\u9875",headers:[{level:3,title:"\u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410",slug:"\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410",link:"#\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410",children:[]}],path:"/zh-cn/",pathLocale:"/zh-cn/",extraFields:[]},{title:"About this Document",headers:[{level:2,title:"License",slug:"license",link:"#license",children:[]}],path:"/en/about/about.html",pathLocale:"/en/",extraFields:[]},{title:"Changelog",headers:[{level:3,title:"1.1.4 | 2022.10.04",slug:"_1-1-4-2022-10-04",link:"#_1-1-4-2022-10-04",children:[]},{level:3,title:"1.1.3 | 2022.09.30",slug:"_1-1-3-2022-09-30",link:"#_1-1-3-2022-09-30",children:[]},{level:3,title:"1.1.2 | 2022.09.30",slug:"_1-1-2-2022-09-30",link:"#_1-1-2-2022-09-30",children:[]},{level:3,title:"1.1.1 | 2022.09.28",slug:"_1-1-1-2022-09-28",link:"#_1-1-1-2022-09-28",children:[]},{level:3,title:"1.1.0 | 2022.09.28",slug:"_1-1-0-2022-09-28",link:"#_1-1-0-2022-09-28",children:[]},{level:3,title:"1.0.92 | 2022.05.31",slug:"_1-0-92-2022-05-31",link:"#_1-0-92-2022-05-31",children:[]},{level:3,title:"1.0.91 | 2022.05.29",slug:"_1-0-91-2022-05-29",link:"#_1-0-91-2022-05-29",children:[]},{level:3,title:"1.0.90 | 2022.05.27",slug:"_1-0-90-2022-05-27",link:"#_1-0-90-2022-05-27",children:[]},{level:3,title:"1.0.89 | 2022.05.26",slug:"_1-0-89-2022-05-26",link:"#_1-0-89-2022-05-26",children:[]},{level:3,title:"1.0.88 | 2022.05.25",slug:"_1-0-88-2022-05-25",link:"#_1-0-88-2022-05-25",children:[]},{level:3,title:"1.0.87 | 2022.05.10",slug:"_1-0-87-2022-05-10",link:"#_1-0-87-2022-05-10",children:[]},{level:3,title:"1.0.86 | 2022.05.06",slug:"_1-0-86-2022-05-06",link:"#_1-0-86-2022-05-06",children:[]},{level:3,title:"1.0.85 | 2022.05.04",slug:"_1-0-85-2022-05-04",link:"#_1-0-85-2022-05-04",children:[]},{level:3,title:"1.0.83 | 2022.05.04",slug:"_1-0-83-2022-05-04",link:"#_1-0-83-2022-05-04",children:[]},{level:3,title:"1.0.82 | 2022.05.04",slug:"_1-0-82-2022-05-04",link:"#_1-0-82-2022-05-04",children:[]},{level:3,title:"1.0.81 | 2022.05.04",slug:"_1-0-81-2022-05-04",link:"#_1-0-81-2022-05-04",children:[]},{level:3,title:"1.0.80 | 2022.05.01",slug:"_1-0-80-2022-05-01",link:"#_1-0-80-2022-05-01",children:[]},{level:3,title:"1.0.78 | 2022.04.18",slug:"_1-0-78-2022-04-18",link:"#_1-0-78-2022-04-18",children:[]},{level:3,title:"1.0.77 | 2022.04.15",slug:"_1-0-77-2022-04-15",link:"#_1-0-77-2022-04-15",children:[]},{level:3,title:"1.0.75 | 2022.04.13",slug:"_1-0-75-2022-04-13",link:"#_1-0-75-2022-04-13",children:[]},{level:3,title:"1.0.73 | 2022.04.10",slug:"_1-0-73-2022-04-10",link:"#_1-0-73-2022-04-10",children:[]},{level:3,title:"1.0.72 | 2022.04.09",slug:"_1-0-72-2022-04-09",link:"#_1-0-72-2022-04-09",children:[]},{level:3,title:"1.0.71 | 2022.04.04",slug:"_1-0-71-2022-04-04",link:"#_1-0-71-2022-04-04",children:[]},{level:3,title:"1.0.70 | 2022.04.04",slug:"_1-0-70-2022-04-04",link:"#_1-0-70-2022-04-04",children:[]},{level:3,title:"1.0.69 | 2022.03.30",slug:"_1-0-69-2022-03-30",link:"#_1-0-69-2022-03-30",children:[]},{level:3,title:"1.0.68 | 2022.03.29",slug:"_1-0-68-2022-03-29",link:"#_1-0-68-2022-03-29",children:[]},{level:3,title:"1.0.67 | 2022.03.27",slug:"_1-0-67-2022-03-27",link:"#_1-0-67-2022-03-27",children:[]},{level:3,title:"1.0.66 | 2022.03.25",slug:"_1-0-66-2022-03-25",link:"#_1-0-66-2022-03-25",children:[]},{level:3,title:"1.0.65 | 2022.03.25",slug:"_1-0-65-2022-03-25",link:"#_1-0-65-2022-03-25",children:[]},{level:3,title:"1.0.6 | 2022.03.20",slug:"_1-0-6-2022-03-20",link:"#_1-0-6-2022-03-20",children:[]},{level:3,title:"1.0.55 | 2022.03.18",slug:"_1-0-55-2022-03-18",link:"#_1-0-55-2022-03-18",children:[]},{level:3,title:"1.0.5 | 2022.03.18",slug:"_1-0-5-2022-03-18",link:"#_1-0-5-2022-03-18",children:[]},{level:3,title:"1.0.4 | 2022.03.06",slug:"_1-0-4-2022-03-06",link:"#_1-0-4-2022-03-06",children:[]},{level:3,title:"1.0.3 | 2022.03.02",slug:"_1-0-3-2022-03-02",link:"#_1-0-3-2022-03-02",children:[]},{level:3,title:"1.0.2 | 2022.02.18",slug:"_1-0-2-2022-02-18",link:"#_1-0-2-2022-02-18",children:[]},{level:3,title:"1.0.1 | 2022.02.15",slug:"_1-0-1-2022-02-15",link:"#_1-0-1-2022-02-15",children:[]},{level:3,title:"1.0 | 2022.02.14",slug:"_1-0-2022-02-14",link:"#_1-0-2022-02-14",children:[]}],path:"/en/about/changelog.html",pathLocale:"/en/",extraFields:[]},{title:"Contact Us",headers:[{level:2,title:"Help with Maintenance",slug:"help-with-maintenance",link:"#help-with-maintenance",children:[]}],path:"/en/about/contacts.html",pathLocale:"/en/",extraFields:[]},{title:"Looking for Future",headers:[{level:2,title:"Unresolved Issues",slug:"unresolved-issues",link:"#unresolved-issues",children:[{level:3,title:"YukiHookModulePrefs",slug:"yukihookmoduleprefs",link:"#yukihookmoduleprefs",children:[]}]},{level:2,title:"Future Plans",slug:"future-plans",link:"#future-plans",children:[{level:3,title:"Lite Version Supported for Standalone Use",slug:"lite-version-supported-for-standalone-use",link:"#lite-version-supported-for-standalone-use",children:[]},{level:3,title:"Support for More Hook Framework",slug:"support-for-more-hook-framework",link:"#support-for-more-hook-framework",children:[]}]}],path:"/en/about/future.html",pathLocale:"/en/",extraFields:[]},{title:"Document Introduce",headers:[{level:2,title:"Function Description",slug:"function-description",link:"#function-description",children:[]},{level:2,title:"Function Example Description",slug:"function-example-description",link:"#function-example-description",children:[]},{level:2,title:"Change Record Description",slug:"change-record-description",link:"#change-record-description",children:[]},{level:2,title:"Related Symbols Description",slug:"related-symbols-description",link:"#related-symbols-description",children:[]}],path:"/en/api/home.html",pathLocale:"/en/",extraFields:[]},{title:"API Basic Configs",headers:[{level:2,title:"Function Configs",slug:"function-configs",link:"#function-configs",children:[{level:3,title:"configs Method",slug:"configs-method",link:"#configs-method",children:[]}]},{level:2,title:"Hooker Configs",slug:"hooker-configs",link:"#hooker-configs",children:[{level:3,title:"Created by lambda",slug:"created-by-lambda",link:"#created-by-lambda",children:[]},{level:3,title:"Created by Custom Hooker",slug:"created-by-custom-hooker",link:"#created-by-custom-hooker",children:[]},{level:3,title:"Expansion Features",slug:"expansion-features",link:"#expansion-features",children:[]},{level:3,title:"Precautions",slug:"precautions",link:"#precautions",children:[]}]},{level:2,title:"Precautions when using as Hook API",slug:"precautions-when-using-as-hook-api",link:"#precautions-when-using-as-hook-api",children:[]}],path:"/en/config/api-example.html",pathLocale:"/en/",extraFields:[]},{title:"API Exception Handling",headers:[{level:2,title:"Non-Blocking Exceptions",slug:"non-blocking-exceptions",link:"#non-blocking-exceptions",children:[]},{level:2,title:"Blocking Exceptions",slug:"blocking-exceptions",link:"#blocking-exceptions",children:[]}],path:"/en/config/api-exception.html",pathLocale:"/en/",extraFields:[]},{title:"Use as Hook API Configs",headers:[{level:2,title:"Dependency Configs",slug:"dependency-configs",link:"#dependency-configs",children:[]},{level:2,title:"Entry Configs",slug:"entry-configs",link:"#entry-configs",children:[]},{level:2,title:"Hook Framework",slug:"hook-framework",link:"#hook-framework",children:[{level:3,title:"Pine",slug:"pine",link:"#pine",children:[]},{level:3,title:"SandHook",slug:"sandhook",link:"#sandhook",children:[]},{level:3,title:"Whale",slug:"whale",link:"#whale",children:[]}]}],path:"/en/config/api-using.html",pathLocale:"/en/",extraFields:[]},{title:"R8 & Proguard Obfuscate",headers:[{level:2,title:"R8",slug:"r8",link:"#r8",children:[]},{level:2,title:"Proguard",slug:"proguard",link:"#proguard",children:[]}],path:"/en/config/r8-proguard.html",pathLocale:"/en/",extraFields:[]},{title:"Use as Xposed Module Configs",headers:[{level:2,title:"Dependency Configs",slug:"dependency-configs",link:"#dependency-configs",children:[]},{level:2,title:"Custom Automatic Builder",slug:"custom-automatic-builder",link:"#custom-automatic-builder",children:[{level:3,title:"InjectYukiHookWithXposed Annotation",slug:"injectyukihookwithxposed-annotation",link:"#injectyukihookwithxposed-annotation",children:[]},{level:3,title:"IYukiHookXposedInit Interface",slug:"iyukihookxposedinit-interface",link:"#iyukihookxposedinit-interface",children:[]}]},{level:2,title:"Native Xposed API Events",slug:"native-xposed-api-events",link:"#native-xposed-api-events",children:[]}],path:"/en/config/xposed-using.html",pathLocale:"/en/",extraFields:[]},{title:"Usage Example",headers:[{level:2,title:"Structure Diagram",slug:"structure-diagram",link:"#structure-diagram",children:[]},{level:2,title:"Demo",slug:"demo",link:"#demo",children:[]},{level:2,title:"A Simple Hook Example",slug:"a-simple-hook-example",link:"#a-simple-hook-example",children:[{level:3,title:"Hook App",slug:"hook-app",link:"#hook-app",children:[]},{level:3,title:"Hook Zygote",slug:"hook-zygote",link:"#hook-zygote",children:[]},{level:3,title:"Hook System Framework",slug:"hook-system-framework",link:"#hook-system-framework",children:[]},{level:3,title:"Hook Resources",slug:"hook-resources",link:"#hook-resources",children:[]},{level:3,title:"Remove Hook",slug:"remove-hook",link:"#remove-hook",children:[]}]},{level:2,title:"Exception Handling",slug:"exception-handling",link:"#exception-handling",children:[{level:3,title:"Listen for Exceptions",slug:"listen-for-exceptions",link:"#listen-for-exceptions",children:[]},{level:3,title:"Throw an Exception",slug:"throw-an-exception",link:"#throw-an-exception",children:[]}]},{level:2,title:"Status Monitor",slug:"status-monitor",link:"#status-monitor",children:[]},{level:2,title:"Expansion Usage",slug:"expansion-usage",link:"#expansion-usage",children:[{level:3,title:"Multiple Hosts",slug:"multiple-hosts",link:"#multiple-hosts",children:[]},{level:3,title:"Multiple Processes",slug:"multiple-processes",link:"#multiple-processes",children:[]}]},{level:2,title:"Writing Optimization",slug:"writing-optimization",link:"#writing-optimization",children:[]},{level:2,title:"Xposed Module own Active State",slug:"xposed-module-own-active-state",link:"#xposed-module-own-active-state",children:[]}],path:"/en/guide/example.html",pathLocale:"/en/",extraFields:[]},{title:"Introduce",headers:[{level:2,title:"Background",slug:"background",link:"#background",children:[]},{level:2,title:"Usage",slug:"usage",link:"#usage",children:[]},{level:2,title:"Language Requirement",slug:"language-requirement",link:"#language-requirement",children:[]},{level:2,title:"Source of Inspiration",slug:"source-of-inspiration",link:"#source-of-inspiration",children:[]},{level:2,title:"Suppored Hook Framework",slug:"suppored-hook-framework",link:"#suppored-hook-framework",children:[]}],path:"/en/guide/home.html",pathLocale:"/en/",extraFields:[]},{title:"Basic Knowledge",headers:[{level:2,title:"Related Introduction",slug:"related-introduction",link:"#related-introduction",children:[{level:3,title:"What is Xposed",slug:"what-is-xposed",link:"#what-is-xposed",children:[]},{level:3,title:"What can Xposed do",slug:"what-can-xposed-do",link:"#what-can-xposed-do",children:[]},{level:3,title:"Development Process",slug:"development-process",link:"#development-process",children:[]},{level:3,title:"Derivatives",slug:"derivatives",link:"#derivatives",children:[]},{level:3,title:"What YukiHookAPI does",slug:"what-yukihookapi-does",link:"#what-yukihookapi-does",children:[]}]},{level:2,title:"Let's Started",slug:"let-s-started",link:"#let-s-started",children:[]}],path:"/en/guide/knowledge.html",pathLocale:"/en/",extraFields:[]},{title:"Migrate from Xposed API",headers:[{level:2,title:"Migrate Hook Entry Point",slug:"migrate-hook-entry-point",link:"#migrate-hook-entry-point",children:[]},{level:2,title:"Migrate Hook Method Body",slug:"migrate-hook-method-body",link:"#migrate-hook-method-body",children:[{level:3,title:"Before/After Hook",slug:"before-after-hook",link:"#before-after-hook",children:[]},{level:3,title:"Replace Hook",slug:"replace-hook",link:"#replace-hook",children:[]}]},{level:2,title:"Migrate Other Features",slug:"migrate-other-features",link:"#migrate-other-features",children:[]}],path:"/en/guide/move-to-new-api.html",pathLocale:"/en/",extraFields:[]},{title:"Quick Start",headers:[{level:2,title:"Environment Requirements",slug:"environment-requirements",link:"#environment-requirements",children:[]},{level:2,title:"Automatically Build Project",slug:"automatically-build-project",link:"#automatically-build-project",children:[]},{level:2,title:"Manually Configure Project",slug:"manually-configure-project",link:"#manually-configure-project",children:[{level:3,title:"Create Project",slug:"create-project",link:"#create-project",children:[]},{level:3,title:"Integration Dependencies",slug:"integration-dependencies",link:"#integration-dependencies",children:[]},{level:3,title:"Use as Xposed Module",slug:"use-as-xposed-module",link:"#use-as-xposed-module",children:[]},{level:3,title:"Use as Hook API",slug:"use-as-hook-api",link:"#use-as-hook-api",children:[]}]}],path:"/en/guide/quick-start.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookAPI Project Builder",headers:[{level:2,title:"Get Project",slug:"get-project",link:"#get-project",children:[]},{level:2,title:"Usage",slug:"usage",link:"#usage",children:[{level:3,title:"Basic Usage",slug:"basic-usage",link:"#basic-usage",children:[]},{level:3,title:"Config Template",slug:"config-template",link:"#config-template",children:[]},{level:3,title:"Multilingual Support",slug:"multilingual-support",link:"#multilingual-support",children:[]}]}],path:"/en/tools/yukihookapi-projectbuilder.html",pathLocale:"/en/",extraFields:[]},{title:"\u5173\u4E8E\u6B64\u6587\u6863",headers:[{level:2,title:"License",slug:"license",link:"#license",children:[]}],path:"/zh-cn/about/about.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u66F4\u65B0\u65E5\u5FD7",headers:[{level:3,title:"1.1.4 | 2022.10.04",slug:"_1-1-4-2022-10-04",link:"#_1-1-4-2022-10-04",children:[]},{level:3,title:"1.1.3 | 2022.09.30",slug:"_1-1-3-2022-09-30",link:"#_1-1-3-2022-09-30",children:[]},{level:3,title:"1.1.2 | 2022.09.30",slug:"_1-1-2-2022-09-30",link:"#_1-1-2-2022-09-30",children:[]},{level:3,title:"1.1.1 | 2022.09.28",slug:"_1-1-1-2022-09-28",link:"#_1-1-1-2022-09-28",children:[]},{level:3,title:"1.1.0 | 2022.09.28",slug:"_1-1-0-2022-09-28",link:"#_1-1-0-2022-09-28",children:[]},{level:3,title:"1.0.92 | 2022.05.31",slug:"_1-0-92-2022-05-31",link:"#_1-0-92-2022-05-31",children:[]},{level:3,title:"1.0.91 | 2022.05.29",slug:"_1-0-91-2022-05-29",link:"#_1-0-91-2022-05-29",children:[]},{level:3,title:"1.0.90 | 2022.05.27",slug:"_1-0-90-2022-05-27",link:"#_1-0-90-2022-05-27",children:[]},{level:3,title:"1.0.89 | 2022.05.26",slug:"_1-0-89-2022-05-26",link:"#_1-0-89-2022-05-26",children:[]},{level:3,title:"1.0.88 | 2022.05.25",slug:"_1-0-88-2022-05-25",link:"#_1-0-88-2022-05-25",children:[]},{level:3,title:"1.0.87 | 2022.05.10",slug:"_1-0-87-2022-05-10",link:"#_1-0-87-2022-05-10",children:[]},{level:3,title:"1.0.86 | 2022.05.06",slug:"_1-0-86-2022-05-06",link:"#_1-0-86-2022-05-06",children:[]},{level:3,title:"1.0.85 | 2022.05.04",slug:"_1-0-85-2022-05-04",link:"#_1-0-85-2022-05-04",children:[]},{level:3,title:"1.0.83 | 2022.05.04",slug:"_1-0-83-2022-05-04",link:"#_1-0-83-2022-05-04",children:[]},{level:3,title:"1.0.82 | 2022.05.04",slug:"_1-0-82-2022-05-04",link:"#_1-0-82-2022-05-04",children:[]},{level:3,title:"1.0.81 | 2022.05.04",slug:"_1-0-81-2022-05-04",link:"#_1-0-81-2022-05-04",children:[]},{level:3,title:"1.0.80 | 2022.05.01",slug:"_1-0-80-2022-05-01",link:"#_1-0-80-2022-05-01",children:[]},{level:3,title:"1.0.78 | 2022.04.18",slug:"_1-0-78-2022-04-18",link:"#_1-0-78-2022-04-18",children:[]},{level:3,title:"1.0.77 | 2022.04.15",slug:"_1-0-77-2022-04-15",link:"#_1-0-77-2022-04-15",children:[]},{level:3,title:"1.0.75 | 2022.04.13",slug:"_1-0-75-2022-04-13",link:"#_1-0-75-2022-04-13",children:[]},{level:3,title:"1.0.73 | 2022.04.10",slug:"_1-0-73-2022-04-10",link:"#_1-0-73-2022-04-10",children:[]},{level:3,title:"1.0.72 | 2022.04.09",slug:"_1-0-72-2022-04-09",link:"#_1-0-72-2022-04-09",children:[]},{level:3,title:"1.0.71 | 2022.04.04",slug:"_1-0-71-2022-04-04",link:"#_1-0-71-2022-04-04",children:[]},{level:3,title:"1.0.70 | 2022.04.04",slug:"_1-0-70-2022-04-04",link:"#_1-0-70-2022-04-04",children:[]},{level:3,title:"1.0.69 | 2022.03.30",slug:"_1-0-69-2022-03-30",link:"#_1-0-69-2022-03-30",children:[]},{level:3,title:"1.0.68 | 2022.03.29",slug:"_1-0-68-2022-03-29",link:"#_1-0-68-2022-03-29",children:[]},{level:3,title:"1.0.67 | 2022.03.27",slug:"_1-0-67-2022-03-27",link:"#_1-0-67-2022-03-27",children:[]},{level:3,title:"1.0.66 | 2022.03.25",slug:"_1-0-66-2022-03-25",link:"#_1-0-66-2022-03-25",children:[]},{level:3,title:"1.0.65 | 2022.03.25",slug:"_1-0-65-2022-03-25",link:"#_1-0-65-2022-03-25",children:[]},{level:3,title:"1.0.6 | 2022.03.20",slug:"_1-0-6-2022-03-20",link:"#_1-0-6-2022-03-20",children:[]},{level:3,title:"1.0.55 | 2022.03.18",slug:"_1-0-55-2022-03-18",link:"#_1-0-55-2022-03-18",children:[]},{level:3,title:"1.0.5 | 2022.03.18",slug:"_1-0-5-2022-03-18",link:"#_1-0-5-2022-03-18",children:[]},{level:3,title:"1.0.4 | 2022.03.06",slug:"_1-0-4-2022-03-06",link:"#_1-0-4-2022-03-06",children:[]},{level:3,title:"1.0.3 | 2022.03.02",slug:"_1-0-3-2022-03-02",link:"#_1-0-3-2022-03-02",children:[]},{level:3,title:"1.0.2 | 2022.02.18",slug:"_1-0-2-2022-02-18",link:"#_1-0-2-2022-02-18",children:[]},{level:3,title:"1.0.1 | 2022.02.15",slug:"_1-0-1-2022-02-15",link:"#_1-0-1-2022-02-15",children:[]},{level:3,title:"1.0 | 2022.02.14",slug:"_1-0-2022-02-14",link:"#_1-0-2022-02-14",children:[]}],path:"/zh-cn/about/changelog.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u8054\u7CFB\u6211\u4EEC",headers:[{level:2,title:"\u52A9\u529B\u7EF4\u62A4",slug:"\u52A9\u529B\u7EF4\u62A4",link:"#\u52A9\u529B\u7EF4\u62A4",children:[]}],path:"/zh-cn/about/contacts.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5C55\u671B\u672A\u6765",headers:[{level:2,title:"\u672A\u89E3\u51B3\u7684\u95EE\u9898",slug:"\u672A\u89E3\u51B3\u7684\u95EE\u9898",link:"#\u672A\u89E3\u51B3\u7684\u95EE\u9898",children:[{level:3,title:"YukiHookModulePrefs",slug:"yukihookmoduleprefs",link:"#yukihookmoduleprefs",children:[]}]},{level:2,title:"\u672A\u6765\u7684\u8BA1\u5212",slug:"\u672A\u6765\u7684\u8BA1\u5212",link:"#\u672A\u6765\u7684\u8BA1\u5212",children:[{level:3,title:"\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684 Lite \u7248\u672C",slug:"\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684-lite-\u7248\u672C",link:"#\u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684-lite-\u7248\u672C",children:[]},{level:3,title:"\u652F\u6301\u66F4\u591A Hook Framework",slug:"\u652F\u6301\u66F4\u591A-hook-framework",link:"#\u652F\u6301\u66F4\u591A-hook-framework",children:[]}]}],path:"/zh-cn/about/future.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u6587\u6863\u4ECB\u7ECD",headers:[{level:2,title:"\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",slug:"\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",link:"#\u529F\u80FD\u63CF\u8FF0\u8BF4\u660E",children:[]},{level:2,title:"\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",slug:"\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",link:"#\u529F\u80FD\u793A\u4F8B\u8BF4\u660E",children:[]},{level:2,title:"\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",slug:"\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",link:"#\u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E",children:[]},{level:2,title:"\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",slug:"\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",link:"#\u76F8\u5173\u7B26\u53F7\u8BF4\u660E",children:[]}],path:"/zh-cn/api/home.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"API \u57FA\u672C\u914D\u7F6E",headers:[{level:2,title:"\u529F\u80FD\u914D\u7F6E",slug:"\u529F\u80FD\u914D\u7F6E",link:"#\u529F\u80FD\u914D\u7F6E",children:[{level:3,title:"configs \u65B9\u6CD5",slug:"configs-\u65B9\u6CD5",link:"#configs-\u65B9\u6CD5",children:[]}]},{level:2,title:"Hooker \u914D\u7F6E",slug:"hooker-\u914D\u7F6E",link:"#hooker-\u914D\u7F6E",children:[{level:3,title:"\u901A\u8FC7 lambda \u521B\u5EFA",slug:"\u901A\u8FC7-lambda-\u521B\u5EFA",link:"#\u901A\u8FC7-lambda-\u521B\u5EFA",children:[]},{level:3,title:"\u901A\u8FC7\u81EA\u5B9A\u4E49 Hooker \u521B\u5EFA",slug:"\u901A\u8FC7\u81EA\u5B9A\u4E49-hooker-\u521B\u5EFA",link:"#\u901A\u8FC7\u81EA\u5B9A\u4E49-hooker-\u521B\u5EFA",children:[]},{level:3,title:"\u6269\u5C55\u7279\u6027",slug:"\u6269\u5C55\u7279\u6027",link:"#\u6269\u5C55\u7279\u6027",children:[]},{level:3,title:"\u6CE8\u610F\u4E8B\u9879",slug:"\u6CE8\u610F\u4E8B\u9879",link:"#\u6CE8\u610F\u4E8B\u9879",children:[]}]},{level:2,title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",slug:"\u4F5C\u4E3A-hook-api-\u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",link:"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528\u9700\u8981\u6CE8\u610F\u7684\u5730\u65B9",children:[]}],path:"/zh-cn/config/api-example.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"API \u5F02\u5E38\u5904\u7406",headers:[{level:2,title:"\u975E\u963B\u65AD\u5F02\u5E38",slug:"\u975E\u963B\u65AD\u5F02\u5E38",link:"#\u975E\u963B\u65AD\u5F02\u5E38",children:[]},{level:2,title:"\u963B\u65AD\u5F02\u5E38",slug:"\u963B\u65AD\u5F02\u5E38",link:"#\u963B\u65AD\u5F02\u5E38",children:[]}],path:"/zh-cn/config/api-exception.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E",headers:[{level:2,title:"\u4F9D\u8D56\u914D\u7F6E",slug:"\u4F9D\u8D56\u914D\u7F6E",link:"#\u4F9D\u8D56\u914D\u7F6E",children:[]},{level:2,title:"\u5165\u53E3\u914D\u7F6E",slug:"\u5165\u53E3\u914D\u7F6E",link:"#\u5165\u53E3\u914D\u7F6E",children:[]},{level:2,title:"Hook Framework",slug:"hook-framework",link:"#hook-framework",children:[{level:3,title:"Pine",slug:"pine",link:"#pine",children:[]},{level:3,title:"SandHook",slug:"sandhook",link:"#sandhook",children:[]},{level:3,title:"Whale",slug:"whale",link:"#whale",children:[]}]}],path:"/zh-cn/config/api-using.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"R8 \u4E0E Proguard \u6DF7\u6DC6",headers:[{level:2,title:"R8",slug:"r8",link:"#r8",children:[]},{level:2,title:"Proguard",slug:"proguard",link:"#proguard",children:[]}],path:"/zh-cn/config/r8-proguard.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E",headers:[{level:2,title:"\u4F9D\u8D56\u914D\u7F6E",slug:"\u4F9D\u8D56\u914D\u7F6E",link:"#\u4F9D\u8D56\u914D\u7F6E",children:[]},{level:2,title:"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",slug:"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",link:"#\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F",children:[{level:3,title:"InjectYukiHookWithXposed \u6CE8\u89E3",slug:"injectyukihookwithxposed-\u6CE8\u89E3",link:"#injectyukihookwithxposed-\u6CE8\u89E3",children:[]},{level:3,title:"IYukiHookXposedInit \u63A5\u53E3",slug:"iyukihookxposedinit-\u63A5\u53E3",link:"#iyukihookxposedinit-\u63A5\u53E3",children:[]}]},{level:2,title:"\u539F\u751F Xposed API \u4E8B\u4EF6",slug:"\u539F\u751F-xposed-api-\u4E8B\u4EF6",link:"#\u539F\u751F-xposed-api-\u4E8B\u4EF6",children:[]}],path:"/zh-cn/config/xposed-using.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u7528\u6CD5\u793A\u4F8B",headers:[{level:2,title:"\u7ED3\u6784\u56FE\u89E3",slug:"\u7ED3\u6784\u56FE\u89E3",link:"#\u7ED3\u6784\u56FE\u89E3",children:[]},{level:2,title:"Demo",slug:"demo",link:"#demo",children:[]},{level:2,title:"\u4E00\u4E2A\u7B80\u5355\u7684 Hook \u4F8B\u5B50",slug:"\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50",link:"#\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50",children:[{level:3,title:"Hook APP",slug:"hook-app",link:"#hook-app",children:[]},{level:3,title:"Hook Zygote",slug:"hook-zygote",link:"#hook-zygote",children:[]},{level:3,title:"Hook \u7CFB\u7EDF\u6846\u67B6",slug:"hook-\u7CFB\u7EDF\u6846\u67B6",link:"#hook-\u7CFB\u7EDF\u6846\u67B6",children:[]},{level:3,title:"Hook Resources",slug:"hook-resources",link:"#hook-resources",children:[]},{level:3,title:"\u89E3\u9664 Hook",slug:"\u89E3\u9664-hook",link:"#\u89E3\u9664-hook",children:[]}]},{level:2,title:"\u5F02\u5E38\u5904\u7406",slug:"\u5F02\u5E38\u5904\u7406",link:"#\u5F02\u5E38\u5904\u7406",children:[{level:3,title:"\u76D1\u542C\u5F02\u5E38",slug:"\u76D1\u542C\u5F02\u5E38",link:"#\u76D1\u542C\u5F02\u5E38",children:[]},{level:3,title:"\u629B\u51FA\u5F02\u5E38",slug:"\u629B\u51FA\u5F02\u5E38",link:"#\u629B\u51FA\u5F02\u5E38",children:[]}]},{level:2,title:"\u72B6\u6001\u76D1\u542C",slug:"\u72B6\u6001\u76D1\u542C",link:"#\u72B6\u6001\u76D1\u542C",children:[]},{level:2,title:"\u6269\u5C55\u7528\u6CD5",slug:"\u6269\u5C55\u7528\u6CD5",link:"#\u6269\u5C55\u7528\u6CD5",children:[{level:3,title:"\u591A\u4E2A\u5BBF\u4E3B",slug:"\u591A\u4E2A\u5BBF\u4E3B",link:"#\u591A\u4E2A\u5BBF\u4E3B",children:[]},{level:3,title:"\u591A\u4E2A\u8FDB\u7A0B",slug:"\u591A\u4E2A\u8FDB\u7A0B",link:"#\u591A\u4E2A\u8FDB\u7A0B",children:[]}]},{level:2,title:"\u5199\u6CD5\u4F18\u5316",slug:"\u5199\u6CD5\u4F18\u5316",link:"#\u5199\u6CD5\u4F18\u5316",children:[]},{level:2,title:"Xposed \u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",slug:"xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",link:"#xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001",children:[]}],path:"/zh-cn/guide/example.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4ECB\u7ECD",headers:[{level:2,title:"\u80CC\u666F",slug:"\u80CC\u666F",link:"#\u80CC\u666F",children:[]},{level:2,title:"\u7528\u9014",slug:"\u7528\u9014",link:"#\u7528\u9014",children:[]},{level:2,title:"\u8BED\u8A00\u8981\u6C42",slug:"\u8BED\u8A00\u8981\u6C42",link:"#\u8BED\u8A00\u8981\u6C42",children:[]},{level:2,title:"\u7075\u611F\u6765\u6E90",slug:"\u7075\u611F\u6765\u6E90",link:"#\u7075\u611F\u6765\u6E90",children:[]},{level:2,title:"\u652F\u6301\u7684 Hook \u6846\u67B6",slug:"\u652F\u6301\u7684-hook-\u6846\u67B6",link:"#\u652F\u6301\u7684-hook-\u6846\u67B6",children:[]}],path:"/zh-cn/guide/home.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u57FA\u7840\u77E5\u8BC6",headers:[{level:2,title:"\u76F8\u5173\u4ECB\u7ECD",slug:"\u76F8\u5173\u4ECB\u7ECD",link:"#\u76F8\u5173\u4ECB\u7ECD",children:[{level:3,title:"Xposed \u662F\u4EC0\u4E48",slug:"xposed-\u662F\u4EC0\u4E48",link:"#xposed-\u662F\u4EC0\u4E48",children:[]},{level:3,title:"Xposed \u80FD\u505A\u4EC0\u4E48",slug:"xposed-\u80FD\u505A\u4EC0\u4E48",link:"#xposed-\u80FD\u505A\u4EC0\u4E48",children:[]},{level:3,title:"\u53D1\u5C55\u8FC7\u7A0B",slug:"\u53D1\u5C55\u8FC7\u7A0B",link:"#\u53D1\u5C55\u8FC7\u7A0B",children:[]},{level:3,title:"\u884D\u751F\u4EA7\u54C1",slug:"\u884D\u751F\u4EA7\u54C1",link:"#\u884D\u751F\u4EA7\u54C1",children:[]},{level:3,title:"YukiHookAPI \u505A\u4E86\u4EC0\u4E48",slug:"yukihookapi-\u505A\u4E86\u4EC0\u4E48",link:"#yukihookapi-\u505A\u4E86\u4EC0\u4E48",children:[]}]},{level:2,title:"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",slug:"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",link:"#\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427",children:[]}],path:"/zh-cn/guide/knowledge.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u4ECE Xposed API \u8FC1\u79FB",headers:[{level:2,title:"\u8FC1\u79FB Hook \u5165\u53E3\u70B9",slug:"\u8FC1\u79FB-hook-\u5165\u53E3\u70B9",link:"#\u8FC1\u79FB-hook-\u5165\u53E3\u70B9",children:[]},{level:2,title:"\u8FC1\u79FB Hook \u65B9\u6CD5\u4F53",slug:"\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53",link:"#\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53",children:[{level:3,title:"Before/After Hook",slug:"before-after-hook",link:"#before-after-hook",children:[]},{level:3,title:"Replace Hook",slug:"replace-hook",link:"#replace-hook",children:[]}]},{level:2,title:"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",slug:"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",link:"#\u8FC1\u79FB\u5176\u5B83\u529F\u80FD",children:[]}],path:"/zh-cn/guide/move-to-new-api.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5FEB\u901F\u5F00\u59CB",headers:[{level:2,title:"\u73AF\u5883\u8981\u6C42",slug:"\u73AF\u5883\u8981\u6C42",link:"#\u73AF\u5883\u8981\u6C42",children:[]},{level:2,title:"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",slug:"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",link:"#\u81EA\u52A8\u6784\u5EFA\u9879\u76EE",children:[]},{level:2,title:"\u624B\u52A8\u914D\u7F6E\u9879\u76EE",slug:"\u624B\u52A8\u914D\u7F6E\u9879\u76EE",link:"#\u624B\u52A8\u914D\u7F6E\u9879\u76EE",children:[{level:3,title:"\u521B\u5EFA\u9879\u76EE",slug:"\u521B\u5EFA\u9879\u76EE",link:"#\u521B\u5EFA\u9879\u76EE",children:[]},{level:3,title:"\u96C6\u6210\u4F9D\u8D56",slug:"\u96C6\u6210\u4F9D\u8D56",link:"#\u96C6\u6210\u4F9D\u8D56",children:[]},{level:3,title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528",slug:"\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528",link:"#\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528",children:[]},{level:3,title:"\u4F5C\u4E3A Hook API \u4F7F\u7528",slug:"\u4F5C\u4E3A-hook-api-\u4F7F\u7528",link:"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528",children:[]}]}],path:"/zh-cn/guide/quick-start.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookAPI \u6784\u5EFA\u5DE5\u5177",headers:[{level:2,title:"\u83B7\u53D6\u9879\u76EE",slug:"\u83B7\u53D6\u9879\u76EE",link:"#\u83B7\u53D6\u9879\u76EE",children:[]},{level:2,title:"\u4F7F\u7528\u65B9\u6CD5",slug:"\u4F7F\u7528\u65B9\u6CD5",link:"#\u4F7F\u7528\u65B9\u6CD5",children:[{level:3,title:"\u57FA\u672C\u7528\u6CD5",slug:"\u57FA\u672C\u7528\u6CD5",link:"#\u57FA\u672C\u7528\u6CD5",children:[]},{level:3,title:"\u914D\u7F6E\u6A21\u677F",slug:"\u914D\u7F6E\u6A21\u677F",link:"#\u914D\u7F6E\u6A21\u677F",children:[]},{level:3,title:"\u591A\u8BED\u8A00\u652F\u6301",slug:"\u591A\u8BED\u8A00\u652F\u6301",link:"#\u591A\u8BED\u8A00\u652F\u6301",children:[]}]}],path:"/zh-cn/tools/yukihookapi-projectbuilder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Host Resource Injection Extension",headers:[{level:2,title:"Inject Module App's Resources",slug:"inject-module-app-s-resources",link:"#inject-module-app-s-resources",children:[]},{level:2,title:"Register Module App's Activity",slug:"register-module-app-s-activity",link:"#register-module-app-s-activity",children:[]},{level:2,title:"Create ContextThemeWrapper Proxy",slug:"create-contextthemewrapper-proxy",link:"#create-contextthemewrapper-proxy",children:[]},{level:2,title:"ClassLoader Conflict Problem",slug:"classloader-conflict-problem",link:"#classloader-conflict-problem",children:[]}],path:"/en/api/special-features/host-inject.html",pathLocale:"/en/",extraFields:[]},{title:"Host Lifecycle Extension",headers:[{level:2,title:"Monitor Lifecycle",slug:"monitor-lifecycle",link:"#monitor-lifecycle",children:[]},{level:2,title:"Register System Broadcast",slug:"register-system-broadcast",link:"#register-system-broadcast",children:[]}],path:"/en/api/special-features/host-lifecycle.html",pathLocale:"/en/",extraFields:[]},{title:"Debug Logs",headers:[{level:2,title:"Normal Logs",slug:"normal-logs",link:"#normal-logs",children:[]},{level:2,title:"Error Logs",slug:"error-logs",link:"#error-logs",children:[]},{level:2,title:"Save Logs and Custom Elements",slug:"save-logs-and-custom-elements",link:"#save-logs-and-custom-elements",children:[]}],path:"/en/api/special-features/logger.html",pathLocale:"/en/",extraFields:[]},{title:"Reflection Extensions",headers:[{level:2,title:"Class Extensions",slug:"class-extensions",link:"#class-extensions",children:[{level:3,title:"Object Conversion",slug:"object-conversion",link:"#object-conversion",children:[]},{level:3,title:"Existential Judgment",slug:"existential-judgment",link:"#existential-judgment",children:[]},{level:3,title:"Vague Search",slug:"vague-search",link:"#vague-search",children:[]}]},{level:2,title:"Member Extensions",slug:"member-extensions",link:"#member-extensions",children:[{level:3,title:"Find and Reflection",slug:"find-and-reflection",link:"#find-and-reflection",children:[]},{level:3,title:"Optional Find Conditions",slug:"optional-find-conditions",link:"#optional-find-conditions",children:[]},{level:3,title:"Find in Super Class",slug:"find-in-super-class",link:"#find-in-super-class",children:[]},{level:3,title:"Vague Find",slug:"vague-find",link:"#vague-find",children:[]},{level:3,title:"Multiple Find",slug:"multiple-find",link:"#multiple-find",children:[]},{level:3,title:"Static Bytecode",slug:"static-bytecode",link:"#static-bytecode",children:[]},{level:3,title:"Obfuscated Bytecode",slug:"obfuscated-bytecode",link:"#obfuscated-bytecode",children:[]},{level:3,title:"Directly Called",slug:"directly-called",link:"#directly-called",children:[]},{level:3,title:"Original Called",slug:"original-called",link:"#original-called",children:[]},{level:3,title:"Find Again",slug:"find-again",link:"#find-again",children:[]},{level:3,title:"Relative Matching",slug:"relative-matching",link:"#relative-matching",children:[]},{level:3,title:"Calling Generics",slug:"calling-generics",link:"#calling-generics",children:[]},{level:3,title:"Pay Attention of Trap",slug:"pay-attention-of-trap",link:"#pay-attention-of-trap",children:[]}]},{level:2,title:"Common Type Extensions",slug:"common-type-extensions",link:"#common-type-extensions",children:[]}],path:"/en/api/special-features/reflection.html",pathLocale:"/en/",extraFields:[]},{title:"Xposed Module and Host Channel",headers:[{level:2,title:"Basic Usage",slug:"basic-usage",link:"#basic-usage",children:[]},{level:2,title:"Determine Module App and Host App Version Match",slug:"determine-module-app-and-host-app-version-match",link:"#determine-module-app-and-host-app-version-match",children:[]},{level:2,title:"Rules for Callback Event Response",slug:"rules-for-callback-event-response",link:"#rules-for-callback-event-response",children:[]},{level:2,title:"Security Instructions",slug:"security-instructions",link:"#security-instructions",children:[]}],path:"/en/api/special-features/xposed-channel.html",pathLocale:"/en/",extraFields:[]},{title:"Xposed Module Data Storage",headers:[{level:2,title:"Use in Activity",slug:"use-in-activity",link:"#use-in-activity",children:[]},{level:2,title:"Use in PreferenceFragment",slug:"use-in-preferencefragment",link:"#use-in-preferencefragment",children:[]}],path:"/en/api/special-features/xposed-storage.html",pathLocale:"/en/",extraFields:[]},{title:"\u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55",headers:[{level:2,title:"\u6CE8\u5165\u6A21\u5757\u8D44\u6E90 (Resources)",slug:"\u6CE8\u5165\u6A21\u5757\u8D44\u6E90-resources",link:"#\u6CE8\u5165\u6A21\u5757\u8D44\u6E90-resources",children:[]},{level:2,title:"\u6CE8\u518C\u6A21\u5757 Activity",slug:"\u6CE8\u518C\u6A21\u5757-activity",link:"#\u6CE8\u518C\u6A21\u5757-activity",children:[]},{level:2,title:"\u521B\u5EFA ContextThemeWrapper \u4EE3\u7406",slug:"\u521B\u5EFA-contextthemewrapper-\u4EE3\u7406",link:"#\u521B\u5EFA-contextthemewrapper-\u4EE3\u7406",children:[]},{level:2,title:"ClassLoader \u51B2\u7A81\u95EE\u9898",slug:"classloader-\u51B2\u7A81\u95EE\u9898",link:"#classloader-\u51B2\u7A81\u95EE\u9898",children:[]}],path:"/zh-cn/api/special-features/host-inject.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55",headers:[{level:2,title:"\u76D1\u542C\u751F\u547D\u5468\u671F",slug:"\u76D1\u542C\u751F\u547D\u5468\u671F",link:"#\u76D1\u542C\u751F\u547D\u5468\u671F",children:[]},{level:2,title:"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",slug:"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",link:"#\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD",children:[]}],path:"/zh-cn/api/special-features/host-lifecycle.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u8C03\u8BD5\u65E5\u5FD7",headers:[{level:2,title:"\u666E\u901A\u65E5\u5FD7",slug:"\u666E\u901A\u65E5\u5FD7",link:"#\u666E\u901A\u65E5\u5FD7",children:[]},{level:2,title:"\u9519\u8BEF\u65E5\u5FD7",slug:"\u9519\u8BEF\u65E5\u5FD7",link:"#\u9519\u8BEF\u65E5\u5FD7",children:[]},{level:2,title:"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",slug:"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",link:"#\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20",children:[]}],path:"/zh-cn/api/special-features/logger.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55",headers:[{level:2,title:"Class \u6269\u5C55",slug:"class-\u6269\u5C55",link:"#class-\u6269\u5C55",children:[{level:3,title:"\u5BF9\u8C61\u8F6C\u6362",slug:"\u5BF9\u8C61\u8F6C\u6362",link:"#\u5BF9\u8C61\u8F6C\u6362",children:[]},{level:3,title:"\u5B58\u5728\u5224\u65AD",slug:"\u5B58\u5728\u5224\u65AD",link:"#\u5B58\u5728\u5224\u65AD",children:[]},{level:3,title:"\u6A21\u7CCA\u67E5\u627E",slug:"\u6A21\u7CCA\u67E5\u627E",link:"#\u6A21\u7CCA\u67E5\u627E",children:[]}]},{level:2,title:"Member \u6269\u5C55",slug:"member-\u6269\u5C55",link:"#member-\u6269\u5C55",children:[{level:3,title:"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",slug:"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",link:"#\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528",children:[]},{level:3,title:"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",slug:"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",link:"#\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6",children:[]},{level:3,title:"\u5728\u7236\u7C7B\u67E5\u627E",slug:"\u5728\u7236\u7C7B\u67E5\u627E",link:"#\u5728\u7236\u7C7B\u67E5\u627E",children:[]},{level:3,title:"\u6A21\u7CCA\u67E5\u627E",slug:"\u6A21\u7CCA\u67E5\u627E-1",link:"#\u6A21\u7CCA\u67E5\u627E-1",children:[]},{level:3,title:"\u591A\u91CD\u67E5\u627E",slug:"\u591A\u91CD\u67E5\u627E-1",link:"#\u591A\u91CD\u67E5\u627E-1",children:[]},{level:3,title:"\u9759\u6001\u5B57\u8282\u7801",slug:"\u9759\u6001\u5B57\u8282\u7801",link:"#\u9759\u6001\u5B57\u8282\u7801",children:[]},{level:3,title:"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",slug:"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",link:"#\u6DF7\u6DC6\u7684\u5B57\u8282\u7801",children:[]},{level:3,title:"\u76F4\u63A5\u8C03\u7528",slug:"\u76F4\u63A5\u8C03\u7528",link:"#\u76F4\u63A5\u8C03\u7528",children:[]},{level:3,title:"\u539F\u59CB\u8C03\u7528",slug:"\u539F\u59CB\u8C03\u7528",link:"#\u539F\u59CB\u8C03\u7528",children:[]},{level:3,title:"\u518D\u6B21\u67E5\u627E",slug:"\u518D\u6B21\u67E5\u627E",link:"#\u518D\u6B21\u67E5\u627E",children:[]},{level:3,title:"\u76F8\u5BF9\u5339\u914D",slug:"\u76F8\u5BF9\u5339\u914D",link:"#\u76F8\u5BF9\u5339\u914D",children:[]},{level:3,title:"\u8C03\u7528\u6CDB\u578B",slug:"\u8C03\u7528\u6CDB\u578B",link:"#\u8C03\u7528\u6CDB\u578B",children:[]},{level:3,title:"\u6CE8\u610F\u8BEF\u533A",slug:"\u6CE8\u610F\u8BEF\u533A",link:"#\u6CE8\u610F\u8BEF\u533A",children:[]}]},{level:2,title:"\u5E38\u7528\u7C7B\u578B\u6269\u5C55",slug:"\u5E38\u7528\u7C7B\u578B\u6269\u5C55",link:"#\u5E38\u7528\u7C7B\u578B\u6269\u5C55",children:[]}],path:"/zh-cn/api/special-features/reflection.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865",headers:[{level:2,title:"\u57FA\u672C\u7528\u6CD5",slug:"\u57FA\u672C\u7528\u6CD5",link:"#\u57FA\u672C\u7528\u6CD5",children:[]},{level:2,title:"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",slug:"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",link:"#\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D",children:[]},{level:2,title:"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",slug:"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",link:"#\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219",children:[]},{level:2,title:"\u5B89\u5168\u6027\u8BF4\u660E",slug:"\u5B89\u5168\u6027\u8BF4\u660E",link:"#\u5B89\u5168\u6027\u8BF4\u660E",children:[]}],path:"/zh-cn/api/special-features/xposed-channel.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8",headers:[{level:2,title:"\u5728 Activity \u4E2D\u4F7F\u7528",slug:"\u5728-activity-\u4E2D\u4F7F\u7528",link:"#\u5728-activity-\u4E2D\u4F7F\u7528",children:[]},{level:2,title:"\u5728 PreferenceFragment \u4E2D\u4F7F\u7528",slug:"\u5728-preferencefragment-\u4E2D\u4F7F\u7528",link:"#\u5728-preferencefragment-\u4E2D\u4F7F\u7528",children:[]}],path:"/zh-cn/api/special-features/xposed-storage.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookAPI - object",headers:[{level:2,title:"API_VERSION_NAME - field",slug:"api-version-name-field",link:"#api-version-name-field",children:[]},{level:2,title:"API_VERSION_CODE - field",slug:"api-version-code-field",link:"#api-version-code-field",children:[]},{level:2,title:"Status - object",slug:"status-object",link:"#status-object",children:[{level:3,title:"compiledTimestamp - field",slug:"compiledtimestamp-field",link:"#compiledtimestamp-field",children:[]},{level:3,title:"isXposedEnvironment - field",slug:"isxposedenvironment-field",link:"#isxposedenvironment-field",children:[]},{level:3,title:"executorName - field",slug:"executorname-field",link:"#executorname-field",children:[]},{level:3,title:"executorVersion - field",slug:"executorversion-field",link:"#executorversion-field",children:[]},{level:3,title:"isModuleActive - field",slug:"ismoduleactive-field",link:"#ismoduleactive-field",children:[]},{level:3,title:"isXposedModuleActive - field",slug:"isxposedmoduleactive-field",link:"#isxposedmoduleactive-field",children:[]},{level:3,title:"isTaiChiModuleActive - field",slug:"istaichimoduleactive-field",link:"#istaichimoduleactive-field",children:[]},{level:3,title:"isSupportResourcesHook - field",slug:"issupportresourceshook-field",link:"#issupportresourceshook-field",children:[]}]},{level:2,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[{level:3,title:"debugLog - method",slug:"debuglog-method",link:"#debuglog-method",children:[]},{level:3,title:"isDebug - field",slug:"isdebug-field",link:"#isdebug-field",children:[]},{level:3,title:"isEnableModulePrefsCache - field",slug:"isenablemoduleprefscache-field",link:"#isenablemoduleprefscache-field",children:[]},{level:3,title:"isEnableModuleAppResourcesCache - field",slug:"isenablemoduleappresourcescache-field",link:"#isenablemoduleappresourcescache-field",children:[]},{level:3,title:"isEnableHookModuleStatus - field",slug:"isenablehookmodulestatus-field",link:"#isenablehookmodulestatus-field",children:[]},{level:3,title:"isEnableHookSharedPreferences - field",slug:"isenablehooksharedpreferences-field",link:"#isenablehooksharedpreferences-field",children:[]},{level:3,title:"isEnableDataChannel - field",slug:"isenabledatachannel-field",link:"#isenabledatachannel-field",children:[]},{level:3,title:"isEnableMemberCache - field",slug:"isenablemembercache-field",link:"#isenablemembercache-field",children:[]}]},{level:2,title:"configs - method",slug:"configs-method",link:"#configs-method",children:[]},{level:2,title:"encase - method",slug:"encase-method",link:"#encase-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookAPI - object",headers:[{level:2,title:"API_VERSION_NAME - field",slug:"api-version-name-field",link:"#api-version-name-field",children:[]},{level:2,title:"API_VERSION_CODE - field",slug:"api-version-code-field",link:"#api-version-code-field",children:[]},{level:2,title:"Status - object",slug:"status-object",link:"#status-object",children:[{level:3,title:"compiledTimestamp - field",slug:"compiledtimestamp-field",link:"#compiledtimestamp-field",children:[]},{level:3,title:"isXposedEnvironment - field",slug:"isxposedenvironment-field",link:"#isxposedenvironment-field",children:[]},{level:3,title:"executorName - field",slug:"executorname-field",link:"#executorname-field",children:[]},{level:3,title:"executorVersion - field",slug:"executorversion-field",link:"#executorversion-field",children:[]},{level:3,title:"isModuleActive - field",slug:"ismoduleactive-field",link:"#ismoduleactive-field",children:[]},{level:3,title:"isXposedModuleActive - field",slug:"isxposedmoduleactive-field",link:"#isxposedmoduleactive-field",children:[]},{level:3,title:"isTaiChiModuleActive - field",slug:"istaichimoduleactive-field",link:"#istaichimoduleactive-field",children:[]},{level:3,title:"isSupportResourcesHook - field",slug:"issupportresourceshook-field",link:"#issupportresourceshook-field",children:[]}]},{level:2,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[{level:3,title:"debugLog - method",slug:"debuglog-method",link:"#debuglog-method",children:[]},{level:3,title:"isDebug - field",slug:"isdebug-field",link:"#isdebug-field",children:[]},{level:3,title:"isEnableModulePrefsCache - field",slug:"isenablemoduleprefscache-field",link:"#isenablemoduleprefscache-field",children:[]},{level:3,title:"isEnableModuleAppResourcesCache - field",slug:"isenablemoduleappresourcescache-field",link:"#isenablemoduleappresourcescache-field",children:[]},{level:3,title:"isEnableHookModuleStatus - field",slug:"isenablehookmodulestatus-field",link:"#isenablehookmodulestatus-field",children:[]},{level:3,title:"isEnableHookSharedPreferences - field",slug:"isenablehooksharedpreferences-field",link:"#isenablehooksharedpreferences-field",children:[]},{level:3,title:"isEnableDataChannel - field",slug:"isenabledatachannel-field",link:"#isenabledatachannel-field",children:[]},{level:3,title:"isEnableMemberCache - field",slug:"isenablemembercache-field",link:"#isenablemembercache-field",children:[]}]},{level:2,title:"configs - method",slug:"configs-method",link:"#configs-method",children:[]},{level:2,title:"encase - method",slug:"encase-method",link:"#encase-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"InjectYukiHookWithXposed - annotation",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",pathLocale:"/en/",extraFields:[]},{title:"CurrentClass - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"generic - method",slug:"generic-method",link:"#generic-method",children:[]},{level:2,title:"generic - method",slug:"generic-method-1",link:"#generic-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"SuperClass - class",slug:"superclass-class",link:"#superclass-class",children:[{level:3,title:"name - field",slug:"name-field-1",link:"#name-field-1",children:[]},{level:3,title:"simpleName - field",slug:"simplename-field-1",link:"#simplename-field-1",children:[]},{level:3,title:"generic - method",slug:"generic-method-2",link:"#generic-method-2",children:[]},{level:3,title:"generic - method",slug:"generic-method-3",link:"#generic-method-3",children:[]},{level:3,title:"field - method",slug:"field-method-1",link:"#field-method-1",children:[]},{level:3,title:"method - method",slug:"method-method-1",link:"#method-method-1",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",pathLocale:"/en/",extraFields:[]},{title:"GenericClass - class",headers:[{level:2,title:"argument - method",slug:"argument-method",link:"#argument-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",pathLocale:"/en/",extraFields:[]},{title:"HookClass - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",pathLocale:"/en/",extraFields:[]},{title:"HookResources - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",pathLocale:"/en/",extraFields:[]},{title:"VariousClass - class",headers:[{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"getOrNull - method",slug:"getornull-method",link:"#getornull-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",pathLocale:"/en/",extraFields:[]},{title:"YukiMemberHookCreator - class",headers:[{level:2,title:"PRIORITY_DEFAULT - field",slug:"priority-default-field",link:"#priority-default-field",children:[]},{level:2,title:"PRIORITY_LOWEST - field",slug:"priority-lowest-field",link:"#priority-lowest-field",children:[]},{level:2,title:"PRIORITY_HIGHEST - field",slug:"priority-highest-field",link:"#priority-highest-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"injectMember - method",slug:"injectmember-method",link:"#injectmember-method",children:[]},{level:2,title:"useDangerousOperation - method",slug:"usedangerousoperation-method",link:"#usedangerousoperation-method",children:[]},{level:2,title:"MemberHookCreator - class",slug:"memberhookcreator-class",link:"#memberhookcreator-class",children:[{level:3,title:"members - method",slug:"members-method",link:"#members-method",children:[]},{level:3,title:"allMembers - method",slug:"allmembers-method",link:"#allmembers-method",children:[]},{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"HookParam.field - i-ext-method",slug:"hookparam-field-i-ext-method",link:"#hookparam-field-i-ext-method",children:[]},{level:3,title:"HookParam.method - i-ext-method",slug:"hookparam-method-i-ext-method",link:"#hookparam-method-i-ext-method",children:[]},{level:3,title:"HookParam.constructor - i-ext-method",slug:"hookparam-constructor-i-ext-method",link:"#hookparam-constructor-i-ext-method",children:[]},{level:3,title:"HookParam.injectMember - i-ext-method",slug:"hookparam-injectmember-i-ext-method",link:"#hookparam-injectmember-i-ext-method",children:[]},{level:3,title:"beforeHook - method",slug:"beforehook-method",link:"#beforehook-method",children:[]},{level:3,title:"afterHook - method",slug:"afterhook-method",link:"#afterhook-method",children:[]},{level:3,title:"replaceAny - method",slug:"replaceany-method",link:"#replaceany-method",children:[]},{level:3,title:"replaceUnit - method",slug:"replaceunit-method",link:"#replaceunit-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"intercept - method",slug:"intercept-method",link:"#intercept-method",children:[]},{level:3,title:"removeSelf - method",slug:"removeself-method",link:"#removeself-method",children:[]},{level:3,title:"HookCallback - class",slug:"hookcallback-class",link:"#hookcallback-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"by - method",slug:"by-method-1",link:"#by-method-1",children:[]},{level:3,title:"onPrepareHook - method",slug:"onpreparehook-method",link:"#onpreparehook-method",children:[]},{level:3,title:"onHookClassNotFoundFailure - method",slug:"onhookclassnotfoundfailure-method",link:"#onhookclassnotfoundfailure-method",children:[]},{level:3,title:"ignoredHookClassNotFoundFailure - method",slug:"ignoredhookclassnotfoundfailure-method",link:"#ignoredhookclassnotfoundfailure-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResourcesHookCreator - class",headers:[{level:2,title:"injectResource - method",slug:"injectresource-method",link:"#injectresource-method",children:[]},{level:2,title:"ResourcesHookCreator - class",slug:"resourceshookcreator-class",link:"#resourceshookcreator-class",children:[{level:3,title:"resourceId - field",slug:"resourceid-field",link:"#resourceid-field",children:[]},{level:3,title:"conditions - method",slug:"conditions-method",link:"#conditions-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"replaceToModuleResource - method",slug:"replacetomoduleresource-method",link:"#replacetomoduleresource-method",children:[]},{level:3,title:"injectAsLayout - method",slug:"injectaslayout-method",link:"#injectaslayout-method",children:[]},{level:3,title:"ConditionFinder - class",slug:"conditionfinder-class",link:"#conditionfinder-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]},{level:3,title:"onHookingFailure - method",slug:"onhookingfailure-method",link:"#onhookingfailure-method",children:[]},{level:3,title:"ignoredHookingFailure - method",slug:"ignoredhookingfailure-method",link:"#ignoredhookingfailure-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",pathLocale:"/en/",extraFields:[]},{title:"YukiBaseHooker - class",headers:[{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",pathLocale:"/en/",extraFields:[]},{title:"ReflectionFactory - kt",headers:[{level:2,title:"MembersType - class",slug:"memberstype-class",link:"#memberstype-class",children:[{level:3,title:"ALL - enum",slug:"all-enum",link:"#all-enum",children:[]},{level:3,title:"METHOD - enum",slug:"method-enum",link:"#method-enum",children:[]},{level:3,title:"CONSTRUCTOR - enum",slug:"constructor-enum",link:"#constructor-enum",children:[]}]},{level:2,title:"ClassLoader.listOfClasses - ext-method",slug:"classloader-listofclasses-ext-method",link:"#classloader-listofclasses-ext-method",children:[]},{level:2,title:"ClassLoader.searchClass - ext-method",slug:"classloader-searchclass-ext-method",link:"#classloader-searchclass-ext-method",children:[]},{level:2,title:"ClassLoader.onLoadClass - ext-method",slug:"classloader-onloadclass-ext-method",link:"#classloader-onloadclass-ext-method",children:[]},{level:2,title:"Class.hasExtends - ext-field",slug:"class-hasextends-ext-field",link:"#class-hasextends-ext-field",children:[]},{level:2,title:"String.toClass - ext-method",slug:"string-toclass-ext-method",link:"#string-toclass-ext-method",children:[]},{level:2,title:"String.toClassOrNull - ext-method",slug:"string-toclassornull-ext-method",link:"#string-toclassornull-ext-method",children:[]},{level:2,title:"classOf - method",slug:"classof-method",link:"#classof-method",children:[]},{level:2,title:"String.hasClass - ext-method",slug:"string-hasclass-ext-method",link:"#string-hasclass-ext-method",children:[]},{level:2,title:"Class.hasField - ext-method",slug:"class-hasfield-ext-method",link:"#class-hasfield-ext-method",children:[]},{level:2,title:"Class.hasMethod - ext-method",slug:"class-hasmethod-ext-method",link:"#class-hasmethod-ext-method",children:[]},{level:2,title:"Class.hasConstructor - ext-method",slug:"class-hasconstructor-ext-method",link:"#class-hasconstructor-ext-method",children:[]},{level:2,title:"Member.hasModifiers - ext-method",slug:"member-hasmodifiers-ext-method",link:"#member-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.hasModifiers - ext-method",slug:"class-hasmodifiers-ext-method",link:"#class-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.field - ext-method",slug:"class-field-ext-method",link:"#class-field-ext-method",children:[]},{level:2,title:"Class.method - ext-method",slug:"class-method-ext-method",link:"#class-method-ext-method",children:[]},{level:2,title:"Class.constructor - ext-method",slug:"class-constructor-ext-method",link:"#class-constructor-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method",link:"#class-generic-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method-1",link:"#class-generic-ext-method-1",children:[]},{level:2,title:"Any.current - ext-method",slug:"any-current-ext-method",link:"#any-current-ext-method",children:[]},{level:2,title:"Class.buildOf - ext-method",slug:"class-buildof-ext-method",link:"#class-buildof-ext-method",children:[]},{level:2,title:"Class.allMethods - ext-method",slug:"class-allmethods-ext-method",link:"#class-allmethods-ext-method",children:[]},{level:2,title:"Class.allConstructors - ext-method",slug:"class-allconstructors-ext-method",link:"#class-allconstructors-ext-method",children:[]},{level:2,title:"Class.allFields - ext-method",slug:"class-allfields-ext-method",link:"#class-allfields-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookFactory - kt",headers:[{level:2,title:"IYukiHookXposedInit.configs - ext-method",slug:"iyukihookxposedinit-configs-ext-method",link:"#iyukihookxposedinit-configs-ext-method",children:[]},{level:2,title:"IYukiHookXposedInit.encase - ext-method",slug:"iyukihookxposedinit-encase-ext-method",link:"#iyukihookxposedinit-encase-ext-method",children:[]},{level:2,title:"Context.modulePrefs - ext-field",slug:"context-moduleprefs-ext-field",link:"#context-moduleprefs-ext-field",children:[]},{level:2,title:"Context.modulePrefs - ext-method",slug:"context-moduleprefs-ext-method",link:"#context-moduleprefs-ext-method",children:[]},{level:2,title:"Context.dataChannel - ext-method",slug:"context-datachannel-ext-method",link:"#context-datachannel-ext-method",children:[]},{level:2,title:"Context.processName - ext-field",slug:"context-processname-ext-field",link:"#context-processname-ext-field",children:[]},{level:2,title:"Context+Resources.injectModuleAppResources - ext-method",slug:"context-resources-injectmoduleappresources-ext-method",link:"#context-resources-injectmoduleappresources-ext-method",children:[]},{level:2,title:"Context.registerModuleAppActivities - ext-method",slug:"context-registermoduleappactivities-ext-method",link:"#context-registermoduleappactivities-ext-method",children:[]},{level:2,title:"Context.applyModuleTheme - ext-method",slug:"context-applymoduletheme-ext-method",link:"#context-applymoduletheme-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",pathLocale:"/en/",extraFields:[]},{title:"LoggerFactory - kt",headers:[{level:2,title:"LoggerType - class",slug:"loggertype-class",link:"#loggertype-class",children:[{level:3,title:"LOGD - enum",slug:"logd-enum",link:"#logd-enum",children:[]},{level:3,title:"XPOSEDBRIDGE - enum",slug:"xposedbridge-enum",link:"#xposedbridge-enum",children:[]},{level:3,title:"SCOPE - enum",slug:"scope-enum",link:"#scope-enum",children:[]},{level:3,title:"BOTH - enum",slug:"both-enum",link:"#both-enum",children:[]}]},{level:2,title:"YukiLoggerData - class",slug:"yukiloggerdata-class",link:"#yukiloggerdata-class",children:[]},{level:2,title:"YukiHookLogger - object",slug:"yukihooklogger-object",link:"#yukihooklogger-object",children:[{level:3,title:"inMemoryData - field",slug:"inmemorydata-field",link:"#inmemorydata-field",children:[]},{level:3,title:"contents - field",slug:"contents-field",link:"#contents-field",children:[]},{level:3,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:3,title:"saveToFile - method",slug:"savetofile-method",link:"#savetofile-method",children:[]},{level:3,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[]}]},{level:2,title:"loggerD - method",slug:"loggerd-method",link:"#loggerd-method",children:[]},{level:2,title:"loggerI - method",slug:"loggeri-method",link:"#loggeri-method",children:[]},{level:2,title:"loggerW - method",slug:"loggerw-method",link:"#loggerw-method",children:[]},{level:2,title:"loggerE - method",slug:"loggere-method",link:"#loggere-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",pathLocale:"/en/",extraFields:[]},{title:"InjectYukiHookWithXposed - annotation",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookParam - class",headers:[{level:2,title:"args - field",slug:"args-field",link:"#args-field",children:[]},{level:2,title:"instance - field",slug:"instance-field",link:"#instance-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"member - field",slug:"member-field",link:"#member-field",children:[]},{level:2,title:"method - field",slug:"method-field",link:"#method-field",children:[]},{level:2,title:"constructor - field",slug:"constructor-field",link:"#constructor-field",children:[]},{level:2,title:"result - field",slug:"result-field",link:"#result-field",children:[]},{level:2,title:"hasThrowable - field",slug:"hasthrowable-field",link:"#hasthrowable-field",children:[]},{level:2,title:"throwable - field",slug:"throwable-field",link:"#throwable-field",children:[]},{level:2,title:"Throwable.throwToApp - i-ext-method",slug:"throwable-throwtoapp-i-ext-method",link:"#throwable-throwtoapp-i-ext-method",children:[]},{level:2,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:2,title:"instance - method",slug:"instance-method",link:"#instance-method",children:[]},{level:2,title:"args - method",slug:"args-method",link:"#args-method",children:[]},{level:2,title:"args - method",slug:"args-method-1",link:"#args-method-1",children:[]},{level:2,title:"callOriginal - method",slug:"calloriginal-method",link:"#calloriginal-method",children:[]},{level:2,title:"invokeOriginal - method",slug:"invokeoriginal-method",link:"#invokeoriginal-method",children:[]},{level:2,title:"resultTrue - method",slug:"resulttrue-method",link:"#resulttrue-method",children:[]},{level:2,title:"resultFalse - method",slug:"resultfalse-method",link:"#resultfalse-method",children:[]},{level:2,title:"resultNull - method",slug:"resultnull-method",link:"#resultnull-method",children:[]},{level:2,title:"ArgsIndexCondition - class",slug:"argsindexcondition-class",link:"#argsindexcondition-class",children:[{level:3,title:"first - method",slug:"first-method",link:"#first-method",children:[]},{level:3,title:"last - method",slug:"last-method",link:"#last-method",children:[]}]},{level:2,title:"ArgsModifyer - class",slug:"argsmodifyer-class",link:"#argsmodifyer-class",children:[{level:3,title:"cast - method",slug:"cast-method",link:"#cast-method",children:[]},{level:3,title:"byte - method",slug:"byte-method",link:"#byte-method",children:[]},{level:3,title:"int - method",slug:"int-method",link:"#int-method",children:[]},{level:3,title:"long - method",slug:"long-method",link:"#long-method",children:[]},{level:3,title:"short - method",slug:"short-method",link:"#short-method",children:[]},{level:3,title:"double - method",slug:"double-method",link:"#double-method",children:[]},{level:3,title:"float - method",slug:"float-method",link:"#float-method",children:[]},{level:3,title:"string - method",slug:"string-method",link:"#string-method",children:[]},{level:3,title:"char - method",slug:"char-method",link:"#char-method",children:[]},{level:3,title:"boolean - method",slug:"boolean-method",link:"#boolean-method",children:[]},{level:3,title:"any - method",slug:"any-method",link:"#any-method",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]},{level:3,title:"set - method",slug:"set-method",link:"#set-method",children:[]},{level:3,title:"setNull - method",slug:"setnull-method",link:"#setnull-method",children:[]},{level:3,title:"setTrue - method",slug:"settrue-method",link:"#settrue-method",children:[]},{level:3,title:"setFalse - method",slug:"setfalse-method",link:"#setfalse-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",pathLocale:"/en/",extraFields:[]},{title:"PackageParam - class",headers:[{level:2,title:"appClassLoader - field",slug:"appclassloader-field",link:"#appclassloader-field",children:[]},{level:2,title:"appInfo - field",slug:"appinfo-field",link:"#appinfo-field",children:[]},{level:2,title:"appUserId - field",slug:"appuserid-field",link:"#appuserid-field",children:[]},{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]},{level:2,title:"appResources - field",slug:"appresources-field",link:"#appresources-field",children:[]},{level:2,title:"systemContext - field",slug:"systemcontext-field",link:"#systemcontext-field",children:[]},{level:2,title:"processName - field",slug:"processname-field",link:"#processname-field",children:[]},{level:2,title:"packageName - field",slug:"packagename-field",link:"#packagename-field",children:[]},{level:2,title:"isFirstApplication - field",slug:"isfirstapplication-field",link:"#isfirstapplication-field",children:[]},{level:2,title:"mainProcessName - field",slug:"mainprocessname-field",link:"#mainprocessname-field",children:[]},{level:2,title:"moduleAppFilePath - field",slug:"moduleappfilepath-field",link:"#moduleappfilepath-field",children:[]},{level:2,title:"moduleAppResources - field",slug:"moduleappresources-field",link:"#moduleappresources-field",children:[]},{level:2,title:"prefs - field",slug:"prefs-field",link:"#prefs-field",children:[]},{level:2,title:"prefs - method",slug:"prefs-method",link:"#prefs-method",children:[]},{level:2,title:"dataChannel - field",slug:"datachannel-field",link:"#datachannel-field",children:[]},{level:2,title:"resources - method",slug:"resources-method",link:"#resources-method",children:[]},{level:2,title:"refreshModuleAppResources - method",slug:"refreshmoduleappresources-method",link:"#refreshmoduleappresources-method",children:[]},{level:2,title:"onAppLifecycle - method",slug:"onapplifecycle-method",link:"#onapplifecycle-method",children:[]},{level:2,title:"loadApp - method",slug:"loadapp-method",link:"#loadapp-method",children:[]},{level:2,title:"loadZygote - method",slug:"loadzygote-method",link:"#loadzygote-method",children:[]},{level:2,title:"loadSystem - method",slug:"loadsystem-method",link:"#loadsystem-method",children:[]},{level:2,title:"withProcess - method",slug:"withprocess-method",link:"#withprocess-method",children:[]},{level:2,title:"loadHooker - method",slug:"loadhooker-method",link:"#loadhooker-method",children:[]},{level:2,title:"searchClass - method",slug:"searchclass-method",link:"#searchclass-method",children:[]},{level:2,title:"String+VariousClass.toClass - i-ext-method",slug:"string-variousclass-toclass-i-ext-method",link:"#string-variousclass-toclass-i-ext-method",children:[]},{level:2,title:"String+VariousClass.toClassOrNull - i-ext-method",slug:"string-variousclass-toclassornull-i-ext-method",link:"#string-variousclass-toclassornull-i-ext-method",children:[]},{level:2,title:"String.hasClass - i-ext-method",slug:"string-hasclass-i-ext-method",link:"#string-hasclass-i-ext-method",children:[]},{level:2,title:"findClass - method",slug:"findclass-method",link:"#findclass-method",children:[]},{level:2,title:"String+Class+VariousClass+HookClass.hook - i-ext-method",slug:"string-class-variousclass-hookclass-hook-i-ext-method",link:"#string-class-variousclass-hookclass-hook-i-ext-method",children:[]},{level:2,title:"HookResources.hook - i-ext-method",slug:"hookresources-hook-i-ext-method",link:"#hookresources-hook-i-ext-method",children:[]},{level:2,title:"AppLifecycle - class",slug:"applifecycle-class",link:"#applifecycle-class",children:[{level:3,title:"attachBaseContext - method",slug:"attachbasecontext-method",link:"#attachbasecontext-method",children:[]},{level:3,title:"onCreate - method",slug:"oncreate-method",link:"#oncreate-method",children:[]},{level:3,title:"onTerminate - method",slug:"onterminate-method",link:"#onterminate-method",children:[]},{level:3,title:"onLowMemory - method",slug:"onlowmemory-method",link:"#onlowmemory-method",children:[]},{level:3,title:"onTrimMemory - method",slug:"ontrimmemory-method",link:"#ontrimmemory-method",children:[]},{level:3,title:"onConfigurationChanged - method",slug:"onconfigurationchanged-method",link:"#onconfigurationchanged-method",children:[]},{level:3,title:"registerReceiver - method",slug:"registerreceiver-method",link:"#registerreceiver-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",pathLocale:"/en/",extraFields:[]},{title:"CurrentClass - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"generic - method",slug:"generic-method",link:"#generic-method",children:[]},{level:2,title:"generic - method",slug:"generic-method-1",link:"#generic-method-1",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"SuperClass - class",slug:"superclass-class",link:"#superclass-class",children:[{level:3,title:"name - field",slug:"name-field-1",link:"#name-field-1",children:[]},{level:3,title:"simpleName - field",slug:"simplename-field-1",link:"#simplename-field-1",children:[]},{level:3,title:"generic - method",slug:"generic-method-2",link:"#generic-method-2",children:[]},{level:3,title:"generic - method",slug:"generic-method-3",link:"#generic-method-3",children:[]},{level:3,title:"field - method",slug:"field-method-1",link:"#field-method-1",children:[]},{level:3,title:"method - method",slug:"method-method-1",link:"#method-method-1",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"GenericClass - class",headers:[{level:2,title:"argument - method",slug:"argument-method",link:"#argument-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookClass - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookResources - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"VariousClass - class",headers:[{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"getOrNull - method",slug:"getornull-method",link:"#getornull-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiMemberHookCreator - class",headers:[{level:2,title:"PRIORITY_DEFAULT - field",slug:"priority-default-field",link:"#priority-default-field",children:[]},{level:2,title:"PRIORITY_LOWEST - field",slug:"priority-lowest-field",link:"#priority-lowest-field",children:[]},{level:2,title:"PRIORITY_HIGHEST - field",slug:"priority-highest-field",link:"#priority-highest-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"injectMember - method",slug:"injectmember-method",link:"#injectmember-method",children:[]},{level:2,title:"useDangerousOperation - method",slug:"usedangerousoperation-method",link:"#usedangerousoperation-method",children:[]},{level:2,title:"MemberHookCreator - class",slug:"memberhookcreator-class",link:"#memberhookcreator-class",children:[{level:3,title:"members - method",slug:"members-method",link:"#members-method",children:[]},{level:3,title:"allMembers - method",slug:"allmembers-method",link:"#allmembers-method",children:[]},{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"HookParam.field - i-ext-method",slug:"hookparam-field-i-ext-method",link:"#hookparam-field-i-ext-method",children:[]},{level:3,title:"HookParam.method - i-ext-method",slug:"hookparam-method-i-ext-method",link:"#hookparam-method-i-ext-method",children:[]},{level:3,title:"HookParam.constructor - i-ext-method",slug:"hookparam-constructor-i-ext-method",link:"#hookparam-constructor-i-ext-method",children:[]},{level:3,title:"HookParam.injectMember - i-ext-method",slug:"hookparam-injectmember-i-ext-method",link:"#hookparam-injectmember-i-ext-method",children:[]},{level:3,title:"beforeHook - method",slug:"beforehook-method",link:"#beforehook-method",children:[]},{level:3,title:"afterHook - method",slug:"afterhook-method",link:"#afterhook-method",children:[]},{level:3,title:"replaceAny - method",slug:"replaceany-method",link:"#replaceany-method",children:[]},{level:3,title:"replaceUnit - method",slug:"replaceunit-method",link:"#replaceunit-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"intercept - method",slug:"intercept-method",link:"#intercept-method",children:[]},{level:3,title:"removeSelf - method",slug:"removeself-method",link:"#removeself-method",children:[]},{level:3,title:"HookCallback - class",slug:"hookcallback-class",link:"#hookcallback-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"by - method",slug:"by-method-1",link:"#by-method-1",children:[]},{level:3,title:"onPrepareHook - method",slug:"onpreparehook-method",link:"#onpreparehook-method",children:[]},{level:3,title:"onHookClassNotFoundFailure - method",slug:"onhookclassnotfoundfailure-method",link:"#onhookclassnotfoundfailure-method",children:[]},{level:3,title:"ignoredHookClassNotFoundFailure - method",slug:"ignoredhookclassnotfoundfailure-method",link:"#ignoredhookclassnotfoundfailure-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResourcesHookCreator - class",headers:[{level:2,title:"injectResource - method",slug:"injectresource-method",link:"#injectresource-method",children:[]},{level:2,title:"ResourcesHookCreator - class",slug:"resourceshookcreator-class",link:"#resourceshookcreator-class",children:[{level:3,title:"resourceId - field",slug:"resourceid-field",link:"#resourceid-field",children:[]},{level:3,title:"conditions - method",slug:"conditions-method",link:"#conditions-method",children:[]},{level:3,title:"replaceTo - method",slug:"replaceto-method",link:"#replaceto-method",children:[]},{level:3,title:"replaceToTrue - method",slug:"replacetotrue-method",link:"#replacetotrue-method",children:[]},{level:3,title:"replaceToFalse - method",slug:"replacetofalse-method",link:"#replacetofalse-method",children:[]},{level:3,title:"replaceToModuleResource - method",slug:"replacetomoduleresource-method",link:"#replacetomoduleresource-method",children:[]},{level:3,title:"injectAsLayout - method",slug:"injectaslayout-method",link:"#injectaslayout-method",children:[]},{level:3,title:"ConditionFinder - class",slug:"conditionfinder-class",link:"#conditionfinder-class",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]},{level:3,title:"onHookingFailure - method",slug:"onhookingfailure-method",link:"#onhookingfailure-method",children:[]},{level:3,title:"ignoredHookingFailure - method",slug:"ignoredhookingfailure-method",link:"#ignoredhookingfailure-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiBaseHooker - class",headers:[{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ReflectionFactory - kt",headers:[{level:2,title:"MembersType - class",slug:"memberstype-class",link:"#memberstype-class",children:[{level:3,title:"ALL - enum",slug:"all-enum",link:"#all-enum",children:[]},{level:3,title:"METHOD - enum",slug:"method-enum",link:"#method-enum",children:[]},{level:3,title:"CONSTRUCTOR - enum",slug:"constructor-enum",link:"#constructor-enum",children:[]}]},{level:2,title:"ClassLoader.listOfClasses - ext-method",slug:"classloader-listofclasses-ext-method",link:"#classloader-listofclasses-ext-method",children:[]},{level:2,title:"ClassLoader.searchClass - ext-method",slug:"classloader-searchclass-ext-method",link:"#classloader-searchclass-ext-method",children:[]},{level:2,title:"ClassLoader.onLoadClass - ext-method",slug:"classloader-onloadclass-ext-method",link:"#classloader-onloadclass-ext-method",children:[]},{level:2,title:"Class.hasExtends - ext-field",slug:"class-hasextends-ext-field",link:"#class-hasextends-ext-field",children:[]},{level:2,title:"String.toClass - ext-method",slug:"string-toclass-ext-method",link:"#string-toclass-ext-method",children:[]},{level:2,title:"String.toClassOrNull - ext-method",slug:"string-toclassornull-ext-method",link:"#string-toclassornull-ext-method",children:[]},{level:2,title:"classOf - method",slug:"classof-method",link:"#classof-method",children:[]},{level:2,title:"String.hasClass - ext-method",slug:"string-hasclass-ext-method",link:"#string-hasclass-ext-method",children:[]},{level:2,title:"Class.hasField - ext-method",slug:"class-hasfield-ext-method",link:"#class-hasfield-ext-method",children:[]},{level:2,title:"Class.hasMethod - ext-method",slug:"class-hasmethod-ext-method",link:"#class-hasmethod-ext-method",children:[]},{level:2,title:"Class.hasConstructor - ext-method",slug:"class-hasconstructor-ext-method",link:"#class-hasconstructor-ext-method",children:[]},{level:2,title:"Member.hasModifiers - ext-method",slug:"member-hasmodifiers-ext-method",link:"#member-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.hasModifiers - ext-method",slug:"class-hasmodifiers-ext-method",link:"#class-hasmodifiers-ext-method",children:[]},{level:2,title:"Class.field - ext-method",slug:"class-field-ext-method",link:"#class-field-ext-method",children:[]},{level:2,title:"Class.method - ext-method",slug:"class-method-ext-method",link:"#class-method-ext-method",children:[]},{level:2,title:"Class.constructor - ext-method",slug:"class-constructor-ext-method",link:"#class-constructor-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method",link:"#class-generic-ext-method",children:[]},{level:2,title:"Class.generic - ext-method",slug:"class-generic-ext-method-1",link:"#class-generic-ext-method-1",children:[]},{level:2,title:"Any.current - ext-method",slug:"any-current-ext-method",link:"#any-current-ext-method",children:[]},{level:2,title:"Class.buildOf - ext-method",slug:"class-buildof-ext-method",link:"#class-buildof-ext-method",children:[]},{level:2,title:"Class.allMethods - ext-method",slug:"class-allmethods-ext-method",link:"#class-allmethods-ext-method",children:[]},{level:2,title:"Class.allConstructors - ext-method",slug:"class-allconstructors-ext-method",link:"#class-allconstructors-ext-method",children:[]},{level:2,title:"Class.allFields - ext-method",slug:"class-allfields-ext-method",link:"#class-allfields-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookFactory - kt",headers:[{level:2,title:"IYukiHookXposedInit.configs - ext-method",slug:"iyukihookxposedinit-configs-ext-method",link:"#iyukihookxposedinit-configs-ext-method",children:[]},{level:2,title:"IYukiHookXposedInit.encase - ext-method",slug:"iyukihookxposedinit-encase-ext-method",link:"#iyukihookxposedinit-encase-ext-method",children:[]},{level:2,title:"Context.modulePrefs - ext-field",slug:"context-moduleprefs-ext-field",link:"#context-moduleprefs-ext-field",children:[]},{level:2,title:"Context.modulePrefs - ext-method",slug:"context-moduleprefs-ext-method",link:"#context-moduleprefs-ext-method",children:[]},{level:2,title:"Context.dataChannel - ext-method",slug:"context-datachannel-ext-method",link:"#context-datachannel-ext-method",children:[]},{level:2,title:"Context.processName - ext-field",slug:"context-processname-ext-field",link:"#context-processname-ext-field",children:[]},{level:2,title:"Context+Resources.injectModuleAppResources - ext-method",slug:"context-resources-injectmoduleappresources-ext-method",link:"#context-resources-injectmoduleappresources-ext-method",children:[]},{level:2,title:"Context.registerModuleAppActivities - ext-method",slug:"context-registermoduleappactivities-ext-method",link:"#context-registermoduleappactivities-ext-method",children:[]},{level:2,title:"Context.applyModuleTheme - ext-method",slug:"context-applymoduletheme-ext-method",link:"#context-applymoduletheme-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"LoggerFactory - kt",headers:[{level:2,title:"LoggerType - class",slug:"loggertype-class",link:"#loggertype-class",children:[{level:3,title:"LOGD - enum",slug:"logd-enum",link:"#logd-enum",children:[]},{level:3,title:"XPOSEDBRIDGE - enum",slug:"xposedbridge-enum",link:"#xposedbridge-enum",children:[]},{level:3,title:"SCOPE - enum",slug:"scope-enum",link:"#scope-enum",children:[]},{level:3,title:"BOTH - enum",slug:"both-enum",link:"#both-enum",children:[]}]},{level:2,title:"YukiLoggerData - class",slug:"yukiloggerdata-class",link:"#yukiloggerdata-class",children:[]},{level:2,title:"YukiHookLogger - object",slug:"yukihooklogger-object",link:"#yukihooklogger-object",children:[{level:3,title:"inMemoryData - field",slug:"inmemorydata-field",link:"#inmemorydata-field",children:[]},{level:3,title:"contents - field",slug:"contents-field",link:"#contents-field",children:[]},{level:3,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:3,title:"saveToFile - method",slug:"savetofile-method",link:"#savetofile-method",children:[]},{level:3,title:"Configs - object",slug:"configs-object",link:"#configs-object",children:[]}]},{level:2,title:"loggerD - method",slug:"loggerd-method",link:"#loggerd-method",children:[]},{level:2,title:"loggerI - method",slug:"loggeri-method",link:"#loggeri-method",children:[]},{level:2,title:"loggerW - method",slug:"loggerw-method",link:"#loggerw-method",children:[]},{level:2,title:"loggerE - method",slug:"loggere-method",link:"#loggere-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"HookParam - class",headers:[{level:2,title:"args - field",slug:"args-field",link:"#args-field",children:[]},{level:2,title:"instance - field",slug:"instance-field",link:"#instance-field",children:[]},{level:2,title:"instanceClass - field",slug:"instanceclass-field",link:"#instanceclass-field",children:[]},{level:2,title:"member - field",slug:"member-field",link:"#member-field",children:[]},{level:2,title:"method - field",slug:"method-field",link:"#method-field",children:[]},{level:2,title:"constructor - field",slug:"constructor-field",link:"#constructor-field",children:[]},{level:2,title:"result - field",slug:"result-field",link:"#result-field",children:[]},{level:2,title:"hasThrowable - field",slug:"hasthrowable-field",link:"#hasthrowable-field",children:[]},{level:2,title:"throwable - field",slug:"throwable-field",link:"#throwable-field",children:[]},{level:2,title:"Throwable.throwToApp - i-ext-method",slug:"throwable-throwtoapp-i-ext-method",link:"#throwable-throwtoapp-i-ext-method",children:[]},{level:2,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:2,title:"instance - method",slug:"instance-method",link:"#instance-method",children:[]},{level:2,title:"args - method",slug:"args-method",link:"#args-method",children:[]},{level:2,title:"args - method",slug:"args-method-1",link:"#args-method-1",children:[]},{level:2,title:"callOriginal - method",slug:"calloriginal-method",link:"#calloriginal-method",children:[]},{level:2,title:"invokeOriginal - method",slug:"invokeoriginal-method",link:"#invokeoriginal-method",children:[]},{level:2,title:"resultTrue - method",slug:"resulttrue-method",link:"#resulttrue-method",children:[]},{level:2,title:"resultFalse - method",slug:"resultfalse-method",link:"#resultfalse-method",children:[]},{level:2,title:"resultNull - method",slug:"resultnull-method",link:"#resultnull-method",children:[]},{level:2,title:"ArgsIndexCondition - class",slug:"argsindexcondition-class",link:"#argsindexcondition-class",children:[{level:3,title:"first - method",slug:"first-method",link:"#first-method",children:[]},{level:3,title:"last - method",slug:"last-method",link:"#last-method",children:[]}]},{level:2,title:"ArgsModifyer - class",slug:"argsmodifyer-class",link:"#argsmodifyer-class",children:[{level:3,title:"cast - method",slug:"cast-method",link:"#cast-method",children:[]},{level:3,title:"byte - method",slug:"byte-method",link:"#byte-method",children:[]},{level:3,title:"int - method",slug:"int-method",link:"#int-method",children:[]},{level:3,title:"long - method",slug:"long-method",link:"#long-method",children:[]},{level:3,title:"short - method",slug:"short-method",link:"#short-method",children:[]},{level:3,title:"double - method",slug:"double-method",link:"#double-method",children:[]},{level:3,title:"float - method",slug:"float-method",link:"#float-method",children:[]},{level:3,title:"string - method",slug:"string-method",link:"#string-method",children:[]},{level:3,title:"char - method",slug:"char-method",link:"#char-method",children:[]},{level:3,title:"boolean - method",slug:"boolean-method",link:"#boolean-method",children:[]},{level:3,title:"any - method",slug:"any-method",link:"#any-method",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]},{level:3,title:"set - method",slug:"set-method",link:"#set-method",children:[]},{level:3,title:"setNull - method",slug:"setnull-method",link:"#setnull-method",children:[]},{level:3,title:"setTrue - method",slug:"settrue-method",link:"#settrue-method",children:[]},{level:3,title:"setFalse - method",slug:"setfalse-method",link:"#setfalse-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"PackageParam - class",headers:[{level:2,title:"appClassLoader - field",slug:"appclassloader-field",link:"#appclassloader-field",children:[]},{level:2,title:"appInfo - field",slug:"appinfo-field",link:"#appinfo-field",children:[]},{level:2,title:"appUserId - field",slug:"appuserid-field",link:"#appuserid-field",children:[]},{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]},{level:2,title:"appResources - field",slug:"appresources-field",link:"#appresources-field",children:[]},{level:2,title:"systemContext - field",slug:"systemcontext-field",link:"#systemcontext-field",children:[]},{level:2,title:"processName - field",slug:"processname-field",link:"#processname-field",children:[]},{level:2,title:"packageName - field",slug:"packagename-field",link:"#packagename-field",children:[]},{level:2,title:"isFirstApplication - field",slug:"isfirstapplication-field",link:"#isfirstapplication-field",children:[]},{level:2,title:"mainProcessName - field",slug:"mainprocessname-field",link:"#mainprocessname-field",children:[]},{level:2,title:"moduleAppFilePath - field",slug:"moduleappfilepath-field",link:"#moduleappfilepath-field",children:[]},{level:2,title:"moduleAppResources - field",slug:"moduleappresources-field",link:"#moduleappresources-field",children:[]},{level:2,title:"prefs - field",slug:"prefs-field",link:"#prefs-field",children:[]},{level:2,title:"prefs - method",slug:"prefs-method",link:"#prefs-method",children:[]},{level:2,title:"dataChannel - field",slug:"datachannel-field",link:"#datachannel-field",children:[]},{level:2,title:"resources - method",slug:"resources-method",link:"#resources-method",children:[]},{level:2,title:"refreshModuleAppResources - method",slug:"refreshmoduleappresources-method",link:"#refreshmoduleappresources-method",children:[]},{level:2,title:"onAppLifecycle - method",slug:"onapplifecycle-method",link:"#onapplifecycle-method",children:[]},{level:2,title:"loadApp - method",slug:"loadapp-method",link:"#loadapp-method",children:[]},{level:2,title:"loadZygote - method",slug:"loadzygote-method",link:"#loadzygote-method",children:[]},{level:2,title:"loadSystem - method",slug:"loadsystem-method",link:"#loadsystem-method",children:[]},{level:2,title:"withProcess - method",slug:"withprocess-method",link:"#withprocess-method",children:[]},{level:2,title:"loadHooker - method",slug:"loadhooker-method",link:"#loadhooker-method",children:[]},{level:2,title:"searchClass - method",slug:"searchclass-method",link:"#searchclass-method",children:[]},{level:2,title:"String+VariousClass.toClass - i-ext-method",slug:"string-variousclass-toclass-i-ext-method",link:"#string-variousclass-toclass-i-ext-method",children:[]},{level:2,title:"String+VariousClass.toClassOrNull - i-ext-method",slug:"string-variousclass-toclassornull-i-ext-method",link:"#string-variousclass-toclassornull-i-ext-method",children:[]},{level:2,title:"String.hasClass - i-ext-method",slug:"string-hasclass-i-ext-method",link:"#string-hasclass-i-ext-method",children:[]},{level:2,title:"findClass - method",slug:"findclass-method",link:"#findclass-method",children:[]},{level:2,title:"String+Class+VariousClass+HookClass.hook - i-ext-method",slug:"string-class-variousclass-hookclass-hook-i-ext-method",link:"#string-class-variousclass-hookclass-hook-i-ext-method",children:[]},{level:2,title:"HookResources.hook - i-ext-method",slug:"hookresources-hook-i-ext-method",link:"#hookresources-hook-i-ext-method",children:[]},{level:2,title:"AppLifecycle - class",slug:"applifecycle-class",link:"#applifecycle-class",children:[{level:3,title:"attachBaseContext - method",slug:"attachbasecontext-method",link:"#attachbasecontext-method",children:[]},{level:3,title:"onCreate - method",slug:"oncreate-method",link:"#oncreate-method",children:[]},{level:3,title:"onTerminate - method",slug:"onterminate-method",link:"#onterminate-method",children:[]},{level:3,title:"onLowMemory - method",slug:"onlowmemory-method",link:"#onlowmemory-method",children:[]},{level:3,title:"onTrimMemory - method",slug:"ontrimmemory-method",link:"#ontrimmemory-method",children:[]},{level:3,title:"onConfigurationChanged - method",slug:"onconfigurationchanged-method",link:"#onconfigurationchanged-method",children:[]},{level:3,title:"registerReceiver - method",slug:"registerreceiver-method",link:"#registerreceiver-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ComponentTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"GraphicsTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"ViewTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"DefinedTypeFactory - kt",headers:[{level:2,title:"VagueType - field",slug:"vaguetype-field",link:"#vaguetype-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"VariableTypeFactory - kt",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleApplication - class",headers:[{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookDataChannel - class",headers:[{level:2,title:"NameSpace - class",slug:"namespace-class",link:"#namespace-class",children:[{level:3,title:"with - method",slug:"with-method",link:"#with-method",children:[]},{level:3,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:3,title:"put - method",slug:"put-method-1",link:"#put-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"wait - method",slug:"wait-method-1",link:"#wait-method-1",children:[]},{level:3,title:"checkingVersionEquals - method",slug:"checkingversionequals-method",link:"#checkingversionequals-method",children:[]},{level:3,title:"obtainLoggerInMemoryData - method",slug:"obtainloggerinmemorydata-method",link:"#obtainloggerinmemorydata-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",pathLocale:"/en/",extraFields:[]},{title:"YukiHookModulePrefs - class",headers:[{level:2,title:"isXSharePrefsReadable - field",slug:"isxshareprefsreadable-field",link:"#isxshareprefsreadable-field",children:[]},{level:2,title:"isRunInNewXShareMode - field",slug:"isruninnewxsharemode-field",link:"#isruninnewxsharemode-field",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"direct - method",slug:"direct-method",link:"#direct-method",children:[]},{level:2,title:"getString - method",slug:"getstring-method",link:"#getstring-method",children:[]},{level:2,title:"getStringSet - method",slug:"getstringset-method",link:"#getstringset-method",children:[]},{level:2,title:"getBoolean - method",slug:"getboolean-method",link:"#getboolean-method",children:[]},{level:2,title:"getInt - method",slug:"getint-method",link:"#getint-method",children:[]},{level:2,title:"getLong - method",slug:"getlong-method",link:"#getlong-method",children:[]},{level:2,title:"getFloat - method",slug:"getfloat-method",link:"#getfloat-method",children:[]},{level:2,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:2,title:"remove - method",slug:"remove-method",link:"#remove-method",children:[]},{level:2,title:"remove - method",slug:"remove-method-1",link:"#remove-method-1",children:[]},{level:2,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:2,title:"putString - method",slug:"putstring-method",link:"#putstring-method",children:[]},{level:2,title:"putStringSet - method",slug:"putstringset-method",link:"#putstringset-method",children:[]},{level:2,title:"putBoolean - method",slug:"putboolean-method",link:"#putboolean-method",children:[]},{level:2,title:"putInt - method",slug:"putint-method",link:"#putint-method",children:[]},{level:2,title:"putLong - method",slug:"putlong-method",link:"#putlong-method",children:[]},{level:2,title:"putFloat - method",slug:"putfloat-method",link:"#putfloat-method",children:[]},{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:2,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",pathLocale:"/en/",extraFields:[]},{title:"IYukiHookXposedInit - interface",headers:[{level:2,title:"onInit - method",slug:"oninit-method",link:"#oninit-method",children:[]},{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]},{level:2,title:"onXposedEvent - method",slug:"onxposedevent-method",link:"#onxposedevent-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",pathLocale:"/en/",extraFields:[]},{title:"ComponentTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"GraphicsTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ViewTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"DefinedTypeFactory - kt",headers:[{level:2,title:"VagueType - field",slug:"vaguetype-field",link:"#vaguetype-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"VariableTypeFactory - kt",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleApplication - class",headers:[{level:2,title:"appContext - field",slug:"appcontext-field",link:"#appcontext-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookDataChannel - class",headers:[{level:2,title:"NameSpace - class",slug:"namespace-class",link:"#namespace-class",children:[{level:3,title:"with - method",slug:"with-method",link:"#with-method",children:[]},{level:3,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:3,title:"put - method",slug:"put-method-1",link:"#put-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"wait - method",slug:"wait-method-1",link:"#wait-method-1",children:[]},{level:3,title:"checkingVersionEquals - method",slug:"checkingversionequals-method",link:"#checkingversionequals-method",children:[]},{level:3,title:"obtainLoggerInMemoryData - method",slug:"obtainloggerinmemorydata-method",link:"#obtainloggerinmemorydata-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiHookModulePrefs - class",headers:[{level:2,title:"isXSharePrefsReadable - field",slug:"isxshareprefsreadable-field",link:"#isxshareprefsreadable-field",children:[]},{level:2,title:"isRunInNewXShareMode - field",slug:"isruninnewxsharemode-field",link:"#isruninnewxsharemode-field",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"direct - method",slug:"direct-method",link:"#direct-method",children:[]},{level:2,title:"getString - method",slug:"getstring-method",link:"#getstring-method",children:[]},{level:2,title:"getStringSet - method",slug:"getstringset-method",link:"#getstringset-method",children:[]},{level:2,title:"getBoolean - method",slug:"getboolean-method",link:"#getboolean-method",children:[]},{level:2,title:"getInt - method",slug:"getint-method",link:"#getint-method",children:[]},{level:2,title:"getLong - method",slug:"getlong-method",link:"#getlong-method",children:[]},{level:2,title:"getFloat - method",slug:"getfloat-method",link:"#getfloat-method",children:[]},{level:2,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:2,title:"remove - method",slug:"remove-method",link:"#remove-method",children:[]},{level:2,title:"remove - method",slug:"remove-method-1",link:"#remove-method-1",children:[]},{level:2,title:"clear - method",slug:"clear-method",link:"#clear-method",children:[]},{level:2,title:"putString - method",slug:"putstring-method",link:"#putstring-method",children:[]},{level:2,title:"putStringSet - method",slug:"putstringset-method",link:"#putstringset-method",children:[]},{level:2,title:"putBoolean - method",slug:"putboolean-method",link:"#putboolean-method",children:[]},{level:2,title:"putInt - method",slug:"putint-method",link:"#putint-method",children:[]},{level:2,title:"putLong - method",slug:"putlong-method",link:"#putlong-method",children:[]},{level:2,title:"putFloat - method",slug:"putfloat-method",link:"#putfloat-method",children:[]},{level:2,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:2,title:"put - method",slug:"put-method",link:"#put-method",children:[]},{level:2,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"IYukiHookXposedInit - interface",headers:[{level:2,title:"onInit - method",slug:"oninit-method",link:"#oninit-method",children:[]},{level:2,title:"onHook - method",slug:"onhook-method",link:"#onhook-method",children:[]},{level:2,title:"onXposedEvent - method",slug:"onxposedevent-method",link:"#onxposedevent-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"BaseFinder - class",headers:[{level:2,title:"BaseFinder.IndexTypeCondition - class",slug:"basefinder-indextypecondition-class",link:"#basefinder-indextypecondition-class",children:[{level:3,title:"index - method",slug:"index-method",link:"#index-method",children:[]},{level:3,title:"index - method",slug:"index-method-1",link:"#index-method-1",children:[]},{level:3,title:"IndexTypeConditionSort - class",slug:"indextypeconditionsort-class",link:"#indextypeconditionsort-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",pathLocale:"/en/",extraFields:[]},{title:"DexClassFinder - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}]},{level:2,title:"fullName - field",slug:"fullname-field",link:"#fullname-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"singleName - field",slug:"singlename-field",link:"#singlename-field",children:[]},{level:2,title:"from - method",slug:"from-method",link:"#from-method",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method",link:"#fullname-method",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method",link:"#simplename-method",children:[]},{level:2,title:"singleName - method",slug:"singlename-method",link:"#singlename-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method-1",link:"#fullname-method-1",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method-1",link:"#simplename-method-1",children:[]},{level:2,title:"singleName - method",slug:"singlename-method-1",link:"#singlename-method-1",children:[]},{level:2,title:"extends - method",slug:"extends-method",link:"#extends-method",children:[]},{level:2,title:"extends - method",slug:"extends-method-1",link:"#extends-method-1",children:[]},{level:2,title:"implements - method",slug:"implements-method",link:"#implements-method",children:[]},{level:2,title:"implements - method",slug:"implements-method-1",link:"#implements-method-1",children:[]},{level:2,title:"anonymous - method",slug:"anonymous-method",link:"#anonymous-method",children:[]},{level:2,title:"noExtends - method",slug:"noextends-method",link:"#noextends-method",children:[]},{level:2,title:"noImplements - method",slug:"noimplements-method",link:"#noimplements-method",children:[]},{level:2,title:"noSuper - method",slug:"nosuper-method",link:"#nosuper-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method",link:"#enclosing-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method-1",link:"#enclosing-method-1",children:[]},{level:2,title:"FromPackageRules - class",slug:"frompackagerules-class",link:"#frompackagerules-class",children:[{level:3,title:"absolute - method",slug:"absolute-method",link:"#absolute-method",children:[]}]},{level:2,title:"ClassNameRules - class",slug:"classnamerules-class",link:"#classnamerules-class",children:[{level:3,title:"optional - method",slug:"optional-method",link:"#optional-method",children:[]}]},{level:2,title:"member - method",slug:"member-method",link:"#member-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:2,title:"Result - class",slug:"result-class",link:"#result-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"onNoClassDefFoundError - method",slug:"onnoclassdeffounderror-method",link:"#onnoclassdeffounderror-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",pathLocale:"/en/",extraFields:[]},{title:"ConstructorFinder - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method",link:"#onnosuchconstructor-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method-1",link:"#onnosuchconstructor-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",pathLocale:"/en/",extraFields:[]},{title:"FieldFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchField - method",slug:"onnosuchfield-method",link:"#onnosuchfield-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",pathLocale:"/en/",extraFields:[]},{title:"MethodFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method",link:"#onnosuchmethod-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method-1",link:"#onnosuchmethod-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",pathLocale:"/en/",extraFields:[]},{title:"YukiModuleResources - class",headers:[{level:2,title:"fwd - method",slug:"fwd-method",link:"#fwd-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResForwarder - class",headers:[{level:2,title:"id - field",slug:"id-field",link:"#id-field",children:[]},{level:2,title:"resources - field",slug:"resources-field",link:"#resources-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",pathLocale:"/en/",extraFields:[]},{title:"YukiResources - class",headers:[{level:2,title:"LayoutInflatedParam - class",slug:"layoutinflatedparam-class",link:"#layoutinflatedparam-class",children:[{level:3,title:"variantName - field",slug:"variantname-field",link:"#variantname-field",children:[]},{level:3,title:"currentView - field",slug:"currentview-field",link:"#currentview-field",children:[]},{level:3,title:"findViewByIdentifier - method",slug:"findviewbyidentifier-method",link:"#findviewbyidentifier-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",pathLocale:"/en/",extraFields:[]},{title:"YukiXposedEvent - object",headers:[{level:2,title:"events - method",slug:"events-method",link:"#events-method",children:[]},{level:2,title:"onInitZygote - method",slug:"oninitzygote-method",link:"#oninitzygote-method",children:[]},{level:2,title:"onHandleLoadPackage - method",slug:"onhandleloadpackage-method",link:"#onhandleloadpackage-method",children:[]},{level:2,title:"onHandleInitPackageResources - method",slug:"onhandleinitpackageresources-method",link:"#onhandleinitpackageresources-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",pathLocale:"/en/",extraFields:[]},{title:"ChannelData - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleClassLoader - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"excludeHostClasses - method",slug:"excludehostclasses-method",link:"#excludehostclasses-method",children:[]},{level:3,title:"excludeModuleClasses - method",slug:"excludemoduleclasses-method",link:"#excludemoduleclasses-method",children:[]}]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",pathLocale:"/en/",extraFields:[]},{title:"PrefsData - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",pathLocale:"/en/",extraFields:[]},{title:"ModulePreferenceFragment - class",headers:[{level:2,title:"onCreatePreferencesInModuleApp - method",slug:"oncreatepreferencesinmoduleapp-method",link:"#oncreatepreferencesinmoduleapp-method",children:[]},{level:2,title:"onSharedPreferenceChanged - method",slug:"onsharedpreferencechanged-method",link:"#onsharedpreferencechanged-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",pathLocale:"/en/",extraFields:[]},{title:"BaseFinder - class",headers:[{level:2,title:"BaseFinder.IndexTypeCondition - class",slug:"basefinder-indextypecondition-class",link:"#basefinder-indextypecondition-class",children:[{level:3,title:"index - method",slug:"index-method",link:"#index-method",children:[]},{level:3,title:"index - method",slug:"index-method-1",link:"#index-method-1",children:[]},{level:3,title:"IndexTypeConditionSort - class",slug:"indextypeconditionsort-class",link:"#indextypeconditionsort-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"DexClassFinder - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"clearCache - method",slug:"clearcache-method",link:"#clearcache-method",children:[]}]},{level:2,title:"fullName - field",slug:"fullname-field",link:"#fullname-field",children:[]},{level:2,title:"simpleName - field",slug:"simplename-field",link:"#simplename-field",children:[]},{level:2,title:"singleName - field",slug:"singlename-field",link:"#singlename-field",children:[]},{level:2,title:"from - method",slug:"from-method",link:"#from-method",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method",link:"#fullname-method",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method",link:"#simplename-method",children:[]},{level:2,title:"singleName - method",slug:"singlename-method",link:"#singlename-method",children:[]},{level:2,title:"fullName - method",slug:"fullname-method-1",link:"#fullname-method-1",children:[]},{level:2,title:"simpleName - method",slug:"simplename-method-1",link:"#simplename-method-1",children:[]},{level:2,title:"singleName - method",slug:"singlename-method-1",link:"#singlename-method-1",children:[]},{level:2,title:"extends - method",slug:"extends-method",link:"#extends-method",children:[]},{level:2,title:"extends - method",slug:"extends-method-1",link:"#extends-method-1",children:[]},{level:2,title:"implements - method",slug:"implements-method",link:"#implements-method",children:[]},{level:2,title:"implements - method",slug:"implements-method-1",link:"#implements-method-1",children:[]},{level:2,title:"anonymous - method",slug:"anonymous-method",link:"#anonymous-method",children:[]},{level:2,title:"noExtends - method",slug:"noextends-method",link:"#noextends-method",children:[]},{level:2,title:"noImplements - method",slug:"noimplements-method",link:"#noimplements-method",children:[]},{level:2,title:"noSuper - method",slug:"nosuper-method",link:"#nosuper-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method",link:"#enclosing-method",children:[]},{level:2,title:"enclosing - method",slug:"enclosing-method-1",link:"#enclosing-method-1",children:[]},{level:2,title:"FromPackageRules - class",slug:"frompackagerules-class",link:"#frompackagerules-class",children:[{level:3,title:"absolute - method",slug:"absolute-method",link:"#absolute-method",children:[]}]},{level:2,title:"ClassNameRules - class",slug:"classnamerules-class",link:"#classnamerules-class",children:[{level:3,title:"optional - method",slug:"optional-method",link:"#optional-method",children:[]}]},{level:2,title:"member - method",slug:"member-method",link:"#member-method",children:[]},{level:2,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:2,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:2,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:2,title:"Result - class",slug:"result-class",link:"#result-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"onNoClassDefFoundError - method",slug:"onnoclassdeffounderror-method",link:"#onnoclassdeffounderror-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ConstructorFinder - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"constructor - method",slug:"constructor-method",link:"#constructor-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method",link:"#onnosuchconstructor-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchConstructor - method",slug:"onnosuchconstructor-method-1",link:"#onnosuchconstructor-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"FieldFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"type - method",slug:"type-method",link:"#type-method",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"field - method",slug:"field-method",link:"#field-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchField - method",slug:"onnosuchfield-method",link:"#onnosuchfield-method",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MethodFinder - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"order - method",slug:"order-method",link:"#order-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"name - method",slug:"name-method-1",link:"#name-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-2",link:"#paramcount-method-2",children:[]},{level:2,title:"returnType - method",slug:"returntype-method",link:"#returntype-method",children:[]},{level:2,title:"superClass - method",slug:"superclass-method",link:"#superclass-method",children:[]},{level:2,title:"RemedyPlan - class",slug:"remedyplan-class",link:"#remedyplan-class",children:[{level:3,title:"method - method",slug:"method-method",link:"#method-method",children:[]},{level:3,title:"Result - class",slug:"result-class",link:"#result-class",children:[]}]},{level:2,title:"Process - class",slug:"process-class",link:"#process-class",children:[{level:3,title:"result - method",slug:"result-method",link:"#result-method",children:[]},{level:3,title:"all - method",slug:"all-method",link:"#all-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method",link:"#remedys-method",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method",link:"#onnosuchmethod-method",children:[]}]},{level:2,title:"Result - class",slug:"result-class-1",link:"#result-class-1",children:[{level:3,title:"result - method",slug:"result-method-1",link:"#result-method-1",children:[]},{level:3,title:"get - method",slug:"get-method",link:"#get-method",children:[]},{level:3,title:"all - method",slug:"all-method-1",link:"#all-method-1",children:[]},{level:3,title:"give - method",slug:"give-method",link:"#give-method",children:[]},{level:3,title:"giveAll - method",slug:"giveall-method",link:"#giveall-method",children:[]},{level:3,title:"wait - method",slug:"wait-method",link:"#wait-method",children:[]},{level:3,title:"waitAll - method",slug:"waitall-method",link:"#waitall-method",children:[]},{level:3,title:"remedys - method",slug:"remedys-method-1",link:"#remedys-method-1",children:[]},{level:3,title:"onNoSuchMethod - method",slug:"onnosuchmethod-method-1",link:"#onnosuchmethod-method-1",children:[]},{level:3,title:"ignored - method",slug:"ignored-method",link:"#ignored-method",children:[]},{level:3,title:"Instance - class",slug:"instance-class",link:"#instance-class",children:[]},{level:3,title:"array - method",slug:"array-method",link:"#array-method",children:[]},{level:3,title:"list - method",slug:"list-method",link:"#list-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiModuleResources - class",headers:[{level:2,title:"fwd - method",slug:"fwd-method",link:"#fwd-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResForwarder - class",headers:[{level:2,title:"id - field",slug:"id-field",link:"#id-field",children:[]},{level:2,title:"resources - field",slug:"resources-field",link:"#resources-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiResources - class",headers:[{level:2,title:"LayoutInflatedParam - class",slug:"layoutinflatedparam-class",link:"#layoutinflatedparam-class",children:[{level:3,title:"variantName - field",slug:"variantname-field",link:"#variantname-field",children:[]},{level:3,title:"currentView - field",slug:"currentview-field",link:"#currentview-field",children:[]},{level:3,title:"findViewByIdentifier - method",slug:"findviewbyidentifier-method",link:"#findviewbyidentifier-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"YukiXposedEvent - object",headers:[{level:2,title:"events - method",slug:"events-method",link:"#events-method",children:[]},{level:2,title:"onInitZygote - method",slug:"oninitzygote-method",link:"#oninitzygote-method",children:[]},{level:2,title:"onHandleLoadPackage - method",slug:"onhandleloadpackage-method",link:"#onhandleloadpackage-method",children:[]},{level:2,title:"onHandleInitPackageResources - method",slug:"onhandleinitpackageresources-method",link:"#onhandleinitpackageresources-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ChannelData - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleClassLoader - class",headers:[{level:2,title:"companion object - object",slug:"companion-object-object",link:"#companion-object-object",children:[{level:3,title:"excludeHostClasses - method",slug:"excludehostclasses-method",link:"#excludehostclasses-method",children:[]},{level:3,title:"excludeModuleClasses - method",slug:"excludemoduleclasses-method",link:"#excludemoduleclasses-method",children:[]}]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"PrefsData - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModulePreferenceFragment - class",headers:[{level:2,title:"onCreatePreferencesInModuleApp - method",slug:"oncreatepreferencesinmoduleapp-method",link:"#oncreatepreferencesinmoduleapp-method",children:[]},{level:2,title:"onSharedPreferenceChanged - method",slug:"onsharedpreferencechanged-method",link:"#onsharedpreferencechanged-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"CountRules - class",headers:[{level:2,title:"Int.isZero - i-ext-method",slug:"int-iszero-i-ext-method",link:"#int-iszero-i-ext-method",children:[]},{level:2,title:"Int.moreThan - i-ext-method",slug:"int-morethan-i-ext-method",link:"#int-morethan-i-ext-method",children:[]},{level:2,title:"Int.lessThan - i-ext-method",slug:"int-lessthan-i-ext-method",link:"#int-lessthan-i-ext-method",children:[]},{level:2,title:"Int.inInterval - i-ext-method",slug:"int-ininterval-i-ext-method",link:"#int-ininterval-i-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",pathLocale:"/en/",extraFields:[]},{title:"ModifierRules - class",headers:[{level:2,title:"isPublic - i-ext-field",slug:"ispublic-i-ext-field",link:"#ispublic-i-ext-field",children:[]},{level:2,title:"isPrivate - i-ext-field",slug:"isprivate-i-ext-field",link:"#isprivate-i-ext-field",children:[]},{level:2,title:"isProtected - i-ext-field",slug:"isprotected-i-ext-field",link:"#isprotected-i-ext-field",children:[]},{level:2,title:"isStatic - i-ext-field",slug:"isstatic-i-ext-field",link:"#isstatic-i-ext-field",children:[]},{level:2,title:"isFinal - i-ext-field",slug:"isfinal-i-ext-field",link:"#isfinal-i-ext-field",children:[]},{level:2,title:"isSynchronized - i-ext-field",slug:"issynchronized-i-ext-field",link:"#issynchronized-i-ext-field",children:[]},{level:2,title:"isVolatile - i-ext-field",slug:"isvolatile-i-ext-field",link:"#isvolatile-i-ext-field",children:[]},{level:2,title:"isTransient - i-ext-field",slug:"istransient-i-ext-field",link:"#istransient-i-ext-field",children:[]},{level:2,title:"isNative - i-ext-field",slug:"isnative-i-ext-field",link:"#isnative-i-ext-field",children:[]},{level:2,title:"isInterface - i-ext-field",slug:"isinterface-i-ext-field",link:"#isinterface-i-ext-field",children:[]},{level:2,title:"isAbstract - i-ext-field",slug:"isabstract-i-ext-field",link:"#isabstract-i-ext-field",children:[]},{level:2,title:"isStrict - i-ext-field",slug:"isstrict-i-ext-field",link:"#isstrict-i-ext-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",pathLocale:"/en/",extraFields:[]},{title:"NameRules - class",headers:[{level:2,title:"String.isSynthetic - i-ext-method",slug:"string-issynthetic-i-ext-method",link:"#string-issynthetic-i-ext-method",children:[]},{level:2,title:"String.isOnlySymbols - i-ext-method",slug:"string-isonlysymbols-i-ext-method",link:"#string-isonlysymbols-i-ext-method",children:[]},{level:2,title:"String.isOnlyLetters - i-ext-method",slug:"string-isonlyletters-i-ext-method",link:"#string-isonlyletters-i-ext-method",children:[]},{level:2,title:"String.isOnlyNumbers - i-ext-method",slug:"string-isonlynumbers-i-ext-method",link:"#string-isonlynumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLettersNumbers - i-ext-method",slug:"string-isonlylettersnumbers-i-ext-method",link:"#string-isonlylettersnumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLowercase - i-ext-method",slug:"string-isonlylowercase-i-ext-method",link:"#string-isonlylowercase-i-ext-method",children:[]},{level:2,title:"String.isOnlyUppercase - i-ext-method",slug:"string-isonlyuppercase-i-ext-method",link:"#string-isonlyuppercase-i-ext-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",pathLocale:"/en/",extraFields:[]},{title:"ConstructorRules - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",pathLocale:"/en/",extraFields:[]},{title:"FieldRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",pathLocale:"/en/",extraFields:[]},{title:"MemberRules - class",headers:[{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",pathLocale:"/en/",extraFields:[]},{title:"MethodRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleAppActivity - class",headers:[],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleAppCompatActivity - class",headers:[{level:2,title:"moduleTheme - field",slug:"moduletheme-field",link:"#moduletheme-field",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",pathLocale:"/en/",extraFields:[]},{title:"ModuleContextThemeWrapper - class",headers:[{level:2,title:"applyConfiguration - method",slug:"applyconfiguration-method",link:"#applyconfiguration-method",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",pathLocale:"/en/",extraFields:[]},{title:"CountRules - class",headers:[{level:2,title:"Int.isZero - i-ext-method",slug:"int-iszero-i-ext-method",link:"#int-iszero-i-ext-method",children:[]},{level:2,title:"Int.moreThan - i-ext-method",slug:"int-morethan-i-ext-method",link:"#int-morethan-i-ext-method",children:[]},{level:2,title:"Int.lessThan - i-ext-method",slug:"int-lessthan-i-ext-method",link:"#int-lessthan-i-ext-method",children:[]},{level:2,title:"Int.inInterval - i-ext-method",slug:"int-ininterval-i-ext-method",link:"#int-ininterval-i-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModifierRules - class",headers:[{level:2,title:"isPublic - i-ext-field",slug:"ispublic-i-ext-field",link:"#ispublic-i-ext-field",children:[]},{level:2,title:"isPrivate - i-ext-field",slug:"isprivate-i-ext-field",link:"#isprivate-i-ext-field",children:[]},{level:2,title:"isProtected - i-ext-field",slug:"isprotected-i-ext-field",link:"#isprotected-i-ext-field",children:[]},{level:2,title:"isStatic - i-ext-field",slug:"isstatic-i-ext-field",link:"#isstatic-i-ext-field",children:[]},{level:2,title:"isFinal - i-ext-field",slug:"isfinal-i-ext-field",link:"#isfinal-i-ext-field",children:[]},{level:2,title:"isSynchronized - i-ext-field",slug:"issynchronized-i-ext-field",link:"#issynchronized-i-ext-field",children:[]},{level:2,title:"isVolatile - i-ext-field",slug:"isvolatile-i-ext-field",link:"#isvolatile-i-ext-field",children:[]},{level:2,title:"isTransient - i-ext-field",slug:"istransient-i-ext-field",link:"#istransient-i-ext-field",children:[]},{level:2,title:"isNative - i-ext-field",slug:"isnative-i-ext-field",link:"#isnative-i-ext-field",children:[]},{level:2,title:"isInterface - i-ext-field",slug:"isinterface-i-ext-field",link:"#isinterface-i-ext-field",children:[]},{level:2,title:"isAbstract - i-ext-field",slug:"isabstract-i-ext-field",link:"#isabstract-i-ext-field",children:[]},{level:2,title:"isStrict - i-ext-field",slug:"isstrict-i-ext-field",link:"#isstrict-i-ext-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"NameRules - class",headers:[{level:2,title:"String.isSynthetic - i-ext-method",slug:"string-issynthetic-i-ext-method",link:"#string-issynthetic-i-ext-method",children:[]},{level:2,title:"String.isOnlySymbols - i-ext-method",slug:"string-isonlysymbols-i-ext-method",link:"#string-isonlysymbols-i-ext-method",children:[]},{level:2,title:"String.isOnlyLetters - i-ext-method",slug:"string-isonlyletters-i-ext-method",link:"#string-isonlyletters-i-ext-method",children:[]},{level:2,title:"String.isOnlyNumbers - i-ext-method",slug:"string-isonlynumbers-i-ext-method",link:"#string-isonlynumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLettersNumbers - i-ext-method",slug:"string-isonlylettersnumbers-i-ext-method",link:"#string-isonlylettersnumbers-i-ext-method",children:[]},{level:2,title:"String.isOnlyLowercase - i-ext-method",slug:"string-isonlylowercase-i-ext-method",link:"#string-isonlylowercase-i-ext-method",children:[]},{level:2,title:"String.isOnlyUppercase - i-ext-method",slug:"string-isonlyuppercase-i-ext-method",link:"#string-isonlyuppercase-i-ext-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ConstructorRules - class",headers:[{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"FieldRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"type - field",slug:"type-field",link:"#type-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MemberRules - class",headers:[{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MethodRules - class",headers:[{level:2,title:"name - field",slug:"name-field",link:"#name-field",children:[]},{level:2,title:"paramCount - field",slug:"paramcount-field",link:"#paramcount-field",children:[]},{level:2,title:"returnType - field",slug:"returntype-field",link:"#returntype-field",children:[]},{level:2,title:"modifiers - method",slug:"modifiers-method",link:"#modifiers-method",children:[]},{level:2,title:"emptyParam - method",slug:"emptyparam-method",link:"#emptyparam-method",children:[]},{level:2,title:"param - method",slug:"param-method",link:"#param-method",children:[]},{level:2,title:"name - method",slug:"name-method",link:"#name-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method",link:"#paramcount-method",children:[]},{level:2,title:"paramCount - method",slug:"paramcount-method-1",link:"#paramcount-method-1",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleAppActivity - class",headers:[],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleAppCompatActivity - class",headers:[{level:2,title:"moduleTheme - field",slug:"moduletheme-field",link:"#moduletheme-field",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"ModuleContextThemeWrapper - class",headers:[{level:2,title:"applyConfiguration - method",slug:"applyconfiguration-method",link:"#applyconfiguration-method",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"MemberRulesResult - class",headers:[{level:2,title:"none - method",slug:"none-method",link:"#none-method",children:[]},{level:2,title:"count - method",slug:"count-method",link:"#count-method",children:[]},{level:2,title:"count - method",slug:"count-method-1",link:"#count-method-1",children:[]},{level:2,title:"count - method",slug:"count-method-2",link:"#count-method-2",children:[]}],path:"/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",pathLocale:"/en/",extraFields:[]},{title:"MemberRulesResult - class",headers:[{level:2,title:"none - method",slug:"none-method",link:"#none-method",children:[]},{level:2,title:"count - method",slug:"count-method",link:"#count-method",children:[]},{level:2,title:"count - method",slug:"count-method-1",link:"#count-method-1",children:[]},{level:2,title:"count - method",slug:"count-method-2",link:"#count-method-2",children:[]}],path:"/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",pathLocale:"/zh-cn/",extraFields:[]},{title:"",headers:[],path:"/404.html",pathLocale:"/",extraFields:[]}],Br=ye(hf),df=()=>Br;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateSearchIndex=e=>{Br.value=e});const uf=({searchIndex:e,routeLocale:t,query:l,maxSuggestions:i})=>{const o=Y(()=>e.value.filter(n=>n.pathLocale===t.value));return Y(()=>{const n=l.value.trim().toLowerCase();if(!n)return[];const a=[],r=(s,c)=>{sa(n,[c.title])&&a.push({link:`${s.path}#${c.slug}`,title:s.title,header:c.title});for(const h of c.children){if(a.length>=i.value)return;r(s,h)}};for(const s of o.value){if(a.length>=i.value)break;if(sa(n,[s.title,...s.extraFields])){a.push({link:s.path,title:s.title});continue}for(const c of s.headers){if(a.length>=i.value)break;r(s,c)}}return a})},pf=e=>{const t=ye(0);return{focusIndex:t,focusNext:()=>{t.value{t.value>0?t.value-=1:t.value=e.value.length-1}}},mf=ue({name:"SearchBox",props:{locales:{type:Object,required:!1,default:()=>({})},hotKeys:{type:Array,required:!1,default:()=>[]},maxSuggestions:{type:Number,required:!1,default:5}},setup(e){const{locales:t,hotKeys:l,maxSuggestions:i}=Ei(e),o=Jt(),n=Wl(),a=df(),r=ye(null),s=ye(!1),c=ye(""),h=Y(()=>{var P;return(P=t.value[n.value])!=null?P:{}}),p=uf({searchIndex:a,routeLocale:n,query:c,maxSuggestions:i}),{focusIndex:m,focusNext:g,focusPrev:x}=pf(p);cf({input:r,hotKeys:l});const L=Y(()=>s.value&&!!p.value.length),E=()=>{!L.value||x()},k=()=>{!L.value||g()},b=P=>{if(!L.value)return;const H=p.value[P];!H||o.push(H.link).then(()=>{c.value="",m.value=0})};return()=>he("form",{class:"search-box",role:"search"},[he("input",{ref:r,type:"search",placeholder:h.value.placeholder,autocomplete:"off",spellcheck:!1,value:c.value,onFocus:()=>s.value=!0,onBlur:()=>s.value=!1,onInput:P=>c.value=P.target.value,onKeydown:P=>{switch(P.key){case"ArrowUp":{E();break}case"ArrowDown":{k();break}case"Enter":{P.preventDefault(),b(m.value);break}}}}),L.value&&he("ul",{class:"suggestions",onMouseleave:()=>m.value=-1},p.value.map(({link:P,title:H,header:U},ee)=>he("li",{class:["suggestion",{focus:m.value===ee}],onMouseenter:()=>m.value=ee,onMousedown:()=>b(ee)},he("a",{href:P,onClick:w=>w.preventDefault()},[he("span",{class:"page-title"},H),U&&he("span",{class:"page-header"},`> ${U}`)]))))])}});const ff={"/en/":{placeholder:"Search"},"/zh-cn/":{placeholder:"\u641C\u7D22"}},gf=["s","/"],kf=5,vf=Ht({enhance({app:e}){e.component("SearchBox",t=>he(mf,{locales:ff,hotKeys:gf,maxSuggestions:kf,...t}))}}),oi=[Nd,Yd,Xd,nu,cu,mu,nf,vf];var Ur=ye(es),Wr=Co({key:"",path:"",title:"",lang:"",frontmatter:{},excerpt:"",headers:[]}),gt=ye(Wr),Ot=()=>gt;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updatePageData=e=>{Ur.value[e.key]=()=>Promise.resolve(e),e.key===gt.value.key&&(gt.value=e)});var Xr=Symbol(""),vt=()=>{const e=Me(Xr);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},qr=Symbol(""),bf=()=>{const e=Me(qr);if(!e)throw new Error("usePageHead() is called without provider.");return e},_f=Symbol(""),Kr=Symbol(""),yf=()=>{const e=Me(Kr);if(!e)throw new Error("usePageLang() is called without provider.");return e},No=Symbol(""),Wl=()=>{const e=Me(No);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},Tt=ye(Ah),Gr=()=>Tt;import.meta.webpackHot&&(__VUE_HMR_RUNTIME__.updateSiteData=e=>{Tt.value=e});var Qr=Symbol(""),jo=()=>{const e=Me(Qr);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},xf=Symbol(""),Ut=gl({resolvePageData:async e=>{const t=Ur.value[e],l=await(t==null?void 0:t());return l!=null?l:Wr},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,l)=>{const i=be(t.description)?t.description:l.description,o=[...te(t.head)?t.head:[],...l.head,["title",{},e],["meta",{name:"description",content:i}]];return Ih(o)},resolvePageHeadTitle:(e,t)=>`${e.title?`${e.title} | `:""}${t.title}`,resolvePageLang:e=>e.lang||"en",resolveRouteLocale:(e,t)=>pr(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),$o=ue({name:"ClientOnly",setup(e,t){const l=ye(!1);return Ze(()=>{l.value=!0}),()=>{var i,o;return l.value?(o=(i=t.slots).default)==null?void 0:o.call(i):null}}}),Ef=ue({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=Ot(),l=Y(()=>mr[e.pageKey||t.value.key]);return()=>l.value?he(l.value):he("div","404 Not Found")}}),Cf="Layout",Rf="NotFound",Lf=oi.reduce((e,t)=>({...e,...t.layouts}),{}),ca=ue({name:"Vuepress",setup(){const e=Ot(),t=Y(()=>{let l;if(e.value.path){const i=e.value.frontmatter.layout;be(i)?l=i:l=Cf}else l=Rf;return Lf[l]});return()=>he(t.value)}}),Yo=e=>Ul(e)?e:`${Gr().value.base}${ur(e)}`;const Pf=[["v-8daa1a0e","/",{title:""},["/index.html","/index.md"]],["v-2d0a870d","/en/",{title:"Home"},["/en/index.html","/en/index.md"]],["v-c0c85b84","/zh-cn/",{title:"\u9996\u9875"},["/zh-cn/index.html","/zh-cn/index.md"]],["v-7a15fe3b","/en/about/about.html",{title:"About this Document"},["/en/about/about","/en/about/about.md"]],["v-3f851d14","/en/about/changelog.html",{title:"Changelog"},["/en/about/changelog","/en/about/changelog.md"]],["v-193cf592","/en/about/contacts.html",{title:"Contact Us"},["/en/about/contacts","/en/about/contacts.md"]],["v-ae7b83f2","/en/about/future.html",{title:"Looking for Future"},["/en/about/future","/en/about/future.md"]],["v-64fc7bb8","/en/api/home.html",{title:"Document Introduce"},["/en/api/home","/en/api/home.md"]],["v-9cfea7fc","/en/config/api-example.html",{title:"API Basic Configs"},["/en/config/api-example","/en/config/api-example.md"]],["v-72c12b7d","/en/config/api-exception.html",{title:"API Exception Handling"},["/en/config/api-exception","/en/config/api-exception.md"]],["v-793879e8","/en/config/api-using.html",{title:"Use as Hook API Configs"},["/en/config/api-using","/en/config/api-using.md"]],["v-29d6c1ba","/en/config/r8-proguard.html",{title:"R8 & Proguard Obfuscate"},["/en/config/r8-proguard","/en/config/r8-proguard.md"]],["v-24e71de7","/en/config/xposed-using.html",{title:"Use as Xposed Module Configs"},["/en/config/xposed-using","/en/config/xposed-using.md"]],["v-7b22efaf","/en/guide/example.html",{title:"Usage Example"},["/en/guide/example","/en/guide/example.md"]],["v-efb45d4c","/en/guide/home.html",{title:"Introduce"},["/en/guide/home","/en/guide/home.md"]],["v-277b35ca","/en/guide/knowledge.html",{title:"Basic Knowledge"},["/en/guide/knowledge","/en/guide/knowledge.md"]],["v-77d752a2","/en/guide/move-to-new-api.html",{title:"Migrate from Xposed API"},["/en/guide/move-to-new-api","/en/guide/move-to-new-api.md"]],["v-72889797","/en/guide/quick-start.html",{title:"Quick Start"},["/en/guide/quick-start","/en/guide/quick-start.md"]],["v-55c11626","/en/tools/yukihookapi-projectbuilder.html",{title:"YukiHookAPI Project Builder"},["/en/tools/yukihookapi-projectbuilder","/en/tools/yukihookapi-projectbuilder.md"]],["v-41967128","/zh-cn/about/about.html",{title:"\u5173\u4E8E\u6B64\u6587\u6863"},["/zh-cn/about/about","/zh-cn/about/about.md"]],["v-0e6c3476","/zh-cn/about/changelog.html",{title:"\u66F4\u65B0\u65E5\u5FD7"},["/zh-cn/about/changelog","/zh-cn/about/changelog.md"]],["v-6cf86266","/zh-cn/about/contacts.html",{title:"\u8054\u7CFB\u6211\u4EEC"},["/zh-cn/about/contacts","/zh-cn/about/contacts.md"]],["v-3106ca14","/zh-cn/about/future.html",{title:"\u5C55\u671B\u672A\u6765"},["/zh-cn/about/future","/zh-cn/about/future.md"]],["v-c8deafb2","/zh-cn/api/home.html",{title:"\u6587\u6863\u4ECB\u7ECD"},["/zh-cn/api/home","/zh-cn/api/home.md"]],["v-c6114c9e","/zh-cn/config/api-example.html",{title:"API \u57FA\u672C\u914D\u7F6E"},["/zh-cn/config/api-example","/zh-cn/config/api-example.md"]],["v-5b43296c","/zh-cn/config/api-exception.html",{title:"API \u5F02\u5E38\u5904\u7406"},["/zh-cn/config/api-exception","/zh-cn/config/api-exception.md"]],["v-2ee67152","/zh-cn/config/api-using.html",{title:"\u4F5C\u4E3A Hook API \u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E"},["/zh-cn/config/api-using","/zh-cn/config/api-using.md"]],["v-154d6f69","/zh-cn/config/r8-proguard.html",{title:"R8 \u4E0E Proguard \u6DF7\u6DC6"},["/zh-cn/config/r8-proguard","/zh-cn/config/r8-proguard.md"]],["v-af73b3d0","/zh-cn/config/xposed-using.html",{title:"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E"},["/zh-cn/config/xposed-using","/zh-cn/config/xposed-using.md"]],["v-13b430a0","/zh-cn/guide/example.html",{title:"\u7528\u6CD5\u793A\u4F8B"},["/zh-cn/guide/example","/zh-cn/guide/example.md"]],["v-6a609e09","/zh-cn/guide/home.html",{title:"\u4ECB\u7ECD"},["/zh-cn/guide/home","/zh-cn/guide/home.md"]],["v-b4f1a468","/zh-cn/guide/knowledge.html",{title:"\u57FA\u7840\u77E5\u8BC6"},["/zh-cn/guide/knowledge","/zh-cn/guide/knowledge.md"]],["v-c0d5dada","/zh-cn/guide/move-to-new-api.html",{title:"\u4ECE Xposed API \u8FC1\u79FB"},["/zh-cn/guide/move-to-new-api","/zh-cn/guide/move-to-new-api.md"]],["v-24840ff0","/zh-cn/guide/quick-start.html",{title:"\u5FEB\u901F\u5F00\u59CB"},["/zh-cn/guide/quick-start","/zh-cn/guide/quick-start.md"]],["v-a2fab4d6","/zh-cn/tools/yukihookapi-projectbuilder.html",{title:"YukiHookAPI \u6784\u5EFA\u5DE5\u5177"},["/zh-cn/tools/yukihookapi-projectbuilder","/zh-cn/tools/yukihookapi-projectbuilder.md"]],["v-12042f1f","/en/api/special-features/host-inject.html",{title:"Host Resource Injection Extension"},["/en/api/special-features/host-inject","/en/api/special-features/host-inject.md"]],["v-deaff1d0","/en/api/special-features/host-lifecycle.html",{title:"Host Lifecycle Extension"},["/en/api/special-features/host-lifecycle","/en/api/special-features/host-lifecycle.md"]],["v-33c1dc26","/en/api/special-features/logger.html",{title:"Debug Logs"},["/en/api/special-features/logger","/en/api/special-features/logger.md"]],["v-581ddb9c","/en/api/special-features/reflection.html",{title:"Reflection Extensions"},["/en/api/special-features/reflection","/en/api/special-features/reflection.md"]],["v-2e6ad66c","/en/api/special-features/xposed-channel.html",{title:"Xposed Module and Host Channel"},["/en/api/special-features/xposed-channel","/en/api/special-features/xposed-channel.md"]],["v-68bebbf4","/en/api/special-features/xposed-storage.html",{title:"Xposed Module Data Storage"},["/en/api/special-features/xposed-storage","/en/api/special-features/xposed-storage.md"]],["v-6ac5be8e","/zh-cn/api/special-features/host-inject.html",{title:"\u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55"},["/zh-cn/api/special-features/host-inject","/zh-cn/api/special-features/host-inject.md"]],["v-357a8d49","/zh-cn/api/special-features/host-lifecycle.html",{title:"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55"},["/zh-cn/api/special-features/host-lifecycle","/zh-cn/api/special-features/host-lifecycle.md"]],["v-1f0f591e","/zh-cn/api/special-features/logger.html",{title:"\u8C03\u8BD5\u65E5\u5FD7"},["/zh-cn/api/special-features/logger","/zh-cn/api/special-features/logger.md"]],["v-001858e3","/zh-cn/api/special-features/reflection.html",{title:"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55"},["/zh-cn/api/special-features/reflection","/zh-cn/api/special-features/reflection.md"]],["v-598546c6","/zh-cn/api/special-features/xposed-channel.html",{title:"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865"},["/zh-cn/api/special-features/xposed-channel","/zh-cn/api/special-features/xposed-channel.md"]],["v-0d914225","/zh-cn/api/special-features/xposed-storage.html",{title:"Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8"},["/zh-cn/api/special-features/xposed-storage","/zh-cn/api/special-features/xposed-storage.md"]],["v-053599a5","/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",{title:"YukiHookAPI - object"},["/en/api/public/com/highcapable/yukihookapi/YukiHookAPI","/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"]],["v-6931cb54","/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html",{title:"YukiHookAPI - object"},["/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI","/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.md"]],["v-818b3ca6","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",{title:"InjectYukiHookWithXposed - annotation"},["/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.md"]],["v-b6a815c4","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",{title:"CurrentClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.md"]],["v-0183e3fc","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",{title:"GenericClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"]],["v-57506200","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",{title:"HookClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.md"]],["v-9af56c1a","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",{title:"HookResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources","/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.md"]],["v-032b1710","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",{title:"VariousClass - class"},["/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"]],["v-71147891","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",{title:"YukiMemberHookCreator - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"]],["v-5ed1ceee","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",{title:"YukiResourcesHookCreator - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"]],["v-e288ce96","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",{title:"YukiBaseHooker - class"},["/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.md"]],["v-0d0fcec2","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",{title:"ReflectionFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"]],["v-65091354","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",{title:"YukiHookFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"]],["v-36aec5ad","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",{title:"LoggerFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"]],["v-30f3ba1e","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html",{title:"InjectYukiHookWithXposed - annotation"},["/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed","/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.md"]],["v-60cbe1b4","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",{title:"HookParam - class"},["/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"]],["v-b381a126","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",{title:"PackageParam - class"},["/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"]],["v-6e47300f","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html",{title:"CurrentClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.md"]],["v-69c1c226","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html",{title:"GenericClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.md"]],["v-735374af","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html",{title:"HookClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.md"]],["v-1c516d22","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html",{title:"HookResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.md"]],["v-66735bfe","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html",{title:"VariousClass - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass","/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.md"]],["v-3ac40680","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html",{title:"YukiMemberHookCreator - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.md"]],["v-5e81af42","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html",{title:"YukiResourcesHookCreator - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.md"]],["v-516df326","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html",{title:"YukiBaseHooker - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker","/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.md"]],["v-213d88b3","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html",{title:"ReflectionFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.md"]],["v-448e9585","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html",{title:"YukiHookFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.md"]],["v-004a009e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html",{title:"LoggerFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.md"]],["v-75a9b636","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html",{title:"HookParam - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md"]],["v-100b529c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html",{title:"PackageParam - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam","/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.md"]],["v-8293d958","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",{title:"ComponentTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.md"]],["v-7b0abf86","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",{title:"GraphicsTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.md"]],["v-5309e4a0","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",{title:"ViewTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.md"]],["v-a2615d0c","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",{title:"DefinedTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.md"]],["v-ba01a600","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",{title:"VariableTypeFactory - kt"},["/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.md"]],["v-7fec5836","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",{title:"ModuleApplication - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.md"]],["v-7414265a","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",{title:"YukiHookDataChannel - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"]],["v-003862c2","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",{title:"YukiHookModulePrefs - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"]],["v-1d680acc","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",{title:"IYukiHookXposedInit - interface"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.md"]],["v-5e874c45","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html",{title:"ComponentTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.md"]],["v-4ea62475","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html",{title:"GraphicsTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.md"]],["v-ef79cde2","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html",{title:"ViewTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.md"]],["v-5acc12ab","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html",{title:"DefinedTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.md"]],["v-14ec8671","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html",{title:"VariableTypeFactory - kt"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory","/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.md"]],["v-4709ad58","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html",{title:"ModuleApplication - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.md"]],["v-632be8ee","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html",{title:"YukiHookDataChannel - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md"]],["v-5858709e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html",{title:"YukiHookModulePrefs - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.md"]],["v-763140ee","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html",{title:"IYukiHookXposedInit - interface"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.md"]],["v-4fca92c0","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",{title:"BaseFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.md"]],["v-2a898c66","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",{title:"DexClassFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.md"]],["v-a71937aa","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",{title:"ConstructorFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"]],["v-42e0f0ab","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",{title:"FieldFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"]],["v-a4aa4d00","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",{title:"MethodFinder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"]],["v-0f1e3594","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",{title:"YukiModuleResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.md"]],["v-35faec91","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",{title:"YukiResForwarder - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.md"]],["v-2c04b82a","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",{title:"YukiResources - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.md"]],["v-19e7277e","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",{title:"YukiXposedEvent - object"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.md"]],["v-2f64a2d4","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",{title:"ChannelData - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"]],["v-2d4e0da6","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",{title:"ModuleClassLoader - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.md"]],["v-58ed8298","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",{title:"PrefsData - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"]],["v-23e1a817","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",{title:"ModulePreferenceFragment - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.md"]],["v-0f719471","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html",{title:"BaseFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.md"]],["v-45111efc","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html",{title:"DexClassFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.md"]],["v-1e2cbc9c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html",{title:"ConstructorFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.md"]],["v-22449c48","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html",{title:"FieldFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.md"]],["v-fd738322","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html",{title:"MethodFinder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.md"]],["v-3d943532","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html",{title:"YukiModuleResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.md"]],["v-526c4200","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html",{title:"YukiResForwarder - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.md"]],["v-68541dca","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html",{title:"YukiResources - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.md"]],["v-0a4de82f","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html",{title:"YukiXposedEvent - object"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.md"]],["v-493d37f6","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html",{title:"ChannelData - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.md"]],["v-4b468415","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html",{title:"ModuleClassLoader - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.md"]],["v-d99f7f36","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html",{title:"PrefsData - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.md"]],["v-53bcae06","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html",{title:"ModulePreferenceFragment - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.md"]],["v-52995ef7","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",{title:"CountRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.md"]],["v-8d5ce71a","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",{title:"ModifierRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.md"]],["v-f5b1ffb2","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",{title:"NameRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.md"]],["v-08b70f7f","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",{title:"ConstructorRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"]],["v-21f64ebf","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",{title:"FieldRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"]],["v-77f11cf9","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",{title:"MemberRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.md"]],["v-64827680","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",{title:"MethodRules - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"]],["v-2d5d16db","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",{title:"ModuleAppActivity - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md"]],["v-cadbe48e","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",{title:"ModuleAppCompatActivity - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md"]],["v-78731c50","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",{title:"ModuleContextThemeWrapper - class"},["/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.md"]],["v-1b2ad030","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html",{title:"CountRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.md"]],["v-547a3c3c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html",{title:"ModifierRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.md"]],["v-58c26516","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html",{title:"NameRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.md"]],["v-a42f54a4","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html",{title:"ConstructorRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.md"]],["v-3e67a42e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html",{title:"FieldRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.md"]],["v-2cab152c","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html",{title:"MemberRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.md"]],["v-5388621e","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html",{title:"MethodRules - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.md"]],["v-1446bdca","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html",{title:"ModuleAppActivity - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md"]],["v-c7cef530","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html",{title:"ModuleAppCompatActivity - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md"]],["v-44efb702","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html",{title:"ModuleContextThemeWrapper - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper","/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.md"]],["v-5e375d98","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",{title:"MemberRulesResult - class"},["/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.md"]],["v-b8000f3a","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html",{title:"MemberRulesResult - class"},["/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult","/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.md"]],["v-3706649a","/404.html",{title:""},["/404"]]];var Af=()=>Pf.reduce((e,[t,l,i,o])=>(e.push({name:t,path:l,component:ca,meta:i},...o.map(n=>({path:n,redirect:l}))),e),[{name:"404",path:"/:catchAll(.*)",component:ca}]),Tf=Gh,If=()=>{const e=Fd({history:Tf(dr(Tt.value.base)),routes:Af(),scrollBehavior:(t,l,i)=>i||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,l)=>{var i;(t.path!==l.path||l===mt)&&([gt.value]=await Promise.all([Ut.resolvePageData(t.name),(i=mr[t.name])==null?void 0:i.__asyncLoader()]))}),e},wf=e=>{e.component("ClientOnly",$o),e.component("Content",Ef)},Of=(e,t)=>{const l=Y(()=>Ut.resolveRouteLocale(Tt.value.locales,t.currentRoute.value.path)),i=Y(()=>Ut.resolveSiteLocaleData(Tt.value,l.value)),o=Y(()=>Ut.resolvePageFrontmatter(gt.value)),n=Y(()=>Ut.resolvePageHeadTitle(gt.value,i.value)),a=Y(()=>Ut.resolvePageHead(n.value,o.value,i.value)),r=Y(()=>Ut.resolvePageLang(gt.value));return e.provide(No,l),e.provide(Qr,i),e.provide(Xr,o),e.provide(_f,n),e.provide(qr,a),e.provide(Kr,r),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>o.value},$head:{get:()=>a.value},$headTitle:{get:()=>n.value},$lang:{get:()=>r.value},$page:{get:()=>gt.value},$routeLocale:{get:()=>l.value},$site:{get:()=>Tt.value},$siteLocale:{get:()=>i.value},$withBase:{get:()=>Yo}}),{pageData:gt,pageFrontmatter:o,pageHead:a,pageHeadTitle:n,pageLang:r,routeLocale:l,siteData:Tt,siteLocaleData:i}},Ff=()=>{const e=St(),t=bf(),l=yf(),i=ye([]),o=()=>{t.value.forEach(a=>{const r=zf(a);r&&i.value.push(r)})},n=()=>{document.documentElement.lang=l.value,i.value.forEach(a=>{a.parentNode===document.head&&document.head.removeChild(a)}),i.value.splice(0,i.value.length),t.value.forEach(a=>{const r=Df(a);r!==null&&(document.head.appendChild(r),i.value.push(r))})};Gt(xf,n),Ze(()=>{o(),n(),dt(()=>e.path,()=>n())})},zf=([e,t,l=""])=>{const i=Object.entries(t).map(([r,s])=>be(s)?`[${r}="${s}"]`:s===!0?`[${r}]`:"").join(""),o=`head > ${e}${i}`;return Array.from(document.querySelectorAll(o)).find(r=>r.innerText===l)||null},Df=([e,t,l])=>{if(!be(e))return null;const i=document.createElement(e);return Oo(t)&&Object.entries(t).forEach(([o,n])=>{be(n)?i.setAttribute(o,n):n===!0&&i.setAttribute(o,"")}),be(l)&&i.appendChild(document.createTextNode(l)),i},Mf=Lh,Hf=async()=>{var l;const e=Mf({name:"VuepressApp",setup(){var i;Ff();for(const o of oi)(i=o.setup)==null||i.call(o);return()=>[he(Lr),...oi.flatMap(({rootComponents:o=[]})=>o.map(n=>he(n)))]}}),t=If();wf(e),Of(e,t);for(const i of oi)await((l=i.enhance)==null?void 0:l.call(i,{app:e,router:t,siteData:Tt}));return e.use(t),{app:e,router:t}};Hf().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Ae as _,jc as a,fe as b,J as c,Hf as createVueApp,oe as d,Mt as e,N as o,_t as r,He as w}; diff --git a/docs/assets/changelog.html.379566e7.js b/docs/assets/changelog.html.379566e7.js deleted file mode 100644 index c0845253e..000000000 --- a/docs/assets/changelog.html.379566e7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,r as l,o as n,c as a,b as e,d,e as o,a as c}from"./app.99fcdd51.js";const r={},_=e("h1",{id:"\u66F4\u65B0\u65E5\u5FD7",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u66F4\u65B0\u65E5\u5FD7","aria-hidden":"true"},"#"),o(" \u66F4\u65B0\u65E5\u5FD7")],-1),h=e("blockquote",null,[e("p",null,[o("\u8FD9\u91CC\u8BB0\u5F55\u4E86 "),e("code",null,"YukiHookAPI"),o(" \u7684\u7248\u672C\u66F4\u65B0\u5386\u53F2\u3002")])],-1),u=e("div",{class:"custom-container danger"},[e("p",{class:"custom-container-title"},"\u7279\u522B\u6CE8\u610F"),e("p",null,"\u6211\u4EEC\u53EA\u4F1A\u5BF9\u6700\u65B0\u7684 API \u7248\u672C\u8FDB\u884C\u7EF4\u62A4\uFF0C\u82E5\u4F60\u6B63\u5728\u4F7F\u7528\u8FC7\u65F6\u7684 API \u7248\u672C\u5219\u4EE3\u8868\u4F60\u81EA\u613F\u653E\u5F03\u4E00\u5207\u7EF4\u62A4\u7684\u53EF\u80FD\u6027\u3002")],-1),k={id:"_1-1-4-2022-10-04",tabindex:"-1"},p=e("a",{class:"header-anchor",href:"#_1-1-4-2022-10-04","aria-hidden":"true"},"#",-1),g=o(" 1.1.4 | 2022.10.04 \u2002"),f=c("
    • \u4FEE\u590D YukiHookDataChannel \u53EF\u80FD\u4E0D\u80FD\u54CD\u5E94\u7CFB\u7EDF\u6846\u67B6\u4E2D\u54CD\u5E94\u5E7F\u64AD\u4E8B\u4EF6\u7684\u95EE\u9898\uFF0C\u5728 Android 13 \u4E2D\u590D\u73B0
    • \u4FEE\u590D YukiHookDataChannel \u957F\u8FBE\u591A\u4E2A\u7248\u672C\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u65E0\u6CD5\u4E0E\u6A21\u5757\u901A\u8BAF\u7684\u95EE\u9898
    • YukiHookDataChannel \u4E2D\u65B0\u589E obtainLoggerInMemoryData \u65B9\u6CD5\uFF0C\u53EF\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u5171\u4EAB\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E
    • \u4FEE\u6539 YukiHookLogger.inMemoryData \u7684\u7C7B\u578B\u4E3A ArrayList \u5E76\u4FEE\u6539 YukiLoggerData \u4E3A data class
    • \u4FEE\u590D YukiLoggerData \u5728\u6A21\u5757\u4E2D\u5305\u540D\u4E3A\u7A7A\u6253\u5370\u7A7A\u767D\u7684\u95EE\u9898
    • PackageParam \u4E2D\u65B0\u589E loadApp\u3001loadZygote\u3001loadSystem\u3001withProcess \u7684\u540C\u540D\u591A\u53C2\u6570\u65B9\u6CD5
    • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),m={id:"_1-1-3-2022-09-30",tabindex:"-1"},H=e("a",{class:"header-anchor",href:"#_1-1-3-2022-09-30","aria-hidden":"true"},"#",-1),P=o(" 1.1.3 | 2022.09.30 \u2002"),b=e("ul",null,[e("li",null,"\u4FEE\u590D\u4E00\u4E2A\u65E0\u6CD5\u81EA\u5B9A\u4E49 Hook \u5165\u53E3\u7C7B\u540D\u7684\u81F4\u547D\u9519\u8BEF"),e("li",null,[o("\u6DFB\u52A0 "),e("code",null,"LoggerFactory"),o(" \u4E2D\u7684\u90E8\u5206\u4EE3\u7801\u6CE8\u91CA\u6587\u6848\u5E76\u66F4\u65B0\u7279\u8272\u529F\u80FD\u6587\u6863")])],-1),x={id:"_1-1-2-2022-09-30",tabindex:"-1"},y=e("a",{class:"header-anchor",href:"#_1-1-2-2022-09-30","aria-hidden":"true"},"#",-1),C=o(" 1.1.2 | 2022.09.30 \u2002"),A=c('
    • \u6587\u6863 \u57FA\u7840\u77E5\u8BC6 \u9875\u9762\u65B0\u589E English \u7248\u672C\u53CB\u60C5\u94FE\u63A5
    • \u4FEE\u590D YukiBaseHooker \u6CE8\u91CA\u4E2D\u7684 English \u6587\u6863\u94FE\u63A5\u9519\u8BEF\u95EE\u9898
    • \u4FEE\u590D ModuleClassLoader \u4E2D\u7684 ClassCastException \u95EE\u9898
    • \u4FEE\u6B63\u5E76\u89C4\u8303\u90E8\u5206\u4EE3\u7801\u6CE8\u91CA
    • \u65B0\u589E ModuleClassLoader \u6392\u9664\u5217\u8868\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528 excludeHostClasses \u548C excludeModuleClasses \u65B9\u6CD5\u6765\u81EA\u5B9A\u4E49\u6392\u9664\u5217\u8868
    • \u65B0\u589E YukiLoggerData \u5B9E\u65F6\u65E5\u5FD7\u6570\u636E\u7C7B\uFF0C\u53EF\u5B9E\u65F6\u901A\u8FC7 YukiHookLogger.inMemoryData \u83B7\u53D6\u65E5\u5FD7\u6570\u7EC4
    • \u65B0\u589E ClassLoader.listOfClasses \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5\u83B7\u53D6\u5F53\u524D Dex \u4E2D\u7684\u5168\u90E8 Class
    ',1),v={id:"_1-1-1-2022-09-28",tabindex:"-1"},M=e("a",{class:"header-anchor",href:"#_1-1-1-2022-09-28","aria-hidden":"true"},"#",-1),Y=o(" 1.1.1 | 2022.09.28 \u2002"),I=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E86\u6587\u6863 "),e("a",{href:"../guide/knowledge"},"\u57FA\u7840\u77E5\u8BC6"),o(" \u9875\u9762\u53CB\u60C5\u94FE\u63A5\u9519\u8BEF\u7684\u95EE\u9898")]),e("li",null,[o("\u4FEE\u590D\u4E86\u6587\u6863 "),e("code",null,"favicon"),o(" \u4E0D\u663E\u793A\u7684\u95EE\u9898")]),e("li",null,[o("\u4FEE\u590D "),e("code",null,"DexClassFinder"),o(" \u67E5\u627E\u6761\u4EF6\u4E2D\u7684 BUG")])],-1),R={id:"_1-1-0-2022-09-28",tabindex:"-1"},S=e("a",{class:"header-anchor",href:"#_1-1-0-2022-09-28","aria-hidden":"true"},"#",-1),L=o(" 1.1.0 | 2022.09.28 \u2002"),X=e("li",null,[o("\u8FD9\u662F\u4E00\u6B21\u5927\u7248\u672C\u66F4\u65B0\uFF0C\u6709\u5173\u66F4\u65B0\u65E5\u5FD7\u4E2D\u63D0\u5230\u7684\u53D8\u5316\u53CA\u7528\u6CD5\u8BF7\u53C2\u8003 "),e("a",{href:"../api/home"},"API \u6587\u6863"),o(" \u4EE5\u53CA "),e("a",{href:"../api/special-features/reflection"},"\u7279\u8272\u529F\u80FD")],-1),F=o("\u66F4\u6362\u5E2E\u52A9\u6587\u6863\u6846\u67B6\u5230 "),D={href:"https://v2.vuepress.vuejs.org",target:"_blank",rel:"noopener noreferrer"},B=o("VuePress"),U=c('
  • \u7EDF\u4E00\u5E76\u89C4\u8303\u6587\u6863\u4E2D\u7684\u672F\u8BED\u540D\u8BCD\uFF0C\u4F8B\u5982\u201C\u67E5\u8BE2\u201D\u4E00\u5F8B\u66F4\u6539\u4E3A\u4E86\u201C\u67E5\u627E\u201D\uFF0CXposedHelper \u62FC\u5199\u9519\u8BEF\u4FEE\u6539\u4E3A\u4E86 XposedHelpers
  • \u6587\u6863 \u57FA\u7840\u77E5\u8BC6 \u9875\u9762\u52A0\u5165\u53CB\u60C5\u94FE\u63A5\uFF0C\u4EC5\u9650\u7B80\u4F53\u4E2D\u6587
  • \u5C06 Hook App Demo \u7684 Class \u4E0E Method \u8F6C\u4E3A Java \u4EE5\u63D0\u4F9B\u66F4\u597D\u7684\u6F14\u793A\u6548\u679C
  • \u4FEE\u6B63\u4E86 Hook Module Demo \u4E2D\u7684\u4EE3\u7801\u6CE8\u91CA\u547D\u540D
  • \u91CD\u6784\u4E86\u5927\u91CF\u5E95\u5C42 Hook \u903B\u8F91\u53CA Xposed API \u7684\u5BF9\u63A5\u65B9\u5F0F
  • \u79FB\u9664\u4E86 HookParamWrapper\uFF0C\u73B0\u5DF2\u5C06\u5176\u76F4\u63A5\u4E0E YukiBridgeFactory \u5BF9\u63A5
  • \u79FB\u52A8\u90E8\u5206 YukiHookBridge \u4E2D\u7684\u65B9\u6CD5\u5230 AppParasitics
  • \u79FB\u9664\u4E86 HookParam.args \u4E0E\u5E95\u5C42\u7684\u76F4\u63A5\u5BF9\u63A5\u65B9\u6CD5 setArgs\uFF0C\u76F4\u63A5\u83B7\u53D6\u5E76\u8BBE\u7F6E\u5F53\u524D\u6570\u7EC4\u7684\u5BF9\u8C61
  • \u4F18\u5316\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\uFF0C\u5C06\u5F15\u7528\u7684 jar \u5408\u5E76\u5230 stub \u9879\u76EE
  • ',9),W=o("\u4FEE\u590D\u591A\u9879\u76EE\u6253\u5305\u65F6\u6A21\u5757\u5305\u540D\u65E0\u6CD5\u6B63\u786E\u5339\u914D\u7684\u95EE\u9898\u4EE5\u53CA\u4FEE\u6539\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7684\u6A21\u5757\u5305\u540D\u5339\u914D\u903B\u8F91\uFF0C\u611F\u8C22 "),G={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},w=o("5ec1cff"),T=o(" \u7684\u53CD\u9988\u53CA\u63D0\u4F9B\u7684\u89E3\u51B3\u65B9\u6848"),N=c("
  • \u5BF9 API \u79C1\u6709\u5DE5\u5177\u7C7B\u7684\u65B9\u6CD5\u8FDB\u884C\u4E86 internal \u95ED\u5305\u5904\u7406\uFF0C\u907F\u514D\u6C61\u67D3\u9876\u7EA7\u547D\u540D\u7A7A\u95F4
  • \u4FEE\u6B63\u4E86\u6240\u6709\u53CD\u5C04\u548C Hook \u7C7B\u7684 Creater \u547D\u540D\u5230 Creator
  • \u65B0\u589E YukiHookAPI.Status.compiledTimestamp \u529F\u80FD\uFF0C\u53EF\u4EE5\u5728\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u65F6\u83B7\u53D6\u7F16\u8BD1\u5B8C\u6210\u7684\u65F6\u95F4\u6233
  • \u65B0\u589E YukiHookAPI.Status.isXposedEnvironment \u529F\u80FD\uFF0C\u53EF\u4EE5\u5224\u65AD\u5F53\u524D\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u8FD8\u662F\u6A21\u5757\u73AF\u5883
  • \u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\u8FDB\u884C\u4E86\u5927\u6539\u7248\uFF0C\u73B0\u5DF2\u5C06 YukiHookAPI.Configs.debugTag \u7B49\u529F\u80FD\u5408\u5E76\u5230 YukiHookLogger.Configs \u4E2D
  • \u8C03\u8BD5\u65E5\u5FD7\u65B0\u589E\u53EF\u6307\u5B9A\u6253\u5370\u4F7F\u7528\u7684\u65B9\u6CD5\u4E3A XposedBridge.log \u6216 Logd
  • \u8C03\u8BD5\u65E5\u5FD7\u4E2D\u9ED8\u8BA4\u52A0\u5165\u5F53\u524D\u5BBF\u4E3B\u7684\u5305\u540D\u4EE5\u53CA\u5F53\u524D\u7528\u6237 ID\uFF0C\u4EE5\u4F9B\u8C03\u8BD5\uFF0C\u4F60\u53EF\u4EE5\u5728 debugLog \u914D\u7F6E\u4E2D\u81EA\u884C\u66F4\u6539
  • \u65B0\u589E generic \u529F\u80FD\uFF0C\u53EF\u5BF9\u6CDB\u578B\u8FDB\u884C\u53CD\u5C04\u548C\u8C03\u7528\uFF0C\u4F60\u53EF\u4EE5\u5728 Class \u6216 CurrentClass \u4E2D\u4F7F\u7528\u5B83
  • \u4F5C\u5E9F buildOfAny \u65B9\u6CD5\uFF0C\u73B0\u5728\u8BF7\u76F4\u63A5\u4F7F\u7528 buildOf \u65B9\u6CD5 (\u4E0D\u5E26\u6CDB\u578B) \u6765\u4F7F\u7528\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5BF9\u8C61\u5E76\u5F97\u5230\u7ED3\u679C Any
  • \u4FEE\u590D hasExtends \u4F7F\u7528\u8FC7\u7A0B\u53D1\u751F\u7A7A\u6307\u9488\u5F02\u5E38\u7684\u95EE\u9898
  • CurrentClass \u65B0\u589E\u975E lambda \u65B9\u5F0F\u7684\u8C03\u7528\u65B9\u6CD5
  • CurrentClass \u65B0\u589E name \u4E0E simpleName \u529F\u80FD
  • \u5B8C\u5168\u91CD\u5199 ReflectionTool \u7684\u6838\u5FC3\u65B9\u6CD5\uFF0C\u5C06\u4E0D\u540C\u7684\u67E5\u627E\u6761\u4EF6\u8FDB\u884C\u4E86\u6574\u7406\u5206\u7C7B
  • \u4FEE\u590D ReflectionTool \u4E2D\u53EF\u80FD\u7684\u76F4\u63A5\u8C03\u7528 declared \u83B7\u53D6\u7684 Member \u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898
  • \u4FEE\u590D ReflectionTool \u4E2D UndefinedType \u672A\u5728 Method \u4E0E Constructor \u6761\u4EF6\u4E2D\u6B63\u786E\u5224\u65AD\u7684\u95EE\u9898
  • \u65B0\u589E\u53CD\u5C04\u67E5\u627E\u7ED3\u679C\u53D1\u751F\u5F02\u5E38\u65F6\u7684\u53CB\u597D\u63D0\u793A\u65B9\u5F0F\uFF0C\u53EF\u5177\u4F53\u5B9A\u4F4D\u5230\u6307\u5B9A\u6761\u4EF6\u627E\u4E0D\u5230 Member \u7684\u95EE\u9898
  • \u53CD\u5C04\u67E5\u627E Method\u3001Constructor \u4E2D\u65B0\u589E VagueType \u6761\u4EF6\uFF0C\u53EF\u4F7F\u7528\u5728 param \u6761\u4EF6\u4E2D\u7528\u4E8E\u5FFD\u7565\u4F60\u4E0D\u60F3\u586B\u5199\u7684\u53C2\u6570
  • \u53CD\u5C04\u67E5\u627E Method\u3001Constructor \u4E2D\u65B0\u589E paramCount { ... } \u6761\u4EF6\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u76F4\u63A5\u62FF\u5230\u5176\u4E2D\u7684 it \u6765\u81EA\u5B9A\u4E49\u4F60\u7684\u5224\u65AD\u6761\u4EF6
  • FieldFinder \u7ED3\u679C\u4E2D\u65B0\u589E current \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5\u5BF9\u7ED3\u679C\u5B9E\u4F8B\u521B\u5EFA\u8C03\u7528\u7A7A\u95F4
  • \u4FEE\u6539\u4E86\u53CD\u5C04\u67E5\u627E\u529F\u80FD\u4E2D\u7684 modifiers \u6761\u4EF6\u4EE5\u53CA name \u6761\u4EF6\uFF0C\u73B0\u5728\u4F60\u9700\u8981\u5BF9\u6B64\u65B9\u6CD5\u4F53\u7ED3\u5C3E\u8FD4\u56DE\u4E00\u4E2A Boolean \u4EE5\u4F7F\u6761\u4EF6\u6210\u7ACB
  • ",20),E=e("code",null,"ModifierRules",-1),j=o(" \u4E2D\u7684 "),z=e("code",null,"as*",-1),V=o(" \u529F\u80FD\u6539\u540D\u4E3A "),Z=e("code",null,"is*",-1),O=o("\uFF0C\u611F\u8C22 "),K={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},J=o("Kitsune"),q=o(" \u7684\u5EFA\u8BAE"),Q=c("
  • FieldFinder \u4E2D\u65B0\u589E RemedyPlan \u529F\u80FD
  • \u65B0\u589E Dex \u4E2D\u7684 Class \u6A21\u7CCA\u67E5\u627E\u529F\u80FD (Beta)\uFF0C\u4F60\u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 searchClass \u529F\u80FD\u6765\u4F7F\u7528\u6307\u5B9A\u6761\u4EF6\u6A21\u7CCA\u67E5\u627E Class
  • ",2),$=o("\u65B0\u589E\u53CD\u5C04\u67E5\u627E\u4E2D\u7684\u591A\u91CD\u67E5\u627E\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528\u76F8\u5BF9\u67E5\u627E\u6761\u4EF6\u540C\u65F6\u83B7\u53D6\u591A\u4E2A\u67E5\u627E\u7ED3\u679C\uFF0C\u611F\u8C22 "),ee=e("strong",null,"AA",-1),oe=o(" \u4EE5\u53CA "),de={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},ie=o("Kitsune"),ce=o(" \u7684\u5EFA\u8BAE"),te=o("\u4FEE\u590D "),le=e("code",null,"appClassLoader",-1),se=o(" \u83B7\u53D6\u5230\u7684\u5BF9\u8C61\u5728\u67D0\u4E9B\u7CFB\u7EDF\u4E2D\u7684\u7CFB\u7EDF\u5E94\u7528\u4E2D\u4E0D\u6B63\u786E\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),ne={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},ae=o("Luckyzyx"),re=o(" \u7684\u53CD\u9988"),_e=e("li",null,[o("\u4FEE\u6539\u4E86 "),e("code",null,"XposedBridge.invokeOriginalMethod"),o(" \u7684\u8C03\u7528\u65B9\u5F0F\u5E76\u5728 "),e("code",null,"MethodFinder.Result.Instance"),o(" \u4E2D\u589E\u52A0 "),e("code",null,"original"),o(" \u529F\u80FD")],-1),he=o("\u4FEE\u590D "),ue=e("code",null,"YukiHookModulePrefs",-1),ke=o(" \u4E2D "),pe=e("code",null,"getStringSet",-1),ge=o(" \u65B9\u6CD5\u53D6\u503C\u9519\u8BEF\u7684\u95EE\u9898\u5E76\u4F18\u5316\u4EE3\u7801\u98CE\u683C\uFF0C\u611F\u8C22 "),fe={href:"https://github.com/Teddy-Zhu",target:"_blank",rel:"noopener noreferrer"},me=o("Teddy_Zhu"),He=o(" \u7684 "),Pe={href:"https://github.com/fankes/YukiHookAPI/pull/19",target:"_blank",rel:"noopener noreferrer"},be=o("PR"),xe=e("li",null,[o("\u4FEE\u6539 "),e("code",null,"YukiHookModulePrefs"),o("\uFF0C\u62E6\u622A "),e("code",null,"XSharePreference"),o(" \u53EF\u80FD\u4E0D\u5B58\u5728\u7684\u5F02\u5E38")],-1),ye=e("li",null,[o("\u4FEE\u590D "),e("code",null,"YukiHookDataChannel"),o(" \u5728\u67D0\u4E9B\u7B2C\u4E09\u65B9 ROM \u7CFB\u7EDF\u6846\u67B6\u4E2D\u65E0\u6CD5\u6CE8\u518C\u6210\u529F\u7684\u95EE\u9898")],-1),Ce=e("li",null,[o("\u5B89\u5168\u5316 "),e("code",null,"YukiHookDataChannel"),o("\uFF0C\u73B0\u5728\u5B83\u53EA\u80FD\u5728\u6765\u81EA\u6307\u5B9A\u5305\u540D\u7684\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u901A\u4FE1")],-1),Ae=o("\u65B0\u589E\u81EA\u52A8 Hook "),ve=e("code",null,"SharedPreferences",-1),Me=o(" \u4EE5\u4FEE\u590D\u90E8\u5206\u7CFB\u7EDF\u4E2D\u6587\u4EF6\u6743\u9650\u4E0D\u662F "),Ye=e("code",null,"0664",-1),Ie=o(" \u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Re={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},Se=o("5ec1cff"),Le=o(" \u7684\u53CD\u9988\u53CA\u63D0\u4F9B\u7684\u5B9E\u73B0\u4EE3\u7801"),Xe=c("
  • \u65B0\u589E YukiHookAPI.Configs.isEnableHookSharedPreferences \u529F\u80FD\uFF0C\u9ED8\u8BA4\u5173\u95ED\uFF0C\u82E5 SharedPreferences \u7684\u6743\u9650\u9519\u8BEF\u53EF\u8FDB\u884C\u542F\u7528
  • \u4FEE\u590D\u67E5\u627E Constructor \u65F6\u65E0\u53C2\u6784\u9020\u65B9\u6CD5\u5728\u4E0D\u586B\u5199\u67E5\u627E\u6761\u4EF6\u65F6\u65E0\u6CD5\u627E\u5230\u7684 BUG\uFF0C\u611F\u8C22 B5 KAKA \u7684\u53CD\u9988
  • \u5206\u79BB\u4F4D\u4E8E injectMember \u4E2D method\u3001constructor \u7684 Result \u5B9E\u4F8B\u5230 Process
  • \u5728 Hook \u8FC7\u7A0B\u4E2D\u65B0\u589E useDangerousOperation \u65B9\u6CD5\uFF0C\u672A\u8FDB\u884C\u58F0\u660E\u65F6\u5728 Hook \u5371\u9669\u5217\u8868\u4E2D\u7684\u529F\u80FD\u540E\u4F1A\u81EA\u52A8\u505C\u6B62 Hook \u5E76\u6253\u5370\u9519\u8BEF
  • \u65B0\u589E\u6A21\u5757\u8D44\u6E90\u6CE8\u5165\u4E0E Activity \u4EE3\u7406\u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u8C03\u7528 injectModuleAppResources \u53CA registerModuleAppActivities \u6765\u4F7F\u7528
  • \u65B0\u589E ModuleContextThemeWrapper \u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u8C03\u7528 applyModuleTheme \u5728\u4EFB\u610F Activity \u4E2D\u521B\u5EFA\u6A21\u5757\u7684 Context
  • \u65B0\u589E ClassLoader.onLoadClass \u529F\u80FD\uFF0C\u53EF\u7528\u4E8E\u76D1\u542C ClassLoader \u7684 loadClass \u65B9\u6CD5\u88AB\u8C03\u7528\u7684\u4E8B\u4EF6
  • \u4F5C\u5E9F\u4E86 classOf \u4E0E clazz \u6269\u5C55\u65B9\u6CD5\uFF0C\u65B0\u589E toClass \u4EE5\u53CA toClassOrNull \u7528\u6CD5\uFF0C\u8BF7\u73B0\u5728\u8F6C\u79FB\u5230\u65B0\u7684\u65B9\u6CD5
  • VariousClass \u65B0\u589E getOrNull \u65B9\u6CD5\uFF0C\u53EF\u5728\u5339\u914D\u4E0D\u5230 Class \u7684\u65F6\u5019\u4E0D\u629B\u51FA\u5F02\u5E38\u800C\u662F\u8FD4\u56DE null
  • PackageParam.hook \u4E2D\u79FB\u9664\u4E86 isUseAppClassLoader \u53C2\u6570\uFF0C\u4FEE\u6539\u4E3A isForceUseAbsolute \u5E76\u81EA\u52A8\u5339\u914D\u76EE\u6807 Class
  • PackageParam \u65B0\u589E systemContext \u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u5728\u4EFB\u610F\u65F6\u95F4\u8C03\u7528\u6B64\u529F\u80FD\u83B7\u53D6\u4E00\u4E2A\u6301\u4E45\u5316\u7684 Context
  • \u4E0D\u518D\u5BF9\u5916\u5F00\u653E HookClass \u4E2D\u7684\u4EFB\u4F55\u65B9\u6CD5
  • HookParam \u4E2D\u65B0\u589E throwToApp \u529F\u80FD\uFF0C\u53EF\u5C06\u5F02\u5E38\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B
  • Hook \u56DE\u8C03\u4E2D\u65B0\u589E onFailureThrowToApp \u529F\u80FD\uFF0C\u53EF\u5728\u53D1\u751F\u5F02\u5E38\u65F6\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B
  • \u4FEE\u6539\u4E86\u8C03\u8BD5\u65E5\u5FD7\u7684\u6253\u5370\u903B\u8F91\uFF0C\u53CD\u5C04\u67E5\u627E\u529F\u80FD\u4E2D\u7684\u8017\u65F6\u8BB0\u5F55\u4EC5\u4F1A\u5728 Hook \u8FC7\u7A0B\u4E2D\u8FDB\u884C\u6253\u5370
  • Hook \u8FC7\u7A0B\u4E2D\u65B0\u589E\u89E3\u9664 Hook \u529F\u80FD\uFF0C\u53EF\u4F7F\u7528 remove \u53CA removeSelf \u65B9\u6CD5\u89E3\u9664 Hook
  • \u4FEE\u590D\u5728 ReplaceHook \u5931\u8D25\u7684\u65F6\u5019\u5BFC\u81F4\u5BBF\u4E3B\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u73B0\u4FEE\u6539\u4E3A\u8C03\u7528\u539F\u59CB\u65B9\u6CD5\u4FDD\u8BC1\u5BBF\u4E3B\u529F\u80FD\u6B63\u5E38\u8FD0\u884C
  • \u65B0\u589E Hook \u8FC7\u7A0B\u4E2D\u5BF9\u65B9\u6CD5\u8FD4\u56DE\u503C\u7684\u68C0\u67E5\u529F\u80FD\uFF0C\u5728\u8FD4\u56DE\u503C\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u4E0B\u4F1A\u6839\u636E\u60C5\u666F\u81EA\u52A8\u629B\u51FA\u5F02\u5E38\u6216\u6253\u5370\u9519\u8BEF
  • ",18),Fe=o("Resources Hook \u4E2D\u65B0\u589E "),De=e("code",null,"array",-1),Be=o(" \u7C7B\u578B\uFF0C\u611F\u8C22 "),Ue={href:"https://github.com/GSWXXN",target:"_blank",rel:"noopener noreferrer"},We=o("GSWXXN"),Ge=o(" \u7684 "),we={href:"https://github.com/fankes/YukiHookAPI/pull/12",target:"_blank",rel:"noopener noreferrer"},Te=o("PR"),Ne=e("li",null,[o("\u79FB\u52A8 "),e("code",null,"me.weishu.reflection"),o(" \u5230 "),e("code",null,"thirdparty"),o(" \u9632\u6B62\u540C\u65F6\u5F15\u5165\u7684\u540C\u540D\u4F9D\u8D56\u51B2\u7A81")],-1),Ee=e("li",null,"\u79FB\u9664 Hook \u65B9\u6CD5\u4F53\u4E3A\u7A7A\u65F6\u629B\u51FA\u7684\u5F02\u5E38\uFF0C\u4FEE\u6539\u4E3A\u6253\u5370\u8B66\u544A\u65E5\u5FD7",-1),je=e("li",null,[o("\u4FEE\u6539 "),e("code",null,"AppLifecycle"),o(" \u7684\u5F02\u5E38\u5904\u7406\u903B\u8F91\uFF0C\u5F53\u5176\u53D1\u751F\u5F02\u5E38\u65F6\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B")],-1),ze=e("li",null,"\u66F4\u65B0 Demo \u7684 API \u7248\u672C\u5230 33",-1),Ve={id:"_1-0-92-2022-05-31",tabindex:"-1"},Ze=e("a",{class:"header-anchor",href:"#_1-0-92-2022-05-31","aria-hidden":"true"},"#",-1),Oe=o(" 1.0.92 | 2022.05.31 \u2002"),Ke=c("
    • \u4FEE\u6B63\u4E86\u5927\u91CF\u65B9\u6CD5\u4E2D callback \u7684\u547D\u540D\u65B9\u6CD5
    • \u66F4\u6362\u65B9\u6848\u518D\u6B21\u4FEE\u590D YukiHookDataChannel \u5728\u4F4E\u4E8E Android 12 \u7684\u8BBE\u5907\u4E0A\u4E0D\u80FD\u56DE\u8C03\u5F53\u524D Activity \u5E7F\u64AD\u7684\u95EE\u9898
    • InjectYukiHookWithXposed \u6CE8\u89E3\u65B0\u589E isUsingResourcesHook \u529F\u80FD\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u9009\u62E9\u6027\u5173\u95ED\u81EA\u52A8\u751F\u6210 IXposedHookInitPackageResources \u7684\u4F9D\u8D56\u63A5\u53E3\u4E86
    ",1),Je={id:"_1-0-91-2022-05-29",tabindex:"-1"},qe=e("a",{class:"header-anchor",href:"#_1-0-91-2022-05-29","aria-hidden":"true"},"#",-1),Qe=o(" 1.0.91 | 2022.05.29 \u2002"),$e=o("\u4FEE\u590D\u90E8\u5206\u8BBE\u5907\u7684\u5B9A\u5236\u7CFB\u7EDF\u5728 LSPosed \u73AF\u5883\u4E0B\u5F00\u673A\u542F\u52A8\u83B7\u53D6\u7684 "),eo=e("code",null,"ClassLoader",-1),oo=o(" \u9519\u8BEF\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),io={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},co=o("Luckyzyx"),to=o(" \u7684\u53CD\u9988"),lo=c("
  • \u4FEE\u590D YukiHookDataChannel \u5728 ZUI \u4EE5\u53CA\u4F4E\u4E8E Android 12 \u7684\u7CFB\u7EDF\u4E0A\u4E0D\u80FD\u56DE\u8C03\u5F53\u524D Activity \u5E7F\u64AD\u7684\u95EE\u9898
  • \u6574\u5408 YukiHookModuleStatus \u529F\u80FD\u5230 YukiHookAPI.Status\uFF0C\u91CD\u5199\u4E86\u5927\u91CF\u65B9\u6CD5\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u53CC\u5411\u5224\u65AD\u6A21\u5757\u6FC0\u6D3B\u7B49\u72B6\u6001\u4FE1\u606F
  • ",2),so={id:"_1-0-90-2022-05-27",tabindex:"-1"},no=e("a",{class:"header-anchor",href:"#_1-0-90-2022-05-27","aria-hidden":"true"},"#",-1),ao=o(" 1.0.90 | 2022.05.27 \u2002"),ro=c("
    • \u4FEE\u590D YukiHookDataChannel \u5728\u6A21\u5757\u8BBE\u7F6E\u76D1\u542C\u56DE\u8C03\u65F6\u95EA\u9000\u7684\u95EE\u9898
    • \u4FEE\u590D YukiHookDataChannel \u5728\u975E\u5F53\u524D Activity \u60C5\u51B5\u4E0B\u4F9D\u7136\u4F1A\u56DE\u8C03\u7684\u95EE\u9898
    • \u79FB\u9664 YukiHookDataChannel \u56DE\u8C03\u4E8B\u4EF6\u7684\u9ED8\u8BA4\u503C\uFF0C\u6CA1\u6709\u5373\u4E0D\u56DE\u8C03
    • \u79FB\u9664 YukiHookModulePrefs \u5728 XShare \u4E0D\u53EF\u8BFB\u7684\u60C5\u51B5\u4E0B\u6253\u5370\u7684\u8B66\u544A
    • \u65B0\u589E YukiHookModulePrefs \u4E2D\u7684 isXSharePrefsReadable \u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D\u7684 XShare \u662F\u5426\u53EF\u7528
    ",1),_o={id:"_1-0-89-2022-05-26",tabindex:"-1"},ho=e("a",{class:"header-anchor",href:"#_1-0-89-2022-05-26","aria-hidden":"true"},"#",-1),uo=o(" 1.0.89 | 2022.05.26 \u2002"),ko=c("
    • \u4FEE\u590D YukiHookDataChannel \u4E0D\u80FD\u91CD\u590D\u8BBE\u7F6E\u76D1\u542C\u7684\u95EE\u9898\uFF0C\u5E76\u52A0\u5165\u5728\u6A21\u5757\u4E0D\u540C Activity \u4E2D\u91CD\u590D\u54CD\u5E94\u548C\u81EA\u52A8\u8DDF\u968F Activity \u9500\u6BC1\u76D1\u542C\u529F\u80FD
    • \u65B0\u589E YukiHookDataChannel \u91CD\u590D\u76D1\u542C\u7528\u4F8B\u8BF4\u660E\u6587\u6863
    • \u52A0\u5165 onAlreadyHooked \u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D\u65B9\u6CD5\u662F\u5426\u88AB\u91CD\u590D Hook
    • \u4FEE\u6539\u90E8\u5206\u91CD\u590D\u6DFB\u52A0 HashMap \u7684\u903B\u8F91\uFF0C\u79FB\u9664 putIfAbsent \u65B9\u6CD5\uFF0C\u5141\u8BB8\u8986\u76D6\u6DFB\u52A0
    • \u4FEE\u590D\u4E86\u51E0\u5904\u53EF\u80FD\u7684 BUG
    ",1),po={id:"_1-0-88-2022-05-25",tabindex:"-1"},go=e("a",{class:"header-anchor",href:"#_1-0-88-2022-05-25","aria-hidden":"true"},"#",-1),fo=o(" 1.0.88 | 2022.05.25 \u2002"),mo=c("
    • \u5BF9 Xposed API \u5B8C\u5168\u89E3\u8026\u5408
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
    • \u5C06 YukiHookModuleStatus \u4ECE\u81EA\u52A8\u751F\u6210\u4EE3\u7801\u4E2D\u5206\u79BB\uFF0C\u5E76\u52A0\u5165 isEnableHookModuleStatus \u7684\u5F00\u5173\uFF0C\u7531\u4F60\u51B3\u5B9A\u662F\u5426\u542F\u7528
    • \u5BF9 API \u5927\u91CF\u7C7B\u7684\u6784\u9020\u65B9\u6CD5\u8FDB\u884C\u4E86 internal \u95ED\u5305\u5904\u7406
    • \u5C06 YukiHookModulePrefs \u8BBE\u7F6E\u4E3A\u5355\u4F8B\u8FD0\u884C\uFF0C\u9632\u6B62\u91CD\u590D\u521B\u5EFA\u6D6A\u8D39\u7CFB\u7EDF\u8D44\u6E90
    • \u4FEE\u590D\u81EA 1.0.80 \u7248\u672C\u540E\u65E0\u6CD5\u5D4C\u5957 Hook \u7684 BUG\uFF0C\u5E76\u4F18\u5316\u5D4C\u5957 Hook \u76F8\u5173\u529F\u80FD
    • \u4FEE\u6539 Hooker \u5B58\u50A8\u65B9\u6848\u7531 HashSet \u5230 HashMap\uFF0C\u9632\u6B62\u91CD\u590D\u6DFB\u52A0 Hooker \u7684\u95EE\u9898
    • \u4FEE\u6539 Hook \u6838\u5FC3\u5B9E\u73B0\u65B9\u6CD5\uFF0C\u52A0\u5165\u67E5\u91CD\uFF0C\u907F\u514D\u91CD\u590D Hook \u591A\u6B21\u56DE\u8C03 HookParam \u65B9\u6CD5
    • MethodFinder \u4E0E FieldFinder \u52A0\u5165\u67E5\u627E\u6A21\u7CCA\u65B9\u6CD5\u3001\u53D8\u91CF\u540D\u79F0\u529F\u80FD\uFF0C\u53EF\u8C03\u7528 name { ... } \u6765\u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\uFF0C\u652F\u6301\u6B63\u5219
    • \u4F18\u5316\u5E76\u4FEE\u6539 appContext \u7684\u83B7\u53D6\u65B9\u5F0F\uFF0C\u964D\u4F4E\u4F1A\u53D6\u5230\u7A7A\u7684\u95EE\u9898\u7684\u53EF\u80FD\u6027
    • \u4FEE\u6539\u81EA\u52A8\u751F\u6210\u7684\u4EE3\u7801\u4E2D logger \u7684\u6253\u5370 TAG \u9ED8\u8BA4\u4E3A\u4F60\u81EA\u5B9A\u4E49\u7684\u540D\u79F0\uFF0C\u65B9\u4FBF\u8FDB\u884C\u8C03\u8BD5
    • \u4F18\u5316 YukiHookBridge \u7684 Hooker \u5B9E\u73B0\u65B9\u5F0F\uFF0C\u63D0\u5347 Hook \u6027\u80FD
    • PackageParam \u589E\u52A0 onAppLifecycle \u65B9\u6CD5\uFF0C\u53EF\u539F\u751F\u76D1\u542C\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\u4EE5\u53CA\u5B9E\u73B0\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u529F\u80FD
    • \u65B0\u589E YukiHookDataChannel \u529F\u80FD\uFF0C\u53EF\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4FDD\u6301\u5B58\u6D3B\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u8FDB\u884C\u901A\u8BAF
    • YukiHookDataChannel \u589E\u52A0 checkingVersionEquals \u65B9\u6CD5\uFF0C\u53EF\u901A\u8FC7\u76D1\u542C\u6765\u9A8C\u8BC1\u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u66F4\u65B0\u7248\u672C\u4E0D\u5339\u914D\u95EE\u9898
    • demo-module \u7684\u793A\u4F8B\u4EE3\u7801\u4E2D\u65B0\u589E Java \u7248\u672C\u7684\u793A\u4F8B\uFF0C\u4EC5\u4F9B\u53C2\u8003
    ",1),Ho={id:"_1-0-87-2022-05-10",tabindex:"-1"},Po=e("a",{class:"header-anchor",href:"#_1-0-87-2022-05-10","aria-hidden":"true"},"#",-1),bo=o(" 1.0.87 | 2022.05.10 \u2002"),xo=e("ul",null,[e("li",null,[o("\u65B0\u589E "),e("code",null,"refreshModuleAppResources"),o(" \u529F\u80FD\uFF0C\u4EE5\u9002\u914D\u8BED\u8A00\u533A\u57DF\u3001\u5B57\u4F53\u5927\u5C0F\u3001\u5206\u8FA8\u7387\u6539\u53D8\u7B49\u60C5\u51B5\u4E0B\u7684 Resources \u5237\u65B0")]),e("li",null,[o("\u65B0\u589E "),e("code",null,"isEnableModuleAppResourcesCache"),o(" \u529F\u80FD\uFF0C\u53EF\u81EA\u884C\u8BBE\u7F6E\u662F\u5426\u81EA\u52A8\u7F13\u5B58\u5F53\u524D\u6A21\u5757\u7684 Resources")])],-1),yo={id:"_1-0-86-2022-05-06",tabindex:"-1"},Co=e("a",{class:"header-anchor",href:"#_1-0-86-2022-05-06","aria-hidden":"true"},"#",-1),Ao=o(" 1.0.86 | 2022.05.06 \u2002"),vo=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E0D\u652F\u6301 Resources Hook(\u8D44\u6E90\u94A9\u5B50) \u7684\u60C5\u51B5\u4E0B\u5728 "),e("code",null,"initZygote"),o(" \u65F6\u6301\u7EED\u62A5\u9519\u7684\u95EE\u9898\uFF0C\u590D\u73B0\u5728 "),e("strong",null,"ZUI"),o("/"),e("strong",null,"LSPosed CI(1.8.3-6550)")]),e("li",null,"\u4F18\u5316\u5E76\u5BF9 Resources Hook \u8FDB\u884C\u5F02\u5E38\u5904\u7406\uFF0C\u53EA\u6709\u88AB\u4F7F\u7528\u540E\u4E0D\u652F\u6301\u624D\u4F1A\u6253\u5370\u9519\u8BEF\u548C\u8B66\u544A")],-1),Mo={id:"_1-0-85-2022-05-04",tabindex:"-1"},Yo=e("a",{class:"header-anchor",href:"#_1-0-85-2022-05-04","aria-hidden":"true"},"#",-1),Io=o(" 1.0.85 | 2022.05.04 \u2002"),Ro=c("
    • \u4FEE\u590D\u65E0\u6CD5 Hook \u7CFB\u7EDF\u6846\u67B6\u7684\u4E25\u91CD\u95EE\u9898\uFF0C\u4ECE 1.0.80 \u5F00\u59CB\u51FA\u73B0
    • \u8C03\u8BD5\u65E5\u5FD7\u4E2D\u65B0\u589E\u533A\u5206 initZygote \u88C5\u8F7D\u7684\u5305\u540D\u4E3A android-zygote\uFF0CpackageName \u4FDD\u6301 android \u4E0D\u53D8
    ",1),So={id:"_1-0-83-2022-05-04",tabindex:"-1"},Lo=e("a",{class:"header-anchor",href:"#_1-0-83-2022-05-04","aria-hidden":"true"},"#",-1),Xo=o(" 1.0.83 | 2022.05.04 \u2002"),Fo=e("ul",null,[e("li",null,[o("\u4FEE\u590D "),e("code",null,"YukiHookModuleStatus"),o(" \u5728 "),e("code",null,"loadSystem"),o(" \u540E\u5927\u91CF\u62A5\u9519\u7684\u95EE\u9898")]),e("li",null,[o("\u65B0\u589E "),e("code",null,"type"),o(" \u4E2D\u7684 "),e("code",null,"android"),o(" \u7C7B\u578B")]),e("li",null,"\u66F4\u65B0\u5E2E\u52A9\u6587\u6863\u7684\u793A\u4F8B\u8BF4\u660E")],-1),Do={id:"_1-0-82-2022-05-04",tabindex:"-1"},Bo=e("a",{class:"header-anchor",href:"#_1-0-82-2022-05-04","aria-hidden":"true"},"#",-1),Uo=o(" 1.0.82 | 2022.05.04 \u2002"),Wo=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E86\u4E00\u5904\u6982\u5FF5\u6DF7\u6DC6\u9519\u8BEF\uFF0C\u533A\u5206 "),e("code",null,"initZygote"),o(" \u4E0E\u7CFB\u7EDF\u6846\u67B6\u7684\u5173\u7CFB\uFF0C\u4E4B\u524D\u7684\u6CE8\u91CA\u548C\u6587\u6863\u6709\u95EE\u9898\uFF0C\u975E\u5E38\u62B1\u6B49")]),e("li",null,[e("code",null,"PackageParam"),o(" \u65B0\u589E "),e("code",null,"loadSystem"),o(" \u65B9\u6CD5\uFF0C\u4E0D\u9700\u8981\u518D\u5199 "),e("code",null,'loadApp(name = "android")'),o(" \u5373\u53EF Hook \u7CFB\u7EDF\u6846\u67B6")])],-1),Go={id:"_1-0-81-2022-05-04",tabindex:"-1"},wo=e("a",{class:"header-anchor",href:"#_1-0-81-2022-05-04","aria-hidden":"true"},"#",-1),To=o(" 1.0.81 | 2022.05.04 \u2002"),No=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4F7F\u7528 "),e("code",null,"by"),o(" \u65B9\u6CD5\u8BBE\u7F6E\u6761\u4EF6\u540E Hook \u65B9\u6CD5\u4F53\u5185\u67E5\u627E\u4E0D\u5230\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4F9D\u7136\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u7684\u95EE\u9898")]),e("li",null,"\u5728\u6267\u884C Hook \u8FC7\u7A0B\u4E2D\u52A0\u5165\u5168\u5C40\u65E5\u5FD7\u663E\u793A\u5F53\u524D Hook APP \u7684\u5305\u540D\uFF0C\u5E76\u4FEE\u590D\u4E00\u5904\u9519\u8BEF\u65E5\u5FD7\u6253\u5370\u6837\u5F0F\u7684\u95EE\u9898")],-1),Eo={id:"_1-0-80-2022-05-01",tabindex:"-1"},jo=e("a",{class:"header-anchor",href:"#_1-0-80-2022-05-01","aria-hidden":"true"},"#",-1),zo=o(" 1.0.80 | 2022.05.01 \u2002"),Vo=c("
  • InjectYukiHookWithXposed \u6CE8\u89E3\u65B0\u589E entryClassName \u529F\u80FD\uFF0C\u53EF\u81EA\u5B9A\u4E49\u751F\u6210\u7684 xposed_init \u5165\u53E3\u7C7B\u540D
  • YukiHookXposedInitProxy \u66F4\u540D\u4E3A IYukiHookXposedInit\uFF0C\u539F\u63A5\u53E3\u540D\u79F0\u5DF2\u4F5C\u5E9F\uFF0C\u5C06\u5728\u540E\u7EED\u7248\u672C\u4E2D\u76F4\u63A5\u88AB\u5220\u9664
  • \u65B0\u589E initZygote \u4E0E Resources Hook \u529F\u80FD\uFF0C\u652F\u6301 Hook Layout
  • \u65B0\u589E onXposedEvent \u65B9\u6CD5\uFF0C\u53EF\u76D1\u542C\u539F\u751F Xposed API \u7684\u5168\u90E8\u4E8B\u4EF6
  • \u5BF9 Hook \u529F\u80FD\u7684 lambda \u8FDB\u884C inline \u5904\u7406\uFF0C\u907F\u514D\u751F\u6210\u8FC7\u788E\u7684\u533F\u540D\u7C7B\uFF0C\u63D0\u5347\u7F16\u8BD1\u540E\u7684\u8FD0\u884C\u6027\u80FD
  • \u4FEE\u590D PrefsData \u7F16\u8BD1\u540E\u7684\u65B9\u6CD5\u4F53\u590D\u5236\u8FC7\u5927\u7684\u95EE\u9898
  • \u589E\u52A0 XSharePreference \u53EF\u8BFB\u6027\u6D4B\u8BD5\uFF0C\u5931\u8D25\u540E\u4F1A\u81EA\u52A8\u6253\u5370\u8B66\u544A\u65E5\u5FD7
  • PackageParam \u65B0\u589E appResources\u3001moduleAppResources\u3001moduleAppFilePath \u529F\u80FD
  • PackageParam \u7684 loadApp \u65B0\u589E\u4E0D\u5199 name \u529F\u80FD\uFF0C\u9ED8\u8BA4\u7B5B\u9009\u5168\u90E8 APP
  • PackageParam \u65B0\u589E loadZygote \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5 Hook \u7CFB\u7EDF\u6846\u67B6
  • PackageParam \u65B0\u589E resources().hook \u529F\u80FD
  • \u4F18\u5316\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u67E5\u627E\u529F\u80FD\uFF0C\u627E\u4E0D\u5230\u7684\u9519\u8BEF\u65E5\u5FD7\u5C06\u4F18\u5148\u663E\u793A\u5DF2\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6
  • \u589E\u52A0 hasExtends \u6269\u5C55\u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB
  • \u589E\u52A0 isSupportResourcesHook \u529F\u80FD\uFF0C\u5224\u65AD\u5F53\u524D\u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)
  • current \u529F\u80FD\u65B0\u589E superClass \u65B9\u6CD5\u8C03\u7528\u7236\u7C7B
  • \u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u65B0\u589E superClass \u67E5\u627E\u6761\u4EF6\uFF0C\u53EF\u7EE7\u7EED\u5728\u7236\u7C7B\u4E2D\u67E5\u627E
  • YukiHookAPI \u5927\u91CF\u65B9\u6CD5\u4E0E Xposed API \u89E3\u8026\u5408
  • \u65B0\u589E Xposed API \u7684\u539F\u751F Hook \u4F18\u5148\u7EA7\u529F\u80FD
  • \u4FEE\u590D isFirstApplication \u53EF\u80FD\u5224\u65AD\u4E0D\u51C6\u786E\u7684\u95EE\u9898
  • \u5C4F\u853D MIUI \u7CFB\u7EDF\u4E0A MiuiCatcherPatch \u91CD\u590D\u8C03\u7528 Hook \u5165\u53E3\u65B9\u6CD5\u7684\u95EE\u9898
  • \u4F18\u5316 Hook \u5165\u53E3\u8C03\u7528\u65B9\u6CD5\uFF0C\u907F\u514D\u56E0\u4E3A Hook Framework \u95EE\u9898\u5BFC\u81F4\u591A\u6B21\u8C03\u7528
  • ",21),Zo=o("\u4FEE\u590D Hook "),Oo=e("code",null,"ClassLoader",-1),Ko=o(" \u5BFC\u81F4 Hook \u5361\u6B7B\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Jo={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},qo=o("WankkoRee"),Qo=o(" \u7684\u53CD\u9988"),$o=e("li",null,[o("\u63D0\u5347 "),e("code",null,"XC_Callback"),o(" \u63A5\u53E3\u5BF9\u63A5\u540E\u7684\u6027\u80FD")],-1),ed=e("li",null,[o("Java "),e("code",null,"type"),o(" \u65B0\u589E "),e("code",null,"ClassLoader"),o(" \u7C7B\u578B")],-1),od=e("li",null,"\u4F18\u5316 API \u5E2E\u52A9\u6587\u6863\uFF0C\u4FEE\u590D\u53EF\u80FD\u6301\u7EED\u7F13\u5B58\u9875\u9762\u7684\u95EE\u9898",-1),dd={id:"_1-0-78-2022-04-18",tabindex:"-1"},id=e("a",{class:"header-anchor",href:"#_1-0-78-2022-04-18","aria-hidden":"true"},"#",-1),cd=o(" 1.0.78 | 2022.04.18 \u2002"),td=c("
  • YukiHookModulePrefs \u65B0\u589E isRunInNewXShareMode \u65B9\u6CD5\uFF0C\u53EF\u7528\u4E8E\u5224\u65AD\u6A21\u5757\u5F53\u524D\u662F\u5426\u5904\u4E8E New XSharePreference \u6A21\u5F0F
  • \u4FEE\u590D YukiHookModulePrefs \u5728 New XSharePreference \u6A21\u5F0F\u4E0B\u5DE5\u4F5C\u7684\u90E8\u5206\u95EE\u9898
  • \u65B0\u589E ModulePreferenceFragment\uFF0C\u73B0\u5728\uFF0C\u4F60\u53EF\u4EE5\u5B8C\u5168\u66FF\u6362\u6389 PreferenceFragmentCompat \u5E76\u5F00\u59CB\u4F7F\u7528\u65B0\u7684\u529F\u80FD
  • ",3),ld=o("\u9002\u914D "),sd=e("code",null,"PreferenceFragmentCompat",-1),nd=o(" \u7684 Sp \u6570\u636E\u5B58\u50A8\u89E3\u51B3\u65B9\u6848\uFF0C\u611F\u8C22 "),ad={href:"https://github.com/mahoshojoHCG",target:"_blank",rel:"noopener noreferrer"},rd=o("mahoshojoHCG"),_d=o(" \u7684\u53CD\u9988"),hd=e("li",null,[o("\u66F4\u65B0\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u4EE5\u53CA "),e("code",null,"Kotlin"),o(" \u4F9D\u8D56\u5230\u6700\u65B0\u7248\u672C")],-1),ud=e("li",null,"\u4FEE\u6B63\u90E8\u5206\u6587\u6863\u548C\u4EE3\u7801\u6CE8\u91CA\u4E2D\u7684\u9519\u8BEF",-1),kd={id:"_1-0-77-2022-04-15",tabindex:"-1"},pd=e("a",{class:"header-anchor",href:"#_1-0-77-2022-04-15","aria-hidden":"true"},"#",-1),gd=o(" 1.0.77 | 2022.04.15 \u2002"),fd=e("code",null,"YukiHookModulePrefs",-1),md=o(" \u65B0\u589E "),Hd=e("code",null,"clear",-1),Pd=o(" \u65B9\u6CD5\uFF0C\u611F\u8C22 "),bd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},xd=o("WankkoRee"),yd=o(" \u7684\u5EFA\u8BAE"),Cd=c("
  • YukiHookModulePrefs \u65B0\u589E getStringSet\u3001putStringSet\u3001all \u65B9\u6CD5
  • HookParam \u7684 args \u589E\u52A0 any \u65B9\u6CD5
  • \u65B0\u589E ModuleApplication\uFF0C\u53EF\u5728\u6A21\u5757\u4E2D\u7EE7\u627F\u6B64\u7C7B\u5B9E\u73B0\u66F4\u591A\u529F\u80FD
  • \u5BF9\u63A5\u5168\u90E8\u7684 findClass \u529F\u80FD\u5230 Xposed API\uFF0C\u5728\u975E\u5BBF\u4E3B\u73AF\u5883\u7EE7\u7EED\u4F7F\u7528\u539F\u751F ClassLoader
  • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
  • ",5),Ad={id:"_1-0-75-2022-04-13",tabindex:"-1"},vd=e("a",{class:"header-anchor",href:"#_1-0-75-2022-04-13","aria-hidden":"true"},"#",-1),Md=o(" 1.0.75 | 2022.04.13 \u2002"),Yd=o("\u66F4\u6B63\u4E86\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7684\u903B\u8F91\u8BC6\u522B\u90E8\u5206\uFF0C\u611F\u8C22 "),Id={href:"https://github.com/ApeaSuperz",target:"_blank",rel:"noopener noreferrer"},Rd=o("ApeaSuperz"),Sd=o(" \u7684\u8D21\u732E"),Ld=c("
  • \u4FEE\u6B63\u4E00\u5904\u6587\u6863\u6CE8\u91CA\u7684\u5F15\u7528\u672A\u66F4\u6539\u7684\u95EE\u9898
  • HookParam \u4E2D\u5220\u9664\u4E86 firstArgs \u4E0E lastArgs \u65B9\u6CD5\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 args().first() \u4E0E args().last() \u6765\u53D6\u4EE3\u5B83
  • HookParam \u4E2D\u5220\u9664\u4E86 args() \u4E2D\u7684\u9ED8\u8BA4\u53C2\u6570 index = 0\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 args().first() \u6216 args(index = 0) \u6765\u53D6\u4EE3\u5B83
  • HookParam \u4E2D result \u529F\u80FD\u589E\u52A0\u4E86\u6CDB\u578B\u5339\u914D\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 result<T> \u6765\u5339\u914D\u4F60\u7684\u76EE\u6807\u65B9\u6CD5\u5DF2\u77E5\u8FD4\u56DE\u503C\u7C7B\u578B\u4E86
  • \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u67E5\u627E\u529F\u80FD\u65B0\u589E emptyParam \u6761\u4EF6\uFF0C\u5E76\u5B8C\u5584\u4E86\u6587\u6863\u76F8\u5173\u9700\u8981\u6CE8\u610F\u7684\u67E5\u627E\u6761\u4EF6\u8BEF\u533A
  • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
  • ",6),Xd=e("h3",{id:"_1-0-73-2022-04-10",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#_1-0-73-2022-04-10","aria-hidden":"true"},"#"),o(" 1.0.73 | 2022.04.10")],-1),Fd=o("\u4FEE\u6B63\u51E0\u5904\u6587\u6863\u7684\u4E2D\u6587\u7FFB\u8BD1\u9519\u8BEF\uFF0C\u611F\u8C22 "),Dd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Bd=o("WankkoRee"),Ud=o(" \u7684\u8D21\u732E"),Wd=o("\u4FEE\u590D\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B "),Gd=e("code",null,"XC_LoadPackage.LoadPackageParam",-1),wd=o(" \u5185\u5BB9\u4E3A\u7A7A\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Td={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},Nd=o("Luckyzyx"),Ed=o(" \u7684\u53CD\u9988"),jd=e("li",null,"\u4FEE\u590D\u4E00\u4E9B\u5DF2\u77E5\u7684 BUG\uFF0C\u63D0\u5347 Hook \u7A33\u5B9A\u6027",-1),zd={id:"_1-0-72-2022-04-09",tabindex:"-1"},Vd=e("a",{class:"header-anchor",href:"#_1-0-72-2022-04-09","aria-hidden":"true"},"#",-1),Zd=o(" 1.0.72 | 2022.04.09 \u2002"),Od=e("ul",null,[e("li",null,"\u66F4\u65B0 API \u6587\u6863\u5230\u65B0\u7684\u5730\u5740"),e("li",null,[e("code",null,"PackageParam"),o(" \u4E2D\u52A0\u5165 "),e("code",null,"appContext"),o(" \u529F\u80FD")]),e("li",null,"\u4FEE\u590D\u4E00\u4E9B\u5DF2\u77E5\u7684 BUG\uFF0C\u63D0\u5347 Hook \u7A33\u5B9A\u6027")],-1),Kd={id:"_1-0-71-2022-04-04",tabindex:"-1"},Jd=e("a",{class:"header-anchor",href:"#_1-0-71-2022-04-04","aria-hidden":"true"},"#",-1),qd=o(" 1.0.71 | 2022.04.04 \u2002"),Qd=e("ul",null,[e("li",null,"\u4FEE\u590D VariousClass \u65E0\u6CD5\u5339\u914D\u65F6\u4F1A\u505C\u6B62 Hook \u629B\u51FA\u5F02\u5E38\u7684\u4E25\u91CD\u95EE\u9898")],-1),$d={id:"_1-0-70-2022-04-04",tabindex:"-1"},ei=e("a",{class:"header-anchor",href:"#_1-0-70-2022-04-04","aria-hidden":"true"},"#",-1),oi=o(" 1.0.70 | 2022.04.04 \u2002"),di=e("li",null,[o("\u4FEE\u590D "),e("code",null,"instanceClass"),o(" \u5728\u9759\u6001\u5B9E\u4F8B\u4E2D\u8C03\u7528\u540E\u62A5\u9519\u95EE\u9898")],-1),ii=o("\u5728 Hook \u8FC7\u7A0B\u4E2D\u52A0\u5165 "),ci=e("code",null,"isUseAppClassLoader",-1),ti=o(" \u529F\u80FD\uFF0C\u611F\u8C22 "),li={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},si=o("WankkoRee"),ni=o(" \u7684\u53CD\u9988"),ai=e("li",null,[o("\u52A0\u5165 "),e("code",null,"withProcess"),o(" \u529F\u80FD\uFF0C\u53EF\u6839\u636E APP \u5F53\u524D\u6307\u5B9A\u8FDB\u7A0B\u8FDB\u884C Hook")],-1),ri=e("li",null,"\u4FEE\u590D\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u548C\u53D8\u91CF\u7684\u4E25\u91CD\u903B\u8F91\u9519\u8BEF\u95EE\u9898",-1),_i=e("li",null,"\u4FEE\u590D Hook \u76EE\u6807\u7C7B\u4E0D\u5B58\u5728\u7684\u65F6\u5019\u65E0\u6CD5\u5FFD\u7565\u5F02\u5E38\u8F93\u51FA\u7684\u95EE\u9898",-1),hi=e("li",null,"\u4FEE\u590D\u90E8\u5206\u60C5\u51B5\u4E0B APP \u542F\u52A8\u65B9\u6CD5\u88C5\u8F7D\u8FC7\u5FEB\u5BFC\u81F4 Hook \u4E0D\u80FD\u751F\u6548\u7684\u95EE\u9898",-1),ui=o("\u4FEE\u590D "),ki=e("code",null,"allMethods",-1),pi=o(" \u672A Hook \u5230\u65B9\u6CD5\u65F6\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),gi={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},fi=o("WankkoRee"),mi=o(" \u7684\u53CD\u9988"),Hi=o("\u52A0\u5165 Hook \u72B6\u6001\u76D1\u542C\u529F\u80FD\uFF0C\u611F\u8C22 "),Pi={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},bi=o("WankkoRee"),xi=o(" \u7684\u5EFA\u8BAE"),yi=e("li",null,"\u4FEE\u6539 Xposed \u5165\u53E3\u6CE8\u5165\u7C7B\u7684\u65B9\u5F0F\uFF0C\u91CD\u65B0\u58F0\u660E API \u7684\u5B9A\u4E49\u57DF",-1),Ci=o("\u52A0\u5165\u6DF7\u6DC6\u7684\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u7684\u67E5\u627E\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528\u4E0D\u540C\u7C7B\u578B\u7B5B\u9009 "),Ai=e("code",null,"index",-1),vi=o(" \u5B9A\u4F4D\u6307\u5B9A\u7684\u65B9\u6CD5\u548C\u53D8\u91CF\uFF0C\u611F\u8C22 "),Mi={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Yi=o("WankkoRee"),Ii=o(" \u63D0\u4F9B\u7684\u601D\u8DEF"),Ri=e("li",null,[o("\u67E5\u627E\u65B9\u6CD5\u3001\u53D8\u91CF\u65F6\u5141\u8BB8\u4F20\u5165\u591A\u79CD\u7C7B\u578B\uFF0C\u4F8B\u5982 "),e("code",null,"String"),o(" \u58F0\u660E\u7684\u7C7B\u540D\u548C "),e("code",null,"VariousClass")],-1),Si=e("li",null,[o("\u52A0\u5165\u5168\u65B0\u7684 "),e("code",null,"current"),o(" \u529F\u80FD\uFF0C\u53EF\u5BF9\u4EFB\u610F\u7684\u7C7B\u6784\u5EFA\u4E00\u4E2A\u53CD\u5C04\u65B9\u6CD5\u64CD\u4F5C\u7A7A\u95F4\uFF0C\u65B9\u4FBF\u5730\u8C03\u7528\u548C\u4FEE\u6539\u5176\u4E2D\u7684\u65B9\u6CD5\u548C\u53D8\u91CF")],-1),Li=o("\u4FEE\u590D\u4E86 Hook \u8FC7\u7A0B\u4E2D\u7684\u5927\u91CF BUG\uFF0C\u611F\u8C22 "),Xi={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Fi=o("WankkoRee"),Di=o(" \u5BF9\u6B64\u9879\u76EE\u6240\u505A\u51FA\u7684\u8D21\u732E"),Bi={id:"_1-0-69-2022-03-30",tabindex:"-1"},Ui=e("a",{class:"header-anchor",href:"#_1-0-69-2022-03-30","aria-hidden":"true"},"#",-1),Wi=o(" 1.0.69 | 2022.03.30 \u2002"),Gi=e("li",null,"\u6DFB\u52A0\u5E76\u6539\u8FDB\u4E00\u4E9B\u65B9\u6CD5\u529F\u80FD\u7684\u6CE8\u91CA",-1),wi=e("li",null,"\u589E\u52A0 Demo \u4E2D\u7684\u66F4\u591A\u793A\u4F8B Hook \u5185\u5BB9",-1),Ti=o("\u4FEE\u590D\u5728\u4E00\u4E2A Hook \u5B9E\u4F8B\u4E2D\uFF0C"),Ni=e("code",null,"allMethods",-1),Ei=o(" \u591A\u6B21\u4F7F\u7528\u65F6\u53EA\u6709\u6700\u540E\u4E00\u4E2A\u751F\u6548\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),ji={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},zi=o("WankkoRee"),Vi=o(" \u7684\u53CD\u9988"),Zi={id:"_1-0-68-2022-03-29",tabindex:"-1"},Oi=e("a",{class:"header-anchor",href:"#_1-0-68-2022-03-29","aria-hidden":"true"},"#",-1),Ki=o(" 1.0.68 | 2022.03.29 \u2002"),Ji=c("
    • \u589E\u52A0 Demo \u4E2D\u7684\u65B0\u7528\u4F8B\u548C LSPosed \u4F5C\u7528\u57DF
    • \u589E\u52A0 Member \u67E5\u627E\u7F13\u5B58\u548C\u67E5\u627E\u7F13\u5B58\u914D\u7F6E\u5F00\u5173
    • \u79FB\u9664\u548C\u4FEE\u6539 MethodFinder\u3001FieldFinder \u4EE5\u53CA HookParam \u76F8\u5173\u65B9\u6CD5\u7684\u8C03\u7528
    • \u589E\u52A0\u66F4\u591A Finder \u4E2D\u7684 cast \u7C7B\u578B\u5E76\u652F\u6301 cast \u4E3A\u6570\u7EC4
    • \u6574\u4F53\u7684\u6027\u80FD\u548C\u7A33\u5B9A\u6027\u63D0\u5347
    • \u4FEE\u590D\u4E0A\u4E00\u4E2A\u7248\u672C\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),qi={id:"_1-0-67-2022-03-27",tabindex:"-1"},Qi=e("a",{class:"header-anchor",href:"#_1-0-67-2022-03-27","aria-hidden":"true"},"#",-1),$i=o(" 1.0.67 | 2022.03.27 \u2002"),ec=c("
    • \u589E\u52A0\u4E09\u4E2A Finder \u4E2D\u7684 modifiers \u529F\u80FD\uFF0C\u53EF\u7B5B\u9009 static\u3001native\u3001public\u3001abstract \u7B49\u8BF8\u591A\u63CF\u8FF0\u7C7B\u578B
    • \u589E\u52A0\u65B9\u6CD5\u548C\u6784\u9020\u65B9\u6CD5\u67E5\u627E\u65F6\u53EF\u6A21\u7CCA\u65B9\u6CD5\u53C2\u6570\u7C7B\u578B\u4E3A\u6307\u5B9A\u4E2A\u6570\u8FDB\u884C\u67E5\u627E
    • \u589E\u52A0 Member \u7684 hasModifiers \u6269\u5C55\u529F\u80FD
    • \u589E\u52A0 MethodFinder \u548C ConstructorFinder \u4E2D\u7684 give \u65B9\u6CD5\uFF0C\u53EF\u83B7\u5F97\u539F\u59CB\u7C7B\u578B
    • \u589E\u52A0 YukiHookModulePrefs \u4E2D\u7684 PrefsData \u6A21\u677F\u529F\u80FD
    • \u5F7B\u5E95\u5BF9\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u53CA\u53D8\u91CF\u7684\u67E5\u627E\u65B9\u6848\u8FDB\u884C\u91CD\u6784
    • \u4F18\u5316\u4EE3\u7801\u6CE8\u91CA\uFF0C\u4FEE\u590D\u4E86\u53EF\u80FD\u4EA7\u751F\u7684 BUG
    ",1),oc={id:"_1-0-66-2022-03-25",tabindex:"-1"},dc=e("a",{class:"header-anchor",href:"#_1-0-66-2022-03-25","aria-hidden":"true"},"#",-1),ic=o(" 1.0.66 | 2022.03.25 \u2002"),cc=e("ul",null,[e("li",null,[o("\u4FEE\u590D "),e("code",null,"MethodFinder"),o(" \u4E2D\u7684\u4E00\u4E2A\u4E25\u91CD\u95EE\u9898")]),e("li",null,[o("\u589E\u52A0 "),e("code",null,"hookParam"),o(" \u4E2D\u7684 "),e("code",null,"args"),o(" \u8C03\u7528\u65B9\u6CD5")]),e("li",null,"\u4FEE\u590D\u5176\u5B83\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898\u4EE5\u53CA\u4FEE\u590D\u90E8\u5206\u7C7B\u7684\u6CE8\u91CA\u95EE\u9898")],-1),tc={id:"_1-0-65-2022-03-25",tabindex:"-1"},lc=e("a",{class:"header-anchor",href:"#_1-0-65-2022-03-25","aria-hidden":"true"},"#",-1),sc=o(" 1.0.65 | 2022.03.25 \u2002"),nc=c("
    • \u91CD\u65B0\u53D1\u5E03\u7248\u672C\u4FEE\u590D Maven \u4ED3\u5E93\u56E0\u4E3A\u7F13\u5B58\u95EE\u9898\u65B0\u7248\u672C\u4E0D\u6B63\u786E\u7684\u60C5\u51B5
    • \u589E\u52A0 MethodFinder \u4E0E FieldFinder \u65B0\u7684\u8FD4\u56DE\u503C\u8C03\u7528\u65B9\u6CD5
    • \u4FEE\u590D\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898\uFF0C\u5E76\u4FEE\u590D\u592A\u6781\u4F7F\u7528\u8FC7\u7A0B\u4E2D\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898
    • \u4FEE\u590D\u81EA\u52A8\u751F\u6210 Xposed \u5165\u53E3\u7C7B\u53EF\u80FD\u53D1\u751F\u7684\u95EE\u9898
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B\u4EE5\u53CA java \u7C7B\u578B
    ",1),ac={id:"_1-0-6-2022-03-20",tabindex:"-1"},rc=e("a",{class:"header-anchor",href:"#_1-0-6-2022-03-20","aria-hidden":"true"},"#",-1),_c=o(" 1.0.6 | 2022.03.20 \u2002"),hc=c("
    • \u4FEE\u590D YukiHookModulePrefs \u5728\u4F7F\u7528\u4E00\u6B21 direct \u5FFD\u7565\u7F13\u5B58\u540E\u6BCF\u6B21\u90FD\u5FFD\u7565\u7684 BUG
    • \u589E\u52A0\u65B0\u7684 API\uFF0C\u4F5C\u5E9F\u4E86 isActive \u5224\u65AD\u6A21\u5757\u6FC0\u6D3B\u7684\u4F20\u7EDF\u7528\u6CD5
    • \u4FEE\u590D\u975E Xposed \u73AF\u5883\u4F7F\u7528 API \u65F6\u6253\u5370\u8C03\u8BD5\u65E5\u5FD7\u7684\u95EE\u9898
    • \u4FEE\u590D\u67E5\u627E Field \u65F6\u7684\u65E5\u5FD7\u8F93\u51FA\u95EE\u9898\u548C\u672A\u62E6\u622A\u7684\u5F02\u5E38\u95EE\u9898
    • \u89E3\u8026\u5408 ReflectionUtils \u4E2D\u7684 Xposed API
    • \u589E\u52A0 YukiHookModuleStatus \u65B9\u6CD5\u540D\u79F0\u7684\u6DF7\u6DC6\uFF0C\u4EE5\u7CBE\u7B80\u6A21\u5757\u751F\u6210\u7684\u4F53\u79EF
    • \u88C5\u8F7D\u6A21\u5757\u81EA\u8EAB Hook \u65F6\u5C06\u4E0D\u518D\u6253\u5370\u6B22\u8FCE\u4FE1\u606F
    • \u4FEE\u590D\u4E0A\u4E00\u4E2A\u7248\u672C\u4ECD\u7136\u5B58\u5728\u7684\u67D0\u4E9B BUG
    ",1),uc={id:"_1-0-55-2022-03-18",tabindex:"-1"},kc=e("a",{class:"header-anchor",href:"#_1-0-55-2022-03-18","aria-hidden":"true"},"#",-1),pc=o(" 1.0.55 | 2022.03.18 \u2002"),gc=e("ul",null,[e("li",null,"\u4FEE\u6B63\u4E00\u5904\u6CE8\u91CA\u9519\u8BEF"),e("li",null,"\u4E34\u65F6\u4FEE\u590D\u4E00\u4E2A BUG"),e("li",null,[o("\u589E\u52A0\u4E86 "),e("code",null,"type"),o(" \u4E2D\u7684\u5927\u91CF "),e("code",null,"android"),o(" \u7C7B\u578B\u4EE5\u53CA\u5C11\u91CF "),e("code",null,"java"),o(" \u7C7B\u578B")]),e("li",null,"\u4FEE\u590D\u65B0\u7248\u4E0E\u65E7\u7248 Kotlin APIs \u7684\u517C\u5BB9\u6027\u95EE\u9898")],-1),fc={id:"_1-0-5-2022-03-18",tabindex:"-1"},mc=e("a",{class:"header-anchor",href:"#_1-0-5-2022-03-18","aria-hidden":"true"},"#",-1),Hc=o(" 1.0.5 | 2022.03.18 \u2002"),Pc=c("
    • \u4FEE\u590D\u65E7\u7248\u672C LSPosed \u6846\u67B6\u60C5\u51B5\u4E0B\u6B22\u8FCE\u4FE1\u606F\u591A\u6B21\u6253\u5370\u7684\u95EE\u9898
    • \u6DFB\u52A0 onInit \u65B9\u6CD5\u6765\u914D\u7F6E YukiHookAPI
    • \u65B0\u589E executorName \u548C executorVersion \u6765\u83B7\u53D6\u5F53\u524D Hook \u6846\u67B6\u7684\u540D\u79F0\u548C\u7248\u672C\u53F7
    • \u65B0\u589E by \u65B9\u6CD5\u6765\u8BBE\u7F6E Hook \u7684\u65F6\u673A\u548C\u6761\u4EF6
    • YukiHookModulePrefs \u65B0\u589E\u53EF\u63A7\u5236\u7684\u952E\u503C\u7F13\u5B58\uFF0C\u53EF\u5728\u5BBF\u4E3B\u8FD0\u884C\u65F6\u6A21\u5757\u52A8\u6001\u66F4\u65B0\u6570\u636E
    • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),bc={id:"_1-0-4-2022-03-06",tabindex:"-1"},xc=e("a",{class:"header-anchor",href:"#_1-0-4-2022-03-06","aria-hidden":"true"},"#",-1),yc=o(" 1.0.4 | 2022.03.06 \u2002"),Cc=c("
    • \u4FEE\u590D LSPosed \u5728\u6700\u65B0\u7248\u672C\u4E2D\u542F\u7528\u201C\u53EA\u6709\u6A21\u5757classloader\u53EF\u4EE5\u4F7F\u7528Xposed API\u201D\u9009\u9879\u540E\u627E\u4E0D\u5230 XposedBridge \u7684\u95EE\u9898
    • \u6DFB\u52A0 YukiHookAPI \u7684\u5E38\u91CF\u7248\u672C\u540D\u79F0\u548C\u7248\u672C\u53F7
    • \u65B0\u589E hasField \u65B9\u6CD5\u4EE5\u53CA isAllowPrintingLogs \u914D\u7F6E\u53C2\u6570
    • \u65B0\u589E isDebug \u5F00\u542F\u7684\u60C5\u51B5\u4E0B API \u5C06\u81EA\u52A8\u6253\u5370\u6B22\u8FCE\u4FE1\u606F\u6D4B\u8BD5\u6A21\u5757\u662F\u5426\u751F\u6548
    ",1),Ac={id:"_1-0-3-2022-03-02",tabindex:"-1"},vc=e("a",{class:"header-anchor",href:"#_1-0-3-2022-03-02","aria-hidden":"true"},"#",-1),Mc=o(" 1.0.3 | 2022.03.02 \u2002"),Yc=c("
    • \u4FEE\u590D\u4E00\u4E2A\u6F5C\u5728\u6027\u7684\u5F02\u5E38\u672A\u62E6\u622A BUG
    • \u589E\u52A0 ignoredError \u529F\u80FD
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
    • \u589E\u52A0\u76D1\u542C hook \u540E\u7684 ClassNotFound \u529F\u80FD
    ",1),Ic={id:"_1-0-2-2022-02-18",tabindex:"-1"},Rc=e("a",{class:"header-anchor",href:"#_1-0-2-2022-02-18","aria-hidden":"true"},"#",-1),Sc=o(" 1.0.2 | 2022.02.18 \u2002"),Lc=e("ul",null,[e("li",null,"\u4FEE\u590D Windows \u4E0B\u65E0\u6CD5\u627E\u5230\u9879\u76EE\u8DEF\u5F84\u7684\u95EE\u9898"),e("li",null,[o("\u79FB\u9664\u90E8\u5206\u53CD\u5C04 API\uFF0C\u5408\u5E76\u81F3 "),e("code",null,"BaseFinder"),o(" \u8FDB\u884C\u6574\u5408")]),e("li",null,"\u589E\u52A0\u76F4\u63A5\u4F7F\u7528\u5B57\u7B26\u4E32\u521B\u5EFA Hook \u7684\u65B9\u6CD5")],-1),Xc={id:"_1-0-1-2022-02-15",tabindex:"-1"},Fc=e("a",{class:"header-anchor",href:"#_1-0-1-2022-02-15","aria-hidden":"true"},"#",-1),Dc=o(" 1.0.1 | 2022.02.15 \u2002"),Bc=c("
    • RemedyPlan \u589E\u52A0 onFind \u529F\u80FD
    • \u6574\u5408\u5E76\u4FEE\u6539\u4E86\u90E8\u5206\u53CD\u5C04 API \u4EE3\u7801
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 java \u7C7B\u578B
    • \u4FEE\u590D\u5FFD\u7565\u9519\u8BEF\u5728\u63A7\u5236\u53F0\u4ECD\u7136\u8F93\u51FA\u7684\u95EE\u9898
    ",1),Uc={id:"_1-0-2022-02-14",tabindex:"-1"},Wc=e("a",{class:"header-anchor",href:"#_1-0-2022-02-14","aria-hidden":"true"},"#",-1),Gc=o(" 1.0 | 2022.02.14 \u2002"),wc=e("ul",null,[e("li",null,"\u9996\u4E2A\u7248\u672C\u63D0\u4EA4\u81F3 Maven")],-1);function Tc(Nc,Ec){const i=l("Badge"),t=l("ExternalLinkIcon");return n(),a("div",null,[_,h,u,e("h3",k,[p,g,d(i,{type:"tip",text:"\u6700\u65B0",vertical:"middle"})]),f,e("h3",m,[H,P,d(i,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),b,e("h3",x,[y,C,d(i,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),A,e("h3",v,[M,Y,d(i,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),I,e("h3",R,[S,L,d(i,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),e("ul",null,[X,e("li",null,[F,e("a",D,[B,d(t)])]),U,e("li",null,[W,e("a",G,[w,d(t)]),T]),N,e("li",null,[E,j,z,V,Z,O,e("a",K,[J,d(t)]),q]),Q,e("li",null,[$,ee,oe,e("a",de,[ie,d(t)]),ce]),e("li",null,[te,le,se,e("a",ne,[ae,d(t)]),re]),_e,e("li",null,[he,ue,ke,pe,ge,e("a",fe,[me,d(t)]),He,e("a",Pe,[be,d(t)])]),xe,ye,Ce,e("li",null,[Ae,ve,Me,Ye,Ie,e("a",Re,[Se,d(t)]),Le]),Xe,e("li",null,[Fe,De,Be,e("a",Ue,[We,d(t)]),Ge,e("a",we,[Te,d(t)])]),Ne,Ee,je,ze]),e("h3",Ve,[Ze,Oe,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Ke,e("h3",Je,[qe,Qe,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[$e,eo,oo,e("a",io,[co,d(t)]),to]),lo]),e("h3",so,[no,ao,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ro,e("h3",_o,[ho,uo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ko,e("h3",po,[go,fo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),mo,e("h3",Ho,[Po,bo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),xo,e("h3",yo,[Co,Ao,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),vo,e("h3",Mo,[Yo,Io,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Ro,e("h3",So,[Lo,Xo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Fo,e("h3",Do,[Bo,Uo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Wo,e("h3",Go,[wo,To,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),No,e("h3",Eo,[jo,zo,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[Vo,e("li",null,[Zo,Oo,Ko,e("a",Jo,[qo,d(t)]),Qo]),$o,ed,od]),e("h3",dd,[id,cd,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[td,e("li",null,[ld,sd,nd,e("a",ad,[rd,d(t)]),_d]),hd,ud]),e("h3",kd,[pd,gd,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[fd,md,Hd,Pd,e("a",bd,[xd,d(t)]),yd]),Cd]),e("h3",Ad,[vd,Md,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[Yd,e("a",Id,[Rd,d(t)]),Sd]),Ld]),Xd,e("ul",null,[e("li",null,[Fd,e("a",Dd,[Bd,d(t)]),Ud]),e("li",null,[Wd,Gd,wd,e("a",Td,[Nd,d(t)]),Ed]),jd]),e("h3",zd,[Vd,Zd,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Od,e("h3",Kd,[Jd,qd,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Qd,e("h3",$d,[ei,oi,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[di,e("li",null,[ii,ci,ti,e("a",li,[si,d(t)]),ni]),ai,ri,_i,hi,e("li",null,[ui,ki,pi,e("a",gi,[fi,d(t)]),mi]),e("li",null,[Hi,e("a",Pi,[bi,d(t)]),xi]),yi,e("li",null,[Ci,Ai,vi,e("a",Mi,[Yi,d(t)]),Ii]),Ri,Si,e("li",null,[Li,e("a",Xi,[Fi,d(t)]),Di])]),e("h3",Bi,[Ui,Wi,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[Gi,wi,e("li",null,[Ti,Ni,Ei,e("a",ji,[zi,d(t)]),Vi])]),e("h3",Zi,[Oi,Ki,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Ji,e("h3",qi,[Qi,$i,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ec,e("h3",oc,[dc,ic,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),cc,e("h3",tc,[lc,sc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),nc,e("h3",ac,[rc,_c,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),hc,e("h3",uc,[kc,pc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),gc,e("h3",fc,[mc,Hc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Pc,e("h3",bc,[xc,yc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Cc,e("h3",Ac,[vc,Mc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Yc,e("h3",Ic,[Rc,Sc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Lc,e("h3",Xc,[Fc,Dc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Bc,e("h3",Uc,[Wc,Gc,d(i,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),wc])}const zc=s(r,[["render",Tc],["__file","changelog.html.vue"]]);export{zc as default}; diff --git a/docs/assets/changelog.html.57e5111c.js b/docs/assets/changelog.html.57e5111c.js new file mode 100644 index 000000000..050d16d22 --- /dev/null +++ b/docs/assets/changelog.html.57e5111c.js @@ -0,0 +1 @@ +import{_ as a,r as c,o as s,c as l,b as e,d as t,a as i,e as o}from"./app.6074a838.js";const r={},h=i('

    Changelog

    The version update history of YukiHookAPI is recorded here.

    Pay Attention

    We will only maintain the latest API version, if you are using an outdate API version, you voluntarily renounce any possibility of maintenance.

    Notice

    To avoid translation time consumption, Changelog will use Google Translation from Chinese to English, please refer to the original text for actual reference.

    Time zone of version release date: UTC+8

    ',4),u={id:"_1-1-5-2023-01-13",tabindex:"-1"},m=e("a",{class:"header-anchor",href:"#_1-1-5-2023-01-13","aria-hidden":"true"},"#",-1),_=o(" 1.1.5 | 2023.01.13 \u2002"),p=i('
    • Standardize and optimize the overall code style
    • Privatized some APIs called internally
    • The underlying API interface is decoupled as a whole to prepare for compatibility with more Hook Frameworks
    • Move some of the functions integrated in the API to ksp-xposed dependencies (decoupling), and the separate introduction of api dependencies will no longer contain references to functions such as third-party libraries
    • Documentation Quick Start page added instructions on when YukiHookAPI.Configs.isDebug needs to be closed
    • Standardize Java Primitive Types in type definitions and sync update to docs
    • Java type adds NumberClass type
    • Improved (Xposed) Host environment recognition
    • Take over all exceptions after loading the Xposed Module, if an exception occurs, it will automatically intercept and print the error log
    • Modify the Class that does not exist in the lower Android system version (Android 5.0) in the type definition to be an empty safe type
    • Adapt and support native Xposed, the minimum recommended version is Android 7.0
    • Added support for Hook entry class declared as object type (singleton)
    • Fixed the problem that the system below Android 8 does not support the Executable type, causing the Hook to fail
    • Fixed the problem of reporting an error when using the Activity proxy function for systems below Android 9 and limit the minimum supported version of this function to Android 7.0
    • Added the prohibition of resource injection and Activity proxy function injection into the current module's own instance process to prevent problems
    • Fixed a serious error that the return value of a method in the Hook process is not consistent with the target's inherited class and interface.
    • Fixed the problem that the object is empty when calling HookParam.callOriginal and HookParam.invokeOriginal when the current Hook instance object is static
    • Optimize the function of judging the Tai Chi activation method and update the relevant instructions of the document synchronously
    • Obsolete YukiHookAPI.Status.executorName, YukiHookAPI.Status.executorVersion, please move to YukiHookAPI.Status.Executor
    • Adapted the YukiHookAPI.Status.Executor.name name display function of some third-party Hook Frameworks
    • Added Class.extends, Class.implements and other methods, which can more conveniently judge the inheritance and interface relationship of the current Class
    • Added generic methods of the same name as Class.toClass, Class.toClassOrNull and other related methods, you can use generics to constrain the instance object type of known Class
    • Modify the return value of the classOf<T> method to the generic type T to constrain the instance object type of the known Class
    • Added initialize parameter of Class related extension method, which can control whether to initialize its static method block at the same time when getting Class object
    • Added param { ... }, type { ... } and other usages in the variable, method, and construction method search functions, which can add more specific conditional judgments to the searched objects
    • The loadApp method of PackageParam adds the isExcludeSelf parameter, which can be used to exclude Hook-related functions from injecting into the module's own instance process
    • The onAppLifecycle method of PackageParam adds the isOnFailureThrowToApp parameter, which can directly throw the exception that occurs in the lifecycle method body to the host
    • Modify appClassLoader in PackageParam to be a modifiable variable, which can dynamically set the ClassLoader used by the host in the Hook process
    • Added dataExtra function in HookParam, which can be used to temporarily store the data in the Hook method body
    • Obsolete isRunInNewXShareMode, isXSharePrefsReadable in YukiHookModulePrefs, merged into isPreferencesAvailable
    • Class.allFields, Class.allMethods and other related methods add the isAccessible parameter, which can control when the member object can be set as an accessible type
    • Fixed the problem that only the last method body will be called back when receiving the same key-value data in an Activity when there are multiple hosts in YukiHookDataChannel
    • Added priority parameter in wait and other related methods of YukiHookDataChannel, you can pass in ChannelPriority to customize the conditions for callback data results
    • YukiHookDataChannel adds the function of automatically using ChannelDataWrapper type wrapper when sending data, which improves the user experience and enhances data protection
    • YukiHookDataChannel has added the function of limiting the maximum byte size of data sent at one time to prevent the app from crashing due to excessive data
    • YukiHookDataChannel has added the function of automatically segmenting when the sent data is too large, only supports List, Map, Set, String types
    • YukiHookLogger adds the contents method and the data parameter of saveToFile, which can be passed in custom debug log data for formatting or saving to a file
    • Fixed the problem that the debug log data package name processed by YukiHookLogger may be incorrect in the (Xposed) Host environment
    • Fixed the problem that the package name may be incorrect on some systems (in some system apps) when the Xposed Module loads the Resource Hook event
    ',1),f={id:"_1-1-4-2022-10-04",tabindex:"-1"},g=e("a",{class:"header-anchor",href:"#_1-1-4-2022-10-04","aria-hidden":"true"},"#",-1),k=o(" 1.1.4 | 2022.10.04 \u2002"),y=i("
    • Fixed the issue that YukiHookDataChannel may not respond to broadcast events in the system framework, reproduced in A13
    • Fixed the issue that YukiHookDataChannel could not communicate with Module App in Host App for multiple versions
    • Added obtainLoggerInMemoryData method in YukiHookDataChannel to share debug log data between module and host
    • Modify the type of YukiHookLogger.inMemoryData to ArrayList and change YukiLoggerData to data class
    • Fixed YukiLoggerData printing blank when the package name is empty in the module
    • Added loadApp, loadZygote, loadSystem, withProcess multi-parameter methods of the same name in PackageParam
    • Fixed some possible bugs
    ",1),b={id:"_1-1-3-2022-09-30",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#_1-1-3-2022-09-30","aria-hidden":"true"},"#",-1),v=o(" 1.1.3 | 2022.09.30 \u2002"),w=e("ul",null,[e("li",null,"Fixed a fatal bug where the Hook entry class name could not be customized"),e("li",null,[o("Added some code notes in "),e("code",null,"LoggerFactory"),o(" and updated special features documentation")])],-1),A={id:"_1-1-2-2022-09-30",tabindex:"-1"},H=e("a",{class:"header-anchor",href:"#_1-1-2-2022-09-30","aria-hidden":"true"},"#",-1),P=o(" 1.1.2 | 2022.09.30 \u2002"),C=i('
    • Documentation Basic Knowledge page add a friend link to the English version
    • Fixed YukiBaseHooker comments in English code note link errors
    • Fixed ClassCastException in ModuleClassLoader
    • Fixed and standardize some code notes
    • Added ModuleClassLoader exclusion list function, you can use excludeHostClasses and excludeModuleClasses methods to customize the exclusion list
    • Added YukiLoggerData real-time log data class, you can get the log array in real time through YukiHookLogger.inMemoryData
    • Added ClassLoader.listOfClasses method, which can directly get all Class in the current Dex
    ',1),F={id:"_1-1-1-2022-09-28",tabindex:"-1"},M=e("a",{class:"header-anchor",href:"#_1-1-1-2022-09-28","aria-hidden":"true"},"#",-1),I=o(" 1.1.1 | 2022.09.28 \u2002"),Y=e("ul",null,[e("li",null,[o("Fixed the problem of wrong document friend links in "),e("a",{href:"../guide/knowledge"},"Basic Knowledge"),o(" page")]),e("li",null,[o("Fixed document "),e("code",null,"favicon"),o(" not showing up")]),e("li",null,[o("Fixed bug in "),e("code",null,"DexClassFinder"),o(" search conditions")])],-1),R={id:"_1-1-0-2022-09-28",tabindex:"-1"},S=e("a",{class:"header-anchor",href:"#_1-1-0-2022-09-28","aria-hidden":"true"},"#",-1),z=o(" 1.1.0 | 2022.09.28 \u2002"),D=e("li",null,[o("This is a major version update, please refer to "),e("a",{href:"../api/home"},"API Document"),o(" and "),e("a",{href:"../api/special-features/reflection"},"Special Features"),o(" for the changes and usage mentioned in the changelog")],-1),L=o("Change the help documentation framework to "),T={href:"https://v2.vuepress.vuejs.org",target:"_blank",rel:"noopener noreferrer"},X=o("VuePress"),j=i('
  • Unify and standardize the terms and nouns in the document, for example, "query" is always changed to "find", XposedHelper is misspelled and changed to XposedHelpers
  • Documentation Basic Knowledge page to add friend links, Simplified Chinese only
  • Convert Class and Method of Hook App Demo to Java to provide better demo effect
  • Fixed code comment naming in Hook Module Demo
  • Refactored a lot of low-level Hook logic and the docking method of Xposed API
  • Removed HookParamWrapper, it now interfaces directly with YukiBridgeFactory
  • Moved methods in section YukiHookBridge to AppParasitics
  • Removed HookParam.args and the underlying direct connection method setArgs, directly get and set the object of the current array
  • Optimized automatic handler to merge referenced jar into stub project
  • ',9),W=o("Fixed the problem that the module package name cannot be correctly matched when multi-project packaging, and modify the module package name matching logic of the automatic handler, thanks to "),O={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},N=o("5ec1cff"),B=o(" for the feedback and solutions provided"),E=i("
  • Internal closure processing for the methods of API private tool classes to avoid polluting the top-level namespace
  • Fixed Creater naming to Creator for all reflection and Hook classes
  • Added YukiHookAPI.Status.compiledTimestamp function, which can get the compilation completion timestamp when used as an Xposed module
  • Added YukiHookAPI.Status.isXposedEnvironment function, which can determine whether the current (Xposed) host environment or module environment is
  • The debug logging function has been overhauled, and functions such as YukiHookAPI.Configs.debugTag have been merged into YukiHookLogger.Configs
  • The debug log can be added to specify the printing method as XposedBridge.log or Logd
  • The package name of the current host and the current user ID are added to the debug log by default for debugging, you can change it yourself in the debugLog configuration
  • Added generic function to reflect and call generics, you can use it in Class or CurrentClass
  • obsolete the buildOfAny method, now use the buildOf method directly (without generics) to use the constructor to create a new object and get the result Any
  • Fixed the issue of null pointer exception when using hasExtends
  • CurrentClass added non-lambda method of calling
  • CurrentClass adds name and simpleName functions
  • Completely rewrite the core method of ReflectionTool, sorting and classifying different search conditions
  • Fixed the problem that Member obtained by directly calling declared in ReflectionTool throws an exception
  • Fixed UndefinedType in ReflectionTool is not correctly judged in Method and Constructor conditions
  • Added a friendly prompt method when the reflection search result is abnormal, which can specifically locate the problem that Member cannot be found under specified conditions
  • Added VagueType condition in Method and Constructor for reflection search, which can be used in param condition to ignore parameters you don't want to fill in
  • Added paramCount { ... } condition in Method and Constructor of reflection search, now you can directly get it in it to customize your judgment condition
  • The current method is added to the FieldFinder result, which can directly create a call space for the result instance
  • Modified the modifiers condition and name condition in the reflection lookup function, now you need to return a Boolean at the end of the method body to make the condition true
  • ",20),q=e("code",null,"as*",-1),U=o(" function in "),V=e("code",null,"ModifierRules",-1),K=o(" renamed to "),Z=e("code",null,"is*",-1),G=o(", thanks to "),J={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},Q=o("Kitsune"),$=o(" suggestion"),ee=i("
  • Added RemedyPlan feature in FieldFinder
  • Added Class fuzzy search function (Beta) in Dex, you can now directly use searchClass function to fuzzy search Class with specified conditions
  • ",2),oe=o("Added multiple search function in reflection search, you can use relative search conditions to obtain multiple search results at the same time, thanks to "),te=e("strong",null,"AA",-1),de=o(" and "),ie={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},ne=o("Kitsune"),ce=o(" for suggestions"),ae=o("Fixed the problem that the object obtained by "),se=e("code",null,"appClassLoader",-1),le=o(" is incorrect in system applications in some systems, thanks to "),re={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},he=o("Luckyzyx"),ue=o(" for the feedback"),me=e("li",null,[o("Modified the calling method of "),e("code",null,"XposedBridge.invokeOriginalMethod"),o(" and added "),e("code",null,"original"),o(" function in "),e("code",null,"MethodFinder.Result.Instance")],-1),_e=o("Fixed the problem of wrong value of "),pe=e("code",null,"getStringSet",-1),fe=o(" method in "),ge=e("code",null,"YukiHookModulePrefs",-1),ke=o(" and optimize the code style, thanks to "),ye={href:"https://github.com/Teddy-Zhu",target:"_blank",rel:"noopener noreferrer"},be=o("Teddy_Zhu"),xe=o(),ve={href:"https://github.com/fankes/YukiHookAPI/pull/19",target:"_blank",rel:"noopener noreferrer"},we=o("PR"),Ae=e("li",null,[o("Modify "),e("code",null,"YukiHookModulePrefs"),o(" to intercept exceptions that may not exist in "),e("code",null,"XSharePreference")],-1),He=e("li",null,[o("Fixed the problem that "),e("code",null,"YukiHookDataChannel"),o(" could not be successfully registered in some third-party ROM system frameworks")],-1),Pe=e("li",null,[o("Secured "),e("code",null,"YukiHookDataChannel"),o(", now it can only communicate between modules from the specified package name and the host")],-1),Ce=o("Added automatic hook "),Fe=e("code",null,"SharedPreferences",-1),Me=o(" to fix the problem that file permissions are not "),Ie=e("code",null,"0664",-1),Ye=o(" in some systems, thanks to "),Re={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},Se=o("5ec1cff"),ze=o(" for the feedback and implementation code provided"),De=i("
  • Added YukiHookAPI.Configs.isEnableHookSharedPreferences function, which is disabled by default and can be enabled if the permission of SharedPreferences is incorrect
  • Fixed the bug that the no-parameter construction method cannot be found when searching for Constructor without filling in the search conditions, thanks B5 KAKA for the feedback
  • Detach Result instances located in method, constructor in injectMember to Process
  • Added the useDangerousOperation method in the Hook process, which will automatically stop the Hook and print an error after the function in the Hook Dangerous List is not declared
  • Added module resource injection and Activity proxy functions, you can call injectModuleAppResources and registerModuleAppActivities to use
  • Added ModuleContextThemeWrapper function, you can call applyModuleTheme to create the Context of a module in any Activity
  • Added ClassLoader.onLoadClass function, which can be used to listen for events when the loadClass method of ClassLoader is called
  • obsolete classOf and clazz extension methods, add toClass and toClassOrNull usage, please move to the new method now
  • VariousClass adds a getOrNull method, which can return null instead of throwing an exception when it can't match Class
  • Removed isUseAppClassLoader parameter in PackageParam.hook, changed it to isForceUseAbsolute and automatically matched the target Class
  • PackageParam adds systemContext function, you can call this function at any time to get a persistent Context
  • no longer expose any methods in HookClass
  • Added throwToApp function in HookParam, which can throw exceptions directly to the host
  • The onFailureThrowToApp function is added to the Hook callback, which can be directly thrown to the host when an exception occurs
  • Modified the printing logic of the debug log, the time-consuming records in the reflection search function will only be printed during the Hook process
  • Added the function of removing Hook in the Hook process, you can use the remove and removeSelf methods to remove the hook
  • Fixed the issue that caused the host to throw an exception when ReplaceHook failed, and now it is modified to call the original method to ensure the normal operation of the host function
  • Added the function of checking the return value of the method in the Hook process. If the return value does not match, it will automatically throw an exception or print an error according to the situation
  • ",18),Le=o("Added "),Te=e("code",null,"array",-1),Xe=o(" type to Resources Hook, thanks to "),je={href:"https://github.com/fankes/YukiHookAPI/pull/12",target:"_blank",rel:"noopener noreferrer"},We=o("PR"),Oe=o(" of "),Ne={href:"https://github.com/GSWXXN",target:"_blank",rel:"noopener noreferrer"},Be=o("GSWXXN"),Ee=e("li",null,[o("Moved "),e("code",null,"me.weishu.reflection"),o(" to "),e("code",null,"thirdparty"),o(" to prevent conflicting dependencies of the same name introduced at the same time")],-1),qe=e("li",null,"Remove the exception thrown when the Hook method body is empty, and modify it to print the warning log",-1),Ue=e("li",null,[o("Modify the exception handling logic of "),e("code",null,"AppLifecycle"),o(" and throw it directly to the host when an exception occurs")],-1),Ve=e("li",null,"Updated Demo API version to 33",-1),Ke={id:"_1-0-92-2022-05-31",tabindex:"-1"},Ze=e("a",{class:"header-anchor",href:"#_1-0-92-2022-05-31","aria-hidden":"true"},"#",-1),Ge=o(" 1.0.92 | 2022.05.31 \u2002"),Je=i("
    • Fixed the naming method of callback in a large number of methods
    • Changed the solution to fix the problem that YukiHookDataChannel cannot call back the current Activity broadcast on devices lower than Android 12
    • The InjectYukiHookWithXposed annotation adds the isUsingResourcesHook function, now you can selectively disable the dependency interface that automatically generates IXposedHookInitPackageResources
    ",1),Qe={id:"_1-0-91-2022-05-29",tabindex:"-1"},$e=e("a",{class:"header-anchor",href:"#_1-0-91-2022-05-29","aria-hidden":"true"},"#",-1),eo=o(" 1.0.91 | 2022.05.29 \u2002"),oo=o("Fixed the "),to=e("code",null,"ClassLoader",-1),io=o(" error when the customized system of some devices is booted in the LSPosed environment, thanks to "),no={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},co=o("Luckyzyx"),ao=o(" for the feedback"),so=i("
  • Fixed YukiHookDataChannel not being able to call back the current Activity broadcast on ZUI and systems below Android 12
  • Integrate the YukiHookModuleStatus function into YukiHookAPI.Status, rewrite a lot of methods, now you can judge the status information such as module activation in the module and the host in both directions
  • ",2),lo={id:"_1-0-90-2022-05-27",tabindex:"-1"},ro=e("a",{class:"header-anchor",href:"#_1-0-90-2022-05-27","aria-hidden":"true"},"#",-1),ho=o(" 1.0.90 | 2022.05.27 \u2002"),uo=i("
    • Fixed YukiHookDataChannel crashing when the module sets the listener callback
    • Fixed YukiHookDataChannel still calling back when not in current Activity
    • Remove the default value of YukiHookDataChannel callback event, no callback
    • Removed YukiHookModulePrefs warning printed if XShare is unreadable
    • Added the isXSharePrefsReadable method in YukiHookModulePrefs to determine whether the current XShare is available
    ",1),mo={id:"_1-0-89-2022-05-26",tabindex:"-1"},_o=e("a",{class:"header-anchor",href:"#_1-0-89-2022-05-26","aria-hidden":"true"},"#",-1),po=o(" 1.0.89 | 2022.05.26 \u2002"),fo=i("
    • Fixed the problem that YukiHookDataChannel cannot be repeatedly set to monitor, and added the function of repeating response in different Activity modules and automatically following Activity to destroy the monitor function
    • Added YukiHookDataChannel repeated listening use case description document
    • Add the onAlreadyHooked method to determine whether the current method is repeated Hook
    • Modify part of the logic of repeatedly adding HashMap, remove the putIfAbsent method, allow to override the addition
    • Fixed several possible bugs
    ",1),go={id:"_1-0-88-2022-05-25",tabindex:"-1"},ko=e("a",{class:"header-anchor",href:"#_1-0-88-2022-05-25","aria-hidden":"true"},"#",-1),yo=o(" 1.0.88 | 2022.05.25 \u2002"),bo=i("
    • Fully decoupled from Xposed API
    • Added android type in type
    • Separate YukiHookModuleStatus from auto-generated code and add isEnableHookModuleStatus switch, it is up to you to enable or not
    • Internal closure processing for the constructors of a large number of classes in the API
    • Set YukiHookModulePrefs to run as a singleton to prevent repeated creation and waste of system resources
    • Fixed the bug that Hook cannot be nested since version 1.0.80, and optimize the related functions of nested Hook
    • Modify the Hooker storage scheme from HashSet to HashMap to prevent the problem of repeatedly adding Hookers
    • Modify the core implementation method of Hook, add duplicate checking to avoid repeating the Hook multiple callbacks to the HookParam method
    • MethodFinder and FieldFinder add the function of finding fuzzy methods and variable names, you can call name { ... } to set search conditions, and support regular expressions
    • Optimize and modify the way to get appContext to reduce the possibility of getting empty
    • Modify the print TAG of logger in the automatically generated code to default to your custom name, which is convenient for debugging
    • Optimize the Hooker implementation of YukiHookBridge to improve Hook performance
    • PackageParam adds the onAppLifecycle method, which can natively monitor the life cycle of the host and implement the registration system broadcast function
    • Added YukiHookDataChannel function to communicate using system out-of-order broadcast while the module and the host remain alive
    • YukiHookDataChannel adds the checkingVersionEquals method, which can be monitored to verify that the host has not updated the version mismatch problem after the module is updated
    • Added Java version example in the example code of demo-module for reference only
    ",1),xo={id:"_1-0-87-2022-05-10",tabindex:"-1"},vo=e("a",{class:"header-anchor",href:"#_1-0-87-2022-05-10","aria-hidden":"true"},"#",-1),wo=o(" 1.0.87 | 2022.05.10 \u2002"),Ao=e("ul",null,[e("li",null,[o("Added "),e("code",null,"refreshModuleAppResources"),o(" function to adapt Resources refresh when the language region, font size, resolution changes, etc.")]),e("li",null,[o("Added "),e("code",null,"isEnableModuleAppResourcesCache"),o(" function, you can set whether to automatically cache the resources of the current module")])],-1),Ho={id:"_1-0-86-2022-05-06",tabindex:"-1"},Po=e("a",{class:"header-anchor",href:"#_1-0-86-2022-05-06","aria-hidden":"true"},"#",-1),Co=o(" 1.0.86 | 2022.05.06 \u2002"),Fo=e("ul",null,[e("li",null,[o("Fixed the problem of continuous error reporting during "),e("code",null,"initZygote"),o(" when Resources Hook is not supported, reproduced in "),e("strong",null,"ZUI"),o("/"),e("strong",null,"LSPosed CI(1.8.3-6550)")]),e("li",null,"Optimize and handle exceptions for Resources Hook, only print errors and warnings if they are used and not supported")],-1),Mo={id:"_1-0-85-2022-05-04",tabindex:"-1"},Io=e("a",{class:"header-anchor",href:"#_1-0-85-2022-05-04","aria-hidden":"true"},"#",-1),Yo=o(" 1.0.85 | 2022.05.04 \u2002"),Ro=e("ul",null,[e("li",null,[o("Fixed a serious problem of not being able to hook the system framework, since "),e("code",null,"1.0.80")]),e("li",null,[o("Added in the debug log to distinguish the package name loaded by "),e("code",null,"initZygote"),o(" as "),e("code",null,"android-zygote"),o(", "),e("code",null,"packageName"),o(" keeps "),e("code",null,"android"),o(" unchanged")])],-1),So={id:"_1-0-83-2022-05-04",tabindex:"-1"},zo=e("a",{class:"header-anchor",href:"#_1-0-83-2022-05-04","aria-hidden":"true"},"#",-1),Do=o(" 1.0.83 | 2022.05.04 \u2002"),Lo=e("ul",null,[e("li",null,[o("Fixed "),e("code",null,"YukiHookModuleStatus"),o(" reporting a lot of errors after "),e("code",null,"loadSystem")]),e("li",null,[o("Added "),e("code",null,"android"),o(" type in "),e("code",null,"type")]),e("li",null,"Updated example descriptions in help documentation")],-1),To={id:"_1-0-82-2022-05-04",tabindex:"-1"},Xo=e("a",{class:"header-anchor",href:"#_1-0-82-2022-05-04","aria-hidden":"true"},"#",-1),jo=o(" 1.0.82 | 2022.05.04 \u2002"),Wo=e("ul",null,[e("li",null,[o("Fixed a concept confusion error, distinguishing the relationship between "),e("code",null,"initZygote"),o(" and the system framework, there are problems with the previous comments and documentation, I am very sorry")]),e("li",null,[e("code",null,"PackageParam"),o(" adds "),e("code",null,"loadSystem"),o(" method, no need to write "),e("code",null,'loadApp(name = "android")'),o(" to hook the system framework")])],-1),Oo={id:"_1-0-81-2022-05-04",tabindex:"-1"},No=e("a",{class:"header-anchor",href:"#_1-0-81-2022-05-04","aria-hidden":"true"},"#",-1),Bo=o(" 1.0.81 | 2022.05.04 \u2002"),Eo=e("ul",null,[e("li",null,[o("Fixed the problem that the method and constructor that cannot be found in the Hook method body still output the error log after setting the condition using the "),e("code",null,"by"),o(" method")]),e("li",null,"Added a global log to display the package name of the current Hook APP during the execution of the Hook, and fixed a problem with the printing style of the error log")],-1),qo={id:"_1-0-80-2022-05-01",tabindex:"-1"},Uo=e("a",{class:"header-anchor",href:"#_1-0-80-2022-05-01","aria-hidden":"true"},"#",-1),Vo=o(" 1.0.80 | 2022.05.01 \u2002"),Ko=i("
  • The InjectYukiHookWithXposed annotation adds the entryClassName function, which can customize the generated xposed_init entry class name
  • YukiHookXposedInitProxy renamed to IYukiHookXposedInit, the original interface name has been invalidated and will be deleted directly in subsequent versions
  • Added initZygote and Resources Hook functions to support Hook Layout
  • Added onXposedEvent method to listen to all events of native Xposed API
  • Perform inline processing on the lambda of the Hook function to avoid generating excessively broken anonymous classes and improve the running performance after compilation
  • Fixed PrefsData compiled method body copy is too large
  • Added XSharePreference readability test, which will automatically print a warning log if it fails
  • PackageParam adds appResources, moduleAppResources, moduleAppFilePath functions
  • loadApp of PackageParam adds the function of not writing name, and all APPs are filtered by default
  • PackageParam adds the loadZygote method, which can directly hook the system framework
  • PackageParam added resources().hook function
  • Optimization method, construction method, variable search function, the error log that cannot be found will display the set query conditions first
  • Added hasExtends extension method to determine whether the current Class has an inheritance relationship
  • Added isSupportResourcesHook function to determine whether resource hooks are currently supported (Resources Hook)
  • current function adds superClass method to call superclass
  • New superClass query conditions for search methods, construction methods and variables, you can continue to search in the parent class
  • YukiHookAPI lots of methods are decoupled from Xposed API
  • Added native Hook priority function of Xposed API
  • Fixed the problem that isFirstApplication may be inaccurate
  • Block the problem that MiuiCatcherPatch repeatedly calls the Hook entry method on the MIUI system
  • Optimize Hook entry calling method to avoid multiple calls due to Hook Framework issues
  • ",21),Zo=o("Fixed the problem that Hook "),Go=e("code",null,"ClassLoader",-1),Jo=o(" causes Hook to freeze, thanks to "),Qo={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},$o=o("WankkoRee"),et=o(" for the feedback"),ot=e("li",null,[o("Improve the performance after the "),e("code",null,"XC_Callback"),o(" interface is connected")],-1),tt=e("li",null,[o("Java "),e("code",null,"type"),o(" added "),e("code",null,"ClassLoader"),o(" type")],-1),dt=e("li",null,"Optimize the API help documentation, fix the problem that the page may be continuously cached",-1),it={id:"_1-0-78-2022-04-18",tabindex:"-1"},nt=e("a",{class:"header-anchor",href:"#_1-0-78-2022-04-18","aria-hidden":"true"},"#",-1),ct=o(" 1.0.78 | 2022.04.18 \u2002"),at=i("
  • YukiHookModulePrefs adds isRunInNewXShareMode method, which can be used to determine whether the module is currently in New XSharePreference mode
  • Fixed YukiHookModulePrefs working in New XSharePreference mode
  • Added ModulePreferenceFragment, now you can completely replace PreferenceFragmentCompat and start using the new functionality
  • ",3),st=o("Adapt the Sp data storage solution of "),lt=e("code",null,"PreferenceFragmentCompat",-1),rt=o(", thanks to "),ht={href:"https://github.com/mahoshojoHCG",target:"_blank",rel:"noopener noreferrer"},ut=o("mahoshojoHCG"),mt=o(" for feedback"),_t=e("li",null,[o("Update autohandlers and "),e("code",null,"Kotlin"),o(" dependencies to the latest version")],-1),pt=e("li",null,"Fixed some bugs in documentation and code comments",-1),ft={id:"_1-0-77-2022-04-15",tabindex:"-1"},gt=e("a",{class:"header-anchor",href:"#_1-0-77-2022-04-15","aria-hidden":"true"},"#",-1),kt=o(" 1.0.77 | 2022.04.15 \u2002"),yt=e("code",null,"YukiHookModulePrefs",-1),bt=o(" added "),xt=e("code",null,"clear",-1),vt=o(" method, thanks to "),wt={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},At=o("WankkoRee"),Ht=o(" for the suggestion"),Pt=i("
  • YukiHookModulePrefs added getStringSet, putStringSet, all methods
  • Added any method to args of HookParam
  • Added ModuleApplication, which can be inherited in modules to achieve more functions
  • Connect all findClass functions to the Xposed API, and continue to use native ClassLoader in non-hosted environments
  • Fixed some possible bugs
  • ",5),Ct={id:"_1-0-75-2022-04-13",tabindex:"-1"},Ft=e("a",{class:"header-anchor",href:"#_1-0-75-2022-04-13","aria-hidden":"true"},"#",-1),Mt=o(" 1.0.75 | 2022.04.13 \u2002"),It=o("Corrected the logic recognition part of the automatic handler, thanks to "),Yt={href:"https://github.com/ApeaSuperz",target:"_blank",rel:"noopener noreferrer"},Rt=o("ApeaSuperz"),St=o(" contribution"),zt=i("
  • Fixed an issue where the reference to a doc comment was not changed
  • firstArgs and lastArgs methods have been removed from HookParam, now you can use args().first() and args().last() instead of it
  • Removed default parameter index = 0 in args() in HookParam, now you can use args().first() or args(index = 0) to replace it
  • The result function in HookParam adds generic matching, now you can use result<T> to match the known return value type of your target method
  • The emptyParam condition is added to the method and constructor query function, and the misunderstanding of the query condition that needs to be paid attention to in the document has been improved
  • Added android type in type
  • ",6),Dt={id:"_1-0-73-2022-04-10",tabindex:"-1"},Lt=e("a",{class:"header-anchor",href:"#_1-0-73-2022-04-10","aria-hidden":"true"},"#",-1),Tt=o(" 1.0.73 | 2022.04.10 \u2002"),Xt=o("Fixed some Chinese translation errors in documents, thanks to "),jt={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Wt=o("WankkoRee"),Ot=o(" for their contributions"),Nt=o("Fixed the problem that "),Bt=e("code",null,"XC_LoadPackage.LoadPackageParam",-1),Et=o(" throws an exception when the content is empty in some cases, thanks to "),qt={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},Ut=o("Luckyzyx"),Vt=o(" for the feedback"),Kt=e("li",null,"Fixed some known bugs and improve Hook stability",-1),Zt={id:"_1-0-72-2022-04-09",tabindex:"-1"},Gt=e("a",{class:"header-anchor",href:"#_1-0-72-2022-04-09","aria-hidden":"true"},"#",-1),Jt=o(" 1.0.72 | 2022.04.09 \u2002"),Qt=e("ul",null,[e("li",null,"Update API documentation to new address"),e("li",null,[o("Add "),e("code",null,"appContext"),o(" function to "),e("code",null,"PackageParam")]),e("li",null,"Fixed some known bugs and improve Hook stability")],-1),$t={id:"_1-0-71-2022-04-04",tabindex:"-1"},ed=e("a",{class:"header-anchor",href:"#_1-0-71-2022-04-04","aria-hidden":"true"},"#",-1),od=o(" 1.0.71 | 2022.04.04 \u2002"),td=e("ul",null,[e("li",null,"Fixed a serious issue that would stop the Hook from throwing an exception when VariousClass could not be matched")],-1),dd={id:"_1-0-70-2022-04-04",tabindex:"-1"},id=e("a",{class:"header-anchor",href:"#_1-0-70-2022-04-04","aria-hidden":"true"},"#",-1),nd=o(" 1.0.70 | 2022.04.04 \u2002"),cd=e("li",null,[o("Fixed "),e("code",null,"instanceClass"),o(" reporting an error after being called in a static instance")],-1),ad=o("Add "),sd=e("code",null,"isUseAppClassLoader",-1),ld=o(" function in Hook process, thanks to "),rd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},hd=o("WankkoRee"),ud=o(" for feedback"),md=e("li",null,[o("Added the "),e("code",null,"withProcess"),o(" function, which can be hooked according to the currently specified process of the APP")],-1),_d=e("li",null,"Fixed critical logic errors in lookup methods, constructor classes and variables",-1),pd=e("li",null,"Fixed the problem that the abnormal output cannot be ignored when the Hook target class does not exist",-1),fd=e("li",null,"Fixed the problem that the Hook could not take effect due to the fast loading of the APP startup method in some cases",-1),gd=o("Fixed "),kd=e("code",null,"allMethods",-1),yd=o(" not throwing an exception when it is not hooked to a method, thanks to "),bd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},xd=o("WankkoRee"),vd=o(" for the feedback"),wd=o("Added Hook status monitoring function, thanks to "),Ad={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Hd=o("WankkoRee"),Pd=o(" for the suggestion"),Cd=e("li",null,"Modify the way the Xposed entry is injected into the class, and redefine the definition domain of the API",-1),Fd=o("Added obfuscated method and variable lookup function, you can use different types of filter "),Md=e("code",null,"index",-1),Id=o(" to locate the specified method and variable, thanks to "),Yd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Rd=o("WankkoRee"),Sd=o(" for the ideas provided"),zd=e("li",null,[o("When looking for methods and variables, multiple types are allowed, such as the class name declared by "),e("code",null,"String"),o(" and "),e("code",null,"VariousClass")],-1),Dd=e("li",null,[o("Add a new "),e("code",null,"current"),o(" function, which can build a reflection method operation space for any class, and easily call and modify the methods and variables in it")],-1),Ld=o("Fixed a lot of bugs in the hook process, thanks to "),Td={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Xd=o("WankkoRee"),jd=o(" for contributing to this project"),Wd={id:"_1-0-69-2022-03-30",tabindex:"-1"},Od=e("a",{class:"header-anchor",href:"#_1-0-69-2022-03-30","aria-hidden":"true"},"#",-1),Nd=o(" 1.0.69 | 2022.03.30 \u2002"),Bd=e("li",null,"Added and improved annotations for some method functions",-1),Ed=e("li",null,"Added more example Hook content in Demo",-1),qd=o("Fixed the issue that only the last one takes effect when "),Ud=e("code",null,"allMethods",-1),Vd=o(" is used multiple times in a Hook instance, thanks to "),Kd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Zd=o("WankkoRee"),Gd=o(" for the feedback"),Jd={id:"_1-0-68-2022-03-29",tabindex:"-1"},Qd=e("a",{class:"header-anchor",href:"#_1-0-68-2022-03-29","aria-hidden":"true"},"#",-1),$d=o(" 1.0.68 | 2022.03.29 \u2002"),ei=i("
    • Added new use case and LSPosed scope in Demo
    • Added Member lookup cache and lookup cache configuration switches
    • Removed and modified MethodFinder, FieldFinder and HookParam related method calls
    • Add more cast types in Finder and support cast as array
    • Overall performance and stability improvements
    • Fixed bugs that may exist in the previous version
    ",1),oi={id:"_1-0-67-2022-03-27",tabindex:"-1"},ti=e("a",{class:"header-anchor",href:"#_1-0-67-2022-03-27","aria-hidden":"true"},"#",-1),di=o(" 1.0.67 | 2022.03.27 \u2002"),ii=i("
    • Added three modifiers functions in Finder, which can filter static, native, public, abstract and many other description types
    • When searching for methods and constructors, the method parameter type can be blurred to a specified number for searching
    • Added hasModifiers extension for Member
    • Added give method in MethodFinder and ConstructorFinder to get primitive types
    • Added PrefsData template function in YukiHookModulePrefs
    • Completely refactored method, constructor and variable lookup scheme
    • Optimized code comments and fixed possible bugs
    ",1),ni={id:"_1-0-66-2022-03-25",tabindex:"-1"},ci=e("a",{class:"header-anchor",href:"#_1-0-66-2022-03-25","aria-hidden":"true"},"#",-1),ai=o(" 1.0.66 | 2022.03.25 \u2002"),si=e("ul",null,[e("li",null,[o("Fixed a serious bug in "),e("code",null,"MethodFinder")]),e("li",null,[o("Added "),e("code",null,"args"),o(" call method in "),e("code",null,"hookParam")]),e("li",null,"Fixed other possible problems and fix some class annotation problems")],-1),li={id:"_1-0-65-2022-03-25",tabindex:"-1"},ri=e("a",{class:"header-anchor",href:"#_1-0-65-2022-03-25","aria-hidden":"true"},"#",-1),hi=o(" 1.0.65 | 2022.03.25 \u2002"),ui=i("
    • Republished version to fix the incorrect new version of the Maven repository due to cache issues
    • Added MethodFinder and FieldFinder new return value calling methods
    • Fixed possible problems and fix possible problems during the use of Tai Chi
    • Fixed possible problems with auto-generated Xposed entry classes
    • Added android type and java type in type
    ",1),mi={id:"_1-0-6-2022-03-20",tabindex:"-1"},_i=e("a",{class:"header-anchor",href:"#_1-0-6-2022-03-20","aria-hidden":"true"},"#",-1),pi=o(" 1.0.6 | 2022.03.20 \u2002"),fi=i("
    • Fixed YukiHookModulePrefs being ignored every time after using direct once to ignore cache
    • Added new API, abolished the traditional usage of isActive to judge module activation
    • Fixed the issue of printing debug logs when using the API in a non-Xposed environment
    • Fixed log output issue and unintercepted exception issue when looking for Field
    • Decoupling Xposed API in ReflectionUtils
    • Added YukiHookModuleStatus method name confusion to reduce the size of module generation
    • The welcome message will no longer be printed when loading the module's own Hook
    • Fixed some bugs that still exist in the previous version
    ",1),gi={id:"_1-0-55-2022-03-18",tabindex:"-1"},ki=e("a",{class:"header-anchor",href:"#_1-0-55-2022-03-18","aria-hidden":"true"},"#",-1),yi=o(" 1.0.55 | 2022.03.18 \u2002"),bi=e("ul",null,[e("li",null,"Fixed an annotation error"),e("li",null,"Temporarily fix a bug"),e("li",null,[o("Added a large number of "),e("code",null,"android"),o(" types in "),e("code",null,"type"),o(" and a small number of "),e("code",null,"java"),o(" types")]),e("li",null,"Fixed compatibility issues between new and old Kotlin APIs")],-1),xi={id:"_1-0-5-2022-03-18",tabindex:"-1"},vi=e("a",{class:"header-anchor",href:"#_1-0-5-2022-03-18","aria-hidden":"true"},"#",-1),wi=o(" 1.0.5 | 2022.03.18 \u2002"),Ai=i("
    • Fixed the problem that the welcome message was printed multiple times in the case of the old version of the LSPosed framework
    • Added onInit method to configure YukiHookAPI
    • Added executorName and executorVersion to get the name and version number of the current hook framework
    • Added by method to set the timing and condition of Hook
    • YukiHookModulePrefs adds a controllable key-value cache, which can dynamically update data when the host is running
    • Fixed some possible bugs
    ",1),Hi={id:"_1-0-4-2022-03-06",tabindex:"-1"},Pi=e("a",{class:"header-anchor",href:"#_1-0-4-2022-03-06","aria-hidden":"true"},"#",-1),Ci=o(" 1.0.4 | 2022.03.06 \u2002"),Fi=i("
    • Fixed LSPosed cannot find XposedBridge after enabling "Only module classloader can use Xposed API" option in latest version
    • Added constant version name and version number for YukiHookAPI
    • Added hasField method and isAllowPrintingLogs configuration parameter
    • Added isDebug to enable the API to automatically print the welcome message to test whether the module is valid
    ",1),Mi={id:"_1-0-3-2022-03-02",tabindex:"-1"},Ii=e("a",{class:"header-anchor",href:"#_1-0-3-2022-03-02","aria-hidden":"true"},"#",-1),Yi=o(" 1.0.3 | 2022.03.02 \u2002"),Ri=i("
    • Fixed a potential exception not intercepted BUG
    • Added ignoredError function
    • Added android type in type
    • Added ClassNotFound function after listening to hook
    ",1),Si={id:"_1-0-2-2022-02-18",tabindex:"-1"},zi=e("a",{class:"header-anchor",href:"#_1-0-2-2022-02-18","aria-hidden":"true"},"#",-1),Di=o(" 1.0.2 | 2022.02.18 \u2002"),Li=e("ul",null,[e("li",null,"Fixed the problem that the project path cannot be found under Windows"),e("li",null,[o("Remove part of reflection API, merge into "),e("code",null,"BaseFinder"),o(" for integration")]),e("li",null,"Add a method to create Hook directly using string")],-1),Ti={id:"_1-0-1-2022-02-15",tabindex:"-1"},Xi=e("a",{class:"header-anchor",href:"#_1-0-1-2022-02-15","aria-hidden":"true"},"#",-1),ji=o(" 1.0.1 | 2022.02.15 \u2002"),Wi=e("ul",null,[e("li",null,[e("code",null,"RemedyPlan"),o(" adds "),e("code",null,"onFind"),o(" function")]),e("li",null,"Integrate and modify some reflection API code"),e("li",null,[o("Added "),e("code",null,"java"),o(" type in "),e("code",null,"type")]),e("li",null,"Fixed the issue that ignored errors still output in the console")],-1),Oi={id:"_1-0-2022-02-14",tabindex:"-1"},Ni=e("a",{class:"header-anchor",href:"#_1-0-2022-02-14","aria-hidden":"true"},"#",-1),Bi=o(" 1.0 | 2022.02.14 \u2002"),Ei=e("ul",null,[e("li",null,"The first version is submitted to Maven")],-1);function qi(Ui,Vi){const d=c("Badge"),n=c("ExternalLinkIcon");return s(),l("div",null,[h,e("h3",u,[m,_,t(d,{type:"tip",text:"latest",vertical:"middle"})]),p,e("h3",f,[g,k,t(d,{type:"warning",text:"stale",vertical:"middle"})]),y,e("h3",b,[x,v,t(d,{type:"warning",text:"stale",vertical:"middle"})]),w,e("h3",A,[H,P,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),C,e("h3",F,[M,I,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Y,e("h3",R,[S,z,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[D,e("li",null,[L,e("a",T,[X,t(n)])]),j,e("li",null,[W,e("a",O,[N,t(n)]),B]),E,e("li",null,[q,U,V,K,Z,G,e("a",J,[Q,t(n)]),$]),ee,e("li",null,[oe,te,de,e("a",ie,[ne,t(n)]),ce]),e("li",null,[ae,se,le,e("a",re,[he,t(n)]),ue]),me,e("li",null,[_e,pe,fe,ge,ke,e("a",ye,[be,t(n)]),xe,e("a",ve,[we,t(n)])]),Ae,He,Pe,e("li",null,[Ce,Fe,Me,Ie,Ye,e("a",Re,[Se,t(n)]),ze]),De,e("li",null,[Le,Te,Xe,e("a",je,[We,t(n)]),Oe,e("a",Ne,[Be,t(n)])]),Ee,qe,Ue,Ve]),e("h3",Ke,[Ze,Ge,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Je,e("h3",Qe,[$e,eo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[oo,to,io,e("a",no,[co,t(n)]),ao]),so]),e("h3",lo,[ro,ho,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),uo,e("h3",mo,[_o,po,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),fo,e("h3",go,[ko,yo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),bo,e("h3",xo,[vo,wo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ao,e("h3",Ho,[Po,Co,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Fo,e("h3",Mo,[Io,Yo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ro,e("h3",So,[zo,Do,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Lo,e("h3",To,[Xo,jo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Wo,e("h3",Oo,[No,Bo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Eo,e("h3",qo,[Uo,Vo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[Ko,e("li",null,[Zo,Go,Jo,e("a",Qo,[$o,t(n)]),et]),ot,tt,dt]),e("h3",it,[nt,ct,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[at,e("li",null,[st,lt,rt,e("a",ht,[ut,t(n)]),mt]),_t,pt]),e("h3",ft,[gt,kt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[yt,bt,xt,vt,e("a",wt,[At,t(n)]),Ht]),Pt]),e("h3",Ct,[Ft,Mt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[It,e("a",Yt,[Rt,t(n)]),St]),zt]),e("h3",Dt,[Lt,Tt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[Xt,e("a",jt,[Wt,t(n)]),Ot]),e("li",null,[Nt,Bt,Et,e("a",qt,[Ut,t(n)]),Vt]),Kt]),e("h3",Zt,[Gt,Jt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Qt,e("h3",$t,[ed,od,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),td,e("h3",dd,[id,nd,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[cd,e("li",null,[ad,sd,ld,e("a",rd,[hd,t(n)]),ud]),md,_d,pd,fd,e("li",null,[gd,kd,yd,e("a",bd,[xd,t(n)]),vd]),e("li",null,[wd,e("a",Ad,[Hd,t(n)]),Pd]),Cd,e("li",null,[Fd,Md,Id,e("a",Yd,[Rd,t(n)]),Sd]),zd,Dd,e("li",null,[Ld,e("a",Td,[Xd,t(n)]),jd])]),e("h3",Wd,[Od,Nd,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[Bd,Ed,e("li",null,[qd,Ud,Vd,e("a",Kd,[Zd,t(n)]),Gd])]),e("h3",Jd,[Qd,$d,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ei,e("h3",oi,[ti,di,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ii,e("h3",ni,[ci,ai,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),si,e("h3",li,[ri,hi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ui,e("h3",mi,[_i,pi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),fi,e("h3",gi,[ki,yi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),bi,e("h3",xi,[vi,wi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ai,e("h3",Hi,[Pi,Ci,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Fi,e("h3",Mi,[Ii,Yi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ri,e("h3",Si,[zi,Di,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Li,e("h3",Ti,[Xi,ji,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Wi,e("h3",Oi,[Ni,Bi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ei])}const Zi=a(r,[["render",qi],["__file","changelog.html.vue"]]);export{Zi as default}; diff --git a/docs/assets/changelog.html.858036fa.js b/docs/assets/changelog.html.858036fa.js deleted file mode 100644 index 0e54c56e0..000000000 --- a/docs/assets/changelog.html.858036fa.js +++ /dev/null @@ -1 +0,0 @@ -const l=JSON.parse('{"key":"v-0e6c3476","path":"/zh-cn/about/changelog.html","title":"\u66F4\u65B0\u65E5\u5FD7","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":3,"title":"1.1.4 | 2022.10.04","slug":"_1-1-4-2022-10-04","link":"#_1-1-4-2022-10-04","children":[]},{"level":3,"title":"1.1.3 | 2022.09.30","slug":"_1-1-3-2022-09-30","link":"#_1-1-3-2022-09-30","children":[]},{"level":3,"title":"1.1.2 | 2022.09.30","slug":"_1-1-2-2022-09-30","link":"#_1-1-2-2022-09-30","children":[]},{"level":3,"title":"1.1.1 | 2022.09.28","slug":"_1-1-1-2022-09-28","link":"#_1-1-1-2022-09-28","children":[]},{"level":3,"title":"1.1.0 | 2022.09.28","slug":"_1-1-0-2022-09-28","link":"#_1-1-0-2022-09-28","children":[]},{"level":3,"title":"1.0.92 | 2022.05.31","slug":"_1-0-92-2022-05-31","link":"#_1-0-92-2022-05-31","children":[]},{"level":3,"title":"1.0.91 | 2022.05.29","slug":"_1-0-91-2022-05-29","link":"#_1-0-91-2022-05-29","children":[]},{"level":3,"title":"1.0.90 | 2022.05.27","slug":"_1-0-90-2022-05-27","link":"#_1-0-90-2022-05-27","children":[]},{"level":3,"title":"1.0.89 | 2022.05.26","slug":"_1-0-89-2022-05-26","link":"#_1-0-89-2022-05-26","children":[]},{"level":3,"title":"1.0.88 | 2022.05.25","slug":"_1-0-88-2022-05-25","link":"#_1-0-88-2022-05-25","children":[]},{"level":3,"title":"1.0.87 | 2022.05.10","slug":"_1-0-87-2022-05-10","link":"#_1-0-87-2022-05-10","children":[]},{"level":3,"title":"1.0.86 | 2022.05.06","slug":"_1-0-86-2022-05-06","link":"#_1-0-86-2022-05-06","children":[]},{"level":3,"title":"1.0.85 | 2022.05.04","slug":"_1-0-85-2022-05-04","link":"#_1-0-85-2022-05-04","children":[]},{"level":3,"title":"1.0.83 | 2022.05.04","slug":"_1-0-83-2022-05-04","link":"#_1-0-83-2022-05-04","children":[]},{"level":3,"title":"1.0.82 | 2022.05.04","slug":"_1-0-82-2022-05-04","link":"#_1-0-82-2022-05-04","children":[]},{"level":3,"title":"1.0.81 | 2022.05.04","slug":"_1-0-81-2022-05-04","link":"#_1-0-81-2022-05-04","children":[]},{"level":3,"title":"1.0.80 | 2022.05.01","slug":"_1-0-80-2022-05-01","link":"#_1-0-80-2022-05-01","children":[]},{"level":3,"title":"1.0.78 | 2022.04.18","slug":"_1-0-78-2022-04-18","link":"#_1-0-78-2022-04-18","children":[]},{"level":3,"title":"1.0.77 | 2022.04.15","slug":"_1-0-77-2022-04-15","link":"#_1-0-77-2022-04-15","children":[]},{"level":3,"title":"1.0.75 | 2022.04.13","slug":"_1-0-75-2022-04-13","link":"#_1-0-75-2022-04-13","children":[]},{"level":3,"title":"1.0.73 | 2022.04.10","slug":"_1-0-73-2022-04-10","link":"#_1-0-73-2022-04-10","children":[]},{"level":3,"title":"1.0.72 | 2022.04.09","slug":"_1-0-72-2022-04-09","link":"#_1-0-72-2022-04-09","children":[]},{"level":3,"title":"1.0.71 | 2022.04.04","slug":"_1-0-71-2022-04-04","link":"#_1-0-71-2022-04-04","children":[]},{"level":3,"title":"1.0.70 | 2022.04.04","slug":"_1-0-70-2022-04-04","link":"#_1-0-70-2022-04-04","children":[]},{"level":3,"title":"1.0.69 | 2022.03.30","slug":"_1-0-69-2022-03-30","link":"#_1-0-69-2022-03-30","children":[]},{"level":3,"title":"1.0.68 | 2022.03.29","slug":"_1-0-68-2022-03-29","link":"#_1-0-68-2022-03-29","children":[]},{"level":3,"title":"1.0.67 | 2022.03.27","slug":"_1-0-67-2022-03-27","link":"#_1-0-67-2022-03-27","children":[]},{"level":3,"title":"1.0.66 | 2022.03.25","slug":"_1-0-66-2022-03-25","link":"#_1-0-66-2022-03-25","children":[]},{"level":3,"title":"1.0.65 | 2022.03.25","slug":"_1-0-65-2022-03-25","link":"#_1-0-65-2022-03-25","children":[]},{"level":3,"title":"1.0.6 | 2022.03.20","slug":"_1-0-6-2022-03-20","link":"#_1-0-6-2022-03-20","children":[]},{"level":3,"title":"1.0.55 | 2022.03.18","slug":"_1-0-55-2022-03-18","link":"#_1-0-55-2022-03-18","children":[]},{"level":3,"title":"1.0.5 | 2022.03.18","slug":"_1-0-5-2022-03-18","link":"#_1-0-5-2022-03-18","children":[]},{"level":3,"title":"1.0.4 | 2022.03.06","slug":"_1-0-4-2022-03-06","link":"#_1-0-4-2022-03-06","children":[]},{"level":3,"title":"1.0.3 | 2022.03.02","slug":"_1-0-3-2022-03-02","link":"#_1-0-3-2022-03-02","children":[]},{"level":3,"title":"1.0.2 | 2022.02.18","slug":"_1-0-2-2022-02-18","link":"#_1-0-2-2022-02-18","children":[]},{"level":3,"title":"1.0.1 | 2022.02.15","slug":"_1-0-1-2022-02-15","link":"#_1-0-1-2022-02-15","children":[]},{"level":3,"title":"1.0 | 2022.02.14","slug":"_1-0-2022-02-14","link":"#_1-0-2022-02-14","children":[]}],"git":{"updatedTime":1664838909000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"zh-cn/about/changelog.md"}');export{l as data}; diff --git a/docs/assets/changelog.html.9ab752eb.js b/docs/assets/changelog.html.9ab752eb.js new file mode 100644 index 000000000..a85acae33 --- /dev/null +++ b/docs/assets/changelog.html.9ab752eb.js @@ -0,0 +1 @@ +const l=JSON.parse('{"key":"v-3f851d14","path":"/en/about/changelog.html","title":"Changelog","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":3,"title":"1.1.5 | 2023.01.13","slug":"_1-1-5-2023-01-13","link":"#_1-1-5-2023-01-13","children":[]},{"level":3,"title":"1.1.4 | 2022.10.04","slug":"_1-1-4-2022-10-04","link":"#_1-1-4-2022-10-04","children":[]},{"level":3,"title":"1.1.3 | 2022.09.30","slug":"_1-1-3-2022-09-30","link":"#_1-1-3-2022-09-30","children":[]},{"level":3,"title":"1.1.2 | 2022.09.30","slug":"_1-1-2-2022-09-30","link":"#_1-1-2-2022-09-30","children":[]},{"level":3,"title":"1.1.1 | 2022.09.28","slug":"_1-1-1-2022-09-28","link":"#_1-1-1-2022-09-28","children":[]},{"level":3,"title":"1.1.0 | 2022.09.28","slug":"_1-1-0-2022-09-28","link":"#_1-1-0-2022-09-28","children":[]},{"level":3,"title":"1.0.92 | 2022.05.31","slug":"_1-0-92-2022-05-31","link":"#_1-0-92-2022-05-31","children":[]},{"level":3,"title":"1.0.91 | 2022.05.29","slug":"_1-0-91-2022-05-29","link":"#_1-0-91-2022-05-29","children":[]},{"level":3,"title":"1.0.90 | 2022.05.27","slug":"_1-0-90-2022-05-27","link":"#_1-0-90-2022-05-27","children":[]},{"level":3,"title":"1.0.89 | 2022.05.26","slug":"_1-0-89-2022-05-26","link":"#_1-0-89-2022-05-26","children":[]},{"level":3,"title":"1.0.88 | 2022.05.25","slug":"_1-0-88-2022-05-25","link":"#_1-0-88-2022-05-25","children":[]},{"level":3,"title":"1.0.87 | 2022.05.10","slug":"_1-0-87-2022-05-10","link":"#_1-0-87-2022-05-10","children":[]},{"level":3,"title":"1.0.86 | 2022.05.06","slug":"_1-0-86-2022-05-06","link":"#_1-0-86-2022-05-06","children":[]},{"level":3,"title":"1.0.85 | 2022.05.04","slug":"_1-0-85-2022-05-04","link":"#_1-0-85-2022-05-04","children":[]},{"level":3,"title":"1.0.83 | 2022.05.04","slug":"_1-0-83-2022-05-04","link":"#_1-0-83-2022-05-04","children":[]},{"level":3,"title":"1.0.82 | 2022.05.04","slug":"_1-0-82-2022-05-04","link":"#_1-0-82-2022-05-04","children":[]},{"level":3,"title":"1.0.81 | 2022.05.04","slug":"_1-0-81-2022-05-04","link":"#_1-0-81-2022-05-04","children":[]},{"level":3,"title":"1.0.80 | 2022.05.01","slug":"_1-0-80-2022-05-01","link":"#_1-0-80-2022-05-01","children":[]},{"level":3,"title":"1.0.78 | 2022.04.18","slug":"_1-0-78-2022-04-18","link":"#_1-0-78-2022-04-18","children":[]},{"level":3,"title":"1.0.77 | 2022.04.15","slug":"_1-0-77-2022-04-15","link":"#_1-0-77-2022-04-15","children":[]},{"level":3,"title":"1.0.75 | 2022.04.13","slug":"_1-0-75-2022-04-13","link":"#_1-0-75-2022-04-13","children":[]},{"level":3,"title":"1.0.73 | 2022.04.10","slug":"_1-0-73-2022-04-10","link":"#_1-0-73-2022-04-10","children":[]},{"level":3,"title":"1.0.72 | 2022.04.09","slug":"_1-0-72-2022-04-09","link":"#_1-0-72-2022-04-09","children":[]},{"level":3,"title":"1.0.71 | 2022.04.04","slug":"_1-0-71-2022-04-04","link":"#_1-0-71-2022-04-04","children":[]},{"level":3,"title":"1.0.70 | 2022.04.04","slug":"_1-0-70-2022-04-04","link":"#_1-0-70-2022-04-04","children":[]},{"level":3,"title":"1.0.69 | 2022.03.30","slug":"_1-0-69-2022-03-30","link":"#_1-0-69-2022-03-30","children":[]},{"level":3,"title":"1.0.68 | 2022.03.29","slug":"_1-0-68-2022-03-29","link":"#_1-0-68-2022-03-29","children":[]},{"level":3,"title":"1.0.67 | 2022.03.27","slug":"_1-0-67-2022-03-27","link":"#_1-0-67-2022-03-27","children":[]},{"level":3,"title":"1.0.66 | 2022.03.25","slug":"_1-0-66-2022-03-25","link":"#_1-0-66-2022-03-25","children":[]},{"level":3,"title":"1.0.65 | 2022.03.25","slug":"_1-0-65-2022-03-25","link":"#_1-0-65-2022-03-25","children":[]},{"level":3,"title":"1.0.6 | 2022.03.20","slug":"_1-0-6-2022-03-20","link":"#_1-0-6-2022-03-20","children":[]},{"level":3,"title":"1.0.55 | 2022.03.18","slug":"_1-0-55-2022-03-18","link":"#_1-0-55-2022-03-18","children":[]},{"level":3,"title":"1.0.5 | 2022.03.18","slug":"_1-0-5-2022-03-18","link":"#_1-0-5-2022-03-18","children":[]},{"level":3,"title":"1.0.4 | 2022.03.06","slug":"_1-0-4-2022-03-06","link":"#_1-0-4-2022-03-06","children":[]},{"level":3,"title":"1.0.3 | 2022.03.02","slug":"_1-0-3-2022-03-02","link":"#_1-0-3-2022-03-02","children":[]},{"level":3,"title":"1.0.2 | 2022.02.18","slug":"_1-0-2-2022-02-18","link":"#_1-0-2-2022-02-18","children":[]},{"level":3,"title":"1.0.1 | 2022.02.15","slug":"_1-0-1-2022-02-15","link":"#_1-0-1-2022-02-15","children":[]},{"level":3,"title":"1.0 | 2022.02.14","slug":"_1-0-2022-02-14","link":"#_1-0-2022-02-14","children":[]}],"git":{"updatedTime":1673554573000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/about/changelog.md"}');export{l as data}; diff --git a/docs/assets/changelog.html.88d98aec.js b/docs/assets/changelog.html.9c2f128d.js similarity index 89% rename from docs/assets/changelog.html.88d98aec.js rename to docs/assets/changelog.html.9c2f128d.js index 2284d53da..4cea14dad 100644 --- a/docs/assets/changelog.html.88d98aec.js +++ b/docs/assets/changelog.html.9c2f128d.js @@ -1 +1 @@ -const l=JSON.parse('{"key":"v-3f851d14","path":"/en/about/changelog.html","title":"Changelog","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":3,"title":"1.1.4 | 2022.10.04","slug":"_1-1-4-2022-10-04","link":"#_1-1-4-2022-10-04","children":[]},{"level":3,"title":"1.1.3 | 2022.09.30","slug":"_1-1-3-2022-09-30","link":"#_1-1-3-2022-09-30","children":[]},{"level":3,"title":"1.1.2 | 2022.09.30","slug":"_1-1-2-2022-09-30","link":"#_1-1-2-2022-09-30","children":[]},{"level":3,"title":"1.1.1 | 2022.09.28","slug":"_1-1-1-2022-09-28","link":"#_1-1-1-2022-09-28","children":[]},{"level":3,"title":"1.1.0 | 2022.09.28","slug":"_1-1-0-2022-09-28","link":"#_1-1-0-2022-09-28","children":[]},{"level":3,"title":"1.0.92 | 2022.05.31","slug":"_1-0-92-2022-05-31","link":"#_1-0-92-2022-05-31","children":[]},{"level":3,"title":"1.0.91 | 2022.05.29","slug":"_1-0-91-2022-05-29","link":"#_1-0-91-2022-05-29","children":[]},{"level":3,"title":"1.0.90 | 2022.05.27","slug":"_1-0-90-2022-05-27","link":"#_1-0-90-2022-05-27","children":[]},{"level":3,"title":"1.0.89 | 2022.05.26","slug":"_1-0-89-2022-05-26","link":"#_1-0-89-2022-05-26","children":[]},{"level":3,"title":"1.0.88 | 2022.05.25","slug":"_1-0-88-2022-05-25","link":"#_1-0-88-2022-05-25","children":[]},{"level":3,"title":"1.0.87 | 2022.05.10","slug":"_1-0-87-2022-05-10","link":"#_1-0-87-2022-05-10","children":[]},{"level":3,"title":"1.0.86 | 2022.05.06","slug":"_1-0-86-2022-05-06","link":"#_1-0-86-2022-05-06","children":[]},{"level":3,"title":"1.0.85 | 2022.05.04","slug":"_1-0-85-2022-05-04","link":"#_1-0-85-2022-05-04","children":[]},{"level":3,"title":"1.0.83 | 2022.05.04","slug":"_1-0-83-2022-05-04","link":"#_1-0-83-2022-05-04","children":[]},{"level":3,"title":"1.0.82 | 2022.05.04","slug":"_1-0-82-2022-05-04","link":"#_1-0-82-2022-05-04","children":[]},{"level":3,"title":"1.0.81 | 2022.05.04","slug":"_1-0-81-2022-05-04","link":"#_1-0-81-2022-05-04","children":[]},{"level":3,"title":"1.0.80 | 2022.05.01","slug":"_1-0-80-2022-05-01","link":"#_1-0-80-2022-05-01","children":[]},{"level":3,"title":"1.0.78 | 2022.04.18","slug":"_1-0-78-2022-04-18","link":"#_1-0-78-2022-04-18","children":[]},{"level":3,"title":"1.0.77 | 2022.04.15","slug":"_1-0-77-2022-04-15","link":"#_1-0-77-2022-04-15","children":[]},{"level":3,"title":"1.0.75 | 2022.04.13","slug":"_1-0-75-2022-04-13","link":"#_1-0-75-2022-04-13","children":[]},{"level":3,"title":"1.0.73 | 2022.04.10","slug":"_1-0-73-2022-04-10","link":"#_1-0-73-2022-04-10","children":[]},{"level":3,"title":"1.0.72 | 2022.04.09","slug":"_1-0-72-2022-04-09","link":"#_1-0-72-2022-04-09","children":[]},{"level":3,"title":"1.0.71 | 2022.04.04","slug":"_1-0-71-2022-04-04","link":"#_1-0-71-2022-04-04","children":[]},{"level":3,"title":"1.0.70 | 2022.04.04","slug":"_1-0-70-2022-04-04","link":"#_1-0-70-2022-04-04","children":[]},{"level":3,"title":"1.0.69 | 2022.03.30","slug":"_1-0-69-2022-03-30","link":"#_1-0-69-2022-03-30","children":[]},{"level":3,"title":"1.0.68 | 2022.03.29","slug":"_1-0-68-2022-03-29","link":"#_1-0-68-2022-03-29","children":[]},{"level":3,"title":"1.0.67 | 2022.03.27","slug":"_1-0-67-2022-03-27","link":"#_1-0-67-2022-03-27","children":[]},{"level":3,"title":"1.0.66 | 2022.03.25","slug":"_1-0-66-2022-03-25","link":"#_1-0-66-2022-03-25","children":[]},{"level":3,"title":"1.0.65 | 2022.03.25","slug":"_1-0-65-2022-03-25","link":"#_1-0-65-2022-03-25","children":[]},{"level":3,"title":"1.0.6 | 2022.03.20","slug":"_1-0-6-2022-03-20","link":"#_1-0-6-2022-03-20","children":[]},{"level":3,"title":"1.0.55 | 2022.03.18","slug":"_1-0-55-2022-03-18","link":"#_1-0-55-2022-03-18","children":[]},{"level":3,"title":"1.0.5 | 2022.03.18","slug":"_1-0-5-2022-03-18","link":"#_1-0-5-2022-03-18","children":[]},{"level":3,"title":"1.0.4 | 2022.03.06","slug":"_1-0-4-2022-03-06","link":"#_1-0-4-2022-03-06","children":[]},{"level":3,"title":"1.0.3 | 2022.03.02","slug":"_1-0-3-2022-03-02","link":"#_1-0-3-2022-03-02","children":[]},{"level":3,"title":"1.0.2 | 2022.02.18","slug":"_1-0-2-2022-02-18","link":"#_1-0-2-2022-02-18","children":[]},{"level":3,"title":"1.0.1 | 2022.02.15","slug":"_1-0-1-2022-02-15","link":"#_1-0-1-2022-02-15","children":[]},{"level":3,"title":"1.0 | 2022.02.14","slug":"_1-0-2022-02-14","link":"#_1-0-2022-02-14","children":[]}],"git":{"updatedTime":1664838909000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"en/about/changelog.md"}');export{l as data}; +const l=JSON.parse('{"key":"v-0e6c3476","path":"/zh-cn/about/changelog.html","title":"\u66F4\u65B0\u65E5\u5FD7","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":3,"title":"1.1.5 | 2023.01.13","slug":"_1-1-5-2023-01-13","link":"#_1-1-5-2023-01-13","children":[]},{"level":3,"title":"1.1.4 | 2022.10.04","slug":"_1-1-4-2022-10-04","link":"#_1-1-4-2022-10-04","children":[]},{"level":3,"title":"1.1.3 | 2022.09.30","slug":"_1-1-3-2022-09-30","link":"#_1-1-3-2022-09-30","children":[]},{"level":3,"title":"1.1.2 | 2022.09.30","slug":"_1-1-2-2022-09-30","link":"#_1-1-2-2022-09-30","children":[]},{"level":3,"title":"1.1.1 | 2022.09.28","slug":"_1-1-1-2022-09-28","link":"#_1-1-1-2022-09-28","children":[]},{"level":3,"title":"1.1.0 | 2022.09.28","slug":"_1-1-0-2022-09-28","link":"#_1-1-0-2022-09-28","children":[]},{"level":3,"title":"1.0.92 | 2022.05.31","slug":"_1-0-92-2022-05-31","link":"#_1-0-92-2022-05-31","children":[]},{"level":3,"title":"1.0.91 | 2022.05.29","slug":"_1-0-91-2022-05-29","link":"#_1-0-91-2022-05-29","children":[]},{"level":3,"title":"1.0.90 | 2022.05.27","slug":"_1-0-90-2022-05-27","link":"#_1-0-90-2022-05-27","children":[]},{"level":3,"title":"1.0.89 | 2022.05.26","slug":"_1-0-89-2022-05-26","link":"#_1-0-89-2022-05-26","children":[]},{"level":3,"title":"1.0.88 | 2022.05.25","slug":"_1-0-88-2022-05-25","link":"#_1-0-88-2022-05-25","children":[]},{"level":3,"title":"1.0.87 | 2022.05.10","slug":"_1-0-87-2022-05-10","link":"#_1-0-87-2022-05-10","children":[]},{"level":3,"title":"1.0.86 | 2022.05.06","slug":"_1-0-86-2022-05-06","link":"#_1-0-86-2022-05-06","children":[]},{"level":3,"title":"1.0.85 | 2022.05.04","slug":"_1-0-85-2022-05-04","link":"#_1-0-85-2022-05-04","children":[]},{"level":3,"title":"1.0.83 | 2022.05.04","slug":"_1-0-83-2022-05-04","link":"#_1-0-83-2022-05-04","children":[]},{"level":3,"title":"1.0.82 | 2022.05.04","slug":"_1-0-82-2022-05-04","link":"#_1-0-82-2022-05-04","children":[]},{"level":3,"title":"1.0.81 | 2022.05.04","slug":"_1-0-81-2022-05-04","link":"#_1-0-81-2022-05-04","children":[]},{"level":3,"title":"1.0.80 | 2022.05.01","slug":"_1-0-80-2022-05-01","link":"#_1-0-80-2022-05-01","children":[]},{"level":3,"title":"1.0.78 | 2022.04.18","slug":"_1-0-78-2022-04-18","link":"#_1-0-78-2022-04-18","children":[]},{"level":3,"title":"1.0.77 | 2022.04.15","slug":"_1-0-77-2022-04-15","link":"#_1-0-77-2022-04-15","children":[]},{"level":3,"title":"1.0.75 | 2022.04.13","slug":"_1-0-75-2022-04-13","link":"#_1-0-75-2022-04-13","children":[]},{"level":3,"title":"1.0.73 | 2022.04.10","slug":"_1-0-73-2022-04-10","link":"#_1-0-73-2022-04-10","children":[]},{"level":3,"title":"1.0.72 | 2022.04.09","slug":"_1-0-72-2022-04-09","link":"#_1-0-72-2022-04-09","children":[]},{"level":3,"title":"1.0.71 | 2022.04.04","slug":"_1-0-71-2022-04-04","link":"#_1-0-71-2022-04-04","children":[]},{"level":3,"title":"1.0.70 | 2022.04.04","slug":"_1-0-70-2022-04-04","link":"#_1-0-70-2022-04-04","children":[]},{"level":3,"title":"1.0.69 | 2022.03.30","slug":"_1-0-69-2022-03-30","link":"#_1-0-69-2022-03-30","children":[]},{"level":3,"title":"1.0.68 | 2022.03.29","slug":"_1-0-68-2022-03-29","link":"#_1-0-68-2022-03-29","children":[]},{"level":3,"title":"1.0.67 | 2022.03.27","slug":"_1-0-67-2022-03-27","link":"#_1-0-67-2022-03-27","children":[]},{"level":3,"title":"1.0.66 | 2022.03.25","slug":"_1-0-66-2022-03-25","link":"#_1-0-66-2022-03-25","children":[]},{"level":3,"title":"1.0.65 | 2022.03.25","slug":"_1-0-65-2022-03-25","link":"#_1-0-65-2022-03-25","children":[]},{"level":3,"title":"1.0.6 | 2022.03.20","slug":"_1-0-6-2022-03-20","link":"#_1-0-6-2022-03-20","children":[]},{"level":3,"title":"1.0.55 | 2022.03.18","slug":"_1-0-55-2022-03-18","link":"#_1-0-55-2022-03-18","children":[]},{"level":3,"title":"1.0.5 | 2022.03.18","slug":"_1-0-5-2022-03-18","link":"#_1-0-5-2022-03-18","children":[]},{"level":3,"title":"1.0.4 | 2022.03.06","slug":"_1-0-4-2022-03-06","link":"#_1-0-4-2022-03-06","children":[]},{"level":3,"title":"1.0.3 | 2022.03.02","slug":"_1-0-3-2022-03-02","link":"#_1-0-3-2022-03-02","children":[]},{"level":3,"title":"1.0.2 | 2022.02.18","slug":"_1-0-2-2022-02-18","link":"#_1-0-2-2022-02-18","children":[]},{"level":3,"title":"1.0.1 | 2022.02.15","slug":"_1-0-1-2022-02-15","link":"#_1-0-1-2022-02-15","children":[]},{"level":3,"title":"1.0 | 2022.02.14","slug":"_1-0-2022-02-14","link":"#_1-0-2022-02-14","children":[]}],"git":{"updatedTime":1673554573000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":9}]},"filePathRelative":"zh-cn/about/changelog.md"}');export{l as data}; diff --git a/docs/assets/changelog.html.dc0ca215.js b/docs/assets/changelog.html.dc0ca215.js new file mode 100644 index 000000000..1aa899918 --- /dev/null +++ b/docs/assets/changelog.html.dc0ca215.js @@ -0,0 +1 @@ +import{_ as s,r as t,o as n,c as a,b as e,d,e as o,a as i}from"./app.6074a838.js";const r={},_=e("h1",{id:"\u66F4\u65B0\u65E5\u5FD7",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u66F4\u65B0\u65E5\u5FD7","aria-hidden":"true"},"#"),o(" \u66F4\u65B0\u65E5\u5FD7")],-1),h=e("blockquote",null,[e("p",null,[o("\u8FD9\u91CC\u8BB0\u5F55\u4E86 "),e("code",null,"YukiHookAPI"),o(" \u7684\u7248\u672C\u66F4\u65B0\u5386\u53F2\u3002")])],-1),u=e("div",{class:"custom-container danger"},[e("p",{class:"custom-container-title"},"\u7279\u522B\u6CE8\u610F"),e("p",null,"\u6211\u4EEC\u53EA\u4F1A\u5BF9\u6700\u65B0\u7684 API \u7248\u672C\u8FDB\u884C\u7EF4\u62A4\uFF0C\u82E5\u4F60\u6B63\u5728\u4F7F\u7528\u8FC7\u65F6\u7684 API \u7248\u672C\u5219\u4EE3\u8868\u4F60\u81EA\u613F\u653E\u5F03\u4E00\u5207\u7EF4\u62A4\u7684\u53EF\u80FD\u6027\u3002")],-1),k={id:"_1-1-5-2023-01-13",tabindex:"-1"},p=e("a",{class:"header-anchor",href:"#_1-1-5-2023-01-13","aria-hidden":"true"},"#",-1),g=o(" 1.1.5 | 2023.01.13 \u2002"),f=i('
    • \u89C4\u8303\u5E76\u4F18\u5316\u6574\u4F53\u4EE3\u7801\u98CE\u683C
    • \u5BF9\u90E8\u5206\u5185\u90E8\u8C03\u7528\u7684 API \u8FDB\u884C\u4E86\u79C1\u6709\u5316\u5904\u7406
    • \u5E95\u5C42 API \u63A5\u53E3\u6574\u4F53\u89E3\u8026\u5408\uFF0C\u4E3A\u517C\u5BB9\u66F4\u591A Hook Framework \u505A\u51C6\u5907
    • \u5C06\u90E8\u5206\u96C6\u6210\u4E8E API \u4E2D\u7684\u529F\u80FD\u79FB\u52A8\u5230 ksp-xposed \u4F9D\u8D56 (\u89E3\u8026\u5408)\uFF0C\u5355\u72EC\u5F15\u5165 api \u4F9D\u8D56\u5C06\u4E0D\u518D\u5305\u542B\u7B2C\u4E09\u65B9\u5E93\u7B49\u529F\u80FD\u7684\u5F15\u7528
    • \u6587\u6863 \u5FEB\u901F\u5F00\u59CB \u9875\u9762\u52A0\u5165 YukiHookAPI.Configs.isDebug \u4F55\u65F6\u9700\u8981\u5173\u95ED\u7684\u8BF4\u660E
    • \u89C4\u8303\u7C7B\u578B\u5B9A\u4E49\u4E2D\u7684 Java \u539F\u59CB\u7C7B\u578B (Primitive Type) \u5E76\u540C\u6B65\u66F4\u65B0\u5230\u6587\u6863
    • Java type \u65B0\u589E NumberClass \u7C7B\u578B
    • \u6539\u8FDB\u4E86 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u7684\u8BC6\u522B\u80FD\u529B
    • \u63A5\u7BA1\u4E86 Xposed \u6A21\u5757\u88C5\u8F7D\u540E\u7684\u5168\u90E8\u5F02\u5E38\uFF0C\u82E5\u53D1\u751F\u5F02\u5E38\u5C06\u4F1A\u81EA\u52A8\u62E6\u622A\u5E76\u6253\u5370\u9519\u8BEF\u65E5\u5FD7
    • \u4FEE\u6539\u7C7B\u578B\u5B9A\u4E49\u4E2D\u8F83\u4F4E Android \u7CFB\u7EDF\u7248\u672C (Android 5.0) \u4E2D\u4E0D\u5B58\u5728\u7684 Class \u4E3A\u7A7A\u5B89\u5168\u7C7B\u578B
    • \u9002\u914D\u5E76\u652F\u6301\u539F\u751F Xposed\uFF0C\u6700\u4F4E\u63A8\u8350\u7248\u672C\u4E3A Android 7.0
    • Hook \u5165\u53E3\u7C7B\u65B0\u589E\u652F\u6301\u58F0\u660E\u4E3A object \u7C7B\u578B (\u5355\u4F8B)
    • \u4FEE\u590D Android 8 \u4EE5\u4E0B\u7CFB\u7EDF\u4E0D\u652F\u6301 Executable \u7C7B\u578B\u5BFC\u81F4 Hook \u5931\u6548\u7684\u95EE\u9898
    • \u4FEE\u590D Android 9 \u4EE5\u4E0B\u7CFB\u7EDF\u5728\u4F7F\u7528 Activity \u4EE3\u7406\u529F\u80FD\u65F6\u62A5\u9519\u95EE\u9898\u5E76\u9650\u5236\u6B64\u529F\u80FD\u6700\u4F4E\u652F\u6301\u7248\u672C\u4E3A Android 7.0
    • \u65B0\u589E\u7981\u6B62\u8D44\u6E90\u6CE8\u5165\u4E0E Activity \u4EE3\u7406\u529F\u80FD\u6CE8\u5165\u5F53\u524D\u6A21\u5757\u81EA\u8EAB\u5B9E\u4F8B\u8FDB\u7A0B\uFF0C\u9632\u6B62\u53D1\u751F\u95EE\u9898
    • \u4FEE\u590D\u4E00\u4E2A Hook \u8FC7\u7A0B\u4E2D\u65B9\u6CD5\u8FD4\u56DE\u503C\u7684\u5BF9\u8C61\u662F\u76EE\u6807\u7684\u7EE7\u627F\u7C7B\u548C\u63A5\u53E3\u65F6\u88AB\u8BC6\u522B\u4E3A\u8FD4\u56DE\u503C\u4E0D\u7B26\u7684\u4E25\u91CD\u9519\u8BEF
    • \u4FEE\u590D\u5728\u5F53\u524D Hook \u7684\u5B9E\u4F8B\u5BF9\u8C61\u662F\u9759\u6001\u7684\u60C5\u51B5\u4E0B\u8C03\u7528 HookParam.callOriginal\u3001HookParam.invokeOriginal \u51FA\u73B0\u5BF9\u8C61\u4E3A\u7A7A\u95EE\u9898
    • \u4F18\u5316\u5BF9\u592A\u6781\u6FC0\u6D3B\u65B9\u6CD5\u76F8\u5173\u5224\u65AD\u529F\u80FD\u4EE5\u53CA\u540C\u6B65\u66F4\u65B0\u6587\u6863\u76F8\u5173\u8BF4\u660E
    • \u4F5C\u5E9F\u4E86 YukiHookAPI.Status.executorName\u3001YukiHookAPI.Status.executorVersion\uFF0C\u8BF7\u8F6C\u79FB\u5230 YukiHookAPI.Status.Executor
    • \u9002\u914D\u4E86\u4E00\u4E9B\u7B2C\u4E09\u65B9 Hook Framework \u7684 YukiHookAPI.Status.Executor.name \u540D\u79F0\u663E\u793A\u529F\u80FD
    • \u65B0\u589E Class.extends\u3001Class.implements \u7B49\u65B9\u6CD5\uFF0C\u53EF\u66F4\u52A0\u65B9\u4FBF\u5730\u5224\u65AD\u5F53\u524D Class \u7684\u7EE7\u627F\u4E0E\u63A5\u53E3\u5173\u7CFB
    • \u65B0\u589E Class.toClass\u3001Class.toClassOrNull \u7B49\u76F8\u5173\u65B9\u6CD5\u7684\u540C\u540D\u6CDB\u578B\u65B9\u6CD5\uFF0C\u53EF\u4F7F\u7528\u6CDB\u578B\u6765\u7EA6\u675F\u5DF2\u77E5 Class \u7684\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B
    • \u4FEE\u6539 classOf<T> \u65B9\u6CD5\u7684\u8FD4\u56DE\u503C\u4E3A\u6CDB\u578B T\uFF0C\u4EE5\u7EA6\u675F\u5DF2\u77E5 Class \u7684\u5B9E\u4F8B\u5BF9\u8C61\u7C7B\u578B
    • \u65B0\u589E Class \u76F8\u5173\u6269\u5C55\u65B9\u6CD5\u7684 initialize \u53C2\u6570\uFF0C\u53EF\u63A7\u5236\u5728\u5F97\u5230 Class \u5BF9\u8C61\u65F6\u662F\u5426\u540C\u65F6\u521D\u59CB\u5316\u5176\u9759\u6001\u65B9\u6CD5\u5757
    • \u53D8\u91CF\u3001\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u67E5\u627E\u529F\u80FD\u4E2D\u65B0\u589E param { ... }\u3001type { ... } \u7B49\u7528\u6CD5\uFF0C\u53EF\u5BF9\u67E5\u627E\u7684\u5BF9\u8C61\u589E\u52A0\u66F4\u52A0\u5177\u4F53\u7684\u6761\u4EF6\u5224\u65AD
    • PackageParam \u7684 loadApp \u65B9\u6CD5\u65B0\u589E isExcludeSelf \u53C2\u6570\uFF0C\u53EF\u7528\u4E8E\u6392\u9664 Hook \u76F8\u5173\u529F\u80FD\u6CE8\u5165\u6A21\u5757\u81EA\u8EAB\u5B9E\u4F8B\u8FDB\u7A0B
    • PackageParam \u7684 onAppLifecycle \u65B9\u6CD5\u65B0\u589E isOnFailureThrowToApp \u53C2\u6570\uFF0C\u53EF\u5C06\u751F\u547D\u5468\u671F\u65B9\u6CD5\u4F53\u5185\u53D1\u751F\u7684\u5F02\u5E38\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B
    • \u4FEE\u6539 PackageParam \u4E2D\u7684 appClassLoader \u4E3A\u53EF\u4FEE\u6539\u53D8\u91CF\uFF0C\u53EF\u5728 Hook \u8FC7\u7A0B\u4E2D\u52A8\u6001\u8BBE\u7F6E\u5BBF\u4E3B\u4F7F\u7528\u7684 ClassLoader
    • HookParam \u4E2D\u65B0\u589E dataExtra \u529F\u80FD\uFF0C\u53EF\u7528\u4E8E\u4E34\u65F6\u5B58\u50A8 Hook \u65B9\u6CD5\u4F53\u4E2D\u7684\u6570\u636E
    • \u4F5C\u5E9F YukiHookModulePrefs \u4E2D\u7684 isRunInNewXShareMode\u3001isXSharePrefsReadable\uFF0C\u7EDF\u4E00\u5408\u5E76\u5230 isPreferencesAvailable
    • Class.allFields\u3001Class.allMethods \u7B49\u76F8\u5173\u65B9\u6CD5\u65B0\u589E isAccessible \u53C2\u6570\uFF0C\u53EF\u63A7\u5236\u6210\u5458\u5BF9\u8C61\u4F55\u65F6\u53EF\u88AB\u8BBE\u7F6E\u4E3A\u53EF\u8BBF\u95EE\u7C7B\u578B
    • \u4FEE\u590D YukiHookDataChannel \u5B58\u5728\u591A\u4E2A\u5BBF\u4E3B\u65F6\u5728\u4E00\u4E2A Activity \u4E2D\u63A5\u6536\u76F8\u540C\u952E\u503C\u6570\u636E\u65F6\u4EC5\u4F1A\u56DE\u8C03\u6700\u540E\u4E00\u4E2A\u65B9\u6CD5\u4F53\u7684\u95EE\u9898
    • YukiHookDataChannel \u7684 wait \u7B49\u76F8\u5173\u65B9\u6CD5\u4E2D\u65B0\u589E priority \u53C2\u6570\uFF0C\u53EF\u4F20\u5165 ChannelPriority \u6765\u81EA\u5B9A\u4E49\u56DE\u8C03\u6570\u636E\u7ED3\u679C\u7684\u6761\u4EF6
    • YukiHookDataChannel \u65B0\u589E\u53D1\u9001\u6570\u636E\u65F6\u81EA\u52A8\u4F7F\u7528 ChannelDataWrapper \u7C7B\u578B\u5305\u88C5\u529F\u80FD\uFF0C\u63D0\u5347\u4F7F\u7528\u4F53\u9A8C\u5E76\u589E\u5F3A\u6570\u636E\u4FDD\u62A4
    • YukiHookDataChannel \u65B0\u589E\u9650\u5236\u4E00\u6B21\u6027\u53D1\u9001\u6570\u636E\u7684\u6700\u5927\u5B57\u8282\u5927\u5C0F\u529F\u80FD\uFF0C\u9632\u6B62\u6570\u636E\u8FC7\u5927\u9020\u6210 APP \u5D29\u6E83
    • YukiHookDataChannel \u65B0\u589E\u53D1\u9001\u6570\u636E\u8FC7\u5927\u65F6\u81EA\u52A8\u5206\u6BB5\u53D1\u9001\u529F\u80FD\uFF0C\u4EC5\u652F\u6301 List\u3001Map\u3001Set\u3001String \u7C7B\u578B
    • YukiHookLogger \u65B0\u589E contents \u65B9\u6CD5\u4E0E saveToFile \u7684 data \u53C2\u6570\uFF0C\u53EF\u4F20\u5165\u81EA\u5B9A\u4E49\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u8FDB\u884C\u683C\u5F0F\u5316\u6216\u4FDD\u5B58\u5230\u6587\u4EF6
    • \u4FEE\u590D YukiHookLogger \u5904\u7406\u540E\u7684\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E\u5305\u540D\u53EF\u80FD\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0D\u6B63\u786E\u7684\u95EE\u9898
    • \u4FEE\u590D Xposed \u6A21\u5757\u88C5\u8F7D\u8D44\u6E90\u94A9\u5B50 (Resources Hook) \u4E8B\u4EF6\u65F6\u5728\u90E8\u5206\u7CFB\u7EDF\u4E0A (\u90E8\u5206\u7CFB\u7EDF APP \u4E2D) \u5305\u540D\u53EF\u80FD\u4E0D\u6B63\u786E\u7684\u95EE\u9898
    ',1),m={id:"_1-1-4-2022-10-04",tabindex:"-1"},H=e("a",{class:"header-anchor",href:"#_1-1-4-2022-10-04","aria-hidden":"true"},"#",-1),P=o(" 1.1.4 | 2022.10.04 \u2002"),b=i("
    • \u4FEE\u590D YukiHookDataChannel \u53EF\u80FD\u4E0D\u80FD\u54CD\u5E94\u7CFB\u7EDF\u6846\u67B6\u4E2D\u54CD\u5E94\u5E7F\u64AD\u4E8B\u4EF6\u7684\u95EE\u9898\uFF0C\u5728 Android 13 \u4E2D\u590D\u73B0
    • \u4FEE\u590D YukiHookDataChannel \u957F\u8FBE\u591A\u4E2A\u7248\u672C\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u65E0\u6CD5\u4E0E\u6A21\u5757\u901A\u8BAF\u7684\u95EE\u9898
    • YukiHookDataChannel \u4E2D\u65B0\u589E obtainLoggerInMemoryData \u65B9\u6CD5\uFF0C\u53EF\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u5171\u4EAB\u8C03\u8BD5\u65E5\u5FD7\u6570\u636E
    • \u4FEE\u6539 YukiHookLogger.inMemoryData \u7684\u7C7B\u578B\u4E3A ArrayList \u5E76\u4FEE\u6539 YukiLoggerData \u4E3A data class
    • \u4FEE\u590D YukiLoggerData \u5728\u6A21\u5757\u4E2D\u5305\u540D\u4E3A\u7A7A\u6253\u5370\u7A7A\u767D\u7684\u95EE\u9898
    • PackageParam \u4E2D\u65B0\u589E loadApp\u3001loadZygote\u3001loadSystem\u3001withProcess \u7684\u540C\u540D\u591A\u53C2\u6570\u65B9\u6CD5
    • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),x={id:"_1-1-3-2022-09-30",tabindex:"-1"},C=e("a",{class:"header-anchor",href:"#_1-1-3-2022-09-30","aria-hidden":"true"},"#",-1),y=o(" 1.1.3 | 2022.09.30 \u2002"),A=e("ul",null,[e("li",null,"\u4FEE\u590D\u4E00\u4E2A\u65E0\u6CD5\u81EA\u5B9A\u4E49 Hook \u5165\u53E3\u7C7B\u540D\u7684\u81F4\u547D\u9519\u8BEF"),e("li",null,[o("\u6DFB\u52A0 "),e("code",null,"LoggerFactory"),o(" \u4E2D\u7684\u90E8\u5206\u4EE3\u7801\u6CE8\u91CA\u6587\u6848\u5E76\u66F4\u65B0\u7279\u8272\u529F\u80FD\u6587\u6863")])],-1),v={id:"_1-1-2-2022-09-30",tabindex:"-1"},Y=e("a",{class:"header-anchor",href:"#_1-1-2-2022-09-30","aria-hidden":"true"},"#",-1),M=o(" 1.1.2 | 2022.09.30 \u2002"),I=i('
    • \u6587\u6863 \u57FA\u7840\u77E5\u8BC6 \u9875\u9762\u65B0\u589E English \u7248\u672C\u53CB\u60C5\u94FE\u63A5
    • \u4FEE\u590D YukiBaseHooker \u6CE8\u91CA\u4E2D\u7684 English \u6587\u6863\u94FE\u63A5\u9519\u8BEF\u95EE\u9898
    • \u4FEE\u590D ModuleClassLoader \u4E2D\u7684 ClassCastException \u95EE\u9898
    • \u4FEE\u6B63\u5E76\u89C4\u8303\u90E8\u5206\u4EE3\u7801\u6CE8\u91CA
    • \u65B0\u589E ModuleClassLoader \u6392\u9664\u5217\u8868\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528 excludeHostClasses \u548C excludeModuleClasses \u65B9\u6CD5\u6765\u81EA\u5B9A\u4E49\u6392\u9664\u5217\u8868
    • \u65B0\u589E YukiLoggerData \u5B9E\u65F6\u65E5\u5FD7\u6570\u636E\u7C7B\uFF0C\u53EF\u5B9E\u65F6\u901A\u8FC7 YukiHookLogger.inMemoryData \u83B7\u53D6\u65E5\u5FD7\u6570\u7EC4
    • \u65B0\u589E ClassLoader.listOfClasses \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5\u83B7\u53D6\u5F53\u524D Dex \u4E2D\u7684\u5168\u90E8 Class
    ',1),R={id:"_1-1-1-2022-09-28",tabindex:"-1"},S=e("a",{class:"header-anchor",href:"#_1-1-1-2022-09-28","aria-hidden":"true"},"#",-1),X=o(" 1.1.1 | 2022.09.28 \u2002"),L=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E86\u6587\u6863 "),e("a",{href:"../guide/knowledge"},"\u57FA\u7840\u77E5\u8BC6"),o(" \u9875\u9762\u53CB\u60C5\u94FE\u63A5\u9519\u8BEF\u7684\u95EE\u9898")]),e("li",null,[o("\u4FEE\u590D\u4E86\u6587\u6863 "),e("code",null,"favicon"),o(" \u4E0D\u663E\u793A\u7684\u95EE\u9898")]),e("li",null,[o("\u4FEE\u590D "),e("code",null,"DexClassFinder"),o(" \u67E5\u627E\u6761\u4EF6\u4E2D\u7684 BUG")])],-1),F={id:"_1-1-0-2022-09-28",tabindex:"-1"},D=e("a",{class:"header-anchor",href:"#_1-1-0-2022-09-28","aria-hidden":"true"},"#",-1),B=o(" 1.1.0 | 2022.09.28 \u2002"),W=e("li",null,[o("\u8FD9\u662F\u4E00\u6B21\u5927\u7248\u672C\u66F4\u65B0\uFF0C\u6709\u5173\u66F4\u65B0\u65E5\u5FD7\u4E2D\u63D0\u5230\u7684\u53D8\u5316\u53CA\u7528\u6CD5\u8BF7\u53C2\u8003 "),e("a",{href:"../api/home"},"API \u6587\u6863"),o(" \u4EE5\u53CA "),e("a",{href:"../api/special-features/reflection"},"\u7279\u8272\u529F\u80FD")],-1),U=o("\u66F4\u6362\u5E2E\u52A9\u6587\u6863\u6846\u67B6\u5230 "),T={href:"https://v2.vuepress.vuejs.org",target:"_blank",rel:"noopener noreferrer"},w=o("VuePress"),G=i('
  • \u7EDF\u4E00\u5E76\u89C4\u8303\u6587\u6863\u4E2D\u7684\u672F\u8BED\u540D\u8BCD\uFF0C\u4F8B\u5982\u201C\u67E5\u8BE2\u201D\u4E00\u5F8B\u66F4\u6539\u4E3A\u4E86\u201C\u67E5\u627E\u201D\uFF0CXposedHelper \u62FC\u5199\u9519\u8BEF\u4FEE\u6539\u4E3A\u4E86 XposedHelpers
  • \u6587\u6863 \u57FA\u7840\u77E5\u8BC6 \u9875\u9762\u52A0\u5165\u53CB\u60C5\u94FE\u63A5\uFF0C\u4EC5\u9650\u7B80\u4F53\u4E2D\u6587
  • \u5C06 Hook App Demo \u7684 Class \u4E0E Method \u8F6C\u4E3A Java \u4EE5\u63D0\u4F9B\u66F4\u597D\u7684\u6F14\u793A\u6548\u679C
  • \u4FEE\u6B63\u4E86 Hook Module Demo \u4E2D\u7684\u4EE3\u7801\u6CE8\u91CA\u547D\u540D
  • \u91CD\u6784\u4E86\u5927\u91CF\u5E95\u5C42 Hook \u903B\u8F91\u53CA Xposed API \u7684\u5BF9\u63A5\u65B9\u5F0F
  • \u79FB\u9664\u4E86 HookParamWrapper\uFF0C\u73B0\u5DF2\u5C06\u5176\u76F4\u63A5\u4E0E YukiBridgeFactory \u5BF9\u63A5
  • \u79FB\u52A8\u90E8\u5206 YukiHookBridge \u4E2D\u7684\u65B9\u6CD5\u5230 AppParasitics
  • \u79FB\u9664\u4E86 HookParam.args \u4E0E\u5E95\u5C42\u7684\u76F4\u63A5\u5BF9\u63A5\u65B9\u6CD5 setArgs\uFF0C\u76F4\u63A5\u83B7\u53D6\u5E76\u8BBE\u7F6E\u5F53\u524D\u6570\u7EC4\u7684\u5BF9\u8C61
  • \u4F18\u5316\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\uFF0C\u5C06\u5F15\u7528\u7684 jar \u5408\u5E76\u5230 stub \u9879\u76EE
  • ',9),E=o("\u4FEE\u590D\u591A\u9879\u76EE\u6253\u5305\u65F6\u6A21\u5757\u5305\u540D\u65E0\u6CD5\u6B63\u786E\u5339\u914D\u7684\u95EE\u9898\u4EE5\u53CA\u4FEE\u6539\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7684\u6A21\u5757\u5305\u540D\u5339\u914D\u903B\u8F91\uFF0C\u611F\u8C22 "),N={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},O=o("5ec1cff"),j=o(" \u7684\u53CD\u9988\u53CA\u63D0\u4F9B\u7684\u89E3\u51B3\u65B9\u6848"),z=i("
  • \u5BF9 API \u79C1\u6709\u5DE5\u5177\u7C7B\u7684\u65B9\u6CD5\u8FDB\u884C\u4E86 internal \u95ED\u5305\u5904\u7406\uFF0C\u907F\u514D\u6C61\u67D3\u9876\u7EA7\u547D\u540D\u7A7A\u95F4
  • \u4FEE\u6B63\u4E86\u6240\u6709\u53CD\u5C04\u548C Hook \u7C7B\u7684 Creater \u547D\u540D\u5230 Creator
  • \u65B0\u589E YukiHookAPI.Status.compiledTimestamp \u529F\u80FD\uFF0C\u53EF\u4EE5\u5728\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u65F6\u83B7\u53D6\u7F16\u8BD1\u5B8C\u6210\u7684\u65F6\u95F4\u6233
  • \u65B0\u589E YukiHookAPI.Status.isXposedEnvironment \u529F\u80FD\uFF0C\u53EF\u4EE5\u5224\u65AD\u5F53\u524D\u4E3A (Xposed) \u5BBF\u4E3B\u73AF\u5883\u8FD8\u662F\u6A21\u5757\u73AF\u5883
  • \u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\u8FDB\u884C\u4E86\u5927\u6539\u7248\uFF0C\u73B0\u5DF2\u5C06 YukiHookAPI.Configs.debugTag \u7B49\u529F\u80FD\u5408\u5E76\u5230 YukiHookLogger.Configs \u4E2D
  • \u8C03\u8BD5\u65E5\u5FD7\u65B0\u589E\u53EF\u6307\u5B9A\u6253\u5370\u4F7F\u7528\u7684\u65B9\u6CD5\u4E3A XposedBridge.log \u6216 Logd
  • \u8C03\u8BD5\u65E5\u5FD7\u4E2D\u9ED8\u8BA4\u52A0\u5165\u5F53\u524D\u5BBF\u4E3B\u7684\u5305\u540D\u4EE5\u53CA\u5F53\u524D\u7528\u6237 ID\uFF0C\u4EE5\u4F9B\u8C03\u8BD5\uFF0C\u4F60\u53EF\u4EE5\u5728 debugLog \u914D\u7F6E\u4E2D\u81EA\u884C\u66F4\u6539
  • \u65B0\u589E generic \u529F\u80FD\uFF0C\u53EF\u5BF9\u6CDB\u578B\u8FDB\u884C\u53CD\u5C04\u548C\u8C03\u7528\uFF0C\u4F60\u53EF\u4EE5\u5728 Class \u6216 CurrentClass \u4E2D\u4F7F\u7528\u5B83
  • \u4F5C\u5E9F buildOfAny \u65B9\u6CD5\uFF0C\u73B0\u5728\u8BF7\u76F4\u63A5\u4F7F\u7528 buildOf \u65B9\u6CD5 (\u4E0D\u5E26\u6CDB\u578B) \u6765\u4F7F\u7528\u6784\u9020\u65B9\u6CD5\u521B\u5EFA\u65B0\u5BF9\u8C61\u5E76\u5F97\u5230\u7ED3\u679C Any
  • \u4FEE\u590D hasExtends \u4F7F\u7528\u8FC7\u7A0B\u53D1\u751F\u7A7A\u6307\u9488\u5F02\u5E38\u7684\u95EE\u9898
  • CurrentClass \u65B0\u589E\u975E lambda \u65B9\u5F0F\u7684\u8C03\u7528\u65B9\u6CD5
  • CurrentClass \u65B0\u589E name \u4E0E simpleName \u529F\u80FD
  • \u5B8C\u5168\u91CD\u5199 ReflectionTool \u7684\u6838\u5FC3\u65B9\u6CD5\uFF0C\u5C06\u4E0D\u540C\u7684\u67E5\u627E\u6761\u4EF6\u8FDB\u884C\u4E86\u6574\u7406\u5206\u7C7B
  • \u4FEE\u590D ReflectionTool \u4E2D\u53EF\u80FD\u7684\u76F4\u63A5\u8C03\u7528 declared \u83B7\u53D6\u7684 Member \u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898
  • \u4FEE\u590D ReflectionTool \u4E2D UndefinedType \u672A\u5728 Method \u4E0E Constructor \u6761\u4EF6\u4E2D\u6B63\u786E\u5224\u65AD\u7684\u95EE\u9898
  • \u65B0\u589E\u53CD\u5C04\u67E5\u627E\u7ED3\u679C\u53D1\u751F\u5F02\u5E38\u65F6\u7684\u53CB\u597D\u63D0\u793A\u65B9\u5F0F\uFF0C\u53EF\u5177\u4F53\u5B9A\u4F4D\u5230\u6307\u5B9A\u6761\u4EF6\u627E\u4E0D\u5230 Member \u7684\u95EE\u9898
  • \u53CD\u5C04\u67E5\u627E Method\u3001Constructor \u4E2D\u65B0\u589E VagueType \u6761\u4EF6\uFF0C\u53EF\u4F7F\u7528\u5728 param \u6761\u4EF6\u4E2D\u7528\u4E8E\u5FFD\u7565\u4F60\u4E0D\u60F3\u586B\u5199\u7684\u53C2\u6570
  • \u53CD\u5C04\u67E5\u627E Method\u3001Constructor \u4E2D\u65B0\u589E paramCount { ... } \u6761\u4EF6\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u76F4\u63A5\u62FF\u5230\u5176\u4E2D\u7684 it \u6765\u81EA\u5B9A\u4E49\u4F60\u7684\u5224\u65AD\u6761\u4EF6
  • FieldFinder \u7ED3\u679C\u4E2D\u65B0\u589E current \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5\u5BF9\u7ED3\u679C\u5B9E\u4F8B\u521B\u5EFA\u8C03\u7528\u7A7A\u95F4
  • \u4FEE\u6539\u4E86\u53CD\u5C04\u67E5\u627E\u529F\u80FD\u4E2D\u7684 modifiers \u6761\u4EF6\u4EE5\u53CA name \u6761\u4EF6\uFF0C\u73B0\u5728\u4F60\u9700\u8981\u5BF9\u6B64\u65B9\u6CD5\u4F53\u7ED3\u5C3E\u8FD4\u56DE\u4E00\u4E2A Boolean \u4EE5\u4F7F\u6761\u4EF6\u6210\u7ACB
  • ",20),V=e("code",null,"ModifierRules",-1),Z=o(" \u4E2D\u7684 "),K=e("code",null,"as*",-1),J=o(" \u529F\u80FD\u6539\u540D\u4E3A "),q=e("code",null,"is*",-1),Q=o("\uFF0C\u611F\u8C22 "),$={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},ee=o("Kitsune"),oe=o(" \u7684\u5EFA\u8BAE"),de=i("
  • FieldFinder \u4E2D\u65B0\u589E RemedyPlan \u529F\u80FD
  • \u65B0\u589E Dex \u4E2D\u7684 Class \u6A21\u7CCA\u67E5\u627E\u529F\u80FD (Beta)\uFF0C\u4F60\u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 searchClass \u529F\u80FD\u6765\u4F7F\u7528\u6307\u5B9A\u6761\u4EF6\u6A21\u7CCA\u67E5\u627E Class
  • ",2),ce=o("\u65B0\u589E\u53CD\u5C04\u67E5\u627E\u4E2D\u7684\u591A\u91CD\u67E5\u627E\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528\u76F8\u5BF9\u67E5\u627E\u6761\u4EF6\u540C\u65F6\u83B7\u53D6\u591A\u4E2A\u67E5\u627E\u7ED3\u679C\uFF0C\u611F\u8C22 "),ie=e("strong",null,"AA",-1),le=o(" \u4EE5\u53CA "),te={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},se=o("Kitsune"),ne=o(" \u7684\u5EFA\u8BAE"),ae=o("\u4FEE\u590D "),re=e("code",null,"appClassLoader",-1),_e=o(" \u83B7\u53D6\u5230\u7684\u5BF9\u8C61\u5728\u67D0\u4E9B\u7CFB\u7EDF\u4E2D\u7684\u7CFB\u7EDF\u5E94\u7528\u4E2D\u4E0D\u6B63\u786E\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),he={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},ue=o("Luckyzyx"),ke=o(" \u7684\u53CD\u9988"),pe=e("li",null,[o("\u4FEE\u6539\u4E86 "),e("code",null,"XposedBridge.invokeOriginalMethod"),o(" \u7684\u8C03\u7528\u65B9\u5F0F\u5E76\u5728 "),e("code",null,"MethodFinder.Result.Instance"),o(" \u4E2D\u589E\u52A0 "),e("code",null,"original"),o(" \u529F\u80FD")],-1),ge=o("\u4FEE\u590D "),fe=e("code",null,"YukiHookModulePrefs",-1),me=o(" \u4E2D "),He=e("code",null,"getStringSet",-1),Pe=o(" \u65B9\u6CD5\u53D6\u503C\u9519\u8BEF\u7684\u95EE\u9898\u5E76\u4F18\u5316\u4EE3\u7801\u98CE\u683C\uFF0C\u611F\u8C22 "),be={href:"https://github.com/Teddy-Zhu",target:"_blank",rel:"noopener noreferrer"},xe=o("Teddy_Zhu"),Ce=o(" \u7684 "),ye={href:"https://github.com/fankes/YukiHookAPI/pull/19",target:"_blank",rel:"noopener noreferrer"},Ae=o("PR"),ve=e("li",null,[o("\u4FEE\u6539 "),e("code",null,"YukiHookModulePrefs"),o("\uFF0C\u62E6\u622A "),e("code",null,"XSharePreference"),o(" \u53EF\u80FD\u4E0D\u5B58\u5728\u7684\u5F02\u5E38")],-1),Ye=e("li",null,[o("\u4FEE\u590D "),e("code",null,"YukiHookDataChannel"),o(" \u5728\u67D0\u4E9B\u7B2C\u4E09\u65B9 ROM \u7CFB\u7EDF\u6846\u67B6\u4E2D\u65E0\u6CD5\u6CE8\u518C\u6210\u529F\u7684\u95EE\u9898")],-1),Me=e("li",null,[o("\u5B89\u5168\u5316 "),e("code",null,"YukiHookDataChannel"),o("\uFF0C\u73B0\u5728\u5B83\u53EA\u80FD\u5728\u6765\u81EA\u6307\u5B9A\u5305\u540D\u7684\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u901A\u4FE1")],-1),Ie=o("\u65B0\u589E\u81EA\u52A8 Hook "),Re=e("code",null,"SharedPreferences",-1),Se=o(" \u4EE5\u4FEE\u590D\u90E8\u5206\u7CFB\u7EDF\u4E2D\u6587\u4EF6\u6743\u9650\u4E0D\u662F "),Xe=e("code",null,"0664",-1),Le=o(" \u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Fe={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},De=o("5ec1cff"),Be=o(" \u7684\u53CD\u9988\u53CA\u63D0\u4F9B\u7684\u5B9E\u73B0\u4EE3\u7801"),We=i("
  • \u65B0\u589E YukiHookAPI.Configs.isEnableHookSharedPreferences \u529F\u80FD\uFF0C\u9ED8\u8BA4\u5173\u95ED\uFF0C\u82E5 SharedPreferences \u7684\u6743\u9650\u9519\u8BEF\u53EF\u8FDB\u884C\u542F\u7528
  • \u4FEE\u590D\u67E5\u627E Constructor \u65F6\u65E0\u53C2\u6784\u9020\u65B9\u6CD5\u5728\u4E0D\u586B\u5199\u67E5\u627E\u6761\u4EF6\u65F6\u65E0\u6CD5\u627E\u5230\u7684 BUG\uFF0C\u611F\u8C22 B5 KAKA \u7684\u53CD\u9988
  • \u5206\u79BB\u4F4D\u4E8E injectMember \u4E2D method\u3001constructor \u7684 Result \u5B9E\u4F8B\u5230 Process
  • \u5728 Hook \u8FC7\u7A0B\u4E2D\u65B0\u589E useDangerousOperation \u65B9\u6CD5\uFF0C\u672A\u8FDB\u884C\u58F0\u660E\u65F6\u5728 Hook \u5371\u9669\u5217\u8868\u4E2D\u7684\u529F\u80FD\u540E\u4F1A\u81EA\u52A8\u505C\u6B62 Hook \u5E76\u6253\u5370\u9519\u8BEF
  • \u65B0\u589E\u6A21\u5757\u8D44\u6E90\u6CE8\u5165\u4E0E Activity \u4EE3\u7406\u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u8C03\u7528 injectModuleAppResources \u53CA registerModuleAppActivities \u6765\u4F7F\u7528
  • \u65B0\u589E ModuleContextThemeWrapper \u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u8C03\u7528 applyModuleTheme \u5728\u4EFB\u610F Activity \u4E2D\u521B\u5EFA\u6A21\u5757\u7684 Context
  • \u65B0\u589E ClassLoader.onLoadClass \u529F\u80FD\uFF0C\u53EF\u7528\u4E8E\u76D1\u542C ClassLoader \u7684 loadClass \u65B9\u6CD5\u88AB\u8C03\u7528\u7684\u4E8B\u4EF6
  • \u4F5C\u5E9F\u4E86 classOf \u4E0E clazz \u6269\u5C55\u65B9\u6CD5\uFF0C\u65B0\u589E toClass \u4EE5\u53CA toClassOrNull \u7528\u6CD5\uFF0C\u8BF7\u73B0\u5728\u8F6C\u79FB\u5230\u65B0\u7684\u65B9\u6CD5
  • VariousClass \u65B0\u589E getOrNull \u65B9\u6CD5\uFF0C\u53EF\u5728\u5339\u914D\u4E0D\u5230 Class \u7684\u65F6\u5019\u4E0D\u629B\u51FA\u5F02\u5E38\u800C\u662F\u8FD4\u56DE null
  • PackageParam.hook \u4E2D\u79FB\u9664\u4E86 isUseAppClassLoader \u53C2\u6570\uFF0C\u4FEE\u6539\u4E3A isForceUseAbsolute \u5E76\u81EA\u52A8\u5339\u914D\u76EE\u6807 Class
  • PackageParam \u65B0\u589E systemContext \u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u5728\u4EFB\u610F\u65F6\u95F4\u8C03\u7528\u6B64\u529F\u80FD\u83B7\u53D6\u4E00\u4E2A\u6301\u4E45\u5316\u7684 Context
  • \u4E0D\u518D\u5BF9\u5916\u5F00\u653E HookClass \u4E2D\u7684\u4EFB\u4F55\u65B9\u6CD5
  • HookParam \u4E2D\u65B0\u589E throwToApp \u529F\u80FD\uFF0C\u53EF\u5C06\u5F02\u5E38\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B
  • Hook \u56DE\u8C03\u4E2D\u65B0\u589E onFailureThrowToApp \u529F\u80FD\uFF0C\u53EF\u5728\u53D1\u751F\u5F02\u5E38\u65F6\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B
  • \u4FEE\u6539\u4E86\u8C03\u8BD5\u65E5\u5FD7\u7684\u6253\u5370\u903B\u8F91\uFF0C\u53CD\u5C04\u67E5\u627E\u529F\u80FD\u4E2D\u7684\u8017\u65F6\u8BB0\u5F55\u4EC5\u4F1A\u5728 Hook \u8FC7\u7A0B\u4E2D\u8FDB\u884C\u6253\u5370
  • Hook \u8FC7\u7A0B\u4E2D\u65B0\u589E\u89E3\u9664 Hook \u529F\u80FD\uFF0C\u53EF\u4F7F\u7528 remove \u53CA removeSelf \u65B9\u6CD5\u89E3\u9664 Hook
  • \u4FEE\u590D\u5728 ReplaceHook \u5931\u8D25\u7684\u65F6\u5019\u5BFC\u81F4\u5BBF\u4E3B\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u73B0\u4FEE\u6539\u4E3A\u8C03\u7528\u539F\u59CB\u65B9\u6CD5\u4FDD\u8BC1\u5BBF\u4E3B\u529F\u80FD\u6B63\u5E38\u8FD0\u884C
  • \u65B0\u589E Hook \u8FC7\u7A0B\u4E2D\u5BF9\u65B9\u6CD5\u8FD4\u56DE\u503C\u7684\u68C0\u67E5\u529F\u80FD\uFF0C\u5728\u8FD4\u56DE\u503C\u4E0D\u5339\u914D\u7684\u60C5\u51B5\u4E0B\u4F1A\u6839\u636E\u60C5\u666F\u81EA\u52A8\u629B\u51FA\u5F02\u5E38\u6216\u6253\u5370\u9519\u8BEF
  • ",18),Ue=o("Resources Hook \u4E2D\u65B0\u589E "),Te=e("code",null,"array",-1),we=o(" \u7C7B\u578B\uFF0C\u611F\u8C22 "),Ge={href:"https://github.com/GSWXXN",target:"_blank",rel:"noopener noreferrer"},Ee=o("GSWXXN"),Ne=o(" \u7684 "),Oe={href:"https://github.com/fankes/YukiHookAPI/pull/12",target:"_blank",rel:"noopener noreferrer"},je=o("PR"),ze=e("li",null,[o("\u79FB\u52A8 "),e("code",null,"me.weishu.reflection"),o(" \u5230 "),e("code",null,"thirdparty"),o(" \u9632\u6B62\u540C\u65F6\u5F15\u5165\u7684\u540C\u540D\u4F9D\u8D56\u51B2\u7A81")],-1),Ve=e("li",null,"\u79FB\u9664 Hook \u65B9\u6CD5\u4F53\u4E3A\u7A7A\u65F6\u629B\u51FA\u7684\u5F02\u5E38\uFF0C\u4FEE\u6539\u4E3A\u6253\u5370\u8B66\u544A\u65E5\u5FD7",-1),Ze=e("li",null,[o("\u4FEE\u6539 "),e("code",null,"AppLifecycle"),o(" \u7684\u5F02\u5E38\u5904\u7406\u903B\u8F91\uFF0C\u5F53\u5176\u53D1\u751F\u5F02\u5E38\u65F6\u76F4\u63A5\u629B\u7ED9\u5BBF\u4E3B")],-1),Ke=e("li",null,"\u66F4\u65B0 Demo \u7684 API \u7248\u672C\u5230 33",-1),Je={id:"_1-0-92-2022-05-31",tabindex:"-1"},qe=e("a",{class:"header-anchor",href:"#_1-0-92-2022-05-31","aria-hidden":"true"},"#",-1),Qe=o(" 1.0.92 | 2022.05.31 \u2002"),$e=i("
    • \u4FEE\u6B63\u4E86\u5927\u91CF\u65B9\u6CD5\u4E2D callback \u7684\u547D\u540D\u65B9\u6CD5
    • \u66F4\u6362\u65B9\u6848\u518D\u6B21\u4FEE\u590D YukiHookDataChannel \u5728\u4F4E\u4E8E Android 12 \u7684\u8BBE\u5907\u4E0A\u4E0D\u80FD\u56DE\u8C03\u5F53\u524D Activity \u5E7F\u64AD\u7684\u95EE\u9898
    • InjectYukiHookWithXposed \u6CE8\u89E3\u65B0\u589E isUsingResourcesHook \u529F\u80FD\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u9009\u62E9\u6027\u5173\u95ED\u81EA\u52A8\u751F\u6210 IXposedHookInitPackageResources \u7684\u4F9D\u8D56\u63A5\u53E3\u4E86
    ",1),eo={id:"_1-0-91-2022-05-29",tabindex:"-1"},oo=e("a",{class:"header-anchor",href:"#_1-0-91-2022-05-29","aria-hidden":"true"},"#",-1),co=o(" 1.0.91 | 2022.05.29 \u2002"),io=o("\u4FEE\u590D\u90E8\u5206\u8BBE\u5907\u7684\u5B9A\u5236\u7CFB\u7EDF\u5728 LSPosed \u73AF\u5883\u4E0B\u5F00\u673A\u542F\u52A8\u83B7\u53D6\u7684 "),lo=e("code",null,"ClassLoader",-1),to=o(" \u9519\u8BEF\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),so={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},no=o("Luckyzyx"),ao=o(" \u7684\u53CD\u9988"),ro=i("
  • \u4FEE\u590D YukiHookDataChannel \u5728 ZUI \u4EE5\u53CA\u4F4E\u4E8E Android 12 \u7684\u7CFB\u7EDF\u4E0A\u4E0D\u80FD\u56DE\u8C03\u5F53\u524D Activity \u5E7F\u64AD\u7684\u95EE\u9898
  • \u6574\u5408 YukiHookModuleStatus \u529F\u80FD\u5230 YukiHookAPI.Status\uFF0C\u91CD\u5199\u4E86\u5927\u91CF\u65B9\u6CD5\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u53CC\u5411\u5224\u65AD\u6A21\u5757\u6FC0\u6D3B\u7B49\u72B6\u6001\u4FE1\u606F
  • ",2),_o={id:"_1-0-90-2022-05-27",tabindex:"-1"},ho=e("a",{class:"header-anchor",href:"#_1-0-90-2022-05-27","aria-hidden":"true"},"#",-1),uo=o(" 1.0.90 | 2022.05.27 \u2002"),ko=i("
    • \u4FEE\u590D YukiHookDataChannel \u5728\u6A21\u5757\u8BBE\u7F6E\u76D1\u542C\u56DE\u8C03\u65F6\u95EA\u9000\u7684\u95EE\u9898
    • \u4FEE\u590D YukiHookDataChannel \u5728\u975E\u5F53\u524D Activity \u60C5\u51B5\u4E0B\u4F9D\u7136\u4F1A\u56DE\u8C03\u7684\u95EE\u9898
    • \u79FB\u9664 YukiHookDataChannel \u56DE\u8C03\u4E8B\u4EF6\u7684\u9ED8\u8BA4\u503C\uFF0C\u6CA1\u6709\u5373\u4E0D\u56DE\u8C03
    • \u79FB\u9664 YukiHookModulePrefs \u5728 XShare \u4E0D\u53EF\u8BFB\u7684\u60C5\u51B5\u4E0B\u6253\u5370\u7684\u8B66\u544A
    • \u65B0\u589E YukiHookModulePrefs \u4E2D\u7684 isXSharePrefsReadable \u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D\u7684 XShare \u662F\u5426\u53EF\u7528
    ",1),po={id:"_1-0-89-2022-05-26",tabindex:"-1"},go=e("a",{class:"header-anchor",href:"#_1-0-89-2022-05-26","aria-hidden":"true"},"#",-1),fo=o(" 1.0.89 | 2022.05.26 \u2002"),mo=i("
    • \u4FEE\u590D YukiHookDataChannel \u4E0D\u80FD\u91CD\u590D\u8BBE\u7F6E\u76D1\u542C\u7684\u95EE\u9898\uFF0C\u5E76\u52A0\u5165\u5728\u6A21\u5757\u4E0D\u540C Activity \u4E2D\u91CD\u590D\u54CD\u5E94\u548C\u81EA\u52A8\u8DDF\u968F Activity \u9500\u6BC1\u76D1\u542C\u529F\u80FD
    • \u65B0\u589E YukiHookDataChannel \u91CD\u590D\u76D1\u542C\u7528\u4F8B\u8BF4\u660E\u6587\u6863
    • \u52A0\u5165 onAlreadyHooked \u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D\u65B9\u6CD5\u662F\u5426\u88AB\u91CD\u590D Hook
    • \u4FEE\u6539\u90E8\u5206\u91CD\u590D\u6DFB\u52A0 HashMap \u7684\u903B\u8F91\uFF0C\u79FB\u9664 putIfAbsent \u65B9\u6CD5\uFF0C\u5141\u8BB8\u8986\u76D6\u6DFB\u52A0
    • \u4FEE\u590D\u4E86\u51E0\u5904\u53EF\u80FD\u7684 BUG
    ",1),Ho={id:"_1-0-88-2022-05-25",tabindex:"-1"},Po=e("a",{class:"header-anchor",href:"#_1-0-88-2022-05-25","aria-hidden":"true"},"#",-1),bo=o(" 1.0.88 | 2022.05.25 \u2002"),xo=i("
    • \u5BF9 Xposed API \u5B8C\u5168\u89E3\u8026\u5408
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
    • \u5C06 YukiHookModuleStatus \u4ECE\u81EA\u52A8\u751F\u6210\u4EE3\u7801\u4E2D\u5206\u79BB\uFF0C\u5E76\u52A0\u5165 isEnableHookModuleStatus \u7684\u5F00\u5173\uFF0C\u7531\u4F60\u51B3\u5B9A\u662F\u5426\u542F\u7528
    • \u5BF9 API \u5927\u91CF\u7C7B\u7684\u6784\u9020\u65B9\u6CD5\u8FDB\u884C\u4E86 internal \u95ED\u5305\u5904\u7406
    • \u5C06 YukiHookModulePrefs \u8BBE\u7F6E\u4E3A\u5355\u4F8B\u8FD0\u884C\uFF0C\u9632\u6B62\u91CD\u590D\u521B\u5EFA\u6D6A\u8D39\u7CFB\u7EDF\u8D44\u6E90
    • \u4FEE\u590D\u81EA 1.0.80 \u7248\u672C\u540E\u65E0\u6CD5\u5D4C\u5957 Hook \u7684 BUG\uFF0C\u5E76\u4F18\u5316\u5D4C\u5957 Hook \u76F8\u5173\u529F\u80FD
    • \u4FEE\u6539 Hooker \u5B58\u50A8\u65B9\u6848\u7531 HashSet \u5230 HashMap\uFF0C\u9632\u6B62\u91CD\u590D\u6DFB\u52A0 Hooker \u7684\u95EE\u9898
    • \u4FEE\u6539 Hook \u6838\u5FC3\u5B9E\u73B0\u65B9\u6CD5\uFF0C\u52A0\u5165\u67E5\u91CD\uFF0C\u907F\u514D\u91CD\u590D Hook \u591A\u6B21\u56DE\u8C03 HookParam \u65B9\u6CD5
    • MethodFinder \u4E0E FieldFinder \u52A0\u5165\u67E5\u627E\u6A21\u7CCA\u65B9\u6CD5\u3001\u53D8\u91CF\u540D\u79F0\u529F\u80FD\uFF0C\u53EF\u8C03\u7528 name { ... } \u6765\u8BBE\u7F6E\u67E5\u627E\u6761\u4EF6\uFF0C\u652F\u6301\u6B63\u5219
    • \u4F18\u5316\u5E76\u4FEE\u6539 appContext \u7684\u83B7\u53D6\u65B9\u5F0F\uFF0C\u964D\u4F4E\u4F1A\u53D6\u5230\u7A7A\u7684\u95EE\u9898\u7684\u53EF\u80FD\u6027
    • \u4FEE\u6539\u81EA\u52A8\u751F\u6210\u7684\u4EE3\u7801\u4E2D logger \u7684\u6253\u5370 TAG \u9ED8\u8BA4\u4E3A\u4F60\u81EA\u5B9A\u4E49\u7684\u540D\u79F0\uFF0C\u65B9\u4FBF\u8FDB\u884C\u8C03\u8BD5
    • \u4F18\u5316 YukiHookBridge \u7684 Hooker \u5B9E\u73B0\u65B9\u5F0F\uFF0C\u63D0\u5347 Hook \u6027\u80FD
    • PackageParam \u589E\u52A0 onAppLifecycle \u65B9\u6CD5\uFF0C\u53EF\u539F\u751F\u76D1\u542C\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\u4EE5\u53CA\u5B9E\u73B0\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u529F\u80FD
    • \u65B0\u589E YukiHookDataChannel \u529F\u80FD\uFF0C\u53EF\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4FDD\u6301\u5B58\u6D3B\u7684\u60C5\u51B5\u4E0B\u4F7F\u7528\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u8FDB\u884C\u901A\u8BAF
    • YukiHookDataChannel \u589E\u52A0 checkingVersionEquals \u65B9\u6CD5\uFF0C\u53EF\u901A\u8FC7\u76D1\u542C\u6765\u9A8C\u8BC1\u6A21\u5757\u66F4\u65B0\u540E\u5BBF\u4E3B\u5E76\u672A\u66F4\u65B0\u7248\u672C\u4E0D\u5339\u914D\u95EE\u9898
    • demo-module \u7684\u793A\u4F8B\u4EE3\u7801\u4E2D\u65B0\u589E Java \u7248\u672C\u7684\u793A\u4F8B\uFF0C\u4EC5\u4F9B\u53C2\u8003
    ",1),Co={id:"_1-0-87-2022-05-10",tabindex:"-1"},yo=e("a",{class:"header-anchor",href:"#_1-0-87-2022-05-10","aria-hidden":"true"},"#",-1),Ao=o(" 1.0.87 | 2022.05.10 \u2002"),vo=e("ul",null,[e("li",null,[o("\u65B0\u589E "),e("code",null,"refreshModuleAppResources"),o(" \u529F\u80FD\uFF0C\u4EE5\u9002\u914D\u8BED\u8A00\u533A\u57DF\u3001\u5B57\u4F53\u5927\u5C0F\u3001\u5206\u8FA8\u7387\u6539\u53D8\u7B49\u60C5\u51B5\u4E0B\u7684 Resources \u5237\u65B0")]),e("li",null,[o("\u65B0\u589E "),e("code",null,"isEnableModuleAppResourcesCache"),o(" \u529F\u80FD\uFF0C\u53EF\u81EA\u884C\u8BBE\u7F6E\u662F\u5426\u81EA\u52A8\u7F13\u5B58\u5F53\u524D\u6A21\u5757\u7684 Resources")])],-1),Yo={id:"_1-0-86-2022-05-06",tabindex:"-1"},Mo=e("a",{class:"header-anchor",href:"#_1-0-86-2022-05-06","aria-hidden":"true"},"#",-1),Io=o(" 1.0.86 | 2022.05.06 \u2002"),Ro=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E0D\u652F\u6301 Resources Hook(\u8D44\u6E90\u94A9\u5B50) \u7684\u60C5\u51B5\u4E0B\u5728 "),e("code",null,"initZygote"),o(" \u65F6\u6301\u7EED\u62A5\u9519\u7684\u95EE\u9898\uFF0C\u590D\u73B0\u5728 "),e("strong",null,"ZUI"),o("/"),e("strong",null,"LSPosed CI(1.8.3-6550)")]),e("li",null,"\u4F18\u5316\u5E76\u5BF9 Resources Hook \u8FDB\u884C\u5F02\u5E38\u5904\u7406\uFF0C\u53EA\u6709\u88AB\u4F7F\u7528\u540E\u4E0D\u652F\u6301\u624D\u4F1A\u6253\u5370\u9519\u8BEF\u548C\u8B66\u544A")],-1),So={id:"_1-0-85-2022-05-04",tabindex:"-1"},Xo=e("a",{class:"header-anchor",href:"#_1-0-85-2022-05-04","aria-hidden":"true"},"#",-1),Lo=o(" 1.0.85 | 2022.05.04 \u2002"),Fo=i("
    • \u4FEE\u590D\u65E0\u6CD5 Hook \u7CFB\u7EDF\u6846\u67B6\u7684\u4E25\u91CD\u95EE\u9898\uFF0C\u4ECE 1.0.80 \u5F00\u59CB\u51FA\u73B0
    • \u8C03\u8BD5\u65E5\u5FD7\u4E2D\u65B0\u589E\u533A\u5206 initZygote \u88C5\u8F7D\u7684\u5305\u540D\u4E3A android-zygote\uFF0CpackageName \u4FDD\u6301 android \u4E0D\u53D8
    ",1),Do={id:"_1-0-83-2022-05-04",tabindex:"-1"},Bo=e("a",{class:"header-anchor",href:"#_1-0-83-2022-05-04","aria-hidden":"true"},"#",-1),Wo=o(" 1.0.83 | 2022.05.04 \u2002"),Uo=e("ul",null,[e("li",null,[o("\u4FEE\u590D "),e("code",null,"YukiHookModuleStatus"),o(" \u5728 "),e("code",null,"loadSystem"),o(" \u540E\u5927\u91CF\u62A5\u9519\u7684\u95EE\u9898")]),e("li",null,[o("\u65B0\u589E "),e("code",null,"type"),o(" \u4E2D\u7684 "),e("code",null,"android"),o(" \u7C7B\u578B")]),e("li",null,"\u66F4\u65B0\u5E2E\u52A9\u6587\u6863\u7684\u793A\u4F8B\u8BF4\u660E")],-1),To={id:"_1-0-82-2022-05-04",tabindex:"-1"},wo=e("a",{class:"header-anchor",href:"#_1-0-82-2022-05-04","aria-hidden":"true"},"#",-1),Go=o(" 1.0.82 | 2022.05.04 \u2002"),Eo=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4E86\u4E00\u5904\u6982\u5FF5\u6DF7\u6DC6\u9519\u8BEF\uFF0C\u533A\u5206 "),e("code",null,"initZygote"),o(" \u4E0E\u7CFB\u7EDF\u6846\u67B6\u7684\u5173\u7CFB\uFF0C\u4E4B\u524D\u7684\u6CE8\u91CA\u548C\u6587\u6863\u6709\u95EE\u9898\uFF0C\u975E\u5E38\u62B1\u6B49")]),e("li",null,[e("code",null,"PackageParam"),o(" \u65B0\u589E "),e("code",null,"loadSystem"),o(" \u65B9\u6CD5\uFF0C\u4E0D\u9700\u8981\u518D\u5199 "),e("code",null,'loadApp(name = "android")'),o(" \u5373\u53EF Hook \u7CFB\u7EDF\u6846\u67B6")])],-1),No={id:"_1-0-81-2022-05-04",tabindex:"-1"},Oo=e("a",{class:"header-anchor",href:"#_1-0-81-2022-05-04","aria-hidden":"true"},"#",-1),jo=o(" 1.0.81 | 2022.05.04 \u2002"),zo=e("ul",null,[e("li",null,[o("\u4FEE\u590D\u4F7F\u7528 "),e("code",null,"by"),o(" \u65B9\u6CD5\u8BBE\u7F6E\u6761\u4EF6\u540E Hook \u65B9\u6CD5\u4F53\u5185\u67E5\u627E\u4E0D\u5230\u7684\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u4F9D\u7136\u8F93\u51FA\u9519\u8BEF\u65E5\u5FD7\u7684\u95EE\u9898")]),e("li",null,"\u5728\u6267\u884C Hook \u8FC7\u7A0B\u4E2D\u52A0\u5165\u5168\u5C40\u65E5\u5FD7\u663E\u793A\u5F53\u524D Hook APP \u7684\u5305\u540D\uFF0C\u5E76\u4FEE\u590D\u4E00\u5904\u9519\u8BEF\u65E5\u5FD7\u6253\u5370\u6837\u5F0F\u7684\u95EE\u9898")],-1),Vo={id:"_1-0-80-2022-05-01",tabindex:"-1"},Zo=e("a",{class:"header-anchor",href:"#_1-0-80-2022-05-01","aria-hidden":"true"},"#",-1),Ko=o(" 1.0.80 | 2022.05.01 \u2002"),Jo=i("
  • InjectYukiHookWithXposed \u6CE8\u89E3\u65B0\u589E entryClassName \u529F\u80FD\uFF0C\u53EF\u81EA\u5B9A\u4E49\u751F\u6210\u7684 xposed_init \u5165\u53E3\u7C7B\u540D
  • YukiHookXposedInitProxy \u66F4\u540D\u4E3A IYukiHookXposedInit\uFF0C\u539F\u63A5\u53E3\u540D\u79F0\u5DF2\u4F5C\u5E9F\uFF0C\u5C06\u5728\u540E\u7EED\u7248\u672C\u4E2D\u76F4\u63A5\u88AB\u5220\u9664
  • \u65B0\u589E initZygote \u4E0E Resources Hook \u529F\u80FD\uFF0C\u652F\u6301 Hook Layout
  • \u65B0\u589E onXposedEvent \u65B9\u6CD5\uFF0C\u53EF\u76D1\u542C\u539F\u751F Xposed API \u7684\u5168\u90E8\u4E8B\u4EF6
  • \u5BF9 Hook \u529F\u80FD\u7684 lambda \u8FDB\u884C inline \u5904\u7406\uFF0C\u907F\u514D\u751F\u6210\u8FC7\u788E\u7684\u533F\u540D\u7C7B\uFF0C\u63D0\u5347\u7F16\u8BD1\u540E\u7684\u8FD0\u884C\u6027\u80FD
  • \u4FEE\u590D PrefsData \u7F16\u8BD1\u540E\u7684\u65B9\u6CD5\u4F53\u590D\u5236\u8FC7\u5927\u7684\u95EE\u9898
  • \u589E\u52A0 XSharePreference \u53EF\u8BFB\u6027\u6D4B\u8BD5\uFF0C\u5931\u8D25\u540E\u4F1A\u81EA\u52A8\u6253\u5370\u8B66\u544A\u65E5\u5FD7
  • PackageParam \u65B0\u589E appResources\u3001moduleAppResources\u3001moduleAppFilePath \u529F\u80FD
  • PackageParam \u7684 loadApp \u65B0\u589E\u4E0D\u5199 name \u529F\u80FD\uFF0C\u9ED8\u8BA4\u7B5B\u9009\u5168\u90E8 APP
  • PackageParam \u65B0\u589E loadZygote \u65B9\u6CD5\uFF0C\u53EF\u76F4\u63A5 Hook \u7CFB\u7EDF\u6846\u67B6
  • PackageParam \u65B0\u589E resources().hook \u529F\u80FD
  • \u4F18\u5316\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u67E5\u627E\u529F\u80FD\uFF0C\u627E\u4E0D\u5230\u7684\u9519\u8BEF\u65E5\u5FD7\u5C06\u4F18\u5148\u663E\u793A\u5DF2\u8BBE\u7F6E\u7684\u67E5\u627E\u6761\u4EF6
  • \u589E\u52A0 hasExtends \u6269\u5C55\u65B9\u6CD5\uFF0C\u53EF\u5224\u65AD\u5F53\u524D Class \u662F\u5426\u6709\u7EE7\u627F\u5173\u7CFB
  • \u589E\u52A0 isSupportResourcesHook \u529F\u80FD\uFF0C\u5224\u65AD\u5F53\u524D\u662F\u5426\u652F\u6301\u8D44\u6E90\u94A9\u5B50(Resources Hook)
  • current \u529F\u80FD\u65B0\u589E superClass \u65B9\u6CD5\u8C03\u7528\u7236\u7C7B
  • \u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\u65B0\u589E superClass \u67E5\u627E\u6761\u4EF6\uFF0C\u53EF\u7EE7\u7EED\u5728\u7236\u7C7B\u4E2D\u67E5\u627E
  • YukiHookAPI \u5927\u91CF\u65B9\u6CD5\u4E0E Xposed API \u89E3\u8026\u5408
  • \u65B0\u589E Xposed API \u7684\u539F\u751F Hook \u4F18\u5148\u7EA7\u529F\u80FD
  • \u4FEE\u590D isFirstApplication \u53EF\u80FD\u5224\u65AD\u4E0D\u51C6\u786E\u7684\u95EE\u9898
  • \u5C4F\u853D MIUI \u7CFB\u7EDF\u4E0A MiuiCatcherPatch \u91CD\u590D\u8C03\u7528 Hook \u5165\u53E3\u65B9\u6CD5\u7684\u95EE\u9898
  • \u4F18\u5316 Hook \u5165\u53E3\u8C03\u7528\u65B9\u6CD5\uFF0C\u907F\u514D\u56E0\u4E3A Hook Framework \u95EE\u9898\u5BFC\u81F4\u591A\u6B21\u8C03\u7528
  • ",21),qo=o("\u4FEE\u590D Hook "),Qo=e("code",null,"ClassLoader",-1),$o=o(" \u5BFC\u81F4 Hook \u5361\u6B7B\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),ed={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},od=o("WankkoRee"),dd=o(" \u7684\u53CD\u9988"),cd=e("li",null,[o("\u63D0\u5347 "),e("code",null,"XC_Callback"),o(" \u63A5\u53E3\u5BF9\u63A5\u540E\u7684\u6027\u80FD")],-1),id=e("li",null,[o("Java "),e("code",null,"type"),o(" \u65B0\u589E "),e("code",null,"ClassLoader"),o(" \u7C7B\u578B")],-1),ld=e("li",null,"\u4F18\u5316 API \u5E2E\u52A9\u6587\u6863\uFF0C\u4FEE\u590D\u53EF\u80FD\u6301\u7EED\u7F13\u5B58\u9875\u9762\u7684\u95EE\u9898",-1),td={id:"_1-0-78-2022-04-18",tabindex:"-1"},sd=e("a",{class:"header-anchor",href:"#_1-0-78-2022-04-18","aria-hidden":"true"},"#",-1),nd=o(" 1.0.78 | 2022.04.18 \u2002"),ad=i("
  • YukiHookModulePrefs \u65B0\u589E isRunInNewXShareMode \u65B9\u6CD5\uFF0C\u53EF\u7528\u4E8E\u5224\u65AD\u6A21\u5757\u5F53\u524D\u662F\u5426\u5904\u4E8E New XSharePreference \u6A21\u5F0F
  • \u4FEE\u590D YukiHookModulePrefs \u5728 New XSharePreference \u6A21\u5F0F\u4E0B\u5DE5\u4F5C\u7684\u90E8\u5206\u95EE\u9898
  • \u65B0\u589E ModulePreferenceFragment\uFF0C\u73B0\u5728\uFF0C\u4F60\u53EF\u4EE5\u5B8C\u5168\u66FF\u6362\u6389 PreferenceFragmentCompat \u5E76\u5F00\u59CB\u4F7F\u7528\u65B0\u7684\u529F\u80FD
  • ",3),rd=o("\u9002\u914D "),_d=e("code",null,"PreferenceFragmentCompat",-1),hd=o(" \u7684 Sp \u6570\u636E\u5B58\u50A8\u89E3\u51B3\u65B9\u6848\uFF0C\u611F\u8C22 "),ud={href:"https://github.com/mahoshojoHCG",target:"_blank",rel:"noopener noreferrer"},kd=o("mahoshojoHCG"),pd=o(" \u7684\u53CD\u9988"),gd=e("li",null,[o("\u66F4\u65B0\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u4EE5\u53CA "),e("code",null,"Kotlin"),o(" \u4F9D\u8D56\u5230\u6700\u65B0\u7248\u672C")],-1),fd=e("li",null,"\u4FEE\u6B63\u90E8\u5206\u6587\u6863\u548C\u4EE3\u7801\u6CE8\u91CA\u4E2D\u7684\u9519\u8BEF",-1),md={id:"_1-0-77-2022-04-15",tabindex:"-1"},Hd=e("a",{class:"header-anchor",href:"#_1-0-77-2022-04-15","aria-hidden":"true"},"#",-1),Pd=o(" 1.0.77 | 2022.04.15 \u2002"),bd=e("code",null,"YukiHookModulePrefs",-1),xd=o(" \u65B0\u589E "),Cd=e("code",null,"clear",-1),yd=o(" \u65B9\u6CD5\uFF0C\u611F\u8C22 "),Ad={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},vd=o("WankkoRee"),Yd=o(" \u7684\u5EFA\u8BAE"),Md=i("
  • YukiHookModulePrefs \u65B0\u589E getStringSet\u3001putStringSet\u3001all \u65B9\u6CD5
  • HookParam \u7684 args \u589E\u52A0 any \u65B9\u6CD5
  • \u65B0\u589E ModuleApplication\uFF0C\u53EF\u5728\u6A21\u5757\u4E2D\u7EE7\u627F\u6B64\u7C7B\u5B9E\u73B0\u66F4\u591A\u529F\u80FD
  • \u5BF9\u63A5\u5168\u90E8\u7684 findClass \u529F\u80FD\u5230 Xposed API\uFF0C\u5728\u975E\u5BBF\u4E3B\u73AF\u5883\u7EE7\u7EED\u4F7F\u7528\u539F\u751F ClassLoader
  • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
  • ",5),Id={id:"_1-0-75-2022-04-13",tabindex:"-1"},Rd=e("a",{class:"header-anchor",href:"#_1-0-75-2022-04-13","aria-hidden":"true"},"#",-1),Sd=o(" 1.0.75 | 2022.04.13 \u2002"),Xd=o("\u66F4\u6B63\u4E86\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7684\u903B\u8F91\u8BC6\u522B\u90E8\u5206\uFF0C\u611F\u8C22 "),Ld={href:"https://github.com/ApeaSuperz",target:"_blank",rel:"noopener noreferrer"},Fd=o("ApeaSuperz"),Dd=o(" \u7684\u8D21\u732E"),Bd=i("
  • \u4FEE\u6B63\u4E00\u5904\u6587\u6863\u6CE8\u91CA\u7684\u5F15\u7528\u672A\u66F4\u6539\u7684\u95EE\u9898
  • HookParam \u4E2D\u5220\u9664\u4E86 firstArgs \u4E0E lastArgs \u65B9\u6CD5\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 args().first() \u4E0E args().last() \u6765\u53D6\u4EE3\u5B83
  • HookParam \u4E2D\u5220\u9664\u4E86 args() \u4E2D\u7684\u9ED8\u8BA4\u53C2\u6570 index = 0\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 args().first() \u6216 args(index = 0) \u6765\u53D6\u4EE3\u5B83
  • HookParam \u4E2D result \u529F\u80FD\u589E\u52A0\u4E86\u6CDB\u578B\u5339\u914D\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u4F7F\u7528 result<T> \u6765\u5339\u914D\u4F60\u7684\u76EE\u6807\u65B9\u6CD5\u5DF2\u77E5\u8FD4\u56DE\u503C\u7C7B\u578B\u4E86
  • \u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u67E5\u627E\u529F\u80FD\u65B0\u589E emptyParam \u6761\u4EF6\uFF0C\u5E76\u5B8C\u5584\u4E86\u6587\u6863\u76F8\u5173\u9700\u8981\u6CE8\u610F\u7684\u67E5\u627E\u6761\u4EF6\u8BEF\u533A
  • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
  • ",6),Wd=e("h3",{id:"_1-0-73-2022-04-10",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#_1-0-73-2022-04-10","aria-hidden":"true"},"#"),o(" 1.0.73 | 2022.04.10")],-1),Ud=o("\u4FEE\u6B63\u51E0\u5904\u6587\u6863\u7684\u4E2D\u6587\u7FFB\u8BD1\u9519\u8BEF\uFF0C\u611F\u8C22 "),Td={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},wd=o("WankkoRee"),Gd=o(" \u7684\u8D21\u732E"),Ed=o("\u4FEE\u590D\u5728\u67D0\u4E9B\u60C5\u51B5\u4E0B "),Nd=e("code",null,"XC_LoadPackage.LoadPackageParam",-1),Od=o(" \u5185\u5BB9\u4E3A\u7A7A\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),jd={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},zd=o("Luckyzyx"),Vd=o(" \u7684\u53CD\u9988"),Zd=e("li",null,"\u4FEE\u590D\u4E00\u4E9B\u5DF2\u77E5\u7684 BUG\uFF0C\u63D0\u5347 Hook \u7A33\u5B9A\u6027",-1),Kd={id:"_1-0-72-2022-04-09",tabindex:"-1"},Jd=e("a",{class:"header-anchor",href:"#_1-0-72-2022-04-09","aria-hidden":"true"},"#",-1),qd=o(" 1.0.72 | 2022.04.09 \u2002"),Qd=e("ul",null,[e("li",null,"\u66F4\u65B0 API \u6587\u6863\u5230\u65B0\u7684\u5730\u5740"),e("li",null,[e("code",null,"PackageParam"),o(" \u4E2D\u52A0\u5165 "),e("code",null,"appContext"),o(" \u529F\u80FD")]),e("li",null,"\u4FEE\u590D\u4E00\u4E9B\u5DF2\u77E5\u7684 BUG\uFF0C\u63D0\u5347 Hook \u7A33\u5B9A\u6027")],-1),$d={id:"_1-0-71-2022-04-04",tabindex:"-1"},ec=e("a",{class:"header-anchor",href:"#_1-0-71-2022-04-04","aria-hidden":"true"},"#",-1),oc=o(" 1.0.71 | 2022.04.04 \u2002"),dc=e("ul",null,[e("li",null,"\u4FEE\u590D VariousClass \u65E0\u6CD5\u5339\u914D\u65F6\u4F1A\u505C\u6B62 Hook \u629B\u51FA\u5F02\u5E38\u7684\u4E25\u91CD\u95EE\u9898")],-1),cc={id:"_1-0-70-2022-04-04",tabindex:"-1"},ic=e("a",{class:"header-anchor",href:"#_1-0-70-2022-04-04","aria-hidden":"true"},"#",-1),lc=o(" 1.0.70 | 2022.04.04 \u2002"),tc=e("li",null,[o("\u4FEE\u590D "),e("code",null,"instanceClass"),o(" \u5728\u9759\u6001\u5B9E\u4F8B\u4E2D\u8C03\u7528\u540E\u62A5\u9519\u95EE\u9898")],-1),sc=o("\u5728 Hook \u8FC7\u7A0B\u4E2D\u52A0\u5165 "),nc=e("code",null,"isUseAppClassLoader",-1),ac=o(" \u529F\u80FD\uFF0C\u611F\u8C22 "),rc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},_c=o("WankkoRee"),hc=o(" \u7684\u53CD\u9988"),uc=e("li",null,[o("\u52A0\u5165 "),e("code",null,"withProcess"),o(" \u529F\u80FD\uFF0C\u53EF\u6839\u636E APP \u5F53\u524D\u6307\u5B9A\u8FDB\u7A0B\u8FDB\u884C Hook")],-1),kc=e("li",null,"\u4FEE\u590D\u67E5\u627E\u65B9\u6CD5\u3001\u6784\u9020\u7C7B\u548C\u53D8\u91CF\u7684\u4E25\u91CD\u903B\u8F91\u9519\u8BEF\u95EE\u9898",-1),pc=e("li",null,"\u4FEE\u590D Hook \u76EE\u6807\u7C7B\u4E0D\u5B58\u5728\u7684\u65F6\u5019\u65E0\u6CD5\u5FFD\u7565\u5F02\u5E38\u8F93\u51FA\u7684\u95EE\u9898",-1),gc=e("li",null,"\u4FEE\u590D\u90E8\u5206\u60C5\u51B5\u4E0B APP \u542F\u52A8\u65B9\u6CD5\u88C5\u8F7D\u8FC7\u5FEB\u5BFC\u81F4 Hook \u4E0D\u80FD\u751F\u6548\u7684\u95EE\u9898",-1),fc=o("\u4FEE\u590D "),mc=e("code",null,"allMethods",-1),Hc=o(" \u672A Hook \u5230\u65B9\u6CD5\u65F6\u4E0D\u4F1A\u629B\u51FA\u5F02\u5E38\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Pc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},bc=o("WankkoRee"),xc=o(" \u7684\u53CD\u9988"),Cc=o("\u52A0\u5165 Hook \u72B6\u6001\u76D1\u542C\u529F\u80FD\uFF0C\u611F\u8C22 "),yc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Ac=o("WankkoRee"),vc=o(" \u7684\u5EFA\u8BAE"),Yc=e("li",null,"\u4FEE\u6539 Xposed \u5165\u53E3\u6CE8\u5165\u7C7B\u7684\u65B9\u5F0F\uFF0C\u91CD\u65B0\u58F0\u660E API \u7684\u5B9A\u4E49\u57DF",-1),Mc=o("\u52A0\u5165\u6DF7\u6DC6\u7684\u65B9\u6CD5\u4EE5\u53CA\u53D8\u91CF\u7684\u67E5\u627E\u529F\u80FD\uFF0C\u53EF\u4F7F\u7528\u4E0D\u540C\u7C7B\u578B\u7B5B\u9009 "),Ic=e("code",null,"index",-1),Rc=o(" \u5B9A\u4F4D\u6307\u5B9A\u7684\u65B9\u6CD5\u548C\u53D8\u91CF\uFF0C\u611F\u8C22 "),Sc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Xc=o("WankkoRee"),Lc=o(" \u63D0\u4F9B\u7684\u601D\u8DEF"),Fc=e("li",null,[o("\u67E5\u627E\u65B9\u6CD5\u3001\u53D8\u91CF\u65F6\u5141\u8BB8\u4F20\u5165\u591A\u79CD\u7C7B\u578B\uFF0C\u4F8B\u5982 "),e("code",null,"String"),o(" \u58F0\u660E\u7684\u7C7B\u540D\u548C "),e("code",null,"VariousClass")],-1),Dc=e("li",null,[o("\u52A0\u5165\u5168\u65B0\u7684 "),e("code",null,"current"),o(" \u529F\u80FD\uFF0C\u53EF\u5BF9\u4EFB\u610F\u7684\u7C7B\u6784\u5EFA\u4E00\u4E2A\u53CD\u5C04\u65B9\u6CD5\u64CD\u4F5C\u7A7A\u95F4\uFF0C\u65B9\u4FBF\u5730\u8C03\u7528\u548C\u4FEE\u6539\u5176\u4E2D\u7684\u65B9\u6CD5\u548C\u53D8\u91CF")],-1),Bc=o("\u4FEE\u590D\u4E86 Hook \u8FC7\u7A0B\u4E2D\u7684\u5927\u91CF BUG\uFF0C\u611F\u8C22 "),Wc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Uc=o("WankkoRee"),Tc=o(" \u5BF9\u6B64\u9879\u76EE\u6240\u505A\u51FA\u7684\u8D21\u732E"),wc={id:"_1-0-69-2022-03-30",tabindex:"-1"},Gc=e("a",{class:"header-anchor",href:"#_1-0-69-2022-03-30","aria-hidden":"true"},"#",-1),Ec=o(" 1.0.69 | 2022.03.30 \u2002"),Nc=e("li",null,"\u6DFB\u52A0\u5E76\u6539\u8FDB\u4E00\u4E9B\u65B9\u6CD5\u529F\u80FD\u7684\u6CE8\u91CA",-1),Oc=e("li",null,"\u589E\u52A0 Demo \u4E2D\u7684\u66F4\u591A\u793A\u4F8B Hook \u5185\u5BB9",-1),jc=o("\u4FEE\u590D\u5728\u4E00\u4E2A Hook \u5B9E\u4F8B\u4E2D\uFF0C"),zc=e("code",null,"allMethods",-1),Vc=o(" \u591A\u6B21\u4F7F\u7528\u65F6\u53EA\u6709\u6700\u540E\u4E00\u4E2A\u751F\u6548\u7684\u95EE\u9898\uFF0C\u611F\u8C22 "),Zc={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Kc=o("WankkoRee"),Jc=o(" \u7684\u53CD\u9988"),qc={id:"_1-0-68-2022-03-29",tabindex:"-1"},Qc=e("a",{class:"header-anchor",href:"#_1-0-68-2022-03-29","aria-hidden":"true"},"#",-1),$c=o(" 1.0.68 | 2022.03.29 \u2002"),ei=i("
    • \u589E\u52A0 Demo \u4E2D\u7684\u65B0\u7528\u4F8B\u548C LSPosed \u4F5C\u7528\u57DF
    • \u589E\u52A0 Member \u67E5\u627E\u7F13\u5B58\u548C\u67E5\u627E\u7F13\u5B58\u914D\u7F6E\u5F00\u5173
    • \u79FB\u9664\u548C\u4FEE\u6539 MethodFinder\u3001FieldFinder \u4EE5\u53CA HookParam \u76F8\u5173\u65B9\u6CD5\u7684\u8C03\u7528
    • \u589E\u52A0\u66F4\u591A Finder \u4E2D\u7684 cast \u7C7B\u578B\u5E76\u652F\u6301 cast \u4E3A\u6570\u7EC4
    • \u6574\u4F53\u7684\u6027\u80FD\u548C\u7A33\u5B9A\u6027\u63D0\u5347
    • \u4FEE\u590D\u4E0A\u4E00\u4E2A\u7248\u672C\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),oi={id:"_1-0-67-2022-03-27",tabindex:"-1"},di=e("a",{class:"header-anchor",href:"#_1-0-67-2022-03-27","aria-hidden":"true"},"#",-1),ci=o(" 1.0.67 | 2022.03.27 \u2002"),ii=i("
    • \u589E\u52A0\u4E09\u4E2A Finder \u4E2D\u7684 modifiers \u529F\u80FD\uFF0C\u53EF\u7B5B\u9009 static\u3001native\u3001public\u3001abstract \u7B49\u8BF8\u591A\u63CF\u8FF0\u7C7B\u578B
    • \u589E\u52A0\u65B9\u6CD5\u548C\u6784\u9020\u65B9\u6CD5\u67E5\u627E\u65F6\u53EF\u6A21\u7CCA\u65B9\u6CD5\u53C2\u6570\u7C7B\u578B\u4E3A\u6307\u5B9A\u4E2A\u6570\u8FDB\u884C\u67E5\u627E
    • \u589E\u52A0 Member \u7684 hasModifiers \u6269\u5C55\u529F\u80FD
    • \u589E\u52A0 MethodFinder \u548C ConstructorFinder \u4E2D\u7684 give \u65B9\u6CD5\uFF0C\u53EF\u83B7\u5F97\u539F\u59CB\u7C7B\u578B
    • \u589E\u52A0 YukiHookModulePrefs \u4E2D\u7684 PrefsData \u6A21\u677F\u529F\u80FD
    • \u5F7B\u5E95\u5BF9\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u53CA\u53D8\u91CF\u7684\u67E5\u627E\u65B9\u6848\u8FDB\u884C\u91CD\u6784
    • \u4F18\u5316\u4EE3\u7801\u6CE8\u91CA\uFF0C\u4FEE\u590D\u4E86\u53EF\u80FD\u4EA7\u751F\u7684 BUG
    ",1),li={id:"_1-0-66-2022-03-25",tabindex:"-1"},ti=e("a",{class:"header-anchor",href:"#_1-0-66-2022-03-25","aria-hidden":"true"},"#",-1),si=o(" 1.0.66 | 2022.03.25 \u2002"),ni=e("ul",null,[e("li",null,[o("\u4FEE\u590D "),e("code",null,"MethodFinder"),o(" \u4E2D\u7684\u4E00\u4E2A\u4E25\u91CD\u95EE\u9898")]),e("li",null,[o("\u589E\u52A0 "),e("code",null,"hookParam"),o(" \u4E2D\u7684 "),e("code",null,"args"),o(" \u8C03\u7528\u65B9\u6CD5")]),e("li",null,"\u4FEE\u590D\u5176\u5B83\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898\u4EE5\u53CA\u4FEE\u590D\u90E8\u5206\u7C7B\u7684\u6CE8\u91CA\u95EE\u9898")],-1),ai={id:"_1-0-65-2022-03-25",tabindex:"-1"},ri=e("a",{class:"header-anchor",href:"#_1-0-65-2022-03-25","aria-hidden":"true"},"#",-1),_i=o(" 1.0.65 | 2022.03.25 \u2002"),hi=i("
    • \u91CD\u65B0\u53D1\u5E03\u7248\u672C\u4FEE\u590D Maven \u4ED3\u5E93\u56E0\u4E3A\u7F13\u5B58\u95EE\u9898\u65B0\u7248\u672C\u4E0D\u6B63\u786E\u7684\u60C5\u51B5
    • \u589E\u52A0 MethodFinder \u4E0E FieldFinder \u65B0\u7684\u8FD4\u56DE\u503C\u8C03\u7528\u65B9\u6CD5
    • \u4FEE\u590D\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898\uFF0C\u5E76\u4FEE\u590D\u592A\u6781\u4F7F\u7528\u8FC7\u7A0B\u4E2D\u53EF\u80FD\u5B58\u5728\u7684\u95EE\u9898
    • \u4FEE\u590D\u81EA\u52A8\u751F\u6210 Xposed \u5165\u53E3\u7C7B\u53EF\u80FD\u53D1\u751F\u7684\u95EE\u9898
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B\u4EE5\u53CA java \u7C7B\u578B
    ",1),ui={id:"_1-0-6-2022-03-20",tabindex:"-1"},ki=e("a",{class:"header-anchor",href:"#_1-0-6-2022-03-20","aria-hidden":"true"},"#",-1),pi=o(" 1.0.6 | 2022.03.20 \u2002"),gi=i("
    • \u4FEE\u590D YukiHookModulePrefs \u5728\u4F7F\u7528\u4E00\u6B21 direct \u5FFD\u7565\u7F13\u5B58\u540E\u6BCF\u6B21\u90FD\u5FFD\u7565\u7684 BUG
    • \u589E\u52A0\u65B0\u7684 API\uFF0C\u4F5C\u5E9F\u4E86 isActive \u5224\u65AD\u6A21\u5757\u6FC0\u6D3B\u7684\u4F20\u7EDF\u7528\u6CD5
    • \u4FEE\u590D\u975E Xposed \u73AF\u5883\u4F7F\u7528 API \u65F6\u6253\u5370\u8C03\u8BD5\u65E5\u5FD7\u7684\u95EE\u9898
    • \u4FEE\u590D\u67E5\u627E Field \u65F6\u7684\u65E5\u5FD7\u8F93\u51FA\u95EE\u9898\u548C\u672A\u62E6\u622A\u7684\u5F02\u5E38\u95EE\u9898
    • \u89E3\u8026\u5408 ReflectionUtils \u4E2D\u7684 Xposed API
    • \u589E\u52A0 YukiHookModuleStatus \u65B9\u6CD5\u540D\u79F0\u7684\u6DF7\u6DC6\uFF0C\u4EE5\u7CBE\u7B80\u6A21\u5757\u751F\u6210\u7684\u4F53\u79EF
    • \u88C5\u8F7D\u6A21\u5757\u81EA\u8EAB Hook \u65F6\u5C06\u4E0D\u518D\u6253\u5370\u6B22\u8FCE\u4FE1\u606F
    • \u4FEE\u590D\u4E0A\u4E00\u4E2A\u7248\u672C\u4ECD\u7136\u5B58\u5728\u7684\u67D0\u4E9B BUG
    ",1),fi={id:"_1-0-55-2022-03-18",tabindex:"-1"},mi=e("a",{class:"header-anchor",href:"#_1-0-55-2022-03-18","aria-hidden":"true"},"#",-1),Hi=o(" 1.0.55 | 2022.03.18 \u2002"),Pi=e("ul",null,[e("li",null,"\u4FEE\u6B63\u4E00\u5904\u6CE8\u91CA\u9519\u8BEF"),e("li",null,"\u4E34\u65F6\u4FEE\u590D\u4E00\u4E2A BUG"),e("li",null,[o("\u589E\u52A0\u4E86 "),e("code",null,"type"),o(" \u4E2D\u7684\u5927\u91CF "),e("code",null,"android"),o(" \u7C7B\u578B\u4EE5\u53CA\u5C11\u91CF "),e("code",null,"java"),o(" \u7C7B\u578B")]),e("li",null,"\u4FEE\u590D\u65B0\u7248\u4E0E\u65E7\u7248 Kotlin APIs \u7684\u517C\u5BB9\u6027\u95EE\u9898")],-1),bi={id:"_1-0-5-2022-03-18",tabindex:"-1"},xi=e("a",{class:"header-anchor",href:"#_1-0-5-2022-03-18","aria-hidden":"true"},"#",-1),Ci=o(" 1.0.5 | 2022.03.18 \u2002"),yi=i("
    • \u4FEE\u590D\u65E7\u7248\u672C LSPosed \u6846\u67B6\u60C5\u51B5\u4E0B\u6B22\u8FCE\u4FE1\u606F\u591A\u6B21\u6253\u5370\u7684\u95EE\u9898
    • \u6DFB\u52A0 onInit \u65B9\u6CD5\u6765\u914D\u7F6E YukiHookAPI
    • \u65B0\u589E executorName \u548C executorVersion \u6765\u83B7\u53D6\u5F53\u524D Hook Framework \u7684\u540D\u79F0\u548C\u7248\u672C\u53F7
    • \u65B0\u589E by \u65B9\u6CD5\u6765\u8BBE\u7F6E Hook \u7684\u65F6\u673A\u548C\u6761\u4EF6
    • YukiHookModulePrefs \u65B0\u589E\u53EF\u63A7\u5236\u7684\u952E\u503C\u7F13\u5B58\uFF0C\u53EF\u5728\u5BBF\u4E3B\u8FD0\u884C\u65F6\u6A21\u5757\u52A8\u6001\u66F4\u65B0\u6570\u636E
    • \u4FEE\u590D\u4E86\u4E00\u4E9B\u53EF\u80FD\u5B58\u5728\u7684 BUG
    ",1),Ai={id:"_1-0-4-2022-03-06",tabindex:"-1"},vi=e("a",{class:"header-anchor",href:"#_1-0-4-2022-03-06","aria-hidden":"true"},"#",-1),Yi=o(" 1.0.4 | 2022.03.06 \u2002"),Mi=i("
    • \u4FEE\u590D LSPosed \u5728\u6700\u65B0\u7248\u672C\u4E2D\u542F\u7528\u201C\u53EA\u6709\u6A21\u5757classloader\u53EF\u4EE5\u4F7F\u7528Xposed API\u201D\u9009\u9879\u540E\u627E\u4E0D\u5230 XposedBridge \u7684\u95EE\u9898
    • \u6DFB\u52A0 YukiHookAPI \u7684\u5E38\u91CF\u7248\u672C\u540D\u79F0\u548C\u7248\u672C\u53F7
    • \u65B0\u589E hasField \u65B9\u6CD5\u4EE5\u53CA isAllowPrintingLogs \u914D\u7F6E\u53C2\u6570
    • \u65B0\u589E isDebug \u5F00\u542F\u7684\u60C5\u51B5\u4E0B API \u5C06\u81EA\u52A8\u6253\u5370\u6B22\u8FCE\u4FE1\u606F\u6D4B\u8BD5\u6A21\u5757\u662F\u5426\u751F\u6548
    ",1),Ii={id:"_1-0-3-2022-03-02",tabindex:"-1"},Ri=e("a",{class:"header-anchor",href:"#_1-0-3-2022-03-02","aria-hidden":"true"},"#",-1),Si=o(" 1.0.3 | 2022.03.02 \u2002"),Xi=i("
    • \u4FEE\u590D\u4E00\u4E2A\u6F5C\u5728\u6027\u7684\u5F02\u5E38\u672A\u62E6\u622A BUG
    • \u589E\u52A0 ignoredError \u529F\u80FD
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 android \u7C7B\u578B
    • \u589E\u52A0\u76D1\u542C hook \u540E\u7684 ClassNotFound \u529F\u80FD
    ",1),Li={id:"_1-0-2-2022-02-18",tabindex:"-1"},Fi=e("a",{class:"header-anchor",href:"#_1-0-2-2022-02-18","aria-hidden":"true"},"#",-1),Di=o(" 1.0.2 | 2022.02.18 \u2002"),Bi=e("ul",null,[e("li",null,"\u4FEE\u590D Windows \u4E0B\u65E0\u6CD5\u627E\u5230\u9879\u76EE\u8DEF\u5F84\u7684\u95EE\u9898"),e("li",null,[o("\u79FB\u9664\u90E8\u5206\u53CD\u5C04 API\uFF0C\u5408\u5E76\u81F3 "),e("code",null,"BaseFinder"),o(" \u8FDB\u884C\u6574\u5408")]),e("li",null,"\u589E\u52A0\u76F4\u63A5\u4F7F\u7528\u5B57\u7B26\u4E32\u521B\u5EFA Hook \u7684\u65B9\u6CD5")],-1),Wi={id:"_1-0-1-2022-02-15",tabindex:"-1"},Ui=e("a",{class:"header-anchor",href:"#_1-0-1-2022-02-15","aria-hidden":"true"},"#",-1),Ti=o(" 1.0.1 | 2022.02.15 \u2002"),wi=i("
    • RemedyPlan \u589E\u52A0 onFind \u529F\u80FD
    • \u6574\u5408\u5E76\u4FEE\u6539\u4E86\u90E8\u5206\u53CD\u5C04 API \u4EE3\u7801
    • \u589E\u52A0\u4E86 type \u4E2D\u7684 java \u7C7B\u578B
    • \u4FEE\u590D\u5FFD\u7565\u9519\u8BEF\u5728\u63A7\u5236\u53F0\u4ECD\u7136\u8F93\u51FA\u7684\u95EE\u9898
    ",1),Gi={id:"_1-0-2022-02-14",tabindex:"-1"},Ei=e("a",{class:"header-anchor",href:"#_1-0-2022-02-14","aria-hidden":"true"},"#",-1),Ni=o(" 1.0 | 2022.02.14 \u2002"),Oi=e("ul",null,[e("li",null,"\u9996\u4E2A\u7248\u672C\u63D0\u4EA4\u81F3 Maven")],-1);function ji(zi,Vi){const c=t("Badge"),l=t("ExternalLinkIcon");return n(),a("div",null,[_,h,u,e("h3",k,[p,g,d(c,{type:"tip",text:"\u6700\u65B0",vertical:"middle"})]),f,e("h3",m,[H,P,d(c,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),b,e("h3",x,[C,y,d(c,{type:"warning",text:"\u8FC7\u65E7",vertical:"middle"})]),A,e("h3",v,[Y,M,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),I,e("h3",R,[S,X,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),L,e("h3",F,[D,B,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[W,e("li",null,[U,e("a",T,[w,d(l)])]),G,e("li",null,[E,e("a",N,[O,d(l)]),j]),z,e("li",null,[V,Z,K,J,q,Q,e("a",$,[ee,d(l)]),oe]),de,e("li",null,[ce,ie,le,e("a",te,[se,d(l)]),ne]),e("li",null,[ae,re,_e,e("a",he,[ue,d(l)]),ke]),pe,e("li",null,[ge,fe,me,He,Pe,e("a",be,[xe,d(l)]),Ce,e("a",ye,[Ae,d(l)])]),ve,Ye,Me,e("li",null,[Ie,Re,Se,Xe,Le,e("a",Fe,[De,d(l)]),Be]),We,e("li",null,[Ue,Te,we,e("a",Ge,[Ee,d(l)]),Ne,e("a",Oe,[je,d(l)])]),ze,Ve,Ze,Ke]),e("h3",Je,[qe,Qe,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),$e,e("h3",eo,[oo,co,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[io,lo,to,e("a",so,[no,d(l)]),ao]),ro]),e("h3",_o,[ho,uo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ko,e("h3",po,[go,fo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),mo,e("h3",Ho,[Po,bo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),xo,e("h3",Co,[yo,Ao,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),vo,e("h3",Yo,[Mo,Io,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Ro,e("h3",So,[Xo,Lo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Fo,e("h3",Do,[Bo,Wo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Uo,e("h3",To,[wo,Go,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Eo,e("h3",No,[Oo,jo,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),zo,e("h3",Vo,[Zo,Ko,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[Jo,e("li",null,[qo,Qo,$o,e("a",ed,[od,d(l)]),dd]),cd,id,ld]),e("h3",td,[sd,nd,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[ad,e("li",null,[rd,_d,hd,e("a",ud,[kd,d(l)]),pd]),gd,fd]),e("h3",md,[Hd,Pd,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[bd,xd,Cd,yd,e("a",Ad,[vd,d(l)]),Yd]),Md]),e("h3",Id,[Rd,Sd,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[e("li",null,[Xd,e("a",Ld,[Fd,d(l)]),Dd]),Bd]),Wd,e("ul",null,[e("li",null,[Ud,e("a",Td,[wd,d(l)]),Gd]),e("li",null,[Ed,Nd,Od,e("a",jd,[zd,d(l)]),Vd]),Zd]),e("h3",Kd,[Jd,qd,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Qd,e("h3",$d,[ec,oc,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),dc,e("h3",cc,[ic,lc,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[tc,e("li",null,[sc,nc,ac,e("a",rc,[_c,d(l)]),hc]),uc,kc,pc,gc,e("li",null,[fc,mc,Hc,e("a",Pc,[bc,d(l)]),xc]),e("li",null,[Cc,e("a",yc,[Ac,d(l)]),vc]),Yc,e("li",null,[Mc,Ic,Rc,e("a",Sc,[Xc,d(l)]),Lc]),Fc,Dc,e("li",null,[Bc,e("a",Wc,[Uc,d(l)]),Tc])]),e("h3",wc,[Gc,Ec,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),e("ul",null,[Nc,Oc,e("li",null,[jc,zc,Vc,e("a",Zc,[Kc,d(l)]),Jc])]),e("h3",qc,[Qc,$c,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ei,e("h3",oi,[di,ci,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ii,e("h3",li,[ti,si,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),ni,e("h3",ai,[ri,_i,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),hi,e("h3",ui,[ki,pi,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),gi,e("h3",fi,[mi,Hi,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Pi,e("h3",bi,[xi,Ci,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),yi,e("h3",Ai,[vi,Yi,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Mi,e("h3",Ii,[Ri,Si,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Xi,e("h3",Li,[Fi,Di,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Bi,e("h3",Wi,[Ui,Ti,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),wi,e("h3",Gi,[Ei,Ni,d(c,{type:"danger",text:"\u8FC7\u671F",vertical:"middle"})]),Oi])}const Ki=s(r,[["render",ji],["__file","changelog.html.vue"]]);export{Ki as default}; diff --git a/docs/assets/changelog.html.f7e20a5d.js b/docs/assets/changelog.html.f7e20a5d.js deleted file mode 100644 index 5fd85d20e..000000000 --- a/docs/assets/changelog.html.f7e20a5d.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,r as c,o as s,c as l,b as e,d as t,a as n,e as o}from"./app.99fcdd51.js";const r={},h=n('

    Changelog

    The version update history of YukiHookAPI is recorded here.

    Pay Attention

    We will only maintain the latest API version, if you are using an outdate API version, you voluntarily renounce any possibility of maintenance.

    Notice

    To avoid translation time consumption, Changelog will use Google Translation from Chinese to English, please refer to the original text for actual reference.

    Time zone of version release date: UTC+8

    ',4),u={id:"_1-1-4-2022-10-04",tabindex:"-1"},_=e("a",{class:"header-anchor",href:"#_1-1-4-2022-10-04","aria-hidden":"true"},"#",-1),m=o(" 1.1.4 | 2022.10.04 \u2002"),p=n("
    • Fixed the issue that YukiHookDataChannel may not respond to broadcast events in the system framework, reproduced in A13
    • Fixed the issue that YukiHookDataChannel could not communicate with Module App in Host App for multiple versions
    • Added obtainLoggerInMemoryData method in YukiHookDataChannel to share debug log data between module and host
    • Modify the type of YukiHookLogger.inMemoryData to ArrayList and change YukiLoggerData to data class
    • Fixed YukiLoggerData printing blank when the package name is empty in the module
    • Added loadApp, loadZygote, loadSystem, withProcess multi-parameter methods of the same name in PackageParam
    • Fixed some possible bugs
    ",1),f={id:"_1-1-3-2022-09-30",tabindex:"-1"},g=e("a",{class:"header-anchor",href:"#_1-1-3-2022-09-30","aria-hidden":"true"},"#",-1),k=o(" 1.1.3 | 2022.09.30 \u2002"),b=e("ul",null,[e("li",null,"Fixed a fatal bug where the Hook entry class name could not be customized"),e("li",null,[o("Added some code notes in "),e("code",null,"LoggerFactory"),o(" and updated special features documentation")])],-1),y={id:"_1-1-2-2022-09-30",tabindex:"-1"},x=e("a",{class:"header-anchor",href:"#_1-1-2-2022-09-30","aria-hidden":"true"},"#",-1),v=o(" 1.1.2 | 2022.09.30 \u2002"),w=n('
    • Documentation Basic Knowledge page add a friend link to the English version
    • Fixed YukiBaseHooker comments in English code note link errors
    • Fixed ClassCastException in ModuleClassLoader
    • Fixed and standardize some code notes
    • Added ModuleClassLoader exclusion list function, you can use excludeHostClasses and excludeModuleClasses methods to customize the exclusion list
    • Added YukiLoggerData real-time log data class, you can get the log array in real time through YukiHookLogger.inMemoryData
    • Added ClassLoader.listOfClasses method, which can directly get all Class in the current Dex
    ',1),A={id:"_1-1-1-2022-09-28",tabindex:"-1"},H=e("a",{class:"header-anchor",href:"#_1-1-1-2022-09-28","aria-hidden":"true"},"#",-1),P=o(" 1.1.1 | 2022.09.28 \u2002"),F=e("ul",null,[e("li",null,[o("Fixed the problem of wrong document friend links in "),e("a",{href:"../guide/knowledge"},"Basic Knowledge"),o(" page")]),e("li",null,[o("Fixed document "),e("code",null,"favicon"),o(" not showing up")]),e("li",null,[o("Fixed bug in "),e("code",null,"DexClassFinder"),o(" search conditions")])],-1),C={id:"_1-1-0-2022-09-28",tabindex:"-1"},M=e("a",{class:"header-anchor",href:"#_1-1-0-2022-09-28","aria-hidden":"true"},"#",-1),I=o(" 1.1.0 | 2022.09.28 \u2002"),R=e("li",null,[o("This is a major version update, please refer to "),e("a",{href:"../api/home"},"API Document"),o(" and "),e("a",{href:"../api/special-features/reflection"},"Special Features"),o(" for the changes and usage mentioned in the changelog")],-1),Y=o("Change the help documentation framework to "),S={href:"https://v2.vuepress.vuejs.org",target:"_blank",rel:"noopener noreferrer"},L=o("VuePress"),D=n('
  • Unify and standardize the terms and nouns in the document, for example, "query" is always changed to "find", XposedHelper is misspelled and changed to XposedHelpers
  • Documentation Basic Knowledge page to add friend links, Simplified Chinese only
  • Convert Class and Method of Hook App Demo to Java to provide better demo effect
  • Fixed code comment naming in Hook Module Demo
  • Refactored a lot of low-level Hook logic and the docking method of Xposed API
  • Removed HookParamWrapper, it now interfaces directly with YukiBridgeFactory
  • Moved methods in section YukiHookBridge to AppParasitics
  • Removed HookParam.args and the underlying direct connection method setArgs, directly get and set the object of the current array
  • Optimized automatic handler to merge referenced jar into stub project
  • ',9),X=o("Fixed the problem that the module package name cannot be correctly matched when multi-project packaging, and modify the module package name matching logic of the automatic handler, thanks to "),z={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},T=o("5ec1cff"),W=o(" for the feedback and solutions provided"),j=n("
  • Internal closure processing for the methods of API private tool classes to avoid polluting the top-level namespace
  • Fixed Creater naming to Creator for all reflection and Hook classes
  • Added YukiHookAPI.Status.compiledTimestamp function, which can get the compilation completion timestamp when used as an Xposed module
  • Added YukiHookAPI.Status.isXposedEnvironment function, which can determine whether the current (Xposed) host environment or module environment is
  • The debug logging function has been overhauled, and functions such as YukiHookAPI.Configs.debugTag have been merged into YukiHookLogger.Configs
  • The debug log can be added to specify the printing method as XposedBridge.log or Logd
  • The package name of the current host and the current user ID are added to the debug log by default for debugging, you can change it yourself in the debugLog configuration
  • Added generic function to reflect and call generics, you can use it in Class or CurrentClass
  • obsolete the buildOfAny method, now use the buildOf method directly (without generics) to use the constructor to create a new object and get the result Any
  • Fixed the issue of null pointer exception when using hasExtends
  • CurrentClass added non-lambda method of calling
  • CurrentClass adds name and simpleName functions
  • Completely rewrite the core method of ReflectionTool, sorting and classifying different search conditions
  • Fixed the problem that Member obtained by directly calling declared in ReflectionTool throws an exception
  • Fixed UndefinedType in ReflectionTool is not correctly judged in Method and Constructor conditions
  • Added a friendly prompt method when the reflection search result is abnormal, which can specifically locate the problem that Member cannot be found under specified conditions
  • Added VagueType condition in Method and Constructor for reflection search, which can be used in param condition to ignore parameters you don't want to fill in
  • Added paramCount { ... } condition in Method and Constructor of reflection search, now you can directly get it in it to customize your judgment condition
  • The current method is added to the FieldFinder result, which can directly create a call space for the result instance
  • Modified the modifiers condition and name condition in the reflection lookup function, now you need to return a Boolean at the end of the method body to make the condition true
  • ",20),B=e("code",null,"as*",-1),O=o(" function in "),N=e("code",null,"ModifierRules",-1),E=o(" renamed to "),U=e("code",null,"is*",-1),q=o(", thanks to "),K={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},V=o("Kitsune"),Z=o(" suggestion"),G=n("
  • Added RemedyPlan feature in FieldFinder
  • Added Class fuzzy search function (Beta) in Dex, you can now directly use searchClass function to fuzzy search Class with specified conditions
  • ",2),J=o("Added multiple search function in reflection search, you can use relative search conditions to obtain multiple search results at the same time, thanks to "),Q=e("strong",null,"AA",-1),$=o(" and "),ee={href:"https://github.com/KyuubiRan",target:"_blank",rel:"noopener noreferrer"},oe=o("Kitsune"),te=o(" for suggestions"),de=o("Fixed the problem that the object obtained by "),ie=e("code",null,"appClassLoader",-1),ne=o(" is incorrect in system applications in some systems, thanks to "),ce={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},ae=o("Luckyzyx"),se=o(" for the feedback"),le=e("li",null,[o("Modified the calling method of "),e("code",null,"XposedBridge.invokeOriginalMethod"),o(" and added "),e("code",null,"original"),o(" function in "),e("code",null,"MethodFinder.Result.Instance")],-1),re=o("Fixed the problem of wrong value of "),he=e("code",null,"getStringSet",-1),ue=o(" method in "),_e=e("code",null,"YukiHookModulePrefs",-1),me=o(" and optimize the code style, thanks to "),pe={href:"https://github.com/Teddy-Zhu",target:"_blank",rel:"noopener noreferrer"},fe=o("Teddy_Zhu"),ge=o(),ke={href:"https://github.com/fankes/YukiHookAPI/pull/19",target:"_blank",rel:"noopener noreferrer"},be=o("PR"),ye=e("li",null,[o("Modify "),e("code",null,"YukiHookModulePrefs"),o(" to intercept exceptions that may not exist in "),e("code",null,"XSharePreference")],-1),xe=e("li",null,[o("Fixed the problem that "),e("code",null,"YukiHookDataChannel"),o(" could not be successfully registered in some third-party ROM system frameworks")],-1),ve=e("li",null,[o("Secured "),e("code",null,"YukiHookDataChannel"),o(", now it can only communicate between modules from the specified package name and the host")],-1),we=o("Added automatic hook "),Ae=e("code",null,"SharedPreferences",-1),He=o(" to fix the problem that file permissions are not "),Pe=e("code",null,"0664",-1),Fe=o(" in some systems, thanks to "),Ce={href:"https://github.com/5ec1cff",target:"_blank",rel:"noopener noreferrer"},Me=o("5ec1cff"),Ie=o(" for the feedback and implementation code provided"),Re=n("
  • Added YukiHookAPI.Configs.isEnableHookSharedPreferences function, which is disabled by default and can be enabled if the permission of SharedPreferences is incorrect
  • Fixed the bug that the no-parameter construction method cannot be found when searching for Constructor without filling in the search conditions, thanks B5 KAKA for the feedback
  • Detach Result instances located in method, constructor in injectMember to Process
  • Added the useDangerousOperation method in the Hook process, which will automatically stop the Hook and print an error after the function in the Hook Dangerous List is not declared
  • Added module resource injection and Activity proxy functions, you can call injectModuleAppResources and registerModuleAppActivities to use
  • Added ModuleContextThemeWrapper function, you can call applyModuleTheme to create the Context of a module in any Activity
  • Added ClassLoader.onLoadClass function, which can be used to listen for events when the loadClass method of ClassLoader is called
  • obsolete classOf and clazz extension methods, add toClass and toClassOrNull usage, please move to the new method now
  • VariousClass adds a getOrNull method, which can return null instead of throwing an exception when it can't match Class
  • Removed isUseAppClassLoader parameter in PackageParam.hook, changed it to isForceUseAbsolute and automatically matched the target Class
  • PackageParam adds systemContext function, you can call this function at any time to get a persistent Context
  • no longer expose any methods in HookClass
  • Added throwToApp function in HookParam, which can throw exceptions directly to the host
  • The onFailureThrowToApp function is added to the Hook callback, which can be directly thrown to the host when an exception occurs
  • Modified the printing logic of the debug log, the time-consuming records in the reflection search function will only be printed during the Hook process
  • Added the function of removing Hook in the Hook process, you can use the remove and removeSelf methods to remove the hook
  • Fixed the issue that caused the host to throw an exception when ReplaceHook failed, and now it is modified to call the original method to ensure the normal operation of the host function
  • Added the function of checking the return value of the method in the Hook process. If the return value does not match, it will automatically throw an exception or print an error according to the situation
  • ",18),Ye=o("Added "),Se=e("code",null,"array",-1),Le=o(" type to Resources Hook, thanks to "),De={href:"https://github.com/fankes/YukiHookAPI/pull/12",target:"_blank",rel:"noopener noreferrer"},Xe=o("PR"),ze=o(" of "),Te={href:"https://github.com/GSWXXN",target:"_blank",rel:"noopener noreferrer"},We=o("GSWXXN"),je=e("li",null,[o("Moved "),e("code",null,"me.weishu.reflection"),o(" to "),e("code",null,"thirdparty"),o(" to prevent conflicting dependencies of the same name introduced at the same time")],-1),Be=e("li",null,"Remove the exception thrown when the Hook method body is empty, and modify it to print the warning log",-1),Oe=e("li",null,[o("Modify the exception handling logic of "),e("code",null,"AppLifecycle"),o(" and throw it directly to the host when an exception occurs")],-1),Ne=e("li",null,"Updated Demo API version to 33",-1),Ee={id:"_1-0-92-2022-05-31",tabindex:"-1"},Ue=e("a",{class:"header-anchor",href:"#_1-0-92-2022-05-31","aria-hidden":"true"},"#",-1),qe=o(" 1.0.92 | 2022.05.31 \u2002"),Ke=n("
    • Fixed the naming method of callback in a large number of methods
    • Changed the solution to fix the problem that YukiHookDataChannel cannot call back the current Activity broadcast on devices lower than Android 12
    • The InjectYukiHookWithXposed annotation adds the isUsingResourcesHook function, now you can selectively disable the dependency interface that automatically generates IXposedHookInitPackageResources
    ",1),Ve={id:"_1-0-91-2022-05-29",tabindex:"-1"},Ze=e("a",{class:"header-anchor",href:"#_1-0-91-2022-05-29","aria-hidden":"true"},"#",-1),Ge=o(" 1.0.91 | 2022.05.29 \u2002"),Je=o("Fixed the "),Qe=e("code",null,"ClassLoader",-1),$e=o(" error when the customized system of some devices is booted in the LSPosed environment, thanks to "),eo={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},oo=o("Luckyzyx"),to=o(" for the feedback"),io=n("
  • Fixed YukiHookDataChannel not being able to call back the current Activity broadcast on ZUI and systems below Android 12
  • Integrate the YukiHookModuleStatus function into YukiHookAPI.Status, rewrite a lot of methods, now you can judge the status information such as module activation in the module and the host in both directions
  • ",2),no={id:"_1-0-90-2022-05-27",tabindex:"-1"},co=e("a",{class:"header-anchor",href:"#_1-0-90-2022-05-27","aria-hidden":"true"},"#",-1),ao=o(" 1.0.90 | 2022.05.27 \u2002"),so=n("
    • Fixed YukiHookDataChannel crashing when the module sets the listener callback
    • Fixed YukiHookDataChannel still calling back when not in current Activity
    • Remove the default value of YukiHookDataChannel callback event, no callback
    • Removed YukiHookModulePrefs warning printed if XShare is unreadable
    • Added the isXSharePrefsReadable method in YukiHookModulePrefs to determine whether the current XShare is available
    ",1),lo={id:"_1-0-89-2022-05-26",tabindex:"-1"},ro=e("a",{class:"header-anchor",href:"#_1-0-89-2022-05-26","aria-hidden":"true"},"#",-1),ho=o(" 1.0.89 | 2022.05.26 \u2002"),uo=n("
    • Fixed the problem that YukiHookDataChannel cannot be repeatedly set to monitor, and added the function of repeating response in different Activity modules and automatically following Activity to destroy the monitor function
    • Added YukiHookDataChannel repeated listening use case description document
    • Add the onAlreadyHooked method to determine whether the current method is repeated Hook
    • Modify part of the logic of repeatedly adding HashMap, remove the putIfAbsent method, allow to override the addition
    • Fixed several possible bugs
    ",1),_o={id:"_1-0-88-2022-05-25",tabindex:"-1"},mo=e("a",{class:"header-anchor",href:"#_1-0-88-2022-05-25","aria-hidden":"true"},"#",-1),po=o(" 1.0.88 | 2022.05.25 \u2002"),fo=n("
    • Fully decoupled from Xposed API
    • Added android type in type
    • Separate YukiHookModuleStatus from auto-generated code and add isEnableHookModuleStatus switch, it is up to you to enable or not
    • Internal closure processing for the constructors of a large number of classes in the API
    • Set YukiHookModulePrefs to run as a singleton to prevent repeated creation and waste of system resources
    • Fixed the bug that Hook cannot be nested since version 1.0.80, and optimize the related functions of nested Hook
    • Modify the Hooker storage scheme from HashSet to HashMap to prevent the problem of repeatedly adding Hookers
    • Modify the core implementation method of Hook, add duplicate checking to avoid repeating the Hook multiple callbacks to the HookParam method
    • MethodFinder and FieldFinder add the function of finding fuzzy methods and variable names, you can call name { ... } to set search conditions, and support regular expressions
    • Optimize and modify the way to get appContext to reduce the possibility of getting empty
    • Modify the print TAG of logger in the automatically generated code to default to your custom name, which is convenient for debugging
    • Optimize the Hooker implementation of YukiHookBridge to improve Hook performance
    • PackageParam adds the onAppLifecycle method, which can natively monitor the life cycle of the host and implement the registration system broadcast function
    • Added YukiHookDataChannel function to communicate using system out-of-order broadcast while the module and the host remain alive
    • YukiHookDataChannel adds the checkingVersionEquals method, which can be monitored to verify that the host has not updated the version mismatch problem after the module is updated
    • Added Java version example in the example code of demo-module for reference only
    ",1),go={id:"_1-0-87-2022-05-10",tabindex:"-1"},ko=e("a",{class:"header-anchor",href:"#_1-0-87-2022-05-10","aria-hidden":"true"},"#",-1),bo=o(" 1.0.87 | 2022.05.10 \u2002"),yo=e("ul",null,[e("li",null,[o("Added "),e("code",null,"refreshModuleAppResources"),o(" function to adapt Resources refresh when the language region, font size, resolution changes, etc.")]),e("li",null,[o("Added "),e("code",null,"isEnableModuleAppResourcesCache"),o(" function, you can set whether to automatically cache the resources of the current module")])],-1),xo={id:"_1-0-86-2022-05-06",tabindex:"-1"},vo=e("a",{class:"header-anchor",href:"#_1-0-86-2022-05-06","aria-hidden":"true"},"#",-1),wo=o(" 1.0.86 | 2022.05.06 \u2002"),Ao=e("ul",null,[e("li",null,[o("Fixed the problem of continuous error reporting during "),e("code",null,"initZygote"),o(" when Resources Hook is not supported, reproduced in "),e("strong",null,"ZUI"),o("/"),e("strong",null,"LSPosed CI(1.8.3-6550)")]),e("li",null,"Optimize and handle exceptions for Resources Hook, only print errors and warnings if they are used and not supported")],-1),Ho={id:"_1-0-85-2022-05-04",tabindex:"-1"},Po=e("a",{class:"header-anchor",href:"#_1-0-85-2022-05-04","aria-hidden":"true"},"#",-1),Fo=o(" 1.0.85 | 2022.05.04 \u2002"),Co=e("ul",null,[e("li",null,[o("Fixed a serious problem of not being able to hook the system framework, since "),e("code",null,"1.0.80")]),e("li",null,[o("Added in the debug log to distinguish the package name loaded by "),e("code",null,"initZygote"),o(" as "),e("code",null,"android-zygote"),o(", "),e("code",null,"packageName"),o(" keeps "),e("code",null,"android"),o(" unchanged")])],-1),Mo={id:"_1-0-83-2022-05-04",tabindex:"-1"},Io=e("a",{class:"header-anchor",href:"#_1-0-83-2022-05-04","aria-hidden":"true"},"#",-1),Ro=o(" 1.0.83 | 2022.05.04 \u2002"),Yo=e("ul",null,[e("li",null,[o("Fixed "),e("code",null,"YukiHookModuleStatus"),o(" reporting a lot of errors after "),e("code",null,"loadSystem")]),e("li",null,[o("Added "),e("code",null,"android"),o(" type in "),e("code",null,"type")]),e("li",null,"Updated example descriptions in help documentation")],-1),So={id:"_1-0-82-2022-05-04",tabindex:"-1"},Lo=e("a",{class:"header-anchor",href:"#_1-0-82-2022-05-04","aria-hidden":"true"},"#",-1),Do=o(" 1.0.82 | 2022.05.04 \u2002"),Xo=e("ul",null,[e("li",null,[o("Fixed a concept confusion error, distinguishing the relationship between "),e("code",null,"initZygote"),o(" and the system framework, there are problems with the previous comments and documentation, I am very sorry")]),e("li",null,[e("code",null,"PackageParam"),o(" adds "),e("code",null,"loadSystem"),o(" method, no need to write "),e("code",null,'loadApp(name = "android")'),o(" to hook the system framework")])],-1),zo={id:"_1-0-81-2022-05-04",tabindex:"-1"},To=e("a",{class:"header-anchor",href:"#_1-0-81-2022-05-04","aria-hidden":"true"},"#",-1),Wo=o(" 1.0.81 | 2022.05.04 \u2002"),jo=e("ul",null,[e("li",null,[o("Fixed the problem that the method and constructor that cannot be found in the Hook method body still output the error log after setting the condition using the "),e("code",null,"by"),o(" method")]),e("li",null,"Added a global log to display the package name of the current Hook APP during the execution of the Hook, and fixed a problem with the printing style of the error log")],-1),Bo={id:"_1-0-80-2022-05-01",tabindex:"-1"},Oo=e("a",{class:"header-anchor",href:"#_1-0-80-2022-05-01","aria-hidden":"true"},"#",-1),No=o(" 1.0.80 | 2022.05.01 \u2002"),Eo=n("
  • The InjectYukiHookWithXposed annotation adds the entryClassName function, which can customize the generated xposed_init entry class name
  • YukiHookXposedInitProxy renamed to IYukiHookXposedInit, the original interface name has been invalidated and will be deleted directly in subsequent versions
  • Added initZygote and Resources Hook functions to support Hook Layout
  • Added onXposedEvent method to listen to all events of native Xposed API
  • Perform inline processing on the lambda of the Hook function to avoid generating excessively broken anonymous classes and improve the running performance after compilation
  • Fixed PrefsData compiled method body copy is too large
  • Added XSharePreference readability test, which will automatically print a warning log if it fails
  • PackageParam adds appResources, moduleAppResources, moduleAppFilePath functions
  • loadApp of PackageParam adds the function of not writing name, and all APPs are filtered by default
  • PackageParam adds the loadZygote method, which can directly hook the system framework
  • PackageParam added resources().hook function
  • Optimization method, construction method, variable search function, the error log that cannot be found will display the set query conditions first
  • Added hasExtends extension method to determine whether the current Class has an inheritance relationship
  • Added isSupportResourcesHook function to determine whether resource hooks are currently supported (Resources Hook)
  • current function adds superClass method to call superclass
  • New superClass query conditions for search methods, construction methods and variables, you can continue to search in the parent class
  • YukiHookAPI lots of methods are decoupled from Xposed API
  • Added native Hook priority function of Xposed API
  • Fixed the problem that isFirstApplication may be inaccurate
  • Block the problem that MiuiCatcherPatch repeatedly calls the Hook entry method on the MIUI system
  • Optimize Hook entry calling method to avoid multiple calls due to Hook Framework issues
  • ",21),Uo=o("Fixed the problem that Hook "),qo=e("code",null,"ClassLoader",-1),Ko=o(" causes Hook to freeze, thanks to "),Vo={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Zo=o("WankkoRee"),Go=o(" for the feedback"),Jo=e("li",null,[o("Improve the performance after the "),e("code",null,"XC_Callback"),o(" interface is connected")],-1),Qo=e("li",null,[o("Java "),e("code",null,"type"),o(" added "),e("code",null,"ClassLoader"),o(" type")],-1),$o=e("li",null,"Optimize the API help documentation, fix the problem that the page may be continuously cached",-1),et={id:"_1-0-78-2022-04-18",tabindex:"-1"},ot=e("a",{class:"header-anchor",href:"#_1-0-78-2022-04-18","aria-hidden":"true"},"#",-1),tt=o(" 1.0.78 | 2022.04.18 \u2002"),dt=n("
  • YukiHookModulePrefs adds isRunInNewXShareMode method, which can be used to determine whether the module is currently in New XSharePreference mode
  • Fixed YukiHookModulePrefs working in New XSharePreference mode
  • Added ModulePreferenceFragment, now you can completely replace PreferenceFragmentCompat and start using the new functionality
  • ",3),it=o("Adapt the Sp data storage solution of "),nt=e("code",null,"PreferenceFragmentCompat",-1),ct=o(", thanks to "),at={href:"https://github.com/mahoshojoHCG",target:"_blank",rel:"noopener noreferrer"},st=o("mahoshojoHCG"),lt=o(" for feedback"),rt=e("li",null,[o("Update autohandlers and "),e("code",null,"Kotlin"),o(" dependencies to the latest version")],-1),ht=e("li",null,"Fixed some bugs in documentation and code comments",-1),ut={id:"_1-0-77-2022-04-15",tabindex:"-1"},_t=e("a",{class:"header-anchor",href:"#_1-0-77-2022-04-15","aria-hidden":"true"},"#",-1),mt=o(" 1.0.77 | 2022.04.15 \u2002"),pt=e("code",null,"YukiHookModulePrefs",-1),ft=o(" added "),gt=e("code",null,"clear",-1),kt=o(" method, thanks to "),bt={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},yt=o("WankkoRee"),xt=o(" for the suggestion"),vt=n("
  • YukiHookModulePrefs added getStringSet, putStringSet, all methods
  • Added any method to args of HookParam
  • Added ModuleApplication, which can be inherited in modules to achieve more functions
  • Connect all findClass functions to the Xposed API, and continue to use native ClassLoader in non-hosted environments
  • Fixed some possible bugs
  • ",5),wt={id:"_1-0-75-2022-04-13",tabindex:"-1"},At=e("a",{class:"header-anchor",href:"#_1-0-75-2022-04-13","aria-hidden":"true"},"#",-1),Ht=o(" 1.0.75 | 2022.04.13 \u2002"),Pt=o("Corrected the logic recognition part of the automatic handler, thanks to "),Ft={href:"https://github.com/ApeaSuperz",target:"_blank",rel:"noopener noreferrer"},Ct=o("ApeaSuperz"),Mt=o(" contribution"),It=n("
  • Fixed an issue where the reference to a doc comment was not changed
  • firstArgs and lastArgs methods have been removed from HookParam, now you can use args().first() and args().last() instead of it
  • Removed default parameter index = 0 in args() in HookParam, now you can use args().first() or args(index = 0) to replace it
  • The result function in HookParam adds generic matching, now you can use result<T> to match the known return value type of your target method
  • The emptyParam condition is added to the method and constructor query function, and the misunderstanding of the query condition that needs to be paid attention to in the document has been improved
  • Added android type in type
  • ",6),Rt={id:"_1-0-73-2022-04-10",tabindex:"-1"},Yt=e("a",{class:"header-anchor",href:"#_1-0-73-2022-04-10","aria-hidden":"true"},"#",-1),St=o(" 1.0.73 | 2022.04.10 \u2002"),Lt=o("Fixed some Chinese translation errors in documents, thanks to "),Dt={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Xt=o("WankkoRee"),zt=o(" for their contributions"),Tt=o("Fixed the problem that "),Wt=e("code",null,"XC_LoadPackage.LoadPackageParam",-1),jt=o(" throws an exception when the content is empty in some cases, thanks to "),Bt={href:"https://github.com/luckyzyx",target:"_blank",rel:"noopener noreferrer"},Ot=o("Luckyzyx"),Nt=o(" for the feedback"),Et=e("li",null,"Fixed some known bugs and improve Hook stability",-1),Ut={id:"_1-0-72-2022-04-09",tabindex:"-1"},qt=e("a",{class:"header-anchor",href:"#_1-0-72-2022-04-09","aria-hidden":"true"},"#",-1),Kt=o(" 1.0.72 | 2022.04.09 \u2002"),Vt=e("ul",null,[e("li",null,"Update API documentation to new address"),e("li",null,[o("Add "),e("code",null,"appContext"),o(" function to "),e("code",null,"PackageParam")]),e("li",null,"Fixed some known bugs and improve Hook stability")],-1),Zt={id:"_1-0-71-2022-04-04",tabindex:"-1"},Gt=e("a",{class:"header-anchor",href:"#_1-0-71-2022-04-04","aria-hidden":"true"},"#",-1),Jt=o(" 1.0.71 | 2022.04.04 \u2002"),Qt=e("ul",null,[e("li",null,"Fixed a serious issue that would stop the Hook from throwing an exception when VariousClass could not be matched")],-1),$t={id:"_1-0-70-2022-04-04",tabindex:"-1"},ed=e("a",{class:"header-anchor",href:"#_1-0-70-2022-04-04","aria-hidden":"true"},"#",-1),od=o(" 1.0.70 | 2022.04.04 \u2002"),td=e("li",null,[o("Fixed "),e("code",null,"instanceClass"),o(" reporting an error after being called in a static instance")],-1),dd=o("Add "),id=e("code",null,"isUseAppClassLoader",-1),nd=o(" function in Hook process, thanks to "),cd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},ad=o("WankkoRee"),sd=o(" for feedback"),ld=e("li",null,[o("Added the "),e("code",null,"withProcess"),o(" function, which can be hooked according to the currently specified process of the APP")],-1),rd=e("li",null,"Fixed critical logic errors in lookup methods, constructor classes and variables",-1),hd=e("li",null,"Fixed the problem that the abnormal output cannot be ignored when the Hook target class does not exist",-1),ud=e("li",null,"Fixed the problem that the Hook could not take effect due to the fast loading of the APP startup method in some cases",-1),_d=o("Fixed "),md=e("code",null,"allMethods",-1),pd=o(" not throwing an exception when it is not hooked to a method, thanks to "),fd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},gd=o("WankkoRee"),kd=o(" for the feedback"),bd=o("Added Hook status monitoring function, thanks to "),yd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},xd=o("WankkoRee"),vd=o(" for the suggestion"),wd=e("li",null,"Modify the way the Xposed entry is injected into the class, and redefine the definition domain of the API",-1),Ad=o("Added obfuscated method and variable lookup function, you can use different types of filter "),Hd=e("code",null,"index",-1),Pd=o(" to locate the specified method and variable, thanks to "),Fd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Cd=o("WankkoRee"),Md=o(" for the ideas provided"),Id=e("li",null,[o("When looking for methods and variables, multiple types are allowed, such as the class name declared by "),e("code",null,"String"),o(" and "),e("code",null,"VariousClass")],-1),Rd=e("li",null,[o("Add a new "),e("code",null,"current"),o(" function, which can build a reflection method operation space for any class, and easily call and modify the methods and variables in it")],-1),Yd=o("Fixed a lot of bugs in the hook process, thanks to "),Sd={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Ld=o("WankkoRee"),Dd=o(" for contributing to this project"),Xd={id:"_1-0-69-2022-03-30",tabindex:"-1"},zd=e("a",{class:"header-anchor",href:"#_1-0-69-2022-03-30","aria-hidden":"true"},"#",-1),Td=o(" 1.0.69 | 2022.03.30 \u2002"),Wd=e("li",null,"Added and improved annotations for some method functions",-1),jd=e("li",null,"Added more example Hook content in Demo",-1),Bd=o("Fixed the issue that only the last one takes effect when "),Od=e("code",null,"allMethods",-1),Nd=o(" is used multiple times in a Hook instance, thanks to "),Ed={href:"https://github.com/WankkoRee",target:"_blank",rel:"noopener noreferrer"},Ud=o("WankkoRee"),qd=o(" for the feedback"),Kd={id:"_1-0-68-2022-03-29",tabindex:"-1"},Vd=e("a",{class:"header-anchor",href:"#_1-0-68-2022-03-29","aria-hidden":"true"},"#",-1),Zd=o(" 1.0.68 | 2022.03.29 \u2002"),Gd=n("
    • Added new use case and LSPosed scope in Demo
    • Added Member lookup cache and lookup cache configuration switches
    • Removed and modified MethodFinder, FieldFinder and HookParam related method calls
    • Add more cast types in Finder and support cast as array
    • Overall performance and stability improvements
    • Fixed bugs that may exist in the previous version
    ",1),Jd={id:"_1-0-67-2022-03-27",tabindex:"-1"},Qd=e("a",{class:"header-anchor",href:"#_1-0-67-2022-03-27","aria-hidden":"true"},"#",-1),$d=o(" 1.0.67 | 2022.03.27 \u2002"),ei=n("
    • Added three modifiers functions in Finder, which can filter static, native, public, abstract and many other description types
    • When searching for methods and constructors, the method parameter type can be blurred to a specified number for searching
    • Added hasModifiers extension for Member
    • Added give method in MethodFinder and ConstructorFinder to get primitive types
    • Added PrefsData template function in YukiHookModulePrefs
    • Completely refactored method, constructor and variable lookup scheme
    • Optimized code comments and fixed possible bugs
    ",1),oi={id:"_1-0-66-2022-03-25",tabindex:"-1"},ti=e("a",{class:"header-anchor",href:"#_1-0-66-2022-03-25","aria-hidden":"true"},"#",-1),di=o(" 1.0.66 | 2022.03.25 \u2002"),ii=e("ul",null,[e("li",null,[o("Fixed a serious bug in "),e("code",null,"MethodFinder")]),e("li",null,[o("Added "),e("code",null,"args"),o(" call method in "),e("code",null,"hookParam")]),e("li",null,"Fixed other possible problems and fix some class annotation problems")],-1),ni={id:"_1-0-65-2022-03-25",tabindex:"-1"},ci=e("a",{class:"header-anchor",href:"#_1-0-65-2022-03-25","aria-hidden":"true"},"#",-1),ai=o(" 1.0.65 | 2022.03.25 \u2002"),si=n("
    • Republished version to fix the incorrect new version of the Maven repository due to cache issues
    • Added MethodFinder and FieldFinder new return value calling methods
    • Fixed possible problems and fix possible problems during the use of Tai Chi
    • Fixed possible problems with auto-generated Xposed entry classes
    • Added android type and java type in type
    ",1),li={id:"_1-0-6-2022-03-20",tabindex:"-1"},ri=e("a",{class:"header-anchor",href:"#_1-0-6-2022-03-20","aria-hidden":"true"},"#",-1),hi=o(" 1.0.6 | 2022.03.20 \u2002"),ui=n("
    • Fixed YukiHookModulePrefs being ignored every time after using direct once to ignore cache
    • Added new API, abolished the traditional usage of isActive to judge module activation
    • Fixed the issue of printing debug logs when using the API in a non-Xposed environment
    • Fixed log output issue and unintercepted exception issue when looking for Field
    • Decoupling Xposed API in ReflectionUtils
    • Added YukiHookModuleStatus method name confusion to reduce the size of module generation
    • The welcome message will no longer be printed when loading the module's own Hook
    • Fixed some bugs that still exist in the previous version
    ",1),_i={id:"_1-0-55-2022-03-18",tabindex:"-1"},mi=e("a",{class:"header-anchor",href:"#_1-0-55-2022-03-18","aria-hidden":"true"},"#",-1),pi=o(" 1.0.55 | 2022.03.18 \u2002"),fi=e("ul",null,[e("li",null,"Fixed an annotation error"),e("li",null,"Temporarily fix a bug"),e("li",null,[o("Added a large number of "),e("code",null,"android"),o(" types in "),e("code",null,"type"),o(" and a small number of "),e("code",null,"java"),o(" types")]),e("li",null,"Fixed compatibility issues between new and old Kotlin APIs")],-1),gi={id:"_1-0-5-2022-03-18",tabindex:"-1"},ki=e("a",{class:"header-anchor",href:"#_1-0-5-2022-03-18","aria-hidden":"true"},"#",-1),bi=o(" 1.0.5 | 2022.03.18 \u2002"),yi=n("
    • Fixed the problem that the welcome message was printed multiple times in the case of the old version of the LSPosed framework
    • Added onInit method to configure YukiHookAPI
    • Added executorName and executorVersion to get the name and version number of the current hook framework
    • Added by method to set the timing and condition of Hook
    • YukiHookModulePrefs adds a controllable key-value cache, which can dynamically update data when the host is running
    • Fixed some possible bugs
    ",1),xi={id:"_1-0-4-2022-03-06",tabindex:"-1"},vi=e("a",{class:"header-anchor",href:"#_1-0-4-2022-03-06","aria-hidden":"true"},"#",-1),wi=o(" 1.0.4 | 2022.03.06 \u2002"),Ai=n("
    • Fixed LSPosed cannot find XposedBridge after enabling "Only module classloader can use Xposed API" option in latest version
    • Added constant version name and version number for YukiHookAPI
    • Added hasField method and isAllowPrintingLogs configuration parameter
    • Added isDebug to enable the API to automatically print the welcome message to test whether the module is valid
    ",1),Hi={id:"_1-0-3-2022-03-02",tabindex:"-1"},Pi=e("a",{class:"header-anchor",href:"#_1-0-3-2022-03-02","aria-hidden":"true"},"#",-1),Fi=o(" 1.0.3 | 2022.03.02 \u2002"),Ci=n("
    • Fixed a potential exception not intercepted BUG
    • Added ignoredError function
    • Added android type in type
    • Added ClassNotFound function after listening to hook
    ",1),Mi={id:"_1-0-2-2022-02-18",tabindex:"-1"},Ii=e("a",{class:"header-anchor",href:"#_1-0-2-2022-02-18","aria-hidden":"true"},"#",-1),Ri=o(" 1.0.2 | 2022.02.18 \u2002"),Yi=e("ul",null,[e("li",null,"Fixed the problem that the project path cannot be found under Windows"),e("li",null,[o("Remove part of reflection API, merge into "),e("code",null,"BaseFinder"),o(" for integration")]),e("li",null,"Add a method to create Hook directly using string")],-1),Si={id:"_1-0-1-2022-02-15",tabindex:"-1"},Li=e("a",{class:"header-anchor",href:"#_1-0-1-2022-02-15","aria-hidden":"true"},"#",-1),Di=o(" 1.0.1 | 2022.02.15 \u2002"),Xi=e("ul",null,[e("li",null,[e("code",null,"RemedyPlan"),o(" adds "),e("code",null,"onFind"),o(" function")]),e("li",null,"Integrate and modify some reflection API code"),e("li",null,[o("Added "),e("code",null,"java"),o(" type in "),e("code",null,"type")]),e("li",null,"Fixed the issue that ignored errors still output in the console")],-1),zi={id:"_1-0-2022-02-14",tabindex:"-1"},Ti=e("a",{class:"header-anchor",href:"#_1-0-2022-02-14","aria-hidden":"true"},"#",-1),Wi=o(" 1.0 | 2022.02.14 \u2002"),ji=e("ul",null,[e("li",null,"The first version is submitted to Maven")],-1);function Bi(Oi,Ni){const d=c("Badge"),i=c("ExternalLinkIcon");return s(),l("div",null,[h,e("h3",u,[_,m,t(d,{type:"tip",text:"latest",vertical:"middle"})]),p,e("h3",f,[g,k,t(d,{type:"warning",text:"stale",vertical:"middle"})]),b,e("h3",y,[x,v,t(d,{type:"warning",text:"stale",vertical:"middle"})]),w,e("h3",A,[H,P,t(d,{type:"warning",text:"stale",vertical:"middle"})]),F,e("h3",C,[M,I,t(d,{type:"warning",text:"stale",vertical:"middle"})]),e("ul",null,[R,e("li",null,[Y,e("a",S,[L,t(i)])]),D,e("li",null,[X,e("a",z,[T,t(i)]),W]),j,e("li",null,[B,O,N,E,U,q,e("a",K,[V,t(i)]),Z]),G,e("li",null,[J,Q,$,e("a",ee,[oe,t(i)]),te]),e("li",null,[de,ie,ne,e("a",ce,[ae,t(i)]),se]),le,e("li",null,[re,he,ue,_e,me,e("a",pe,[fe,t(i)]),ge,e("a",ke,[be,t(i)])]),ye,xe,ve,e("li",null,[we,Ae,He,Pe,Fe,e("a",Ce,[Me,t(i)]),Ie]),Re,e("li",null,[Ye,Se,Le,e("a",De,[Xe,t(i)]),ze,e("a",Te,[We,t(i)])]),je,Be,Oe,Ne]),e("h3",Ee,[Ue,qe,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ke,e("h3",Ve,[Ze,Ge,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[Je,Qe,$e,e("a",eo,[oo,t(i)]),to]),io]),e("h3",no,[co,ao,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),so,e("h3",lo,[ro,ho,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),uo,e("h3",_o,[mo,po,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),fo,e("h3",go,[ko,bo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),yo,e("h3",xo,[vo,wo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ao,e("h3",Ho,[Po,Fo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Co,e("h3",Mo,[Io,Ro,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Yo,e("h3",So,[Lo,Do,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Xo,e("h3",zo,[To,Wo,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),jo,e("h3",Bo,[Oo,No,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[Eo,e("li",null,[Uo,qo,Ko,e("a",Vo,[Zo,t(i)]),Go]),Jo,Qo,$o]),e("h3",et,[ot,tt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[dt,e("li",null,[it,nt,ct,e("a",at,[st,t(i)]),lt]),rt,ht]),e("h3",ut,[_t,mt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[pt,ft,gt,kt,e("a",bt,[yt,t(i)]),xt]),vt]),e("h3",wt,[At,Ht,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[Pt,e("a",Ft,[Ct,t(i)]),Mt]),It]),e("h3",Rt,[Yt,St,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[e("li",null,[Lt,e("a",Dt,[Xt,t(i)]),zt]),e("li",null,[Tt,Wt,jt,e("a",Bt,[Ot,t(i)]),Nt]),Et]),e("h3",Ut,[qt,Kt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Vt,e("h3",Zt,[Gt,Jt,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Qt,e("h3",$t,[ed,od,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[td,e("li",null,[dd,id,nd,e("a",cd,[ad,t(i)]),sd]),ld,rd,hd,ud,e("li",null,[_d,md,pd,e("a",fd,[gd,t(i)]),kd]),e("li",null,[bd,e("a",yd,[xd,t(i)]),vd]),wd,e("li",null,[Ad,Hd,Pd,e("a",Fd,[Cd,t(i)]),Md]),Id,Rd,e("li",null,[Yd,e("a",Sd,[Ld,t(i)]),Dd])]),e("h3",Xd,[zd,Td,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),e("ul",null,[Wd,jd,e("li",null,[Bd,Od,Nd,e("a",Ed,[Ud,t(i)]),qd])]),e("h3",Kd,[Vd,Zd,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Gd,e("h3",Jd,[Qd,$d,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ei,e("h3",oi,[ti,di,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ii,e("h3",ni,[ci,ai,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),si,e("h3",li,[ri,hi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ui,e("h3",_i,[mi,pi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),fi,e("h3",gi,[ki,bi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),yi,e("h3",xi,[vi,wi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ai,e("h3",Hi,[Pi,Fi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Ci,e("h3",Mi,[Ii,Ri,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Yi,e("h3",Si,[Li,Di,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),Xi,e("h3",zi,[Ti,Wi,t(d,{type:"danger",text:"outdate",vertical:"middle"})]),ji])}const Ui=a(r,[["render",Bi],["__file","changelog.html.vue"]]);export{Ui as default}; diff --git a/docs/assets/contacts.html.0c1be9b2.js b/docs/assets/contacts.html.1669ed01.js similarity index 91% rename from docs/assets/contacts.html.0c1be9b2.js rename to docs/assets/contacts.html.1669ed01.js index a60600958..8603874a8 100644 --- a/docs/assets/contacts.html.0c1be9b2.js +++ b/docs/assets/contacts.html.1669ed01.js @@ -1 +1 @@ -import{_ as s,r,o as c,c as a,b as e,d as n,e as o}from"./app.99fcdd51.js";const _={},l=e("h1",{id:"\u8054\u7CFB\u6211\u4EEC",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u8054\u7CFB\u6211\u4EEC","aria-hidden":"true"},"#"),o(" \u8054\u7CFB\u6211\u4EEC")],-1),d=e("blockquote",null,[e("p",null,"\u5982\u5728\u4F7F\u7528\u4E2D\u6709\u4EFB\u4F55\u95EE\u9898\uFF0C\u6216\u6709\u4EFB\u4F55\u5EFA\u8BBE\u6027\u7684\u5EFA\u8BAE\uFF0C\u90FD\u53EF\u4EE5\u8054\u7CFB\u6211\u4EEC\u3002")],-1),h=o("\u52A0\u5165\u6211\u4EEC "),i={href:"https://t.me/YukiHookAPI",target:"_blank",rel:"noopener noreferrer"},u=o("\u70B9\u51FB\u52A0\u5165 Telegram \u7FA4\u7EC4"),p=o("\u5728 "),f=e("strong",null,"\u9177\u5B89",-1),k=o(" \u627E\u5230\u6211 "),m={href:"http://www.coolapk.com/u/876977",target:"_blank",rel:"noopener noreferrer"},x=o("@\u661F\u591C\u4E0D\u835F"),b=e("h2",{id:"\u52A9\u529B\u7EF4\u62A4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u52A9\u529B\u7EF4\u62A4","aria-hidden":"true"},"#"),o(" \u52A9\u529B\u7EF4\u62A4")],-1),g=e("p",null,[o("\u611F\u8C22\u60A8\u9009\u62E9\u5E76\u4F7F\u7528 "),e("code",null,"YukiHookAPI"),o("\uFF0C\u5982\u6709\u4EE3\u7801\u76F8\u5173\u7684\u5EFA\u8BAE\u548C\u8BF7\u6C42\uFF0C\u53EF\u5728 Github \u63D0\u4EA4 Pull Request\u3002")],-1);function I(v,w){const t=r("ExternalLinkIcon");return c(),a("div",null,[l,d,e("p",null,[h,e("a",i,[u,n(t)])]),e("p",null,[p,f,k,e("a",m,[x,n(t)])]),b,g])}const E=s(_,[["render",I],["__file","contacts.html.vue"]]);export{E as default}; +import{_ as s,r,o as c,c as a,b as e,d as n,e as o}from"./app.6074a838.js";const _={},l=e("h1",{id:"\u8054\u7CFB\u6211\u4EEC",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u8054\u7CFB\u6211\u4EEC","aria-hidden":"true"},"#"),o(" \u8054\u7CFB\u6211\u4EEC")],-1),d=e("blockquote",null,[e("p",null,"\u5982\u5728\u4F7F\u7528\u4E2D\u6709\u4EFB\u4F55\u95EE\u9898\uFF0C\u6216\u6709\u4EFB\u4F55\u5EFA\u8BBE\u6027\u7684\u5EFA\u8BAE\uFF0C\u90FD\u53EF\u4EE5\u8054\u7CFB\u6211\u4EEC\u3002")],-1),h=o("\u52A0\u5165\u6211\u4EEC "),i={href:"https://t.me/YukiHookAPI",target:"_blank",rel:"noopener noreferrer"},u=o("\u70B9\u51FB\u52A0\u5165 Telegram \u7FA4\u7EC4"),p=o("\u5728 "),f=e("strong",null,"\u9177\u5B89",-1),k=o(" \u627E\u5230\u6211 "),m={href:"http://www.coolapk.com/u/876977",target:"_blank",rel:"noopener noreferrer"},x=o("@\u661F\u591C\u4E0D\u835F"),b=e("h2",{id:"\u52A9\u529B\u7EF4\u62A4",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#\u52A9\u529B\u7EF4\u62A4","aria-hidden":"true"},"#"),o(" \u52A9\u529B\u7EF4\u62A4")],-1),g=e("p",null,[o("\u611F\u8C22\u60A8\u9009\u62E9\u5E76\u4F7F\u7528 "),e("code",null,"YukiHookAPI"),o("\uFF0C\u5982\u6709\u4EE3\u7801\u76F8\u5173\u7684\u5EFA\u8BAE\u548C\u8BF7\u6C42\uFF0C\u53EF\u5728 Github \u63D0\u4EA4 Pull Request\u3002")],-1);function I(v,w){const t=r("ExternalLinkIcon");return c(),a("div",null,[l,d,e("p",null,[h,e("a",i,[u,n(t)])]),e("p",null,[p,f,k,e("a",m,[x,n(t)])]),b,g])}const E=s(_,[["render",I],["__file","contacts.html.vue"]]);export{E as default}; diff --git a/docs/assets/contacts.html.3d7caa0e.js b/docs/assets/contacts.html.e284998c.js similarity index 94% rename from docs/assets/contacts.html.3d7caa0e.js rename to docs/assets/contacts.html.e284998c.js index 8f45e36be..6961deafa 100644 --- a/docs/assets/contacts.html.3d7caa0e.js +++ b/docs/assets/contacts.html.e284998c.js @@ -1 +1 @@ -import{_ as s,r as a,o as c,c as r,b as e,d as o,e as t}from"./app.99fcdd51.js";const i={},l=e("h1",{id:"contact-us",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#contact-us","aria-hidden":"true"},"#"),t(" Contact Us")],-1),_=e("blockquote",null,[e("p",null,"If you have any questions in use, or have any constructive suggestions, you can contact us.")],-1),h=t("Join us "),u={href:"https://t.me/YukiHookAPI",target:"_blank",rel:"noopener noreferrer"},d=t("Click to join Telegram group"),p=t("Find me on "),f=e("strong",null,"Twitter",-1),k=t(),m={href:"https://twitter.com/fankesyooni",target:"_blank",rel:"noopener noreferrer"},g=t("@fankesyooni"),y=e("h2",{id:"help-with-maintenance",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#help-with-maintenance","aria-hidden":"true"},"#"),t(" Help with Maintenance")],-1),b=e("p",null,[t("Thank you for choosing and using "),e("code",null,"YukiHookAPI"),t(".")],-1),x=e("p",null,"If you have code-related suggestions and requests, you can submit a Pull Request on Github.",-1);function v(I,w){const n=a("ExternalLinkIcon");return c(),r("div",null,[l,_,e("p",null,[h,e("a",u,[d,o(n)])]),e("p",null,[p,f,k,e("a",m,[g,o(n)])]),y,b,x])}const T=s(i,[["render",v],["__file","contacts.html.vue"]]);export{T as default}; +import{_ as s,r as a,o as c,c as r,b as e,d as o,e as t}from"./app.6074a838.js";const i={},l=e("h1",{id:"contact-us",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#contact-us","aria-hidden":"true"},"#"),t(" Contact Us")],-1),_=e("blockquote",null,[e("p",null,"If you have any questions in use, or have any constructive suggestions, you can contact us.")],-1),h=t("Join us "),u={href:"https://t.me/YukiHookAPI",target:"_blank",rel:"noopener noreferrer"},d=t("Click to join Telegram group"),p=t("Find me on "),f=e("strong",null,"Twitter",-1),k=t(),m={href:"https://twitter.com/fankesyooni",target:"_blank",rel:"noopener noreferrer"},g=t("@fankesyooni"),y=e("h2",{id:"help-with-maintenance",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#help-with-maintenance","aria-hidden":"true"},"#"),t(" Help with Maintenance")],-1),b=e("p",null,[t("Thank you for choosing and using "),e("code",null,"YukiHookAPI"),t(".")],-1),x=e("p",null,"If you have code-related suggestions and requests, you can submit a Pull Request on Github.",-1);function v(I,w){const n=a("ExternalLinkIcon");return c(),r("div",null,[l,_,e("p",null,[h,e("a",u,[d,o(n)])]),e("p",null,[p,f,k,e("a",m,[g,o(n)])]),y,b,x])}const T=s(i,[["render",v],["__file","contacts.html.vue"]]);export{T as default}; diff --git a/docs/assets/example.html.a036bda1.js b/docs/assets/example.html.3cb1bbf7.js similarity index 94% rename from docs/assets/example.html.a036bda1.js rename to docs/assets/example.html.3cb1bbf7.js index 1e4a5cf78..a9a8cb14b 100644 --- a/docs/assets/example.html.a036bda1.js +++ b/docs/assets/example.html.3cb1bbf7.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-7b22efaf","path":"/en/guide/example.html","title":"Usage Example","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Structure Diagram","slug":"structure-diagram","link":"#structure-diagram","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]},{"level":2,"title":"A Simple Hook Example","slug":"a-simple-hook-example","link":"#a-simple-hook-example","children":[{"level":3,"title":"Hook App","slug":"hook-app","link":"#hook-app","children":[]},{"level":3,"title":"Hook Zygote","slug":"hook-zygote","link":"#hook-zygote","children":[]},{"level":3,"title":"Hook System Framework","slug":"hook-system-framework","link":"#hook-system-framework","children":[]},{"level":3,"title":"Hook Resources","slug":"hook-resources","link":"#hook-resources","children":[]},{"level":3,"title":"Remove Hook","slug":"remove-hook","link":"#remove-hook","children":[]}]},{"level":2,"title":"Exception Handling","slug":"exception-handling","link":"#exception-handling","children":[{"level":3,"title":"Listen for Exceptions","slug":"listen-for-exceptions","link":"#listen-for-exceptions","children":[]},{"level":3,"title":"Throw an Exception","slug":"throw-an-exception","link":"#throw-an-exception","children":[]}]},{"level":2,"title":"Status Monitor","slug":"status-monitor","link":"#status-monitor","children":[]},{"level":2,"title":"Expansion Usage","slug":"expansion-usage","link":"#expansion-usage","children":[{"level":3,"title":"Multiple Hosts","slug":"multiple-hosts","link":"#multiple-hosts","children":[]},{"level":3,"title":"Multiple Processes","slug":"multiple-processes","link":"#multiple-processes","children":[]}]},{"level":2,"title":"Writing Optimization","slug":"writing-optimization","link":"#writing-optimization","children":[]},{"level":2,"title":"Xposed Module own Active State","slug":"xposed-module-own-active-state","link":"#xposed-module-own-active-state","children":[]}],"git":{"updatedTime":1663940587000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/guide/example.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-7b22efaf","path":"/en/guide/example.html","title":"Usage Example","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Structure Diagram","slug":"structure-diagram","link":"#structure-diagram","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]},{"level":2,"title":"A Simple Hook Example","slug":"a-simple-hook-example","link":"#a-simple-hook-example","children":[{"level":3,"title":"Hook App","slug":"hook-app","link":"#hook-app","children":[]},{"level":3,"title":"Hook Zygote","slug":"hook-zygote","link":"#hook-zygote","children":[]},{"level":3,"title":"Hook System Framework","slug":"hook-system-framework","link":"#hook-system-framework","children":[]},{"level":3,"title":"Hook Resources","slug":"hook-resources","link":"#hook-resources","children":[]},{"level":3,"title":"Remove Hook","slug":"remove-hook","link":"#remove-hook","children":[]}]},{"level":2,"title":"Exception Handling","slug":"exception-handling","link":"#exception-handling","children":[{"level":3,"title":"Listen for Exceptions","slug":"listen-for-exceptions","link":"#listen-for-exceptions","children":[]},{"level":3,"title":"Throw an Exception","slug":"throw-an-exception","link":"#throw-an-exception","children":[]}]},{"level":2,"title":"Status Monitor","slug":"status-monitor","link":"#status-monitor","children":[]},{"level":2,"title":"Expansion Usage","slug":"expansion-usage","link":"#expansion-usage","children":[{"level":3,"title":"Multiple Hosts","slug":"multiple-hosts","link":"#multiple-hosts","children":[]},{"level":3,"title":"Multiple Processes","slug":"multiple-processes","link":"#multiple-processes","children":[]}]},{"level":2,"title":"Writing Optimization","slug":"writing-optimization","link":"#writing-optimization","children":[]},{"level":2,"title":"Xposed Module own Active State","slug":"xposed-module-own-active-state","link":"#xposed-module-own-active-state","children":[]}],"git":{"updatedTime":1672659321000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/guide/example.md"}');export{e as data}; diff --git a/docs/assets/example.html.27a92a09.js b/docs/assets/example.html.bb180469.js similarity index 94% rename from docs/assets/example.html.27a92a09.js rename to docs/assets/example.html.bb180469.js index 526407b0c..5c250c985 100644 --- a/docs/assets/example.html.27a92a09.js +++ b/docs/assets/example.html.bb180469.js @@ -1,4 +1,4 @@ -import{_ as o,r as p,o as i,c,b as s,d as a,a as l,e as n}from"./app.99fcdd51.js";const t={},r=l(`

    Usage Example

    Here is an introduction to the basic working method of YukiHookAPI and a list of simple Hook examples and common functions.

    Structure Diagram

    The structure below describes the basic working and principle of YukiHookAPI.

    Host Environment
    +import{_ as o,r as p,o as i,c,b as s,d as a,a as l,e as n}from"./app.6074a838.js";const t={},r=l(`

    Usage Example

    Here is an introduction to the basic working method of YukiHookAPI and a list of simple Hook examples and common functions.

    Structure Diagram

    The structure below describes the basic working and principle of YukiHookAPI.

    Host Environment
     \u2514\u2500\u2500 YukiMemberHookCreator
         \u2514\u2500\u2500 Class
             \u2514\u2500\u2500 MemberHookCreator
    @@ -283,4 +283,10 @@ import{_ as o,r as p,o as i,c,b as s,d as a,a as l,e as n}from"./app.99fcdd51.js
     

    If you want to use both judgment schemes, YukiHookAPI also encapsulates a convenient way for you.

    At this point, you can use YukiHookAPI.Status.isModuleActive to determine whether you are activated in Xposed or TaiChi and Promise.

    The following example

    if(YukiHookAPI.Status.isModuleActive) {
         // Your code here.
     }
    -

    Tips

    For more functions, please refer to YukiHookAPI.Status.

    Notice

    If the activation state of TaiChi and Wuji is included in the Module App activation judgment, the Application of the Module App must be extends ModuleApplication or ModuleApplication must be used directly;

    The API after 1.0.91 has modified the activation logic judgment method, now you can use this API in the Module App and Host App at the same time;

    Need to make sure YukiHookAPI.Configs.isEnableHookModuleStatus is enabled;

    Except for Hook Frameworks that provide standard APIs, Module Apps may not be able to determine whether they are activated in other cases.

    `,142);function b(k,D){const e=p("ExternalLinkIcon");return i(),c("div",null,[r,s("ul",null,[s("li",null,[s("p",null,[d,s("a",u,[A,a(e)])])]),s("li",null,[s("p",null,[m,s("a",v,[y,a(e)])])])]),h])}const B=o(t,[["render",b],["__file","example.html.vue"]]);export{B as default}; +

    Tips

    For more functions, please refer to YukiHookAPI.Status.

    Notice

    If your Module App's API version is higher than 29 and is running on a system whose target API is 29 or higher, you need to add the following permission statement in AndroidManifest.xml to judge the activation status of the Module App in TaiChi and Wuji.

    The following example

    <queries>
    +    <intent>
    +        <action android:name="android.intent.action.MAIN" />
    +    </intent>
    +</queries>
    +

    There is another solution, you can directly declare the android.permission.QUERY_ALL_PACKAGES permission, but it is not recommended and will be warned by code inspection.

    The following example

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    +

    If the activation state of TaiChi and Wuji is included in the Module App activation judgment, the Application of the Module App must be extends ModuleApplication or ModuleApplication must be used directly;

    The API after 1.0.91 has modified the activation logic judgment method, now you can use this API in the Module App and Host App at the same time;

    Need to make sure YukiHookAPI.Configs.isEnableHookModuleStatus is enabled;

    Except for Hook Frameworks that provide standard APIs, Module Apps may not be able to determine whether they are activated in other cases.

    `,142);function b(k,D){const e=p("ExternalLinkIcon");return i(),c("div",null,[r,s("ul",null,[s("li",null,[s("p",null,[d,s("a",u,[A,a(e)])])]),s("li",null,[s("p",null,[m,s("a",v,[y,a(e)])])])]),h])}const B=o(t,[["render",b],["__file","example.html.vue"]]);export{B as default}; diff --git a/docs/assets/example.html.13ac887a.js b/docs/assets/example.html.c868eee2.js similarity index 95% rename from docs/assets/example.html.13ac887a.js rename to docs/assets/example.html.c868eee2.js index 51bfd97e2..5426ee83b 100644 --- a/docs/assets/example.html.13ac887a.js +++ b/docs/assets/example.html.c868eee2.js @@ -1 +1 @@ -const l=JSON.parse('{"key":"v-13b430a0","path":"/zh-cn/guide/example.html","title":"\u7528\u6CD5\u793A\u4F8B","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u7ED3\u6784\u56FE\u89E3","slug":"\u7ED3\u6784\u56FE\u89E3","link":"#\u7ED3\u6784\u56FE\u89E3","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]},{"level":2,"title":"\u4E00\u4E2A\u7B80\u5355\u7684 Hook \u4F8B\u5B50","slug":"\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50","link":"#\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50","children":[{"level":3,"title":"Hook APP","slug":"hook-app","link":"#hook-app","children":[]},{"level":3,"title":"Hook Zygote","slug":"hook-zygote","link":"#hook-zygote","children":[]},{"level":3,"title":"Hook \u7CFB\u7EDF\u6846\u67B6","slug":"hook-\u7CFB\u7EDF\u6846\u67B6","link":"#hook-\u7CFB\u7EDF\u6846\u67B6","children":[]},{"level":3,"title":"Hook Resources","slug":"hook-resources","link":"#hook-resources","children":[]},{"level":3,"title":"\u89E3\u9664 Hook","slug":"\u89E3\u9664-hook","link":"#\u89E3\u9664-hook","children":[]}]},{"level":2,"title":"\u5F02\u5E38\u5904\u7406","slug":"\u5F02\u5E38\u5904\u7406","link":"#\u5F02\u5E38\u5904\u7406","children":[{"level":3,"title":"\u76D1\u542C\u5F02\u5E38","slug":"\u76D1\u542C\u5F02\u5E38","link":"#\u76D1\u542C\u5F02\u5E38","children":[]},{"level":3,"title":"\u629B\u51FA\u5F02\u5E38","slug":"\u629B\u51FA\u5F02\u5E38","link":"#\u629B\u51FA\u5F02\u5E38","children":[]}]},{"level":2,"title":"\u72B6\u6001\u76D1\u542C","slug":"\u72B6\u6001\u76D1\u542C","link":"#\u72B6\u6001\u76D1\u542C","children":[]},{"level":2,"title":"\u6269\u5C55\u7528\u6CD5","slug":"\u6269\u5C55\u7528\u6CD5","link":"#\u6269\u5C55\u7528\u6CD5","children":[{"level":3,"title":"\u591A\u4E2A\u5BBF\u4E3B","slug":"\u591A\u4E2A\u5BBF\u4E3B","link":"#\u591A\u4E2A\u5BBF\u4E3B","children":[]},{"level":3,"title":"\u591A\u4E2A\u8FDB\u7A0B","slug":"\u591A\u4E2A\u8FDB\u7A0B","link":"#\u591A\u4E2A\u8FDB\u7A0B","children":[]}]},{"level":2,"title":"\u5199\u6CD5\u4F18\u5316","slug":"\u5199\u6CD5\u4F18\u5316","link":"#\u5199\u6CD5\u4F18\u5316","children":[]},{"level":2,"title":"Xposed \u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","slug":"xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","link":"#xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/guide/example.md"}');export{l as data}; +const l=JSON.parse('{"key":"v-13b430a0","path":"/zh-cn/guide/example.html","title":"\u7528\u6CD5\u793A\u4F8B","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u7ED3\u6784\u56FE\u89E3","slug":"\u7ED3\u6784\u56FE\u89E3","link":"#\u7ED3\u6784\u56FE\u89E3","children":[]},{"level":2,"title":"Demo","slug":"demo","link":"#demo","children":[]},{"level":2,"title":"\u4E00\u4E2A\u7B80\u5355\u7684 Hook \u4F8B\u5B50","slug":"\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50","link":"#\u4E00\u4E2A\u7B80\u5355\u7684-hook-\u4F8B\u5B50","children":[{"level":3,"title":"Hook APP","slug":"hook-app","link":"#hook-app","children":[]},{"level":3,"title":"Hook Zygote","slug":"hook-zygote","link":"#hook-zygote","children":[]},{"level":3,"title":"Hook \u7CFB\u7EDF\u6846\u67B6","slug":"hook-\u7CFB\u7EDF\u6846\u67B6","link":"#hook-\u7CFB\u7EDF\u6846\u67B6","children":[]},{"level":3,"title":"Hook Resources","slug":"hook-resources","link":"#hook-resources","children":[]},{"level":3,"title":"\u89E3\u9664 Hook","slug":"\u89E3\u9664-hook","link":"#\u89E3\u9664-hook","children":[]}]},{"level":2,"title":"\u5F02\u5E38\u5904\u7406","slug":"\u5F02\u5E38\u5904\u7406","link":"#\u5F02\u5E38\u5904\u7406","children":[{"level":3,"title":"\u76D1\u542C\u5F02\u5E38","slug":"\u76D1\u542C\u5F02\u5E38","link":"#\u76D1\u542C\u5F02\u5E38","children":[]},{"level":3,"title":"\u629B\u51FA\u5F02\u5E38","slug":"\u629B\u51FA\u5F02\u5E38","link":"#\u629B\u51FA\u5F02\u5E38","children":[]}]},{"level":2,"title":"\u72B6\u6001\u76D1\u542C","slug":"\u72B6\u6001\u76D1\u542C","link":"#\u72B6\u6001\u76D1\u542C","children":[]},{"level":2,"title":"\u6269\u5C55\u7528\u6CD5","slug":"\u6269\u5C55\u7528\u6CD5","link":"#\u6269\u5C55\u7528\u6CD5","children":[{"level":3,"title":"\u591A\u4E2A\u5BBF\u4E3B","slug":"\u591A\u4E2A\u5BBF\u4E3B","link":"#\u591A\u4E2A\u5BBF\u4E3B","children":[]},{"level":3,"title":"\u591A\u4E2A\u8FDB\u7A0B","slug":"\u591A\u4E2A\u8FDB\u7A0B","link":"#\u591A\u4E2A\u8FDB\u7A0B","children":[]}]},{"level":2,"title":"\u5199\u6CD5\u4F18\u5316","slug":"\u5199\u6CD5\u4F18\u5316","link":"#\u5199\u6CD5\u4F18\u5316","children":[]},{"level":2,"title":"Xposed \u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","slug":"xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","link":"#xposed-\u6A21\u5757\u5224\u65AD\u81EA\u8EAB\u6FC0\u6D3B\u72B6\u6001","children":[]}],"git":{"updatedTime":1673456451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/guide/example.md"}');export{l as data}; diff --git a/docs/assets/example.html.f72f0f04.js b/docs/assets/example.html.ed3ea935.js similarity index 94% rename from docs/assets/example.html.f72f0f04.js rename to docs/assets/example.html.ed3ea935.js index abe2692ef..7e2d705a5 100644 --- a/docs/assets/example.html.f72f0f04.js +++ b/docs/assets/example.html.ed3ea935.js @@ -1,4 +1,4 @@ -import{_ as o,r as p,o as c,c as i,b as s,d as e,a as l,e as n}from"./app.99fcdd51.js";const r={},t=l(`

    \u7528\u6CD5\u793A\u4F8B

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u4EE5\u53CA\u5217\u4E3E\u4E86\u7B80\u5355\u7684 Hook \u4F8B\u5B50\u548C\u5E38\u7528\u529F\u80FD\u3002

    \u7ED3\u6784\u56FE\u89E3

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    Host Environment
    +import{_ as o,r as p,o as c,c as i,b as s,d as e,a as l,e as n}from"./app.6074a838.js";const r={},t=l(`

    \u7528\u6CD5\u793A\u4F8B

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u4EE5\u53CA\u5217\u4E3E\u4E86\u7B80\u5355\u7684 Hook \u4F8B\u5B50\u548C\u5E38\u7528\u529F\u80FD\u3002

    \u7ED3\u6784\u56FE\u89E3

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86 YukiHookAPI \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    Host Environment
     \u2514\u2500\u2500 YukiMemberHookCreator
         \u2514\u2500\u2500 Class
             \u2514\u2500\u2500 MemberHookCreator
    @@ -283,4 +283,10 @@ import{_ as o,r as p,o as c,c as i,b as s,d as e,a as l,e as n}from"./app.99fcdd
     

    \u82E5\u4F60\u60F3\u4F7F\u7528\u4E24\u8005\u5F97\u517C\u7684\u5224\u65AD\u65B9\u6848\uFF0CYukiHookAPI \u540C\u6837\u4E3A\u4F60\u5C01\u88C5\u4E86\u4FBF\u6377\u7684\u65B9\u5F0F\u3002

    \u6B64\u65F6\u4F60\u53EF\u4EE5\u4F7F\u7528 YukiHookAPI.Status.isModuleActive \u5224\u65AD\u81EA\u8EAB\u662F\u5426\u5728 Xposed \u6216\u592A\u6781\u3001\u65E0\u6781\u4E2D\u88AB\u6FC0\u6D3B\u3002

    \u793A\u4F8B\u5982\u4E0B

    if(YukiHookAPI.Status.isModuleActive) {
         // Your code here.
     }
    -

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookAPI.Status\u3002

    \u6CE8\u610F

    \u82E5\u6A21\u5757\u6FC0\u6D3B\u5224\u65AD\u4E2D\u5305\u542B\u592A\u6781\u3001\u65E0\u6781\u4E2D\u7684\u6FC0\u6D3B\u72B6\u6001\uFF0C\u5C31\u5FC5\u987B\u5C06\u6A21\u5757\u7684 Application \u7EE7\u627F\u4E8E ModuleApplication \u6216\u76F4\u63A5\u4F7F\u7528 ModuleApplication\uFF1B

    1.0.91 \u7248\u672C\u540E\u7684 API \u4FEE\u6539\u4E86\u6FC0\u6D3B\u903B\u8F91\u5224\u65AD\u65B9\u5F0F\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E0E Hook APP (\u5BBF\u4E3B) \u4E2D\u540C\u65F6\u4F7F\u7528\u6B64 API\uFF1B

    \u9700\u8981\u786E\u4FDD YukiHookAPI.Configs.isEnableHookModuleStatus \u662F\u542F\u7528\u72B6\u6001\uFF1B

    \u9664\u4E86\u63D0\u4F9B\u6807\u51C6 API \u7684 Hook \u6846\u67B6\u4E4B\u5916\uFF0C\u5176\u5B83\u60C5\u51B5\u4E0B\u6A21\u5757\u53EF\u80FD\u90FD\u5C06\u65E0\u6CD5\u5224\u65AD\u81EA\u5DF1\u662F\u5426\u88AB\u6FC0\u6D3B\u3002

    `,142);function k(D,C){const a=p("ExternalLinkIcon");return c(),i("div",null,[t,s("ul",null,[s("li",null,[s("p",null,[d,s("a",u,[A,e(a)])])]),s("li",null,[s("p",null,[v,s("a",y,[m,e(a)])])])]),b])}const h=o(r,[["render",k],["__file","example.html.vue"]]);export{h as default}; +

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookAPI.Status\u3002

    \u6CE8\u610F

    \u5982\u679C\u4F60\u7684\u6A21\u5757 API \u7248\u672C\u9AD8\u4E8E 29 \u4E14\u6B63\u5728\u76EE\u6807 API \u4E3A 29 \u4EE5\u4E0A\u7684\u7CFB\u7EDF\u4E2D\u8FD0\u884C\uFF0C\u4F60\u9700\u8981\u5728 AndroidManifest.xml \u4E2D\u6DFB\u52A0\u5982\u4E0B\u6743\u9650\u58F0\u660E\u624D\u80FD\u6B63\u5E38\u5224\u65AD\u6A21\u5757\u5728\u592A\u6781\u3001\u65E0\u6781\u4E2D\u7684\u6FC0\u6D3B\u72B6\u6001\u3002

    \u793A\u4F8B\u5982\u4E0B

    <queries>
    +    <intent>
    +        <action android:name="android.intent.action.MAIN" />
    +    </intent>
    +</queries>
    +

    \u8FD8\u6709\u4E00\u79CD\u65B9\u6848\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u58F0\u660E android.permission.QUERY_ALL_PACKAGES \u6743\u9650\uFF0C\u4F46\u662F\u4E0D\u63A8\u8350\u4E14\u4F1A\u88AB\u4EE3\u7801\u68C0\u67E5\u8B66\u544A\u3002

    \u793A\u4F8B\u5982\u4E0B

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    +

    \u82E5\u6A21\u5757\u6FC0\u6D3B\u5224\u65AD\u4E2D\u5305\u542B\u592A\u6781\u3001\u65E0\u6781\u4E2D\u7684\u6FC0\u6D3B\u72B6\u6001\uFF0C\u5C31\u5FC5\u987B\u5C06\u6A21\u5757\u7684 Application \u7EE7\u627F\u4E8E ModuleApplication \u6216\u76F4\u63A5\u4F7F\u7528 ModuleApplication\uFF1B

    1.0.91 \u7248\u672C\u540E\u7684 API \u4FEE\u6539\u4E86\u6FC0\u6D3B\u903B\u8F91\u5224\u65AD\u65B9\u5F0F\uFF0C\u73B0\u5728\u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E0E Hook APP (\u5BBF\u4E3B) \u4E2D\u540C\u65F6\u4F7F\u7528\u6B64 API\uFF1B

    \u9700\u8981\u786E\u4FDD YukiHookAPI.Configs.isEnableHookModuleStatus \u662F\u542F\u7528\u72B6\u6001\uFF1B

    \u9664\u4E86\u63D0\u4F9B\u6807\u51C6 API \u7684 Hook Framework \u4E4B\u5916\uFF0C\u5176\u5B83\u60C5\u51B5\u4E0B\u6A21\u5757\u53EF\u80FD\u90FD\u5C06\u65E0\u6CD5\u5224\u65AD\u81EA\u5DF1\u662F\u5426\u88AB\u6FC0\u6D3B\u3002

    `,142);function D(k,C){const a=p("ExternalLinkIcon");return c(),i("div",null,[t,s("ul",null,[s("li",null,[s("p",null,[d,s("a",u,[A,e(a)])])]),s("li",null,[s("p",null,[v,s("a",y,[m,e(a)])])])]),b])}const h=o(r,[["render",D],["__file","example.html.vue"]]);export{h as default}; diff --git a/docs/assets/future.html.373b372f.js b/docs/assets/future.html.7c6a1a9d.js similarity index 97% rename from docs/assets/future.html.373b372f.js rename to docs/assets/future.html.7c6a1a9d.js index a442864bd..69464feca 100644 --- a/docs/assets/future.html.373b372f.js +++ b/docs/assets/future.html.7c6a1a9d.js @@ -1 +1 @@ -import{_ as e,o,c as t,a as r}from"./app.99fcdd51.js";const a={},i=r('

    Looking for Future

    The future is bright and uncertain, let us look forward to the future development space of YukiHookAPI.

    Unresolved Issues

    Here are the unresolved issues with YukiHookAPI.

    YukiHookModulePrefs

    Currently only supports LSPosed perfectly, other Xposed Framework need to downgrade the module target api.

    TaiChi may not be supported at all, and TaiChi needs a lower target api to adapt on high-version systems.

    Some Xposed Module developers currently choose the Hook target app self's SharedPreferences storage solution to solve the module settings sharing problem.

    In the later period, the permissions of the Android system will become more and more strict, and selinux is a big problem currently facing, which needs to be discussed and studied.

    Future Plans

    Features that YukiHookAPI may add later are included here.

    Lite Version Supported for Standalone Use

    To be Discussed

    At present, the API only supports binding to xposed_init through the automatic handler.

    If you don't like the automatic handler, you must implement the module loading entry yourself.

    In the future, the Lite version with only API functions will be launched according to the number of people required.

    You can submit issues with us.

    We have provided the Xposed native API listening interface, you can find or view the implementation method of the Demo here.

    Support for More Hook Framework

    As an API, currently only docking XposedBridge as a compatibility layer still has certain limitations.

    Most inline hook do not have a Java compatibility layer, and the Java compatibility layer adaptation of native hook may be considered later.

    ',17),s=[i];function n(d,u){return o(),t("div",null,s)}const h=e(a,[["render",n],["__file","future.html.vue"]]);export{h as default}; +import{_ as e,o,c as t,a as r}from"./app.6074a838.js";const a={},i=r('

    Looking for Future

    The future is bright and uncertain, let us look forward to the future development space of YukiHookAPI.

    Unresolved Issues

    Here are the unresolved issues with YukiHookAPI.

    YukiHookModulePrefs

    Currently only supports LSPosed perfectly, other Xposed Framework need to downgrade the module target api.

    TaiChi may not be supported at all, and TaiChi needs a lower target api to adapt on high-version systems.

    Some Xposed Module developers currently choose the Hook target app self's SharedPreferences storage solution to solve the module settings sharing problem.

    In the later period, the permissions of the Android system will become more and more strict, and selinux is a big problem currently facing, which needs to be discussed and studied.

    Future Plans

    Features that YukiHookAPI may add later are included here.

    Lite Version Supported for Standalone Use

    To be Discussed

    At present, the API only supports binding to xposed_init through the automatic handler.

    If you don't like the automatic handler, you must implement the module loading entry yourself.

    In the future, the Lite version with only API functions will be launched according to the number of people required.

    You can submit issues with us.

    We have provided the Xposed native API listening interface, you can find or view the implementation method of the Demo here.

    Support for More Hook Framework

    As an API, currently only docking XposedBridge as a compatibility layer still has certain limitations.

    Most inline hook do not have a Java compatibility layer, and the Java compatibility layer adaptation of native hook may be considered later.

    ',17),s=[i];function n(d,u){return o(),t("div",null,s)}const h=e(a,[["render",n],["__file","future.html.vue"]]);export{h as default}; diff --git a/docs/assets/future.html.1187acab.js b/docs/assets/future.html.dce50bbf.js similarity index 98% rename from docs/assets/future.html.1187acab.js rename to docs/assets/future.html.dce50bbf.js index 683c2428d..9fa43652b 100644 --- a/docs/assets/future.html.1187acab.js +++ b/docs/assets/future.html.dce50bbf.js @@ -1 +1 @@ -import{_ as e,o,c as a,a as d}from"./app.99fcdd51.js";const r={},c=d('

    \u5C55\u671B\u672A\u6765

    \u672A\u6765\u662F\u7F8E\u597D\u7684\uFF0C\u4E5F\u662F\u4E0D\u786E\u5B9A\u7684\uFF0C\u8BA9\u6211\u4EEC\u5171\u540C\u671F\u5F85 YukiHookAPI \u5728\u672A\u6765\u7684\u53D1\u5C55\u7A7A\u95F4\u3002

    \u672A\u89E3\u51B3\u7684\u95EE\u9898

    \u8FD9\u91CC\u6536\u5F55\u4E86 YukiHookAPI \u5C1A\u672A\u89E3\u51B3\u7684\u95EE\u9898\u3002

    YukiHookModulePrefs

    \u76EE\u524D\u4EC5\u9650\u5B8C\u7F8E\u652F\u6301 LSPosed\uFF0C\u5176\u5B83 Xposed \u6846\u67B6\u9700\u8981\u964D\u7EA7\u6A21\u5757 API\u3002

    \u53EF\u80FD\u5B8C\u5168\u4E0D\u652F\u6301\u592A\u6781\uFF0C\u592A\u6781\u5728\u9AD8\u7248\u672C\u7CFB\u7EDF\u4E0A\u9700\u8981\u66F4\u4F4E\u7684 API \u624D\u80FD\u9002\u914D\u3002

    \u90E8\u5206 Xposed \u6A21\u5757\u5F00\u53D1\u8005\u76EE\u524D\u9009\u62E9 Hook \u76EE\u6807 APP \u5185\u7F6E Sp \u5B58\u50A8\u65B9\u6848\u89E3\u51B3\u6A21\u5757\u8BBE\u7F6E\u5171\u4EAB\u95EE\u9898\u3002

    \u540E\u671F Android \u7CFB\u7EDF\u7684\u6743\u9650\u5C06\u8D8A\u6765\u8D8A\u4E25\u683C\uFF0Cselinux \u5C31\u662F\u76EE\u524D\u9762\u4E34\u7684\u4E00\u4E2A\u5927\u95EE\u9898\uFF0C\u6709\u5F85\u8BA8\u8BBA\u548C\u7814\u7A76\u3002

    \u672A\u6765\u7684\u8BA1\u5212

    \u8FD9\u91CC\u6536\u5F55\u4E86 YukiHookAPI \u53EF\u80FD\u4F1A\u5728\u540E\u671F\u6DFB\u52A0\u7684\u529F\u80FD\u3002

    \u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684 Lite \u7248\u672C

    \u5F85\u8BA8\u8BBA

    \u76EE\u524D API \u53EA\u652F\u6301\u901A\u8FC7\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7ED1\u5B9A\u5230 xposed_init\uFF0C\u82E5\u60A8\u4E0D\u559C\u6B22\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\uFF0C\u4E00\u5B9A\u8981\u81EA\u5DF1\u5B9E\u73B0\u6A21\u5757\u88C5\u8F7D\u5165\u53E3\uFF0C\u672A\u6765\u4F1A\u6309\u7167\u9700\u6C42\u4EBA\u6570\u63A8\u51FA\u4EC5\u6709 API \u529F\u80FD\u7684 Lite \u7248\u672C\uFF0C\u4F60\u53EF\u5411\u6211\u4EEC\u63D0\u51FA issues\u3002

    API \u5DF2\u7ECF\u63D0\u4F9B\u4E86 Xposed \u539F\u751F API \u76D1\u542C\u63A5\u53E3\uFF0C\u4F60\u53EF\u4EE5 \u5728\u8FD9\u91CC \u627E\u5230\u6216\u67E5\u770B Demo \u7684\u5B9E\u73B0\u65B9\u6CD5\u3002

    \u652F\u6301\u66F4\u591A Hook Framework

    \u4F5C\u4E3A API \u6765\u8BB2\uFF0C\u76EE\u524D\u4EC5\u4EC5\u5BF9\u63A5 XposedBridge \u4F5C\u4E3A\u517C\u5BB9\u5C42\uFF0C\u8FD8\u662F\u6709\u4E00\u5B9A\u7684\u5C40\u9650\u6027\u3002

    \u5927\u90E8\u5206 inline hook \u6CA1\u6709 Java \u517C\u5BB9\u5C42\uFF0C\u540E\u671F\u53EF\u80FD\u4F1A\u8003\u8651 native hook \u7684 Java \u517C\u5BB9\u5C42\u9002\u914D\u3002

    ',17),i=[c];function t(s,h){return o(),a("div",null,i)}const p=e(r,[["render",t],["__file","future.html.vue"]]);export{p as default}; +import{_ as e,o,c as a,a as d}from"./app.6074a838.js";const r={},c=d('

    \u5C55\u671B\u672A\u6765

    \u672A\u6765\u662F\u7F8E\u597D\u7684\uFF0C\u4E5F\u662F\u4E0D\u786E\u5B9A\u7684\uFF0C\u8BA9\u6211\u4EEC\u5171\u540C\u671F\u5F85 YukiHookAPI \u5728\u672A\u6765\u7684\u53D1\u5C55\u7A7A\u95F4\u3002

    \u672A\u89E3\u51B3\u7684\u95EE\u9898

    \u8FD9\u91CC\u6536\u5F55\u4E86 YukiHookAPI \u5C1A\u672A\u89E3\u51B3\u7684\u95EE\u9898\u3002

    YukiHookModulePrefs

    \u76EE\u524D\u4EC5\u9650\u5B8C\u7F8E\u652F\u6301 LSPosed\uFF0C\u5176\u5B83 Xposed \u6846\u67B6\u9700\u8981\u964D\u7EA7\u6A21\u5757 API\u3002

    \u53EF\u80FD\u5B8C\u5168\u4E0D\u652F\u6301\u592A\u6781\uFF0C\u592A\u6781\u5728\u9AD8\u7248\u672C\u7CFB\u7EDF\u4E0A\u9700\u8981\u66F4\u4F4E\u7684 API \u624D\u80FD\u9002\u914D\u3002

    \u90E8\u5206 Xposed \u6A21\u5757\u5F00\u53D1\u8005\u76EE\u524D\u9009\u62E9 Hook \u76EE\u6807 APP \u5185\u7F6E Sp \u5B58\u50A8\u65B9\u6848\u89E3\u51B3\u6A21\u5757\u8BBE\u7F6E\u5171\u4EAB\u95EE\u9898\u3002

    \u540E\u671F Android \u7CFB\u7EDF\u7684\u6743\u9650\u5C06\u8D8A\u6765\u8D8A\u4E25\u683C\uFF0Cselinux \u5C31\u662F\u76EE\u524D\u9762\u4E34\u7684\u4E00\u4E2A\u5927\u95EE\u9898\uFF0C\u6709\u5F85\u8BA8\u8BBA\u548C\u7814\u7A76\u3002

    \u672A\u6765\u7684\u8BA1\u5212

    \u8FD9\u91CC\u6536\u5F55\u4E86 YukiHookAPI \u53EF\u80FD\u4F1A\u5728\u540E\u671F\u6DFB\u52A0\u7684\u529F\u80FD\u3002

    \u652F\u6301\u72EC\u7ACB\u4F7F\u7528\u7684 Lite \u7248\u672C

    \u5F85\u8BA8\u8BBA

    \u76EE\u524D API \u53EA\u652F\u6301\u901A\u8FC7\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\u7ED1\u5B9A\u5230 xposed_init\uFF0C\u82E5\u60A8\u4E0D\u559C\u6B22\u81EA\u52A8\u5904\u7406\u7A0B\u5E8F\uFF0C\u4E00\u5B9A\u8981\u81EA\u5DF1\u5B9E\u73B0\u6A21\u5757\u88C5\u8F7D\u5165\u53E3\uFF0C\u672A\u6765\u4F1A\u6309\u7167\u9700\u6C42\u4EBA\u6570\u63A8\u51FA\u4EC5\u6709 API \u529F\u80FD\u7684 Lite \u7248\u672C\uFF0C\u4F60\u53EF\u5411\u6211\u4EEC\u63D0\u51FA issues\u3002

    API \u5DF2\u7ECF\u63D0\u4F9B\u4E86 Xposed \u539F\u751F API \u76D1\u542C\u63A5\u53E3\uFF0C\u4F60\u53EF\u4EE5 \u5728\u8FD9\u91CC \u627E\u5230\u6216\u67E5\u770B Demo \u7684\u5B9E\u73B0\u65B9\u6CD5\u3002

    \u652F\u6301\u66F4\u591A Hook Framework

    \u4F5C\u4E3A API \u6765\u8BB2\uFF0C\u76EE\u524D\u4EC5\u4EC5\u5BF9\u63A5 XposedBridge \u4F5C\u4E3A\u517C\u5BB9\u5C42\uFF0C\u8FD8\u662F\u6709\u4E00\u5B9A\u7684\u5C40\u9650\u6027\u3002

    \u5927\u90E8\u5206 inline hook \u6CA1\u6709 Java \u517C\u5BB9\u5C42\uFF0C\u540E\u671F\u53EF\u80FD\u4F1A\u8003\u8651 native hook \u7684 Java \u517C\u5BB9\u5C42\u9002\u914D\u3002

    ',17),i=[c];function t(s,h){return o(),a("div",null,i)}const p=e(r,[["render",t],["__file","future.html.vue"]]);export{p as default}; diff --git a/docs/assets/home.html.6ee3debd.js b/docs/assets/home.html.02cbcebb.js similarity index 97% rename from docs/assets/home.html.6ee3debd.js rename to docs/assets/home.html.02cbcebb.js index 66425c19c..1a0558779 100644 --- a/docs/assets/home.html.6ee3debd.js +++ b/docs/assets/home.html.02cbcebb.js @@ -1 +1 @@ -import{_ as e,o,c as t,a as i}from"./app.99fcdd51.js";const n={},d=i('

    Document Introduce

    The document here will synchronize the relevant usage of the latest API version, please keep YukiHookAPI as the latest version to use the latest version of the function.

    Function Description

    The function description mainly introduces the related usage and purpose of the current API.

    Function Example Description

    The function examples mainly show the basic usage examples of the current API for reference.

    Change Record Description

    The function of the first version will be marked as v<version> first;

    New function added later will be marked as v<version> added;

    Later modified function will be appended as v<version> modified;

    Later deprecated function will be marked as v<version> deprecated and strikethrough;

    Later removed function will be marked as v<version> removed and strikethrough.

    • kt \xA0Kotlin Static File

    • annotation \xA0Annotation Class

    • interface \xA0Interface Class

    • object \xA0Class (Singleton)

    • class \xA0Class

    • field \xA0Field or get / set method or read-only get method

    • method \xA0Method

    • enum \xA0Enum constant

    • ext-field \xA0Extension field (global)

    • ext-method \xA0Extension method (global)

    • i-ext-field \xA0Extension field (internal)

    • i-ext-method \xA0Extension method (internal)

    ',14),a=[d];function c(r,l){return o(),t("div",null,a)}const p=e(n,[["render",c],["__file","home.html.vue"]]);export{p as default}; +import{_ as e,o,c as t,a as i}from"./app.6074a838.js";const n={},d=i('

    Document Introduce

    The document here will synchronize the relevant usage of the latest API version, please keep YukiHookAPI as the latest version to use the latest version of the function.

    Function Description

    The function description mainly introduces the related usage and purpose of the current API.

    Function Example Description

    The function examples mainly show the basic usage examples of the current API for reference.

    Change Record Description

    The function of the first version will be marked as v<version> first;

    New function added later will be marked as v<version> added;

    Later modified function will be appended as v<version> modified;

    Later deprecated function will be marked as v<version> deprecated and strikethrough;

    Later removed function will be marked as v<version> removed and strikethrough.

    • kt \xA0Kotlin Static File

    • annotation \xA0Annotation Class

    • interface \xA0Interface Class

    • object \xA0Class (Singleton)

    • class \xA0Class

    • field \xA0Field or get / set method or read-only get method

    • method \xA0Method

    • enum \xA0Enum constant

    • ext-field \xA0Extension field (global)

    • ext-method \xA0Extension method (global)

    • i-ext-field \xA0Extension field (internal)

    • i-ext-method \xA0Extension method (internal)

    ',14),a=[d];function c(r,l){return o(),t("div",null,a)}const p=e(n,[["render",c],["__file","home.html.vue"]]);export{p as default}; diff --git a/docs/assets/home.html.bf707b4b.js b/docs/assets/home.html.17ad2390.js similarity index 71% rename from docs/assets/home.html.bf707b4b.js rename to docs/assets/home.html.17ad2390.js index 67c23cf6c..2bfc3912c 100644 --- a/docs/assets/home.html.bf707b4b.js +++ b/docs/assets/home.html.17ad2390.js @@ -1,4 +1,4 @@ -import{_ as i,r as o,o as p,c as d,b as s,d as e,w as a,e as l,a as r}from"./app.99fcdd51.js";const A={},y=s("h1",{id:"\u4ECB\u7ECD",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u4ECB\u7ECD","aria-hidden":"true"},"#"),l(" \u4ECB\u7ECD")],-1),u=s("blockquote",null,[s("p",null,"\u8FD9\u662F\u4E00\u4E2A Hook API \u6846\u67B6\uFF0C\u672C\u8EAB\u4E0D\u63D0\u4F9B\u4EFB\u4F55 Hook \u529F\u80FD\uFF0C\u9700\u8981 Xposed \u57FA\u7840 API \u7684\u652F\u6301\u3002")],-1),D=s("h2",{id:"\u80CC\u666F",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u80CC\u666F","aria-hidden":"true"},"#"),l(" \u80CC\u666F")],-1),C=s("p",null,[l("\u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528 "),s("code",null,"Kotlin"),l(" \u91CD\u65B0\u6784\u5EFA\u7684\u9AD8\u6548 Xposed Hook API\u3002")],-1),h=l("\u540D\u79F0\u53D6\u81EA "),m={href:"https://www.bilibili.com/bangumi/play/ss5016",target:"_blank",rel:"noopener noreferrer"},B=l("\u300A\u3082\u3082\u304F\u308A\u300B\u5973\u4E3B \u6817\u539F \u96EA(Yuki)"),_=l("\u3002"),b=l("\u524D\u8EAB\u4E3A "),v={href:"https://github.com/fankes/TMore",target:"_blank",rel:"noopener noreferrer"},F=l("\u5F00\u53D1\u5B66\u4E60\u9879\u76EE"),k=l(" \u4E2D\u4F7F\u7528\u7684 Innocent Xposed API\uFF0C\u73B0\u5728\u91CD\u65B0\u547D\u540D\u5E76\u5F00\u6E90\u3002"),f=r('

    \u7528\u9014

    YukiHookAPI \u5B8C\u5168\u91C7\u7528 Kotlin lambda \u8BED\u6CD5\u6784\u5EFA\u3002

    \u629B\u5F03\u539F\u59CB\u4E0D\u592A\u53CB\u597D\u7684 XposedHelpers\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528\u5B83\u6765\u8F7B\u677E\u521B\u5EFA Xposed \u6A21\u5757\u4EE5\u53CA\u8F7B\u677E\u5B9E\u73B0\u81EA\u5B9A\u4E49 Hook API\u3002

    \u8BED\u8A00\u8981\u6C42

    \u8BF7\u4F7F\u7528 Kotlin\uFF0C\u6846\u67B6\u90E8\u5206\u4EE3\u7801\u6784\u6210\u540C\u6837\u517C\u5BB9 Java \u4F46\u57FA\u7840 Hook \u573A\u666F\u7684\u5B9E\u73B0\u53EF\u80FD\u5B8C\u5168\u65E0\u6CD5\u4F7F\u7528\u3002

    \u6587\u6863\u5168\u90E8\u7684 Demo \u793A\u4F8B\u4EE3\u7801\u90FD\u5C06\u4F7F\u7528 Kotlin \u8FDB\u884C\u63CF\u8FF0\uFF0C\u5982\u679C\u4F60\u5B8C\u5168\u4E0D\u4F1A\u4F7F\u7528 Kotlin \u90A3\u4F60\u5C06\u6709\u53EF\u80FD\u65E0\u6CD5\u4F7F\u7528 YukiHookAPI\u3002

    ',6),g=l("\u90E8\u5206 Java Demo \u4EE3\u7801\u53EF\u5728 "),H={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/java",target:"_blank",rel:"noopener noreferrer"},P=l("\u8FD9\u91CC"),I=l(" \u627E\u5230\uFF0C\u4F46\u4E0D\u63A8\u8350\u4F7F\u7528\u3002"),X=r('

    \u7075\u611F\u6765\u6E90

    \u4EE5\u524D\uFF0C\u6211\u4EEC\u5728\u6784\u5EFA Xposed \u6A21\u5757\u7684\u65F6\u5019\uFF0C\u9996\u5148\u9700\u8981\u5728 assets \u4E0B\u521B\u5EFA xposed_init \u6587\u4EF6\u3002

    \u7136\u540E\uFF0C\u5C06\u81EA\u5DF1\u7684\u5165\u53E3\u7C7B\u540D\u624B\u52A8\u586B\u5165\u6587\u4EF6\u4E2D\uFF0C\u4F7F\u7528 XposedHelpers \u53BB\u5B9E\u73B0\u6211\u4EEC\u7684 Hook \u903B\u8F91\u3002

    \u81EA Kotlin \u4F5C\u4E3A Android \u4E3B\u8981\u5F00\u53D1\u8BED\u8A00\u4EE5\u6765\uFF0C\u8FD9\u5957 API \u7528\u8D77\u6765\u786E\u5B9E\u5DF2\u7ECF\u4E0D\u662F\u5F88\u4F18\u96C5\u4E86\u3002

    \u6709\u6CA1\u6709\u4EC0\u4E48 \u597D\u7528\u3001\u8F7B\u91CF\u3001\u4F18\u96C5 \u7684\u89E3\u51B3\u529E\u6CD5\u5462\uFF1F

    \u672C\u7740\u8FD9\u6837\u7684\u60F3\u6CD5\uFF0CYukiHookAPI \u8BDE\u751F\u4E86\u3002

    \u73B0\u5728\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u7F16\u5199\u5C11\u91CF\u7684\u4EE3\u7801\uFF0C\u4E00\u5207\u65F6\u95F4\u5F00\u9500\u548C\u82B1\u8D39\u4EA4\u7ED9\u81EA\u52A8\u5316\u5904\u7406\u3002

    \u501F\u52A9 Kotlin \u4F18\u96C5\u7684 lambda \u5199\u6CD5\u4EE5\u53CA YukiHookAPI\uFF0C\u53EF\u4EE5\u8BA9\u4F60\u7684 Hook \u903B\u8F91\u66F4\u52A0\u7F8E\u89C2\u6E05\u6670\u3002

    \u793A\u4F8B\u5982\u4E0B

    ',9),x=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"@InjectYukiHookWithXposed")]),l(` +import{_ as i,r as o,o as p,c as d,b as s,d as e,w as a,e as l,a as r}from"./app.6074a838.js";const A={},y=s("h1",{id:"\u4ECB\u7ECD",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u4ECB\u7ECD","aria-hidden":"true"},"#"),l(" \u4ECB\u7ECD")],-1),u=s("blockquote",null,[s("p",null,[s("code",null,"YukiHookAPI"),l(" \u662F\u4E00\u4E2A\u96C6\u6210\u5316\u7684 Hook API \u6846\u67B6\uFF0C\u672C\u8EAB\u4E0D\u63D0\u4F9B\u4EFB\u4F55 Hook \u529F\u80FD\uFF0C\u9700\u8981 Xposed \u76F8\u5173\u57FA\u7840 API \u7684\u652F\u6301\u3002")])],-1),D=s("h2",{id:"\u80CC\u666F",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u80CC\u666F","aria-hidden":"true"},"#"),l(" \u80CC\u666F")],-1),m=s("p",null,[l("\u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528 "),s("code",null,"Kotlin"),l(" \u57FA\u4E8E Xposed API \u91CD\u65B0\u6784\u5EFA\u7684\u9AD8\u6548 Hook API\uFF0C\u540C\u65F6\u4E3A Xposed \u6A21\u5757\u7684\u5F00\u53D1\u6253\u9020\u4E86\u4E30\u5BCC\u7684\u529F\u80FD\u6269\u5C55\u3002")],-1),C=l("\u540D\u79F0\u53D6\u81EA "),h={href:"https://www.bilibili.com/bangumi/play/ss5016",target:"_blank",rel:"noopener noreferrer"},B=l("\u300A\u3082\u3082\u304F\u308A\u300B\u5973\u4E3B \u6817\u539F \u96EA(Yuki)"),_=l("\u3002"),b=l("\u524D\u8EAB\u4E3A "),v={href:"https://github.com/fankes/TMore",target:"_blank",rel:"noopener noreferrer"},F=l("\u5F00\u53D1\u5B66\u4E60\u9879\u76EE"),k=l(" \u4E2D\u4F7F\u7528\u7684 Innocent Xposed API\uFF0C\u73B0\u5728\u91CD\u65B0\u547D\u540D\u5E76\u5F00\u6E90\u3002"),f=r('

    \u7528\u9014

    YukiHookAPI \u5B8C\u5168\u91C7\u7528 Kotlin lambda \u8BED\u6CD5\u6784\u5EFA\u3002

    \u629B\u5F03\u539F\u59CB\u4E0D\u592A\u53CB\u597D\u7684 XposedHelpers\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528\u5B83\u6765\u8F7B\u677E\u521B\u5EFA Xposed \u6A21\u5757\u4EE5\u53CA\u8F7B\u677E\u5B9E\u73B0\u81EA\u5B9A\u4E49 Hook API\u3002

    \u8BED\u8A00\u8981\u6C42

    \u8BF7\u4F7F\u7528 Kotlin\uFF0C\u6846\u67B6\u90E8\u5206\u4EE3\u7801\u6784\u6210\u540C\u6837\u517C\u5BB9 Java \u4F46\u57FA\u7840 Hook \u573A\u666F\u7684\u5B9E\u73B0\u53EF\u80FD\u5B8C\u5168\u65E0\u6CD5\u4F7F\u7528\u3002

    \u6587\u6863\u5168\u90E8\u7684 Demo \u793A\u4F8B\u4EE3\u7801\u90FD\u5C06\u4F7F\u7528 Kotlin \u8FDB\u884C\u63CF\u8FF0\uFF0C\u5982\u679C\u4F60\u5B8C\u5168\u4E0D\u4F1A\u4F7F\u7528 Kotlin \u90A3\u4F60\u5C06\u6709\u53EF\u80FD\u65E0\u6CD5\u4F7F\u7528 YukiHookAPI\u3002

    ',6),g=l("\u90E8\u5206 Java Demo \u4EE3\u7801\u53EF\u5728 "),H={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/java",target:"_blank",rel:"noopener noreferrer"},P=l("\u8FD9\u91CC"),I=l(" \u627E\u5230\uFF0C\u4F46\u4E0D\u63A8\u8350\u4F7F\u7528\u3002"),X=r('

    \u7075\u611F\u6765\u6E90

    \u4EE5\u524D\uFF0C\u6211\u4EEC\u5728\u6784\u5EFA Xposed \u6A21\u5757\u7684\u65F6\u5019\uFF0C\u9996\u5148\u9700\u8981\u5728 assets \u4E0B\u521B\u5EFA xposed_init \u6587\u4EF6\u3002

    \u7136\u540E\uFF0C\u5C06\u81EA\u5DF1\u7684\u5165\u53E3\u7C7B\u540D\u624B\u52A8\u586B\u5165\u6587\u4EF6\u4E2D\uFF0C\u4F7F\u7528 XposedHelpers \u53BB\u5B9E\u73B0\u6211\u4EEC\u7684 Hook \u903B\u8F91\u3002

    \u81EA Kotlin \u4F5C\u4E3A Android \u4E3B\u8981\u5F00\u53D1\u8BED\u8A00\u4EE5\u6765\uFF0C\u8FD9\u5957 API \u7528\u8D77\u6765\u786E\u5B9E\u5DF2\u7ECF\u4E0D\u662F\u5F88\u4F18\u96C5\u4E86\u3002

    \u6709\u6CA1\u6709\u4EC0\u4E48 \u597D\u7528\u3001\u8F7B\u91CF\u3001\u4F18\u96C5 \u7684\u89E3\u51B3\u529E\u6CD5\u5462\uFF1F

    \u672C\u7740\u8FD9\u6837\u7684\u60F3\u6CD5\uFF0CYukiHookAPI \u8BDE\u751F\u4E86\u3002

    \u73B0\u5728\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u7F16\u5199\u5C11\u91CF\u7684\u4EE3\u7801\uFF0C\u4E00\u5207\u65F6\u95F4\u5F00\u9500\u548C\u82B1\u8D39\u4EA4\u7ED9\u81EA\u52A8\u5316\u5904\u7406\u3002

    \u501F\u52A9 Kotlin \u4F18\u96C5\u7684 lambda \u5199\u6CD5\u4EE5\u53CA YukiHookAPI\uFF0C\u53EF\u4EE5\u8BA9\u4F60\u7684 Hook \u903B\u8F91\u66F4\u52A0\u7F8E\u89C2\u6E05\u6670\u3002

    \u793A\u4F8B\u5982\u4E0B

    ',9),Y=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"@InjectYukiHookWithXposed")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"class"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"HookEntry"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"IYukiHookXposedInit"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),l(` @@ -54,7 +54,7 @@ import{_ as i,r as o,o as p,c as d,b as s,d as e,w as a,e as l,a as r}from"./app `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),R=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"class"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"HookEntry"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"IXposedHookZygoteInit"),s("span",{style:{color:"#ADBAC7"}},", "),s("span",{style:{color:"#F69D50"}},"IXposedHookLoadPackage"),s("span",{style:{color:"#ADBAC7"}},", "),s("span",{style:{color:"#F69D50"}},"IXposedHookInitPackageResources"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),x=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"class"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"HookEntry"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"IXposedHookZygoteInit"),s("span",{style:{color:"#ADBAC7"}},", "),s("span",{style:{color:"#F69D50"}},"IXposedHookLoadPackage"),s("span",{style:{color:"#ADBAC7"}},", "),s("span",{style:{color:"#F69D50"}},"IXposedHookInitPackageResources"),s("span",{style:{color:"#ADBAC7"}}," {")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"private"),s("span",{style:{color:"#ADBAC7"}}," lateinit "),s("span",{style:{color:"#F47067"}},"var"),s("span",{style:{color:"#ADBAC7"}}," moduleResources"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"XModuleResources")]),l(` `),s("span",{class:"line"}),l(` @@ -104,4 +104,4 @@ import{_ as i,r as o,o as p,c as d,b as s,d as e,w as a,e as l,a as r}from"./app `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," )")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),Y=s("p",null,"\u662F\u7684\uFF0C\u4F60\u6CA1\u6709\u770B\u9519\uFF0C\u4EC5\u4EC5\u5C31\u9700\u8981\u8FD9\u4E9B\u4EE3\u7801\uFF0C\u5C31\u80FD\u5B8C\u5168\u53D6\u4EE3 Xposed API \u5B9E\u73B0\u540C\u6837\u7684\u529F\u80FD\u3002",-1),M=s("p",null,[l("\u73B0\u5728\uFF0C\u501F\u52A9\u9AD8\u6548\u5F3A\u5927\u7684 "),s("code",null,"YukiHookAPI"),l("\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5B9E\u73B0\u4E00\u4E2A\u975E\u5E38\u7B80\u5355\u7684 Xposed \u6A21\u5757\u3002")],-1),w=s("h2",{id:"\u652F\u6301\u7684-hook-\u6846\u67B6",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u652F\u6301\u7684-hook-\u6846\u67B6","aria-hidden":"true"},"#"),l(" \u652F\u6301\u7684 Hook \u6846\u67B6")],-1),L=s("p",null,[l("\u4EE5\u4E0B\u662F "),s("code",null,"YukiHookAPI"),l(" \u652F\u6301\u7684 "),s("code",null,"Hook Framework"),l(" \u4EE5\u53CA Xposed \u6846\u67B6\u3002")],-1),j=s("thead",null,[s("tr",null,[s("th",null,"Hook Framework"),s("th",null,"ST"),s("th",null,"Description")])],-1),S={href:"https://github.com/LSPosed/LSPosed",target:"_blank",rel:"noopener noreferrer"},E=l("LSPosed"),K=s("td",null,"\u2705",-1),T=s("td",null,"\u591A\u573A\u666F\u4E0B\u7A33\u5B9A\u4F7F\u7528",-1),N={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},G=l("LSPatch"),V=s("td",null,"\u2B55",-1),W=s("td",null,"\u5C06\u5728\u6B64\u9879\u76EE\u5B8C\u5584\u540E\u9010\u6E10\u52A0\u5165 API \u652F\u6301",-1),Z={href:"https://github.com/ElderDrivers/EdXposed",target:"_blank",rel:"noopener noreferrer"},q=l("EdXposed"),J=s("td",null,"\u274E",-1),z=s("td",null,"\u5DF2\u505C\u6B62\u7EF4\u62A4\uFF0C\u4E0D\u518D\u63A8\u8350\u4F7F\u7528",-1),O={href:"https://github.com/canyie/pine",target:"_blank",rel:"noopener noreferrer"},Q=l("Pine"),U=s("td",null,"\u2B55",-1),$=s("td",null,"\u53EF\u4EE5\u4F7F\u7528",-1),ss={href:"https://github.com/asLody/SandHook",target:"_blank",rel:"noopener noreferrer"},ls=l("SandHook"),es=s("td",null,"\u2B55",-1),ns=s("td",null,"\u53EF\u4EE5\u4F7F\u7528",-1),os={href:"https://github.com/asLody/whale",target:"_blank",rel:"noopener noreferrer"},as=l("Whale"),cs=s("td",null,"\u2B55",-1),rs=l("\u9700\u8981 "),ts={href:"https://github.com/WindySha/xposed-hook-based-on-whale",target:"_blank",rel:"noopener noreferrer"},is=l("xposed-hook-based-on-whale"),ps={href:"https://github.com/PAGalaxyLab/YAHFA",target:"_blank",rel:"noopener noreferrer"},ds=l("YAHFA"),As=s("td",null,"\u2757",-1),ys=s("td",null,"\u9700\u8981\u81EA\u884C\u5B9E\u73B0 Xposed API",-1),us={href:"https://github.com/turing-technician/FastHook",target:"_blank",rel:"noopener noreferrer"},Ds=l("FastHook"),Cs=s("td",null,"\u2757",-1),hs=s("td",null,"\u9700\u8981\u81EA\u884C\u5B9E\u73B0 Xposed API",-1),ms={href:"https://github.com/tiann/epic",target:"_blank",rel:"noopener noreferrer"},Bs=l("Epic"),_s=s("td",null,"\u2757",-1),bs=l("\u9700\u8981\u81EA\u884C\u5BF9\u63A5 "),vs={href:"https://github.com/alibaba/dexposed",target:"_blank",rel:"noopener noreferrer"},Fs=l("Dexposed"),ks={href:"https://github.com/taichi-framework/TaiChi",target:"_blank",rel:"noopener noreferrer"},fs=l("TaiChi"),gs=s("td",null,"\u2B55",-1),Hs=s("td",null,"\u53EF\u4EE5\u4F5C\u4E3A\u6A21\u5757\u4F7F\u7528",-1),Ps={href:"https://github.com/rovo89/Xposed",target:"_blank",rel:"noopener noreferrer"},Is=l("Xposed"),Xs=s("td",null,"\u274E",-1),xs=s("td",null,"\u672A\u6D4B\u8BD5\uFF0C\u4E0D\u518D\u63A8\u8350\u4F7F\u7528",-1);function Rs(Ys,Ms){const n=o("ExternalLinkIcon"),c=o("CodeGroupItem"),t=o("CodeGroup");return p(),d("div",null,[y,u,D,C,s("p",null,[h,s("a",m,[B,e(n)]),_]),s("p",null,[b,s("a",v,[F,e(n)]),k]),f,s("p",null,[g,s("a",H,[P,e(n)]),I]),X,e(t,null,{default:a(()=>[e(c,{title:"Yuki Hook API"},{default:a(()=>[x]),_:1}),e(c,{title:"Xposed API"},{default:a(()=>[R]),_:1})]),_:1}),Y,M,w,L,s("table",null,[j,s("tbody",null,[s("tr",null,[s("td",null,[s("a",S,[E,e(n)])]),K,T]),s("tr",null,[s("td",null,[s("a",N,[G,e(n)])]),V,W]),s("tr",null,[s("td",null,[s("a",Z,[q,e(n)])]),J,z]),s("tr",null,[s("td",null,[s("a",O,[Q,e(n)])]),U,$]),s("tr",null,[s("td",null,[s("a",ss,[ls,e(n)])]),es,ns]),s("tr",null,[s("td",null,[s("a",os,[as,e(n)])]),cs,s("td",null,[rs,s("a",ts,[is,e(n)])])]),s("tr",null,[s("td",null,[s("a",ps,[ds,e(n)])]),As,ys]),s("tr",null,[s("td",null,[s("a",us,[Ds,e(n)])]),Cs,hs]),s("tr",null,[s("td",null,[s("a",ms,[Bs,e(n)])]),_s,s("td",null,[bs,s("a",vs,[Fs,e(n)])])]),s("tr",null,[s("td",null,[s("a",ks,[fs,e(n)])]),gs,Hs]),s("tr",null,[s("td",null,[s("a",Ps,[Is,e(n)])]),Xs,xs])])])])}const Ls=i(A,[["render",Rs],["__file","home.html.vue"]]);export{Ls as default}; +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),R=s("p",null,"\u662F\u7684\uFF0C\u4F60\u6CA1\u6709\u770B\u9519\uFF0C\u4EC5\u4EC5\u5C31\u9700\u8981\u8FD9\u4E9B\u4EE3\u7801\uFF0C\u5C31\u80FD\u5B8C\u5168\u53D6\u4EE3 Xposed API \u5B9E\u73B0\u540C\u6837\u7684\u529F\u80FD\u3002",-1),w=s("p",null,[l("\u73B0\u5728\uFF0C\u501F\u52A9\u9AD8\u6548\u5F3A\u5927\u7684 "),s("code",null,"YukiHookAPI"),l("\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5B9E\u73B0\u4E00\u4E2A\u975E\u5E38\u7B80\u5355\u7684 Xposed \u6A21\u5757\u3002")],-1),M=s("h2",{id:"\u652F\u6301\u7684-hook-framework",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#\u652F\u6301\u7684-hook-framework","aria-hidden":"true"},"#"),l(" \u652F\u6301\u7684 Hook Framework")],-1),L=s("p",null,[l("\u4EE5\u4E0B\u662F "),s("code",null,"YukiHookAPI"),l(" \u652F\u6301\u7684 "),s("code",null,"Hook Framework"),l(" \u4EE5\u53CA Xposed \u6846\u67B6\u3002")],-1),j=s("thead",null,[s("tr",null,[s("th",null,"Hook Framework"),s("th",null,"ST"),s("th",null,"Description")])],-1),S={href:"https://github.com/LSPosed/LSPosed",target:"_blank",rel:"noopener noreferrer"},E=l("LSPosed"),K=s("td",null,"\u2705",-1),T=s("td",null,"\u591A\u573A\u666F\u4E0B\u7A33\u5B9A\u4F7F\u7528",-1),N={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},G=l("LSPatch"),V=s("td",null,"\u2B55",-1),W=s("td",null,"\u5C06\u5728\u6B64\u9879\u76EE\u5B8C\u5584\u540E\u9010\u6E10\u52A0\u5165 API \u652F\u6301",-1),Z={href:"https://github.com/ElderDrivers/EdXposed",target:"_blank",rel:"noopener noreferrer"},q=l("EdXposed"),J=s("td",null,"\u274E",-1),z=s("td",null,"\u5DF2\u505C\u6B62\u7EF4\u62A4\uFF0C\u4E0D\u518D\u63A8\u8350\u4F7F\u7528",-1),O={href:"https://github.com/canyie/pine",target:"_blank",rel:"noopener noreferrer"},Q=l("Pine"),U=s("td",null,"\u2B55",-1),$=s("td",null,"\u53EF\u4EE5\u4F7F\u7528",-1),ss={href:"https://github.com/asLody/SandHook",target:"_blank",rel:"noopener noreferrer"},ls=l("SandHook"),es=s("td",null,"\u2B55",-1),ns=s("td",null,"\u53EF\u4EE5\u4F7F\u7528",-1),os={href:"https://github.com/asLody/whale",target:"_blank",rel:"noopener noreferrer"},as=l("Whale"),cs=s("td",null,"\u2B55",-1),rs=l("\u9700\u8981 "),ts={href:"https://github.com/WindySha/xposed-hook-based-on-whale",target:"_blank",rel:"noopener noreferrer"},is=l("xposed-hook-based-on-whale"),ps={href:"https://github.com/PAGalaxyLab/YAHFA",target:"_blank",rel:"noopener noreferrer"},ds=l("YAHFA"),As=s("td",null,"\u2757",-1),ys=s("td",null,"\u9700\u8981\u81EA\u884C\u5B9E\u73B0 Xposed API",-1),us={href:"https://github.com/turing-technician/FastHook",target:"_blank",rel:"noopener noreferrer"},Ds=l("FastHook"),ms=s("td",null,"\u2757",-1),Cs=s("td",null,"\u9700\u8981\u81EA\u884C\u5B9E\u73B0 Xposed API",-1),hs={href:"https://github.com/tiann/epic",target:"_blank",rel:"noopener noreferrer"},Bs=l("Epic"),_s=s("td",null,"\u2757",-1),bs=l("\u9700\u8981\u81EA\u884C\u5BF9\u63A5 "),vs={href:"https://github.com/alibaba/dexposed",target:"_blank",rel:"noopener noreferrer"},Fs=l("Dexposed"),ks={href:"https://github.com/taichi-framework/TaiChi",target:"_blank",rel:"noopener noreferrer"},fs=l("TaiChi"),gs=s("td",null,"\u2B55",-1),Hs=s("td",null,"\u53EF\u4EE5\u4F5C\u4E3A\u6A21\u5757\u4F7F\u7528",-1),Ps={href:"https://github.com/rovo89/Xposed",target:"_blank",rel:"noopener noreferrer"},Is=l("Xposed"),Xs=s("td",null,"\u2B55",-1),Ys=s("td",null,"\u5EFA\u8BAE\u6700\u4F4E\u7CFB\u7EDF\u7248\u672C\u4E3A Android 7.0",-1);function xs(Rs,ws){const n=o("ExternalLinkIcon"),c=o("CodeGroupItem"),t=o("CodeGroup");return p(),d("div",null,[y,u,D,m,s("p",null,[C,s("a",h,[B,e(n)]),_]),s("p",null,[b,s("a",v,[F,e(n)]),k]),f,s("p",null,[g,s("a",H,[P,e(n)]),I]),X,e(t,null,{default:a(()=>[e(c,{title:"Yuki Hook API"},{default:a(()=>[Y]),_:1}),e(c,{title:"Xposed API"},{default:a(()=>[x]),_:1})]),_:1}),R,w,M,L,s("table",null,[j,s("tbody",null,[s("tr",null,[s("td",null,[s("a",S,[E,e(n)])]),K,T]),s("tr",null,[s("td",null,[s("a",N,[G,e(n)])]),V,W]),s("tr",null,[s("td",null,[s("a",Z,[q,e(n)])]),J,z]),s("tr",null,[s("td",null,[s("a",O,[Q,e(n)])]),U,$]),s("tr",null,[s("td",null,[s("a",ss,[ls,e(n)])]),es,ns]),s("tr",null,[s("td",null,[s("a",os,[as,e(n)])]),cs,s("td",null,[rs,s("a",ts,[is,e(n)])])]),s("tr",null,[s("td",null,[s("a",ps,[ds,e(n)])]),As,ys]),s("tr",null,[s("td",null,[s("a",us,[Ds,e(n)])]),ms,Cs]),s("tr",null,[s("td",null,[s("a",hs,[Bs,e(n)])]),_s,s("td",null,[bs,s("a",vs,[Fs,e(n)])])]),s("tr",null,[s("td",null,[s("a",ks,[fs,e(n)])]),gs,Hs]),s("tr",null,[s("td",null,[s("a",Ps,[Is,e(n)])]),Xs,Ys])])])])}const Ls=i(A,[["render",xs],["__file","home.html.vue"]]);export{Ls as default}; diff --git a/docs/assets/home.html.63ebf7b8.js b/docs/assets/home.html.615f4238.js similarity index 83% rename from docs/assets/home.html.63ebf7b8.js rename to docs/assets/home.html.615f4238.js index 6eb1adfc7..1e3eccbae 100644 --- a/docs/assets/home.html.63ebf7b8.js +++ b/docs/assets/home.html.615f4238.js @@ -1,4 +1,4 @@ -import{_ as i,r as o,o as p,c as d,b as s,d as l,w as a,e,a as r}from"./app.99fcdd51.js";const A={},u=s("h1",{id:"introduce",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduce","aria-hidden":"true"},"#"),e(" Introduce")],-1),y=s("blockquote",null,[s("p",null,"This is a Hook API Framework, it does not provide any Hook function itself, it needs the support of basic Xposed API.")],-1),m=s("h2",{id:"background",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#background","aria-hidden":"true"},"#"),e(" Background")],-1),h=s("p",null,[e("This is an efficient Xposed Hook API rebuilt in "),s("code",null,"Kotlin"),e(".")],-1),D=e("The name is taken from "),C={href:"https://www.bilibili.com/bangumi/play/ss5016",target:"_blank",rel:"noopener noreferrer"},B=e('"\u3082\u3082\u304F\u308A" heroine Yuki Kurihara'),_=e("."),b=e("Formerly the Innocent Xposed API used in "),v={href:"https://github.com/fankes/TMore",target:"_blank",rel:"noopener noreferrer"},F=e("Development Learning Project"),k=e(", now renamed and open sourced."),f=r('

    Usage

    YukiHookAPI is built entirely with Kotlin lambda syntax.

    Abandoning the original less friendly XposedHelpers, you can use it to easily create Xposed Modules and easily implement custom Hook API.

    Language Requirement

    Please use Kotlin, the framework part of the code composition is also compatible with Java but the implementation of the basic Hook scene may not work at all.

    All demo code in this document will be described using Kotlin, if you don't know how to use Kotlin then you may not be able to use YukiHookAPI.

    ',6),g=e("Part of the Java Demo code can be found "),H={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/java",target:"_blank",rel:"noopener noreferrer"},P=e("here"),w=e(", but not recommended."),I=r('

    Source of Inspiration

    Previously, when we built an Xposed Module, we first needed to create an xposed_init file under assets.

    Then, manually fill in your own entry class name into the file and use XposedHelpers to implement our Hook logic.

    Since Kotlin is the main Android development language, this API is really not very elegant to use.

    Is there any easy to use, light, elegant solution?

    With this idea, YukiHookAPI was born.

    Now, we only need to write a small amount of code, and all the time and expense are handed over to automation.

    With Kotlin's elegant lambda writing and YukiHookAPI, you can make your Hook logic more beautiful and clear.

    The following example

    ',9),X=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"@InjectYukiHookWithXposed")]),e(` +import{_ as i,r as o,o as p,c as d,b as s,d as l,w as a,e,a as r}from"./app.6074a838.js";const A={},u=s("h1",{id:"introduce",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#introduce","aria-hidden":"true"},"#"),e(" Introduce")],-1),y=s("blockquote",null,[s("p",null,[s("code",null,"YukiHookAPI"),e(" is an integrated Hook API Framework, which does not provide any Hook functions, and needs the support of Xposed related basic APIs.")])],-1),m=s("h2",{id:"background",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#background","aria-hidden":"true"},"#"),e(" Background")],-1),h=s("p",null,[e("This is an efficient Hook API rebuilt based on the Xposed API using "),s("code",null,"Kotlin"),e(", and creates rich function extensions for the development of Xposed Modules.")],-1),D=e("The name is taken from "),C={href:"https://www.bilibili.com/bangumi/play/ss5016",target:"_blank",rel:"noopener noreferrer"},B=e('"\u3082\u3082\u304F\u308A" heroine Yuki Kurihara'),b=e("."),_=e("Formerly the Innocent Xposed API used in "),v={href:"https://github.com/fankes/TMore",target:"_blank",rel:"noopener noreferrer"},F=e("Development Learning Project"),k=e(", now renamed and open sourced."),f=r('

    Usage

    YukiHookAPI is built entirely with Kotlin lambda syntax.

    Abandoning the original less friendly XposedHelpers, you can use it to easily create Xposed Modules and easily implement custom Hook API.

    Language Requirement

    Please use Kotlin, the framework part of the code composition is also compatible with Java but the implementation of the basic Hook scene may not work at all.

    All demo code in this document will be described using Kotlin, if you don't know how to use Kotlin then you may not be able to use YukiHookAPI.

    ',6),g=e("Part of the Java Demo code can be found "),H={href:"https://github.com/fankes/YukiHookAPI/tree/master/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/java",target:"_blank",rel:"noopener noreferrer"},P=e("here"),w=e(", but not recommended."),I=r('

    Source of Inspiration

    Previously, when we built an Xposed Module, we first needed to create an xposed_init file under assets.

    Then, manually fill in your own entry class name into the file and use XposedHelpers to implement our Hook logic.

    Since Kotlin is the main Android development language, this API is really not very elegant to use.

    Is there any easy to use, light, elegant solution?

    With this idea, YukiHookAPI was born.

    Now, we only need to write a small amount of code, and all the time and expense are handed over to automation.

    With Kotlin's elegant lambda writing and YukiHookAPI, you can make your Hook logic more beautiful and clear.

    The following example

    ',9),X=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"@InjectYukiHookWithXposed")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"class"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"HookEntry"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"IYukiHookXposedInit"),s("span",{style:{color:"#ADBAC7"}}," {")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),e(` @@ -104,4 +104,4 @@ import{_ as i,r as o,o as p,c as d,b as s,d as l,w as a,e,a as r}from"./app.99fc `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," )")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," }")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),e(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),M=s("p",null,"Yes, you read that right, just needing these codes can completely replace the Xposed API to achieve the same function.",-1),R=s("p",null,[e("Now, with the help of the efficient and powerful "),s("code",null,"YukiHookAPI"),e(", you can implement a very simple Xposed Module.")],-1),Y=s("h2",{id:"suppored-hook-framework",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#suppored-hook-framework","aria-hidden":"true"},"#"),e(" Suppored Hook Framework")],-1),L=s("p",null,[e("The following are the "),s("code",null,"Hook Framework"),e(" and Xposed framework supported by "),s("code",null,"YukiHookAPI"),e(".")],-1),S=s("thead",null,[s("tr",null,[s("th",null,"Hook Framework"),s("th",null,"ST"),s("th",null,"Description")])],-1),j={href:"https://github.com/LSPosed/LSPosed",target:"_blank",rel:"noopener noreferrer"},N=e("LSPosed"),T=s("td",null,"\u2705",-1),E=s("td",null,"Stable use in multiple scenarios",-1),K={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},W=e("LSPatch"),q=s("td",null,"\u2B55",-1),G=s("td",null,"WIP after this project is improved",-1),V={href:"https://github.com/ElderDrivers/EdXposed",target:"_blank",rel:"noopener noreferrer"},Z=e("EdXposed"),O=s("td",null,"\u274E",-1),J=s("td",null,"Maintenance has stopped, no longer recommended",-1),U={href:"https://github.com/canyie/pine",target:"_blank",rel:"noopener noreferrer"},z=e("Pine"),Q=s("td",null,"\u2B55",-1),$=s("td",null,"Only available",-1),ss={href:"https://github.com/asLody/SandHook",target:"_blank",rel:"noopener noreferrer"},es=e("SandHook"),ls=s("td",null,"\u2B55",-1),ns=s("td",null,"Only available",-1),os={href:"https://github.com/asLody/whale",target:"_blank",rel:"noopener noreferrer"},as=e("Whale"),ts=s("td",null,"\u2B55",-1),rs=e("Need "),cs={href:"https://github.com/WindySha/xposed-hook-based-on-whale",target:"_blank",rel:"noopener noreferrer"},is=e("xposed-hook-based-on-whale"),ps={href:"https://github.com/PAGalaxyLab/YAHFA",target:"_blank",rel:"noopener noreferrer"},ds=e("YAHFA"),As=s("td",null,"\u2757",-1),us=s("td",null,"Need to implement the Xposed API yourself",-1),ys={href:"https://github.com/turing-technician/FastHook",target:"_blank",rel:"noopener noreferrer"},ms=e("FastHook"),hs=s("td",null,"\u2757",-1),Ds=s("td",null,"Need to implement the Xposed API yourself",-1),Cs={href:"https://github.com/tiann/epic",target:"_blank",rel:"noopener noreferrer"},Bs=e("Epic"),_s=s("td",null,"\u2757",-1),bs=e("Need "),vs={href:"https://github.com/alibaba/dexposed",target:"_blank",rel:"noopener noreferrer"},Fs=e("Dexposed"),ks=e(" by yourself"),fs={href:"https://github.com/taichi-framework/TaiChi",target:"_blank",rel:"noopener noreferrer"},gs=e("TaiChi"),Hs=s("td",null,"\u2B55",-1),Ps=s("td",null,"Only available for Xposed Module",-1),ws={href:"https://github.com/rovo89/Xposed",target:"_blank",rel:"noopener noreferrer"},Is=e("Xposed"),Xs=s("td",null,"\u274E",-1),xs=s("td",null,"Not test, no longer recommended",-1);function Ms(Rs,Ys){const n=o("ExternalLinkIcon"),t=o("CodeGroupItem"),c=o("CodeGroup");return p(),d("div",null,[u,y,m,h,s("p",null,[D,s("a",C,[B,l(n)]),_]),s("p",null,[b,s("a",v,[F,l(n)]),k]),f,s("p",null,[g,s("a",H,[P,l(n)]),w]),I,l(c,null,{default:a(()=>[l(t,{title:"Yuki Hook API"},{default:a(()=>[X]),_:1}),l(t,{title:"Xposed API"},{default:a(()=>[x]),_:1})]),_:1}),M,R,Y,L,s("table",null,[S,s("tbody",null,[s("tr",null,[s("td",null,[s("a",j,[N,l(n)])]),T,E]),s("tr",null,[s("td",null,[s("a",K,[W,l(n)])]),q,G]),s("tr",null,[s("td",null,[s("a",V,[Z,l(n)])]),O,J]),s("tr",null,[s("td",null,[s("a",U,[z,l(n)])]),Q,$]),s("tr",null,[s("td",null,[s("a",ss,[es,l(n)])]),ls,ns]),s("tr",null,[s("td",null,[s("a",os,[as,l(n)])]),ts,s("td",null,[rs,s("a",cs,[is,l(n)])])]),s("tr",null,[s("td",null,[s("a",ps,[ds,l(n)])]),As,us]),s("tr",null,[s("td",null,[s("a",ys,[ms,l(n)])]),hs,Ds]),s("tr",null,[s("td",null,[s("a",Cs,[Bs,l(n)])]),_s,s("td",null,[bs,s("a",vs,[Fs,l(n)]),ks])]),s("tr",null,[s("td",null,[s("a",fs,[gs,l(n)])]),Hs,Ps]),s("tr",null,[s("td",null,[s("a",ws,[Is,l(n)])]),Xs,xs])])])])}const Ss=i(A,[["render",Ms],["__file","home.html.vue"]]);export{Ss as default}; +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),M=s("p",null,"Yes, you read that right, just needing these codes can completely replace the Xposed API to achieve the same function.",-1),R=s("p",null,[e("Now, with the help of the efficient and powerful "),s("code",null,"YukiHookAPI"),e(", you can implement a very simple Xposed Module.")],-1),Y=s("h2",{id:"suppored-hook-framework",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#suppored-hook-framework","aria-hidden":"true"},"#"),e(" Suppored Hook Framework")],-1),L=s("p",null,[e("The following are the "),s("code",null,"Hook Framework"),e(" and Xposed framework supported by "),s("code",null,"YukiHookAPI"),e(".")],-1),S=s("thead",null,[s("tr",null,[s("th",null,"Hook Framework"),s("th",null,"ST"),s("th",null,"Description")])],-1),j={href:"https://github.com/LSPosed/LSPosed",target:"_blank",rel:"noopener noreferrer"},N=e("LSPosed"),T=s("td",null,"\u2705",-1),E=s("td",null,"Stable use in multiple scenarios",-1),K={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},W=e("LSPatch"),q=s("td",null,"\u2B55",-1),G=s("td",null,"WIP after this project is improved",-1),V={href:"https://github.com/ElderDrivers/EdXposed",target:"_blank",rel:"noopener noreferrer"},Z=e("EdXposed"),O=s("td",null,"\u274E",-1),J=s("td",null,"Maintenance has stopped, no longer recommended",-1),U={href:"https://github.com/canyie/pine",target:"_blank",rel:"noopener noreferrer"},z=e("Pine"),Q=s("td",null,"\u2B55",-1),$=s("td",null,"Only available",-1),ss={href:"https://github.com/asLody/SandHook",target:"_blank",rel:"noopener noreferrer"},es=e("SandHook"),ls=s("td",null,"\u2B55",-1),ns=s("td",null,"Only available",-1),os={href:"https://github.com/asLody/whale",target:"_blank",rel:"noopener noreferrer"},as=e("Whale"),ts=s("td",null,"\u2B55",-1),rs=e("Need "),cs={href:"https://github.com/WindySha/xposed-hook-based-on-whale",target:"_blank",rel:"noopener noreferrer"},is=e("xposed-hook-based-on-whale"),ps={href:"https://github.com/PAGalaxyLab/YAHFA",target:"_blank",rel:"noopener noreferrer"},ds=e("YAHFA"),As=s("td",null,"\u2757",-1),us=s("td",null,"Need to implement the Xposed API yourself",-1),ys={href:"https://github.com/turing-technician/FastHook",target:"_blank",rel:"noopener noreferrer"},ms=e("FastHook"),hs=s("td",null,"\u2757",-1),Ds=s("td",null,"Need to implement the Xposed API yourself",-1),Cs={href:"https://github.com/tiann/epic",target:"_blank",rel:"noopener noreferrer"},Bs=e("Epic"),bs=s("td",null,"\u2757",-1),_s=e("Need "),vs={href:"https://github.com/alibaba/dexposed",target:"_blank",rel:"noopener noreferrer"},Fs=e("Dexposed"),ks=e(" by yourself"),fs={href:"https://github.com/taichi-framework/TaiChi",target:"_blank",rel:"noopener noreferrer"},gs=e("TaiChi"),Hs=s("td",null,"\u2B55",-1),Ps=s("td",null,"Only available for Xposed Module",-1),ws={href:"https://github.com/rovo89/Xposed",target:"_blank",rel:"noopener noreferrer"},Is=e("Xposed"),Xs=s("td",null,"\u2B55",-1),xs=s("td",null,"Recommended minimum system version is Android 7.0",-1);function Ms(Rs,Ys){const n=o("ExternalLinkIcon"),t=o("CodeGroupItem"),c=o("CodeGroup");return p(),d("div",null,[u,y,m,h,s("p",null,[D,s("a",C,[B,l(n)]),b]),s("p",null,[_,s("a",v,[F,l(n)]),k]),f,s("p",null,[g,s("a",H,[P,l(n)]),w]),I,l(c,null,{default:a(()=>[l(t,{title:"Yuki Hook API"},{default:a(()=>[X]),_:1}),l(t,{title:"Xposed API"},{default:a(()=>[x]),_:1})]),_:1}),M,R,Y,L,s("table",null,[S,s("tbody",null,[s("tr",null,[s("td",null,[s("a",j,[N,l(n)])]),T,E]),s("tr",null,[s("td",null,[s("a",K,[W,l(n)])]),q,G]),s("tr",null,[s("td",null,[s("a",V,[Z,l(n)])]),O,J]),s("tr",null,[s("td",null,[s("a",U,[z,l(n)])]),Q,$]),s("tr",null,[s("td",null,[s("a",ss,[es,l(n)])]),ls,ns]),s("tr",null,[s("td",null,[s("a",os,[as,l(n)])]),ts,s("td",null,[rs,s("a",cs,[is,l(n)])])]),s("tr",null,[s("td",null,[s("a",ps,[ds,l(n)])]),As,us]),s("tr",null,[s("td",null,[s("a",ys,[ms,l(n)])]),hs,Ds]),s("tr",null,[s("td",null,[s("a",Cs,[Bs,l(n)])]),bs,s("td",null,[_s,s("a",vs,[Fs,l(n)]),ks])]),s("tr",null,[s("td",null,[s("a",fs,[gs,l(n)])]),Hs,Ps]),s("tr",null,[s("td",null,[s("a",ws,[Is,l(n)])]),Xs,xs])])])])}const Ss=i(A,[["render",Ms],["__file","home.html.vue"]]);export{Ss as default}; diff --git a/docs/assets/home.html.f6f658d0.js b/docs/assets/home.html.9718dcfa.js similarity index 84% rename from docs/assets/home.html.f6f658d0.js rename to docs/assets/home.html.9718dcfa.js index 5431897b4..f699cf4e5 100644 --- a/docs/assets/home.html.f6f658d0.js +++ b/docs/assets/home.html.9718dcfa.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-efb45d4c","path":"/en/guide/home.html","title":"Introduce","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Background","slug":"background","link":"#background","children":[]},{"level":2,"title":"Usage","slug":"usage","link":"#usage","children":[]},{"level":2,"title":"Language Requirement","slug":"language-requirement","link":"#language-requirement","children":[]},{"level":2,"title":"Source of Inspiration","slug":"source-of-inspiration","link":"#source-of-inspiration","children":[]},{"level":2,"title":"Suppored Hook Framework","slug":"suppored-hook-framework","link":"#suppored-hook-framework","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/guide/home.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-efb45d4c","path":"/en/guide/home.html","title":"Introduce","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Background","slug":"background","link":"#background","children":[]},{"level":2,"title":"Usage","slug":"usage","link":"#usage","children":[]},{"level":2,"title":"Language Requirement","slug":"language-requirement","link":"#language-requirement","children":[]},{"level":2,"title":"Source of Inspiration","slug":"source-of-inspiration","link":"#source-of-inspiration","children":[]},{"level":2,"title":"Suppored Hook Framework","slug":"suppored-hook-framework","link":"#suppored-hook-framework","children":[]}],"git":{"updatedTime":1673547557000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/guide/home.md"}');export{e as data}; diff --git a/docs/assets/home.html.f11cb486.js b/docs/assets/home.html.cc592da6.js similarity index 98% rename from docs/assets/home.html.f11cb486.js rename to docs/assets/home.html.cc592da6.js index dad09cd07..c8df96902 100644 --- a/docs/assets/home.html.f11cb486.js +++ b/docs/assets/home.html.cc592da6.js @@ -1 +1 @@ -import{_ as e,o,c as i,a as d}from"./app.99fcdd51.js";const c={},t=d('

    \u6587\u6863\u4ECB\u7ECD

    \u8FD9\u91CC\u7684\u6587\u6863\u5C06\u540C\u6B65\u6700\u65B0 API \u7248\u672C\u7684\u76F8\u5173\u7528\u6CD5\uFF0C\u8BF7\u4FDD\u6301 YukiHookAPI \u4E3A\u6700\u65B0\u7248\u672C\u4EE5\u4F7F\u7528\u6700\u65B0\u7248\u672C\u7684\u529F\u80FD\u3002

    \u529F\u80FD\u63CF\u8FF0\u8BF4\u660E

    \u529F\u80FD\u63CF\u8FF0\u4E3B\u8981\u4ECB\u7ECD\u5F53\u524D API \u7684\u76F8\u5173\u7528\u6CD5\u548C\u7528\u9014\u3002

    \u529F\u80FD\u793A\u4F8B\u8BF4\u660E

    \u529F\u80FD\u793A\u4F8B\u4E3B\u8981\u5C55\u793A\u4E86\u5F53\u524D API \u7684\u57FA\u672C\u7528\u6CD5\u793A\u4F8B\uFF0C\u53EF\u4F9B\u53C2\u8003\u3002

    \u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E

    \u9996\u4E2A\u7248\u672C\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u6DFB\u52A0\uFF1B

    \u540E\u671F\u65B0\u589E\u52A0\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u65B0\u589E\uFF1B

    \u540E\u671F\u4FEE\u6539\u7684\u529F\u80FD\u5C06\u88AB\u8FFD\u52A0\u4E3A v<version> \u4FEE\u6539\uFF1B

    \u540E\u671F\u88AB\u4F5C\u5E9F\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u4F5C\u5E9F \u5E76\u4F1A\u6807\u6CE8\u5220\u9664\u7EBF\uFF1B

    \u540E\u671F\u88AB\u5220\u9664\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u79FB\u9664 \u5E76\u4F1A\u6807\u6CE8\u5220\u9664\u7EBF\u3002

    \u76F8\u5173\u7B26\u53F7\u8BF4\u660E

    • kt \xA0Kotlin Static File

    • annotation \xA0\u6CE8\u89E3

    • interface \xA0\u63A5\u53E3

    • object \xA0\u7C7B (\u5355\u4F8B)

    • class \xA0\u7C7B

    • field \xA0\u53D8\u91CF\u6216 get\u3001set \u65B9\u6CD5\u6216\u53EA\u8BFB\u7684 get \u65B9\u6CD5

    • method \xA0\u65B9\u6CD5

    • enum \xA0Enum \u5E38\u91CF

    • ext-field \xA0\u6269\u5C55\u7684\u53D8\u91CF (\u5168\u5C40)

    • ext-method \xA0\u6269\u5C55\u7684\u65B9\u6CD5 (\u5168\u5C40)

    • i-ext-field \xA0\u6269\u5C55\u7684\u53D8\u91CF (\u8C03\u7528\u57DF\u9650\u5236)

    • i-ext-method \xA0\u6269\u5C55\u7684\u65B9\u6CD5 (\u8C03\u7528\u57DF\u9650\u5236)

    ',14),a=[t];function l(p,r){return o(),i("div",null,a)}const n=e(c,[["render",l],["__file","home.html.vue"]]);export{n as default}; +import{_ as e,o,c as i,a as d}from"./app.6074a838.js";const c={},t=d('

    \u6587\u6863\u4ECB\u7ECD

    \u8FD9\u91CC\u7684\u6587\u6863\u5C06\u540C\u6B65\u6700\u65B0 API \u7248\u672C\u7684\u76F8\u5173\u7528\u6CD5\uFF0C\u8BF7\u4FDD\u6301 YukiHookAPI \u4E3A\u6700\u65B0\u7248\u672C\u4EE5\u4F7F\u7528\u6700\u65B0\u7248\u672C\u7684\u529F\u80FD\u3002

    \u529F\u80FD\u63CF\u8FF0\u8BF4\u660E

    \u529F\u80FD\u63CF\u8FF0\u4E3B\u8981\u4ECB\u7ECD\u5F53\u524D API \u7684\u76F8\u5173\u7528\u6CD5\u548C\u7528\u9014\u3002

    \u529F\u80FD\u793A\u4F8B\u8BF4\u660E

    \u529F\u80FD\u793A\u4F8B\u4E3B\u8981\u5C55\u793A\u4E86\u5F53\u524D API \u7684\u57FA\u672C\u7528\u6CD5\u793A\u4F8B\uFF0C\u53EF\u4F9B\u53C2\u8003\u3002

    \u53D8\u66F4\u8BB0\u5F55\u8BF4\u660E

    \u9996\u4E2A\u7248\u672C\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u6DFB\u52A0\uFF1B

    \u540E\u671F\u65B0\u589E\u52A0\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u65B0\u589E\uFF1B

    \u540E\u671F\u4FEE\u6539\u7684\u529F\u80FD\u5C06\u88AB\u8FFD\u52A0\u4E3A v<version> \u4FEE\u6539\uFF1B

    \u540E\u671F\u88AB\u4F5C\u5E9F\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u4F5C\u5E9F \u5E76\u4F1A\u6807\u6CE8\u5220\u9664\u7EBF\uFF1B

    \u540E\u671F\u88AB\u5220\u9664\u7684\u529F\u80FD\u5C06\u6807\u8BB0\u4E3A v<version> \u79FB\u9664 \u5E76\u4F1A\u6807\u6CE8\u5220\u9664\u7EBF\u3002

    \u76F8\u5173\u7B26\u53F7\u8BF4\u660E

    • kt \xA0Kotlin Static File

    • annotation \xA0\u6CE8\u89E3

    • interface \xA0\u63A5\u53E3

    • object \xA0\u7C7B (\u5355\u4F8B)

    • class \xA0\u7C7B

    • field \xA0\u53D8\u91CF\u6216 get\u3001set \u65B9\u6CD5\u6216\u53EA\u8BFB\u7684 get \u65B9\u6CD5

    • method \xA0\u65B9\u6CD5

    • enum \xA0Enum \u5E38\u91CF

    • ext-field \xA0\u6269\u5C55\u7684\u53D8\u91CF (\u5168\u5C40)

    • ext-method \xA0\u6269\u5C55\u7684\u65B9\u6CD5 (\u5168\u5C40)

    • i-ext-field \xA0\u6269\u5C55\u7684\u53D8\u91CF (\u8C03\u7528\u57DF\u9650\u5236)

    • i-ext-method \xA0\u6269\u5C55\u7684\u65B9\u6CD5 (\u8C03\u7528\u57DF\u9650\u5236)

    ',14),a=[t];function l(p,r){return o(),i("div",null,a)}const n=e(c,[["render",l],["__file","home.html.vue"]]);export{n as default}; diff --git a/docs/assets/home.html.4d8cac8a.js b/docs/assets/home.html.e3bb15fd.js similarity index 67% rename from docs/assets/home.html.4d8cac8a.js rename to docs/assets/home.html.e3bb15fd.js index 13b460a8a..d1f25ee26 100644 --- a/docs/assets/home.html.4d8cac8a.js +++ b/docs/assets/home.html.e3bb15fd.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-6a609e09","path":"/zh-cn/guide/home.html","title":"\u4ECB\u7ECD","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u80CC\u666F","slug":"\u80CC\u666F","link":"#\u80CC\u666F","children":[]},{"level":2,"title":"\u7528\u9014","slug":"\u7528\u9014","link":"#\u7528\u9014","children":[]},{"level":2,"title":"\u8BED\u8A00\u8981\u6C42","slug":"\u8BED\u8A00\u8981\u6C42","link":"#\u8BED\u8A00\u8981\u6C42","children":[]},{"level":2,"title":"\u7075\u611F\u6765\u6E90","slug":"\u7075\u611F\u6765\u6E90","link":"#\u7075\u611F\u6765\u6E90","children":[]},{"level":2,"title":"\u652F\u6301\u7684 Hook \u6846\u67B6","slug":"\u652F\u6301\u7684-hook-\u6846\u67B6","link":"#\u652F\u6301\u7684-hook-\u6846\u67B6","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/guide/home.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-6a609e09","path":"/zh-cn/guide/home.html","title":"\u4ECB\u7ECD","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u80CC\u666F","slug":"\u80CC\u666F","link":"#\u80CC\u666F","children":[]},{"level":2,"title":"\u7528\u9014","slug":"\u7528\u9014","link":"#\u7528\u9014","children":[]},{"level":2,"title":"\u8BED\u8A00\u8981\u6C42","slug":"\u8BED\u8A00\u8981\u6C42","link":"#\u8BED\u8A00\u8981\u6C42","children":[]},{"level":2,"title":"\u7075\u611F\u6765\u6E90","slug":"\u7075\u611F\u6765\u6E90","link":"#\u7075\u611F\u6765\u6E90","children":[]},{"level":2,"title":"\u652F\u6301\u7684 Hook Framework","slug":"\u652F\u6301\u7684-hook-framework","link":"#\u652F\u6301\u7684-hook-framework","children":[]}],"git":{"updatedTime":1673547557000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"zh-cn/guide/home.md"}');export{e as data}; diff --git a/docs/assets/host-inject.html.9e3097f8.js b/docs/assets/host-inject.html.0a722722.js similarity index 99% rename from docs/assets/host-inject.html.9e3097f8.js rename to docs/assets/host-inject.html.0a722722.js index 7ec8c39be..3ab398781 100644 --- a/docs/assets/host-inject.html.9e3097f8.js +++ b/docs/assets/host-inject.html.0a722722.js @@ -1,4 +1,4 @@ -import{_ as l,r as o,o as p,c as t,b as s,d as i,a as n,e}from"./app.99fcdd51.js";const c={},r=n(`

    Host Resource Injection Extension

    This is an extension that injects Module App's Resources, Activity components, and Context topics into the Host App.

    Before using the following functions, in order to prevent Resource Id from conflicting with each other, you need to modify the Resource Id in the build.gradle of the current Xposed Module project.

    • Kotlin Gradle DSL
    android {
    +import{_ as l,r as o,o as p,c as t,b as s,d as i,a as n,e}from"./app.6074a838.js";const c={},r=n(`

    Host Resource Injection Extension

    This is an extension that injects Module App's Resources, Activity components, and Context topics into the Host App.

    Before using the following functions, in order to prevent Resource Id from conflicting with each other, you need to modify the Resource Id in the build.gradle of the current Xposed Module project.

    • Kotlin Gradle DSL
    android {
         androidResources.additionalParameters("--allow-reserved-package-id", "--package-id", "0x64")
     }
     
    • Groovy
    android {
    diff --git a/docs/assets/host-inject.html.5ae0aeb9.js b/docs/assets/host-inject.html.abdaad63.js
    similarity index 99%
    rename from docs/assets/host-inject.html.5ae0aeb9.js
    rename to docs/assets/host-inject.html.abdaad63.js
    index f7208d9f9..99e8aec3c 100644
    --- a/docs/assets/host-inject.html.5ae0aeb9.js
    +++ b/docs/assets/host-inject.html.abdaad63.js
    @@ -1,4 +1,4 @@
    -import{_ as e,r as o,o as p,c,b as s,d as i,a,e as n}from"./app.99fcdd51.js";const t={},r=a(`

    \u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55

    \u8FD9\u662F\u4E00\u4E2A\u5C06\u6A21\u5757\u8D44\u6E90\u3001Activity \u7EC4\u4EF6\u4EE5\u53CA Context \u4E3B\u9898\u6CE8\u5165\u5230\u5BBF\u4E3B\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u5728\u4F7F\u7528\u4EE5\u4E0B\u529F\u80FD\u4E4B\u524D\uFF0C\u4E3A\u9632\u6B62\u8D44\u6E90 ID \u4E92\u76F8\u51B2\u7A81\uFF0C\u4F60\u9700\u8981\u5728\u5F53\u524D Xposed \u6A21\u5757\u9879\u76EE\u7684 build.gradle \u4E2D\u4FEE\u6539\u8D44\u6E90 ID\u3002

    • Kotlin Gradle DSL
    android {
    +import{_ as e,r as o,o as p,c,b as s,d as i,a,e as n}from"./app.6074a838.js";const t={},r=a(`

    \u5BBF\u4E3B\u8D44\u6E90\u6CE8\u5165\u6269\u5C55

    \u8FD9\u662F\u4E00\u4E2A\u5C06\u6A21\u5757\u8D44\u6E90\u3001Activity \u7EC4\u4EF6\u4EE5\u53CA Context \u4E3B\u9898\u6CE8\u5165\u5230\u5BBF\u4E3B\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u5728\u4F7F\u7528\u4EE5\u4E0B\u529F\u80FD\u4E4B\u524D\uFF0C\u4E3A\u9632\u6B62\u8D44\u6E90 ID \u4E92\u76F8\u51B2\u7A81\uFF0C\u4F60\u9700\u8981\u5728\u5F53\u524D Xposed \u6A21\u5757\u9879\u76EE\u7684 build.gradle \u4E2D\u4FEE\u6539\u8D44\u6E90 ID\u3002

    • Kotlin Gradle DSL
    android {
         androidResources.additionalParameters("--allow-reserved-package-id", "--package-id", "0x64")
     }
     
    • Groovy
    android {
    diff --git a/docs/assets/host-lifecycle.html.09c0b222.js b/docs/assets/host-lifecycle.html.136055f0.js
    similarity index 82%
    rename from docs/assets/host-lifecycle.html.09c0b222.js
    rename to docs/assets/host-lifecycle.html.136055f0.js
    index 3b1f0926d..d080c8e03 100644
    --- a/docs/assets/host-lifecycle.html.09c0b222.js
    +++ b/docs/assets/host-lifecycle.html.136055f0.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-357a8d49","path":"/zh-cn/api/special-features/host-lifecycle.html","title":"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u76D1\u542C\u751F\u547D\u5468\u671F","slug":"\u76D1\u542C\u751F\u547D\u5468\u671F","link":"#\u76D1\u542C\u751F\u547D\u5468\u671F","children":[]},{"level":2,"title":"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","slug":"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","link":"#\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","children":[]}],"git":{"updatedTime":1664038384000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/special-features/host-lifecycle.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-357a8d49","path":"/zh-cn/api/special-features/host-lifecycle.html","title":"\u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u76D1\u542C\u751F\u547D\u5468\u671F","slug":"\u76D1\u542C\u751F\u547D\u5468\u671F","link":"#\u76D1\u542C\u751F\u547D\u5468\u671F","children":[]},{"level":2,"title":"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","slug":"\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","link":"#\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD","children":[]}],"git":{"updatedTime":1669656909000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/api/special-features/host-lifecycle.md"}');export{e as data};
    diff --git a/docs/assets/host-lifecycle.html.412bbdd6.js b/docs/assets/host-lifecycle.html.412bbdd6.js
    deleted file mode 100644
    index f61419444..000000000
    --- a/docs/assets/host-lifecycle.html.412bbdd6.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -const e=JSON.parse('{"key":"v-deaff1d0","path":"/en/api/special-features/host-lifecycle.html","title":"Host Lifecycle Extension","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Monitor Lifecycle","slug":"monitor-lifecycle","link":"#monitor-lifecycle","children":[]},{"level":2,"title":"Register System Broadcast","slug":"register-system-broadcast","link":"#register-system-broadcast","children":[]}],"git":{"updatedTime":1664038435000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/special-features/host-lifecycle.md"}');export{e as data};
    diff --git a/docs/assets/host-lifecycle.html.fe173b3e.js b/docs/assets/host-lifecycle.html.5b74ef69.js
    similarity index 71%
    rename from docs/assets/host-lifecycle.html.fe173b3e.js
    rename to docs/assets/host-lifecycle.html.5b74ef69.js
    index 1f10e1ee5..29ce0de52 100644
    --- a/docs/assets/host-lifecycle.html.fe173b3e.js
    +++ b/docs/assets/host-lifecycle.html.5b74ef69.js
    @@ -1,6 +1,10 @@
    -import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const l={},p=a(`

    Host Lifecycle Extension

    This is an extension of the lifecycle of an automatic hooking Host App.

    Monitor Lifecycle

    Implement the monitoring function by automating the lifecycle method of the Host App.

    We need to listen to the startup and lifecycle methods of the Host App's Application, just use the following methods.

    The following example

    loadApp(name = "com.example.demo") {
    +import{_ as s,o as n,c as e,a}from"./app.6074a838.js";const l={},p=a(`

    Host Lifecycle Extension

    This is an extension of the lifecycle of an automatic hooking Host App.

    Listener Lifecycle

    Implement the listening function by automating the lifecycle method of the Host App.

    We need to listen to the startup and lifecycle methods of the Host App's Application, just use the following methods.

    The following example

    loadApp(name = "com.example.demo") {
         // Register lifecycle listeners
    -    onAppLifecycle {
    +    // Optional parameter:
    +    // You can set isOnFailureThrowToApp = false
    +    // So that the exception will not be thrown to the Host App to prevent the Host App from crashing
    +    // The default is true
    +    onAppLifecycle(isOnFailureThrowToApp = true) {
             // You can implement lifecycle method listeners in Application here
             attachBaseContext { baseContext, hasCalledSuper ->
                 // Determine whether
    @@ -31,10 +35,10 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const l={},p=a(`

    } } } -

    Tips

    For more functions, please refer to AppLifecycle.

    Register System Broadcast

    Register system broadcast through the Application.onCreate method to monitor system broadcast.

    We can also register system broadcast in the Host App's Application.

    The following example

    loadApp(name = "com.example.demo") {
    +

    Tips

    For more functions, please refer to AppLifecycle.

    Register System Broadcast

    Register system broadcast through the Application.onCreate method to listening system broadcast.

    We can also register system broadcast in the Host App's Application.

    The following example

    loadApp(name = "com.example.demo") {
         // Register lifecycle listeners
         onAppLifecycle {
    -        // Broadcast monitoring when the registered user is unlocked
    +        // Broadcast listening when the registered user is unlocked
             registerReceiver(Intent.ACTION_USER_PRESENT) { context, intent ->
                 // ...
             }
    @@ -44,4 +48,4 @@ import{_ as s,o as n,c as e,a}from"./app.99fcdd51.js";const l={},p=a(`

    } } } -

    Tips

    For more functions, please refer to AppLifecycle.

    `,14),o=[p];function c(i,t){return n(),e("div",null,o)}const d=s(l,[["render",c],["__file","host-lifecycle.html.vue"]]);export{d as default}; +

    Tips

    For more functions, please refer to AppLifecycle.

    `,14),o=[p];function i(c,t){return n(),e("div",null,o)}const d=s(l,[["render",i],["__file","host-lifecycle.html.vue"]]);export{d as default}; diff --git a/docs/assets/host-lifecycle.html.ed922d2c.js b/docs/assets/host-lifecycle.html.6af9a14c.js similarity index 82% rename from docs/assets/host-lifecycle.html.ed922d2c.js rename to docs/assets/host-lifecycle.html.6af9a14c.js index b779ebd04..fe4c0e814 100644 --- a/docs/assets/host-lifecycle.html.ed922d2c.js +++ b/docs/assets/host-lifecycle.html.6af9a14c.js @@ -1,6 +1,7 @@ -import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const e={},p=l(`

    \u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55

    \u8FD9\u662F\u4E00\u4E2A\u81EA\u52A8 Hook \u5BBF\u4E3B APP \u751F\u547D\u5468\u671F\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u76D1\u542C\u751F\u547D\u5468\u671F

    \u901A\u8FC7\u81EA\u52A8\u5316 Hook \u5BBF\u4E3B APP \u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\uFF0C\u6765\u5B9E\u73B0\u76D1\u542C\u529F\u80FD\u3002

    \u6211\u4EEC\u9700\u8981\u76D1\u542C\u5BBF\u4E3B Application \u7684\u542F\u52A8\u548C\u751F\u547D\u5468\u671F\u65B9\u6CD5\uFF0C\u53EA\u9700\u8981\u4F7F\u7528\u4EE5\u4E0B\u65B9\u5F0F\u5B9E\u73B0\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadApp(name = "com.example.demo") {
    +import{_ as s,o as n,c as a,a as l}from"./app.6074a838.js";const e={},p=l(`

    \u5BBF\u4E3B\u751F\u547D\u5468\u671F\u6269\u5C55

    \u8FD9\u662F\u4E00\u4E2A\u81EA\u52A8 Hook \u5BBF\u4E3B APP \u751F\u547D\u5468\u671F\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u76D1\u542C\u751F\u547D\u5468\u671F

    \u901A\u8FC7\u81EA\u52A8\u5316 Hook \u5BBF\u4E3B APP \u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\uFF0C\u6765\u5B9E\u73B0\u76D1\u542C\u529F\u80FD\u3002

    \u6211\u4EEC\u9700\u8981\u76D1\u542C\u5BBF\u4E3B Application \u7684\u542F\u52A8\u548C\u751F\u547D\u5468\u671F\u65B9\u6CD5\uFF0C\u53EA\u9700\u8981\u4F7F\u7528\u4EE5\u4E0B\u65B9\u5F0F\u5B9E\u73B0\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadApp(name = "com.example.demo") {
         // \u6CE8\u518C\u751F\u547D\u5468\u671F\u76D1\u542C
    -    onAppLifecycle {
    +    // \u53EF\u9009\u53C2\u6570\uFF1A\u4F60\u53EF\u4EE5\u8BBE\u7F6E isOnFailureThrowToApp = false \u4F7F\u5F97\u5176\u4E2D\u7684\u5F02\u5E38\u4E0D\u4F1A\u629B\u51FA\u7ED9\u5BBF\u4E3B\u9632\u6B62\u5BBF\u4E3B\u5D29\u6E83\uFF0C\u9ED8\u8BA4\u4E3A true
    +    onAppLifecycle(isOnFailureThrowToApp = true) {
             // \u4F60\u53EF\u4EE5\u5728\u8FD9\u91CC\u5B9E\u73B0 Application \u4E2D\u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\u76D1\u542C
             attachBaseContext { baseContext, hasCalledSuper ->
                 // \u901A\u8FC7\u5224\u65AD hasCalledSuper \u6765\u786E\u5B9A\u662F\u5426\u5DF2\u6267\u884C super.attachBaseContext(base) \u65B9\u6CD5
    @@ -30,7 +31,7 @@ import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const e={},p=l(`

    } } } -

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 AppLifecycle\u3002

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD

    \u901A\u8FC7 Application.onCreate \u65B9\u6CD5\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\uFF0C\u6765\u5B9E\u73B0\u5BF9\u7CFB\u7EDF\u5E7F\u64AD\u7684\u76D1\u542C\u3002

    \u6211\u4EEC\u8FD8\u53EF\u4EE5\u5728\u5BBF\u4E3B Application \u4E2D\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadApp(name = "com.example.demo") {
    +

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 AppLifecycle\u3002

    \u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD

    \u901A\u8FC7 Application.onCreate \u65B9\u6CD5\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\uFF0C\u6765\u5B9E\u73B0\u5BF9\u7CFB\u7EDF\u5E7F\u64AD\u7684\u76D1\u542C\u3002

    \u6211\u4EEC\u8FD8\u53EF\u4EE5\u5728\u5BBF\u4E3B Application \u4E2D\u6CE8\u518C\u7CFB\u7EDF\u5E7F\u64AD\u3002

    \u793A\u4F8B\u5982\u4E0B

    loadApp(name = "com.example.demo") {
         // \u6CE8\u518C\u751F\u547D\u5468\u671F\u76D1\u542C
         onAppLifecycle {
             // \u6CE8\u518C\u7528\u6237\u89E3\u9501\u65F6\u7684\u5E7F\u64AD\u76D1\u542C
    diff --git a/docs/assets/host-lifecycle.html.7e81cf29.js b/docs/assets/host-lifecycle.html.7e81cf29.js
    new file mode 100644
    index 000000000..9e1f335d4
    --- /dev/null
    +++ b/docs/assets/host-lifecycle.html.7e81cf29.js
    @@ -0,0 +1 @@
    +const e=JSON.parse('{"key":"v-deaff1d0","path":"/en/api/special-features/host-lifecycle.html","title":"Host Lifecycle Extension","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Listener Lifecycle","slug":"listener-lifecycle","link":"#listener-lifecycle","children":[]},{"level":2,"title":"Register System Broadcast","slug":"register-system-broadcast","link":"#register-system-broadcast","children":[]}],"git":{"updatedTime":1669656909000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/api/special-features/host-lifecycle.md"}');export{e as data};
    diff --git a/docs/assets/index.html.2ea35cea.js b/docs/assets/index.html.0d73fe13.js
    similarity index 98%
    rename from docs/assets/index.html.2ea35cea.js
    rename to docs/assets/index.html.0d73fe13.js
    index 2e57bb6d4..3aef519f4 100644
    --- a/docs/assets/index.html.2ea35cea.js
    +++ b/docs/assets/index.html.0d73fe13.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const e={},p=l(`

    All Hook process in one step, everything is simplified

    loadApp(name = "com.android.browser") {
    +import{_ as s,o as n,c as a,a as l}from"./app.6074a838.js";const e={},p=l(`

    All Hook process in one step, everything is simplified

    loadApp(name = "com.android.browser") {
         ActivityClass.hook {
             injectMember {
                 method {
    diff --git a/docs/assets/index.html.1b76ac9e.js b/docs/assets/index.html.1ad46905.js
    similarity index 67%
    rename from docs/assets/index.html.1b76ac9e.js
    rename to docs/assets/index.html.1ad46905.js
    index 285aac0fd..8d1f95a2e 100644
    --- a/docs/assets/index.html.1b76ac9e.js
    +++ b/docs/assets/index.html.1ad46905.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"navbar":false,"sidebar":false,"title":null,"heroAlt":null,"heroText":null,"tagline":"Select a language","actions":[{"text":"English","link":"/en/","type":"secondary"},{"text":"\u7B80\u4F53\u4E2D\u6587","link":"/zh-cn/","type":"secondary"}],"footer":"MIT License | Copyright (C) 2019-2022 HighCapable"},"excerpt":"","headers":[],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"index.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-8daa1a0e","path":"/","title":"","lang":"en-US","frontmatter":{"home":true,"navbar":false,"sidebar":false,"title":null,"heroAlt":null,"heroText":null,"tagline":"Select a language","actions":[{"text":"English","link":"/en/","type":"secondary"},{"text":"\u7B80\u4F53\u4E2D\u6587","link":"/zh-cn/","type":"secondary"}],"footer":"MIT License | Copyright (C) 2019-2023 HighCapable"},"excerpt":"","headers":[],"git":{"updatedTime":1673548269000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"index.md"}');export{e as data};
    diff --git a/docs/assets/index.html.872aa7a1.js b/docs/assets/index.html.771ceabe.js
    similarity index 89%
    rename from docs/assets/index.html.872aa7a1.js
    rename to docs/assets/index.html.771ceabe.js
    index d4fe00f0c..3081ee99e 100644
    --- a/docs/assets/index.html.872aa7a1.js
    +++ b/docs/assets/index.html.771ceabe.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-2d0a870d","path":"/en/","title":"Home","lang":"en-US","frontmatter":{"home":true,"title":"Home","heroImage":"/images/logo.png","actions":[{"text":"Get Started","link":"/en/guide/home","type":"primary"},{"text":"Changelog","link":"/en/about/changelog","type":"secondary"}],"features":[{"title":"Xposed Module Develop","details":"The automatic builder can help you quickly create an Xposed Module, automatic configure the entry class and xposed_init file."},{"title":"Light and Elegant","details":"A powerful, elegant, beautiful API built with Kotlin lambda can help you quickly implement members search and methods hooks."},{"title":"Debugging Efficient","details":"A rich debug log function, detailing the name of each hooked method, time-consuming to find the class can quickly debug and find errors."},{"title":"Easy to transplant","details":"Native support for Xposed API usage, in any case, the supported Hook Framework with Xposed API can be quickly spliced with it."},{"title":"Obfuscate Support","details":"The built Xposed Module simply supports R8, obfuscate will not destroy the hook entry point, and no other configuration is required under R8."},{"title":"Quickly Started","details":"Simple and easy to use it now! Do not need complex configuration and full development experience, Integrate dependencies and enjoy yourself."}],"footer":"MIT License | Copyright (C) 2019-2022 HighCapable"},"excerpt":"","headers":[{"level":3,"title":"All Hook process in one step, everything is simplified","slug":"all-hook-process-in-one-step-everything-is-simplified","link":"#all-hook-process-in-one-step-everything-is-simplified","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/index.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-2d0a870d","path":"/en/","title":"Home","lang":"en-US","frontmatter":{"home":true,"title":"Home","heroImage":"/images/logo.png","actions":[{"text":"Get Started","link":"/en/guide/home","type":"primary"},{"text":"Changelog","link":"/en/about/changelog","type":"secondary"}],"features":[{"title":"Xposed Module Develop","details":"The automatic builder can help you quickly create an Xposed Module, automatic configure the entry class and xposed_init file."},{"title":"Light and Elegant","details":"A powerful, elegant, beautiful API built with Kotlin lambda can help you quickly implement members search and methods hooks."},{"title":"Debugging Efficient","details":"A rich debug log function, detailing the name of each hooked method, time-consuming to find the class can quickly debug and find errors."},{"title":"Easy to transplant","details":"Native support for Xposed API usage, in any case, the supported Hook Framework with Xposed API can be quickly spliced with it."},{"title":"Obfuscate Support","details":"The built Xposed Module simply supports R8, obfuscate will not destroy the hook entry point, and no other configuration is required under R8."},{"title":"Quickly Started","details":"Simple and easy to use it now! Do not need complex configuration and full development experience, Integrate dependencies and enjoy yourself."}],"footer":"MIT License | Copyright (C) 2019-2023 HighCapable"},"excerpt":"","headers":[{"level":3,"title":"All Hook process in one step, everything is simplified","slug":"all-hook-process-in-one-step-everything-is-simplified","link":"#all-hook-process-in-one-step-everything-is-simplified","children":[]}],"git":{"updatedTime":1673548269000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/index.md"}');export{e as data};
    diff --git a/docs/assets/index.html.e1a0a108.js b/docs/assets/index.html.7d529d80.js
    similarity index 63%
    rename from docs/assets/index.html.e1a0a108.js
    rename to docs/assets/index.html.7d529d80.js
    index d789c2c9a..ff0050de5 100644
    --- a/docs/assets/index.html.e1a0a108.js
    +++ b/docs/assets/index.html.7d529d80.js
    @@ -1 +1 @@
    -import{_ as e,o as c,c as t}from"./app.99fcdd51.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default};
    +import{_ as e,o as c,c as t}from"./app.6074a838.js";const n={};function _(o,r){return c(),t("div")}const a=e(n,[["render",_],["__file","index.html.vue"]]);export{a as default};
    diff --git a/docs/assets/index.html.0e1e0a04.js b/docs/assets/index.html.7de330d6.js
    similarity index 98%
    rename from docs/assets/index.html.0e1e0a04.js
    rename to docs/assets/index.html.7de330d6.js
    index c8cb6fd1d..530d68f34 100644
    --- a/docs/assets/index.html.0e1e0a04.js
    +++ b/docs/assets/index.html.7de330d6.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const e={},p=l(`

    \u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410

    loadApp(name = "com.android.browser") {
    +import{_ as s,o as n,c as a,a as l}from"./app.6074a838.js";const e={},p=l(`

    \u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410

    loadApp(name = "com.android.browser") {
         ActivityClass.hook {
             injectMember {
                 method {
    diff --git a/docs/assets/index.html.6cc32291.js b/docs/assets/index.html.962e6741.js
    similarity index 52%
    rename from docs/assets/index.html.6cc32291.js
    rename to docs/assets/index.html.962e6741.js
    index ffe98ed21..cd553fbd5 100644
    --- a/docs/assets/index.html.6cc32291.js
    +++ b/docs/assets/index.html.962e6741.js
    @@ -1 +1 @@
    -const e=JSON.parse('{"key":"v-c0c85b84","path":"/zh-cn/","title":"\u9996\u9875","lang":"zh-CN","frontmatter":{"home":true,"title":"\u9996\u9875","heroImage":"/images/logo.png","actions":[{"text":"\u5FEB\u901F\u4E0A\u624B","link":"/zh-cn/guide/home","type":"primary"},{"text":"\u66F4\u65B0\u65E5\u5FD7","link":"/zh-cn/about/changelog","type":"secondary"}],"features":[{"title":"Xposed \u6A21\u5757\u5F00\u53D1","details":"\u81EA\u52A8\u6784\u5EFA\u7A0B\u5E8F\u53EF\u4EE5\u5E2E\u4F60\u5FEB\u901F\u521B\u5EFA\u4E00\u4E2A Xposed \u6A21\u5757\uFF0C\u5B8C\u5168\u7701\u53BB\u914D\u7F6E\u5165\u53E3\u7C7B\u548C xposed_init \u6587\u4EF6\u3002"},{"title":"\u8F7B\u91CF\u4F18\u96C5","details":"\u62E5\u6709\u4E00\u5957\u5F3A\u5927\u3001\u4F18\u96C5\u3001\u4EBA\u6027\u5316\u3001\u5B8C\u5168\u4F7F\u7528 Kotlin lambda \u6253\u9020\u7684 API\uFF0C\u53EF\u4EE5\u5E2E\u4F60\u5FEB\u901F\u5B9E\u73B0\u5B57\u8282\u7801\u7684\u67E5\u627E\u4EE5\u53CA\u65B9\u6CD5 Hook\u3002"},{"title":"\u9AD8\u6548\u8C03\u8BD5","details":"\u62E5\u6709\u4E30\u5BCC\u7684\u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\uFF0C\u7EC6\u5230\u6BCF\u4E2A Hook \u65B9\u6CD5\u7684\u540D\u79F0\u3001\u6240\u5728\u7C7B\u4EE5\u53CA\u67E5\u627E\u8017\u65F6\uFF0C\u53EF\u8FDB\u884C\u5FEB\u901F\u8C03\u8BD5\u548C\u6392\u9519\u3002"},{"title":"\u65B9\u4FBF\u79FB\u690D","details":"\u539F\u751F\u652F\u6301 Xposed API \u7528\u6CD5\uFF0C\u5E76\u539F\u751F\u5BF9\u63A5 Xposed API\uFF0C\u62E5\u6709 Xposed API \u7684 Hook \u6846\u67B6\u90FD\u80FD\u8FDB\u884C\u5FEB\u901F\u5BF9\u63A5\u3002"},{"title":"\u652F\u6301\u6DF7\u6DC6","details":"\u6784\u5EFA\u7684 Xposed \u6A21\u5757\u539F\u751F\u652F\u6301 R8 \u538B\u7F29\u4F18\u5316\u6DF7\u6DC6\uFF0C\u6DF7\u6DC6\u4E0D\u4F1A\u7834\u574F Hook \u5165\u53E3\u70B9\uFF0CR8 \u4E0B\u65E0\u9700\u4EFB\u4F55\u5176\u5B83\u914D\u7F6E\u3002"},{"title":"\u5FEB\u901F\u4E0A\u624B","details":"\u7B80\u5355\u6613\u7528\uFF0C\u4E0D\u9700\u8981\u7E41\u7410\u7684\u914D\u7F6E\uFF0C\u4E0D\u9700\u8981\u5341\u8DB3\u7684\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u642D\u5EFA\u73AF\u5883\u96C6\u6210\u4F9D\u8D56\u5373\u53EF\u7ACB\u5373\u5F00\u59CB\u4F7F\u7528\u3002"}],"footer":"MIT License | Copyright (C) 2019-2022 HighCapable"},"excerpt":"","headers":[{"level":3,"title":"\u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410","slug":"\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410","link":"#\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/index.md"}');export{e as data};
    +const e=JSON.parse('{"key":"v-c0c85b84","path":"/zh-cn/","title":"\u9996\u9875","lang":"zh-CN","frontmatter":{"home":true,"title":"\u9996\u9875","heroImage":"/images/logo.png","actions":[{"text":"\u5FEB\u901F\u4E0A\u624B","link":"/zh-cn/guide/home","type":"primary"},{"text":"\u66F4\u65B0\u65E5\u5FD7","link":"/zh-cn/about/changelog","type":"secondary"}],"features":[{"title":"Xposed \u6A21\u5757\u5F00\u53D1","details":"\u81EA\u52A8\u6784\u5EFA\u7A0B\u5E8F\u53EF\u4EE5\u5E2E\u4F60\u5FEB\u901F\u521B\u5EFA\u4E00\u4E2A Xposed \u6A21\u5757\uFF0C\u5B8C\u5168\u7701\u53BB\u914D\u7F6E\u5165\u53E3\u7C7B\u548C xposed_init \u6587\u4EF6\u3002"},{"title":"\u8F7B\u91CF\u4F18\u96C5","details":"\u62E5\u6709\u4E00\u5957\u5F3A\u5927\u3001\u4F18\u96C5\u3001\u4EBA\u6027\u5316\u3001\u5B8C\u5168\u4F7F\u7528 Kotlin lambda \u6253\u9020\u7684 API\uFF0C\u53EF\u4EE5\u5E2E\u4F60\u5FEB\u901F\u5B9E\u73B0\u5B57\u8282\u7801\u7684\u67E5\u627E\u4EE5\u53CA\u65B9\u6CD5 Hook\u3002"},{"title":"\u9AD8\u6548\u8C03\u8BD5","details":"\u62E5\u6709\u4E30\u5BCC\u7684\u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\uFF0C\u7EC6\u5230\u6BCF\u4E2A Hook \u65B9\u6CD5\u7684\u540D\u79F0\u3001\u6240\u5728\u7C7B\u4EE5\u53CA\u67E5\u627E\u8017\u65F6\uFF0C\u53EF\u8FDB\u884C\u5FEB\u901F\u8C03\u8BD5\u548C\u6392\u9519\u3002"},{"title":"\u65B9\u4FBF\u79FB\u690D","details":"\u539F\u751F\u652F\u6301 Xposed API \u7528\u6CD5\uFF0C\u5E76\u539F\u751F\u5BF9\u63A5 Xposed API\uFF0C\u62E5\u6709 Xposed API \u7684 Hook Framework \u90FD\u80FD\u8FDB\u884C\u5FEB\u901F\u5BF9\u63A5\u3002"},{"title":"\u652F\u6301\u6DF7\u6DC6","details":"\u6784\u5EFA\u7684 Xposed \u6A21\u5757\u539F\u751F\u652F\u6301 R8 \u538B\u7F29\u4F18\u5316\u6DF7\u6DC6\uFF0C\u6DF7\u6DC6\u4E0D\u4F1A\u7834\u574F Hook \u5165\u53E3\u70B9\uFF0CR8 \u4E0B\u65E0\u9700\u4EFB\u4F55\u5176\u5B83\u914D\u7F6E\u3002"},{"title":"\u5FEB\u901F\u4E0A\u624B","details":"\u7B80\u5355\u6613\u7528\uFF0C\u4E0D\u9700\u8981\u7E41\u7410\u7684\u914D\u7F6E\uFF0C\u4E0D\u9700\u8981\u5341\u8DB3\u7684\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u642D\u5EFA\u73AF\u5883\u96C6\u6210\u4F9D\u8D56\u5373\u53EF\u7ACB\u5373\u5F00\u59CB\u4F7F\u7528\u3002"}],"footer":"MIT License | Copyright (C) 2019-2023 HighCapable"},"excerpt":"","headers":[{"level":3,"title":"\u6240\u6709 Hook \u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D\uFF0C\u62D2\u7EDD\u7E41\u7410","slug":"\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410","link":"#\u6240\u6709-hook-\u6D41\u7A0B\u4E00\u6B65\u5230\u4F4D-\u62D2\u7EDD\u7E41\u7410","children":[]}],"git":{"updatedTime":1673548269000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"zh-cn/index.md"}');export{e as data};
    diff --git a/docs/assets/knowledge.html.7104405e.js b/docs/assets/knowledge.html.13983a8b.js
    similarity index 88%
    rename from docs/assets/knowledge.html.7104405e.js
    rename to docs/assets/knowledge.html.13983a8b.js
    index f19eb44b4..3206458a1 100644
    --- a/docs/assets/knowledge.html.7104405e.js
    +++ b/docs/assets/knowledge.html.13983a8b.js
    @@ -1 +1 @@
    -const e=JSON.parse(`{"key":"v-277b35ca","path":"/en/guide/knowledge.html","title":"Basic Knowledge","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Related Introduction","slug":"related-introduction","link":"#related-introduction","children":[{"level":3,"title":"What is Xposed","slug":"what-is-xposed","link":"#what-is-xposed","children":[]},{"level":3,"title":"What can Xposed do","slug":"what-can-xposed-do","link":"#what-can-xposed-do","children":[]},{"level":3,"title":"Development Process","slug":"development-process","link":"#development-process","children":[]},{"level":3,"title":"Derivatives","slug":"derivatives","link":"#derivatives","children":[]},{"level":3,"title":"What YukiHookAPI does","slug":"what-yukihookapi-does","link":"#what-yukihookapi-does","children":[]}]},{"level":2,"title":"Let's Started","slug":"let-s-started","link":"#let-s-started","children":[]}],"git":{"updatedTime":1664469700000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/guide/knowledge.md"}`);export{e as data};
    +const e=JSON.parse(`{"key":"v-277b35ca","path":"/en/guide/knowledge.html","title":"Basic Knowledge","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Related Introduction","slug":"related-introduction","link":"#related-introduction","children":[{"level":3,"title":"What is Xposed","slug":"what-is-xposed","link":"#what-is-xposed","children":[]},{"level":3,"title":"What can Xposed do","slug":"what-can-xposed-do","link":"#what-can-xposed-do","children":[]},{"level":3,"title":"Development Process","slug":"development-process","link":"#development-process","children":[]},{"level":3,"title":"Derivatives","slug":"derivatives","link":"#derivatives","children":[]},{"level":3,"title":"What YukiHookAPI does","slug":"what-yukihookapi-does","link":"#what-yukihookapi-does","children":[]}]},{"level":2,"title":"Let's Started","slug":"let-s-started","link":"#let-s-started","children":[]}],"git":{"updatedTime":1673547665000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":3}]},"filePathRelative":"en/guide/knowledge.md"}`);export{e as data};
    diff --git a/docs/assets/knowledge.html.4101dc45.js b/docs/assets/knowledge.html.4101dc45.js
    new file mode 100644
    index 000000000..b5474f03a
    --- /dev/null
    +++ b/docs/assets/knowledge.html.4101dc45.js
    @@ -0,0 +1,13 @@
    +import{_ as t,r,o as p,c as d,b as o,d as n,a,e}from"./app.6074a838.js";const l={},c=a(`

    \u57FA\u7840\u77E5\u8BC6

    \u8FD9\u91CC\u6536\u96C6\u4E86 Xposed \u76F8\u5173\u7684\u4ECB\u7ECD\u4EE5\u53CA\u5F00\u542F\u524D\u9700\u8981\u638C\u63E1\u7684\u77E5\u8BC6\u8981\u70B9\uFF0C\u5DF2\u7ECF\u4E86\u89E3\u7684\u540C\u5B66\u53EF\u4EE5\u7565\u8FC7\u3002

    \u57FA\u7840\u77E5\u8BC6\u5185\u5BB9\u5E76\u4E0D\u4E00\u5B9A\u5B8C\u5168\u51C6\u786E\uFF0C\u8BF7\u6839\u636E\u81EA\u5DF1\u7684\u89C1\u89E3\u914C\u60C5\u9605\u8BFB\uFF0C\u82E5\u53D1\u73B0\u5185\u5BB9\u6709\u9519\u8BEF\u6B22\u8FCE\u6307\u6B63\u5E76\u5E2E\u52A9\u6211\u4EEC\u5B8C\u5584\u548C\u6539\u8FDB\u3002

    \u76F8\u5173\u4ECB\u7ECD

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 Xposed \u4EE5\u53CA Hook \u7684\u5DE5\u4F5C\u539F\u7406\u3002

    Xposed \u662F\u4EC0\u4E48

    Xposed \u6846\u67B6 (Xposed Framework) \u662F\u4E00\u5957\u5F00\u6E90\u7684\u3001\u5728 Android \u9AD8\u6743\u9650\u6A21\u5F0F\u4E0B\u8FD0\u884C\u7684\u6846\u67B6\u670D\u52A1\uFF0C\u53EF\u4EE5\u5728\u4E0D\u4FEE\u6539 APK \u6587\u4EF6\u7684\u60C5\u51B5\u4E0B\u5F71\u54CD\u7A0B\u5E8F\u8FD0\u884C\uFF08\u4FEE\u6539\u7CFB\u7EDF\uFF09\u7684\u6846\u67B6\u670D\u52A1\uFF0C\u57FA\u4E8E\u5B83\u53EF\u4EE5\u5236\u4F5C\u51FA\u8BB8\u591A\u529F\u80FD\u5F3A\u5927\u7684\u6A21\u5757\uFF0C\u4E14\u5728\u529F\u80FD\u4E0D\u51B2\u7A81\u7684\u60C5\u51B5\u4E0B\u540C\u65F6\u8FD0\u4F5C\u3002

    \u4E0A\u8FF0\u5185\u5BB9\u590D\u5236\u81EA\u767E\u5EA6\u767E\u79D1\u3002

    Xposed \u80FD\u505A\u4EC0\u4E48

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86 Xposed \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    Xposed Framework
    +\u2514\u2500\u2500 App's Environment
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +    App's Environment
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +    ...
    +

    \u6211\u4EEC\u53EF\u4EE5\u5728\u5BBF\u4E3B (APP) \u8FD0\u884C\u65F6\u901A\u8FC7\u6CE8\u5165\u5BBF\u4E3B (APP) \u6765\u8FBE\u5230\u63A7\u5236\u5176\u884C\u4E3A\u7684\u6700\u7EC8\u76EE\u7684\u3002

    Xposed \u7684\u8FD9\u79CD\u8FD0\u884C\u65B9\u5F0F\u88AB\u79F0\u4E3A\u5BC4\u751F\uFF0CXposed \u6A21\u5757\u8DDF\u968F\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\uFF0C\u5728\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\u5185\u5B8C\u6210\u81EA\u5DF1\u7684\u751F\u547D\u5386\u7A0B\u3002

    \u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7\u53CD\u5C04\u7684\u65B9\u5F0F\u8C03\u7528\u5BBF\u4E3B\u7684\u65B9\u6CD5\u3001\u53D8\u91CF\u3001\u6784\u9020\u65B9\u6CD5\uFF0C\u4EE5\u53CA\u4F7F\u7528 XposedBridge \u6240\u63D0\u4F9B\u7684 Hook \u64CD\u4F5C\u52A8\u6001\u5730\u5728\u5BBF\u4E3B (APP) \u8981\u6267\u884C\u7684\u65B9\u6CD5\u524D\u540E\u63D2\u5165\u81EA\u5DF1\u7684\u4EE3\u7801\uFF0C\u6216\u5B8C\u5168\u66FF\u6362\u76EE\u6807\uFF0C\u751A\u81F3\u662F\u62E6\u622A\u3002

    \u53D1\u5C55\u8FC7\u7A0B

    \u5982\u4ECA\u7684 Xposed \u7BA1\u7406\u5668\u5DF2\u5B8C\u5168\u88AB\u5176\u884D\u751F\u4F5C\u54C1\u66FF\u4EE3\uFF0C\u800C SuperSU \u7684\u65F6\u4EE3\u4E5F\u5DF2\u7ECF\u843D\u5E55\u4E86\uFF0C\u73B0\u5728\uFF0C\u501F\u52A9 Magisk \u4F7F\u540E\u9762\u7684\u4E00\u5207\u53C8\u6210\u4E3A\u4E86\u53EF\u80FD\u3002

    \u5176\u53D1\u5C55\u53F2\u5927\u81F4\u53EF\u5206\u4E3A Xposed(Dalvik) \u2192 Xposed(ART) \u2192 Xposed(Magisk) \u2192 EdXposed(Riru)/LSPosed(Riru/Zygisk)

    \u884D\u751F\u4EA7\u54C1

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86\u7C7B\u4F3C Xposed \u7684 Hook Framework \u7684\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    App's Environment
    +\u2514\u2500\u2500 Hook Framework
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +

    \u901A\u8FC7 Xposed \u7684\u8FD0\u884C\u539F\u7406\uFF0C\u4ECE\u800C\u884D\u751F\u4E86\u5F88\u591A\u540C\u7C7B\u578B\u6846\u67B6\uFF0C\u968F\u7740\u5F53\u4ECA\u65F6\u4EE3\u7684\u79FB\u52A8\u8BBE\u5907\u83B7\u53D6 Root \u6743\u9650\u751A\u81F3\u5237\u673A\u8D8A\u6765\u8D8A\u56F0\u96BE\u4E14\u4E0D\u662F\u521A\u9700\u7684\u65F6\u5019\uFF0C\u4E00\u4E9B\u514D Root \u6846\u67B6\u4E5F\u968F\u4E4B\u4EA7\u751F\uFF0C\u4F8B\u5982 LSPatch\u3001\u592A\u6781\u3002

    \u8FD9\u4E9B\u5728 ART \u5C42\u9762\u4E0A\u7684 Hook Framework \u540C\u6837\u4E5F\u53EF\u4E0D\u501F\u52A9 Xposed API \u5B8C\u6210\u5176\u548C Xposed \u539F\u7406\u4E00\u6837\u7684 Hook \u6D41\u7A0B\uFF0C\u514D Root \u7684\u8FD0\u884C\u539F\u7406\u4E3A\u4FEE\u6539 APK \u5E76\u5C06 Hook \u8FDB\u7A0B\u6CE8\u5165\u5BBF\u4E3B\uFF0C\u901A\u8FC7\u5916\u90E8\u6A21\u5757\u5BF9\u5176\u8FDB\u884C\u63A7\u5236\u3002

    \u53E6\u5916\u4E00\u79CD\u4EA7\u54C1\u5C31\u662F\u5229\u7528 Android \u8FD0\u884C\u73AF\u5883\u73B0\u6709\u7684\u529F\u80FD\u865A\u62DF\u51FA\u4E00\u4E2A\u5B8C\u5168\u4E0E\u5F53\u524D\u8BBE\u5907\u7CFB\u7EDF\u4E00\u6837\u7684\u73AF\u5883\uFF0C\u5E76\u5728\u5176\u4E2D\u8FD0\u884C APP\uFF0C\u8FD9\u4E2A\u5C31\u662F\u865A\u62DF APP \u6280\u672F VirtualApp\uFF0C\u540E\u6765\u884D\u751F\u4E3A VirtualXposed\u3002

    `,23),i=e("\u4E0A\u8FF0\u63D0\u5230\u7684\u514D Root \u6846\u67B6\u5206\u522B\u4E3A "),h={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},_=e("LSPatch"),k=e("\u3001"),u={href:"https://taichi.cool/zh/",target:"_blank",rel:"noopener noreferrer"},g=e("\u592A\u6781"),b=e("\u3001"),A={href:"https://github.com/asLody/VirtualApp",target:"_blank",rel:"noopener noreferrer"},f=e("VirtualApp"),X=e("\u3001"),x={href:"https://github.com/asLody/SandVXposed",target:"_blank",rel:"noopener noreferrer"},P=e("SandVXposed"),m=e("\u3002"),y=a('

    YukiHookAPI \u505A\u4E86\u4EC0\u4E48

    \u81EA\u4ECE Xposed \u51FA\u73B0\u5230\u73B0\u5728\u4E3A\u6B62\uFF0C\u9664\u4E86\u5F00\u53D1\u8005\u4EBA\u4EBA\u7686\u77E5\u7684 XposedHelpers\uFF0C\u4F9D\u7136\u6CA1\u6709\u4E00\u5957\u9488\u5BF9 Kotlin \u6253\u9020\u7684\u8BED\u6CD5\u7CD6\u4EE5\u53CA\u7528\u6CD5\u5C01\u88C5\u5341\u5206\u5B8C\u5584\u7684 API\u3002

    \u672C API \u6846\u67B6\u7684\u8BDE\u751F\u5C31\u662F\u5E0C\u671B\u5728 Xposed \u7684\u5982\u4ECA\u65F6\u4EE3\uFF0C\u80FD\u8BA9\u66F4\u591A\u6709\u52A8\u624B\u80FD\u529B\u7684 Xposed \u6A21\u5757\u5F00\u53D1\u8005\u5C11\u8D70\u5F2F\u8DEF\uFF0C\u66F4\u5BB9\u6613\u3001\u66F4\u7B80\u5355\u5730\u5B8C\u6210\u6574\u4E2A\u5F00\u53D1\u6D41\u7A0B\u3002

    \u672A\u6765\uFF0CYukiHookAPI \u5C06\u5728\u4F7F\u7528 Xposed API \u7684\u76EE\u6807\u57FA\u7840\u4E0A\u9002\u914D\u66F4\u591A\u7B2C\u4E09\u65B9 Hook Framework\uFF0C\u4F7F\u5F97\u6574\u4E2A\u751F\u6001\u5F97\u5230\u5B8C\u5584\uFF0C\u5E76\u5E2E\u52A9\u66F4\u591A\u5F00\u53D1\u8005\u8BA9 Xposed \u6A21\u5757\u5F00\u53D1\u53D8\u5F97\u66F4\u52A0\u7B80\u5355\u548C\u6613\u61C2\u3002

    \u8BA9\u6211\u4EEC\u5F00\u59CB\u5427

    \u5728\u5F00\u59CB\u4E4B\u524D\uFF0C\u4F60\u9700\u8981\u62E5\u6709\u4EE5\u4E0B\u57FA\u7840\u624D\u80FD\u66F4\u597D\u5730\u4F7F\u7528 YukiHookAPI\u3002

    ',6),E=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u4E86\u89E3 Android \u5F00\u53D1\u53CA\u7B80\u5355\u7684\u7CFB\u7EDF\u8FD0\u884C\u539F\u7406")],-1),H=e("\u638C\u63E1\u5E76\u4E86\u89E3 Android APK \u5185\u90E8\u7ED3\u6784\u4EE5\u53CA\u7B80\u5355\u7684\u53CD\u7F16\u8BD1\u77E5\u8BC6\u8981\u9886\uFF0C\u53EF\u53C2\u8003 "),v={href:"https://github.com/skylot/jadx",target:"_blank",rel:"noopener noreferrer"},q=e("Jadx"),S=e(" \u4E0E "),I={href:"https://github.com/iBotPeaches/Apktool",target:"_blank",rel:"noopener noreferrer"},V=e("ApkTool"),B=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u719F\u7EC3\u4F7F\u7528 Java \u53CD\u5C04\uFF0C\u4E86\u89E3\u7B80\u5355\u7684 Smali \u8BED\u6CD5\uFF0C\u4E86\u89E3 DEX \u6587\u4EF6\u7ED3\u6784\uFF0C\u4F1A\u4F7F\u7528\u9006\u5411\u5206\u6790\u5B9A\u4F4D\u65B9\u6CD5\u4F4D\u7F6E")],-1),L=e("\u638C\u63E1\u57FA\u7840\u7684\u539F\u751F "),w={href:"https://api.xposed.info",target:"_blank",rel:"noopener noreferrer"},F=e("Xposed API"),K=e(" \u7528\u6CD5\uFF0C\u4E86\u89E3 Xposed \u7684\u8FD0\u884C\u539F\u7406\uFF0C\u53EF\u53C2\u8003\u672C\u6587\u4EE5\u53CA "),R={href:"https://blog.ketal.icu/cn/Xposed%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/",target:"_blank",rel:"noopener noreferrer"},D=e("\u8FD9\u91CC"),J=e(),N=o("strong",null,"(\u53CB\u60C5\u94FE\u63A5)",-1),T=e("\u638C\u63E1 Kotlin \u8BED\u8A00\uFF0C\u5B66\u4F1A\u7075\u6D3B\u8FD0\u7528 "),Y={href:"https://blog.ketal.icu/cn/kotlin-lambda%E5%85%A5%E9%97%A8/",target:"_blank",rel:"noopener noreferrer"},C=e("Kotlin lambda"),M=e(),j=o("strong",null,"(\u53CB\u60C5\u94FE\u63A5)",-1),z=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u4E86\u89E3 Kotlin \u4E0E Java \u6DF7\u7F16\u3001\u4E92\u76F8\u8C03\u7528\u4EE5\u53CA Kotlin \u751F\u6210\u7684 Java \u5B57\u8282\u7801")],-1);function U(Z,G){const s=r("ExternalLinkIcon");return p(),d("div",null,[c,o("p",null,[i,o("a",h,[_,n(s)]),k,o("a",u,[g,n(s)]),b,o("a",A,[f,n(s)]),X,o("a",x,[P,n(s)]),m]),y,o("ul",null,[E,o("li",null,[o("p",null,[H,o("a",v,[q,n(s)]),S,o("a",I,[V,n(s)])])]),B,o("li",null,[o("p",null,[L,o("a",w,[F,n(s)]),K,o("a",R,[D,n(s)]),J,N])]),o("li",null,[o("p",null,[T,o("a",Y,[C,n(s)]),M,j])]),z])])}const Q=t(l,[["render",U],["__file","knowledge.html.vue"]]);export{Q as default}; diff --git a/docs/assets/knowledge.html.50976213.js b/docs/assets/knowledge.html.50976213.js deleted file mode 100644 index 77f2b34a8..000000000 --- a/docs/assets/knowledge.html.50976213.js +++ /dev/null @@ -1,13 +0,0 @@ -import{_ as n,r as a,o as r,c as i,b as e,d as t,a as d,e as o}from"./app.99fcdd51.js";const l={},p=d(`

    Basic Knowledge

    Here is a collection of Xposed-related introductions and the key points of knowledge that need to be grasped before start.

    Anyone who already knows can skip it.

    The basic knowledge content not necessarily completely accurate, please read it according to your own opinion.

    If you find any errors in this page, please correct it and help us improve.

    Here's an introduction to Xposed and how Hooks work.

    What is Xposed

    Xposed Framework (Xposed Framework) is a set of open source framework services that run in Android high-privilege mode. It can affect program operation (modify the system) without modifying the APK file. Based on it, many Powerful modules that operate simultaneously without conflicting functions.

    The above content is copied from Baidu Encyclopedia.

    What can Xposed do

    The structure below describes the basic workings and principles of Xposed.

    Xposed Framework
    -\u2514\u2500\u2500 App's Environment
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -    App's Environment
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -    ...
    -

    We can achieve the ultimate goal of controlling its behavior by injecting the Host (App) when the Host (App) is running.

    This mode of operation of Xposed is called parasitism. The Xposed Module follows the lifecycle of the host and completes its own life course within the lifecycle of the Host.

    We can call the Host's methods, fields, and constructors through reflection, and use the Hook operation provided by XposedBridge to dynamically insert our own code before and after the method to be executed by the Host (App), or completely replace the target, or even intercept.

    Development Process

    Today's Xposed Manager has been completely replaced by its derivative works, and the era of SuperSU has ended, and now, with Magisk, everything behind is possible again.

    Its development history can be roughly divided into Xposed(Dalvik) \u2192 Xposed(ART) \u2192 Xposed(Magisk) \u2192 EdXposed(Riru)/LSPosed(Riru/ Zygisk)

    Derivatives

    The structure below describes how and how the Xposed-like Hook Framework works.

    App's Environment
    -\u2514\u2500\u2500 Hook Framework
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -

    Through the operation principle of Xposed, many frameworks of the same type have been derived. As mobile devices in today's era are more and more difficult to obtain Root permissions or even flash, and when they are not just needed, some Root-free frameworks are also produced, such as Tai Chi.

    These Hook Frameworks at the ART level can also complete the Hook process with the same principle as Xposed without using the Xposed API. The operating principle of Root-free is to modify the APK and inject the Hook process into the Host, and control it through external modules.

    Another product is to use the existing functions of the Android operating environment to virtualize an environment that is completely the same as the current device system, and run App in it. This is the virtual App technology VirtualApp, which was later derived as VirtualXposed .

    The Root-free frameworks mentioned above are Tai Chi/Wuji, VirtualXposed/SandVXposed.

    What YukiHookAPI does

    Since Xposed appeared until now, apart from XposedHelpers, which is well known to developers, there is still no set of syntactic sugar for Kotlin and API with complete usage encapsulation.

    The birth of this API framework is to hope that in the current era of Xposed, more capable Xposed Module developers can avoid detours and complete the entire development process more easily and simply.

    In the future, YukiHookAPI will adapt to more third-party Hook Frameworks based on the goal of using the Xposed API, so as to improve the entire ecosystem and help more developers make Xposed Module development simpler and easier to understand.

    Let's Started

    Before starting, you need to have the following basics to better use YukiHookAPI.

    `,31),c=e("li",null,[e("p",null,"Grasp and understand Android development and simple system operation principles")],-1),h=o("To grasp and understand the internal structure of Android APK and simple decompilation knowledge, you can refer to "),u={href:"https://github.com/skylot/jadx",target:"_blank",rel:"noopener noreferrer"},g=o("Jadx"),m=o(" and "),f={href:"https://github.com/iBotPeaches/Apktool",target:"_blank",rel:"noopener noreferrer"},k=o("ApkTool"),b=e("li",null,[e("p",null,"Grasp and proficient in using Java reflection, understand simple Smali syntax, understand Dex file structure, and use reverse analysis to locate method locations")],-1),y=o("Grasp the basic native "),w={href:"https://api.xposed.info",target:"_blank",rel:"noopener noreferrer"},v=o("Xposed API"),_=o(" usage, understand the operation principle of Xposed, see "),A={href:"https://blog.ketal.icu/en/Xposed%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/",target:"_blank",rel:"noopener noreferrer"},x=o("here"),X=o(),H=e("strong",null,"(Friend Link)",-1),T=e("li",null,[e("p",null,[o("Grasp Kotlin language and learn to use "),e("strong",null,"Kotlin lambda")])],-1),E=e("li",null,[e("p",null,"Grasp and understand Kotlin and Java mixing, calling each other, and Java bytecode generated by Kotlin")],-1);function I(P,B){const s=a("ExternalLinkIcon");return r(),i("div",null,[p,e("ul",null,[c,e("li",null,[e("p",null,[h,e("a",u,[g,t(s)]),m,e("a",f,[k,t(s)])])]),b,e("li",null,[e("p",null,[y,e("a",w,[v,t(s)]),_,e("a",A,[x,t(s)]),X,H])]),T,E])])}const F=n(l,[["render",I],["__file","knowledge.html.vue"]]);export{F as default}; diff --git a/docs/assets/knowledge.html.7539105b.js b/docs/assets/knowledge.html.7539105b.js deleted file mode 100644 index 849aae679..000000000 --- a/docs/assets/knowledge.html.7539105b.js +++ /dev/null @@ -1,13 +0,0 @@ -import{_ as a,r as t,o as r,c as p,b as o,d as n,a as l,e}from"./app.99fcdd51.js";const d={},c=l(`

    \u57FA\u7840\u77E5\u8BC6

    \u8FD9\u91CC\u6536\u96C6\u4E86 Xposed \u76F8\u5173\u7684\u4ECB\u7ECD\u4EE5\u53CA\u5F00\u542F\u524D\u9700\u8981\u638C\u63E1\u7684\u77E5\u8BC6\u8981\u70B9\uFF0C\u5DF2\u7ECF\u4E86\u89E3\u7684\u540C\u5B66\u53EF\u4EE5\u7565\u8FC7\u3002

    \u57FA\u7840\u77E5\u8BC6\u5185\u5BB9\u5E76\u4E0D\u4E00\u5B9A\u5B8C\u5168\u51C6\u786E\uFF0C\u8BF7\u6839\u636E\u81EA\u5DF1\u7684\u89C1\u89E3\u914C\u60C5\u9605\u8BFB\uFF0C\u82E5\u53D1\u73B0\u5185\u5BB9\u6709\u9519\u8BEF\u6B22\u8FCE\u6307\u6B63\u5E76\u5E2E\u52A9\u6211\u4EEC\u5B8C\u5584\u548C\u6539\u8FDB\u3002

    \u76F8\u5173\u4ECB\u7ECD

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 Xposed \u4EE5\u53CA Hook \u7684\u5DE5\u4F5C\u539F\u7406\u3002

    Xposed \u662F\u4EC0\u4E48

    Xposed \u6846\u67B6(Xposed Framework)\u662F\u4E00\u5957\u5F00\u6E90\u7684\u3001\u5728 Android \u9AD8\u6743\u9650\u6A21\u5F0F\u4E0B\u8FD0\u884C\u7684\u6846\u67B6\u670D\u52A1\uFF0C\u53EF\u4EE5\u5728\u4E0D\u4FEE\u6539 APK \u6587\u4EF6\u7684\u60C5\u51B5\u4E0B\u5F71\u54CD\u7A0B\u5E8F\u8FD0\u884C\uFF08\u4FEE\u6539\u7CFB\u7EDF\uFF09\u7684\u6846\u67B6\u670D\u52A1\uFF0C\u57FA\u4E8E\u5B83\u53EF\u4EE5\u5236\u4F5C\u51FA\u8BB8\u591A\u529F\u80FD\u5F3A\u5927\u7684\u6A21\u5757\uFF0C\u4E14\u5728\u529F\u80FD\u4E0D\u51B2\u7A81\u7684\u60C5\u51B5\u4E0B\u540C\u65F6\u8FD0\u4F5C\u3002

    \u4E0A\u8FF0\u5185\u5BB9\u590D\u5236\u81EA\u767E\u5EA6\u767E\u79D1\u3002

    Xposed \u80FD\u505A\u4EC0\u4E48

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86 Xposed \u7684\u57FA\u672C\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    Xposed Framework
    -\u2514\u2500\u2500 App's Environment
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -    App's Environment
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -    ...
    -

    \u6211\u4EEC\u53EF\u4EE5\u5728\u5BBF\u4E3B (APP) \u8FD0\u884C\u65F6\u901A\u8FC7\u6CE8\u5165\u5BBF\u4E3B (APP) \u6765\u8FBE\u5230\u63A7\u5236\u5176\u884C\u4E3A\u7684\u6700\u7EC8\u76EE\u7684\u3002

    Xposed \u7684\u8FD9\u79CD\u8FD0\u884C\u65B9\u5F0F\u88AB\u79F0\u4E3A\u5BC4\u751F\uFF0CXposed \u6A21\u5757\u8DDF\u968F\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\uFF0C\u5728\u5BBF\u4E3B\u7684\u751F\u547D\u5468\u671F\u5185\u5B8C\u6210\u81EA\u5DF1\u7684\u751F\u547D\u5386\u7A0B\u3002

    \u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7\u53CD\u5C04\u7684\u65B9\u5F0F\u8C03\u7528\u5BBF\u4E3B\u7684\u65B9\u6CD5\u3001\u53D8\u91CF\u3001\u6784\u9020\u65B9\u6CD5\uFF0C\u4EE5\u53CA\u4F7F\u7528 XposedBridge \u6240\u63D0\u4F9B\u7684 Hook \u64CD\u4F5C\u52A8\u6001\u5730\u5728\u5BBF\u4E3B (APP) \u8981\u6267\u884C\u7684\u65B9\u6CD5\u524D\u540E\u63D2\u5165\u81EA\u5DF1\u7684\u4EE3\u7801\uFF0C\u6216\u5B8C\u5168\u66FF\u6362\u76EE\u6807\uFF0C\u751A\u81F3\u662F\u62E6\u622A\u3002

    \u53D1\u5C55\u8FC7\u7A0B

    \u5982\u4ECA\u7684 Xposed \u7BA1\u7406\u5668\u5DF2\u5B8C\u5168\u88AB\u5176\u884D\u751F\u4F5C\u54C1\u66FF\u4EE3\uFF0C\u800C SuperSU \u7684\u65F6\u4EE3\u4E5F\u5DF2\u7ECF\u843D\u5E55\u4E86\uFF0C\u73B0\u5728\uFF0C\u501F\u52A9 Magisk \u4F7F\u540E\u9762\u7684\u4E00\u5207\u53C8\u6210\u4E3A\u4E86\u53EF\u80FD\u3002

    \u5176\u53D1\u5C55\u53F2\u5927\u81F4\u53EF\u5206\u4E3A Xposed(Dalvik) \u2192 Xposed(ART) \u2192 Xposed(Magisk) \u2192 EdXposed(Riru)/LSPosed(Riru/Zygisk)

    \u884D\u751F\u4EA7\u54C1

    \u4E0B\u65B9\u7684\u7ED3\u6784\u63CF\u8FF0\u4E86\u7C7B\u4F3C Xposed \u7684 Hook Framework \u7684\u5DE5\u4F5C\u65B9\u5F0F\u548C\u539F\u7406\u3002

    App's Environment
    -\u2514\u2500\u2500 Hook Framework
    -    \u2514\u2500\u2500 Hooker (Hooked)
    -        ...
    -

    \u901A\u8FC7 Xposed \u7684\u8FD0\u884C\u539F\u7406\uFF0C\u4ECE\u800C\u884D\u751F\u4E86\u5F88\u591A\u540C\u7C7B\u578B\u6846\u67B6\uFF0C\u968F\u7740\u5F53\u4ECA\u65F6\u4EE3\u7684\u79FB\u52A8\u8BBE\u5907\u83B7\u53D6 Root \u6743\u9650\u751A\u81F3\u5237\u673A\u8D8A\u6765\u8D8A\u56F0\u96BE\u4E14\u4E0D\u662F\u521A\u9700\u7684\u65F6\u5019\uFF0C\u4E00\u4E9B\u514D Root \u6846\u67B6\u4E5F\u968F\u4E4B\u4EA7\u751F\uFF0C\u4F8B\u5982\u592A\u6781\u3002

    \u8FD9\u4E9B\u5728 ART \u5C42\u9762\u4E0A\u7684 Hook \u6846\u67B6\u540C\u6837\u4E5F\u53EF\u4E0D\u501F\u52A9 Xposed API \u5B8C\u6210\u5176\u548C Xposed \u539F\u7406\u4E00\u6837\u7684 Hook \u6D41\u7A0B\uFF0C\u514D Root \u7684\u8FD0\u884C\u539F\u7406\u4E3A\u4FEE\u6539 APK \u5E76\u5C06 Hook \u8FDB\u7A0B\u6CE8\u5165\u5BBF\u4E3B\uFF0C\u901A\u8FC7\u5916\u90E8\u6A21\u5757\u5BF9\u5176\u8FDB\u884C\u63A7\u5236\u3002

    \u53E6\u5916\u4E00\u79CD\u4EA7\u54C1\u5C31\u662F\u5229\u7528 Android \u8FD0\u884C\u73AF\u5883\u73B0\u6709\u7684\u529F\u80FD\u865A\u62DF\u51FA\u4E00\u4E2A\u5B8C\u5168\u4E0E\u5F53\u524D\u8BBE\u5907\u7CFB\u7EDF\u4E00\u6837\u7684\u73AF\u5883\uFF0C\u5E76\u5728\u5176\u4E2D\u8FD0\u884C APP\uFF0C\u8FD9\u4E2A\u5C31\u662F\u865A\u62DF APP \u6280\u672F VirtualApp\uFF0C\u540E\u6765\u884D\u751F\u4E3A VirtualXposed\u3002

    \u4E0A\u8FF0\u63D0\u5230\u7684\u514D Root \u6846\u67B6\u5206\u522B\u4E3A\u592A\u6781/\u65E0\u6781\u3001VirtualXposed/SandVXposed\u3002

    YukiHookAPI \u505A\u4E86\u4EC0\u4E48

    \u81EA\u4ECE Xposed \u51FA\u73B0\u5230\u73B0\u5728\u4E3A\u6B62\uFF0C\u9664\u4E86\u5F00\u53D1\u8005\u4EBA\u4EBA\u7686\u77E5\u7684 XposedHelpers\uFF0C\u4F9D\u7136\u6CA1\u6709\u4E00\u5957\u9488\u5BF9 Kotlin \u6253\u9020\u7684\u8BED\u6CD5\u7CD6\u4EE5\u53CA\u7528\u6CD5\u5C01\u88C5\u5341\u5206\u5B8C\u5584\u7684 API\u3002

    \u672C API \u6846\u67B6\u7684\u8BDE\u751F\u5C31\u662F\u5E0C\u671B\u5728 Xposed \u7684\u5982\u4ECA\u65F6\u4EE3\uFF0C\u80FD\u8BA9\u66F4\u591A\u6709\u52A8\u624B\u80FD\u529B\u7684 Xposed \u6A21\u5757\u5F00\u53D1\u8005\u5C11\u8D70\u5F2F\u8DEF\uFF0C\u66F4\u5BB9\u6613\u3001\u66F4\u7B80\u5355\u5730\u5B8C\u6210\u6574\u4E2A\u5F00\u53D1\u6D41\u7A0B\u3002

    \u672A\u6765\uFF0CYukiHookAPI \u5C06\u5728\u4F7F\u7528 Xposed API \u7684\u76EE\u6807\u57FA\u7840\u4E0A\u9002\u914D\u66F4\u591A\u7B2C\u4E09\u65B9 Hook \u6846\u67B6\uFF0C\u4F7F\u5F97\u6574\u4E2A\u751F\u6001\u5F97\u5230\u5B8C\u5584\uFF0C\u5E76\u5E2E\u52A9\u66F4\u591A\u5F00\u53D1\u8005\u8BA9 Xposed \u6A21\u5757\u5F00\u53D1\u53D8\u5F97\u66F4\u52A0\u7B80\u5355\u548C\u6613\u61C2\u3002

    \u8BA9\u6211\u4EEC\u5F00\u59CB\u5427

    \u5728\u5F00\u59CB\u4E4B\u524D\uFF0C\u4F60\u9700\u8981\u62E5\u6709\u4EE5\u4E0B\u57FA\u7840\u624D\u80FD\u66F4\u597D\u5730\u4F7F\u7528 YukiHookAPI\u3002

    `,30),i=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u4E86\u89E3 Android \u5F00\u53D1\u53CA\u7B80\u5355\u7684\u7CFB\u7EDF\u8FD0\u884C\u539F\u7406")],-1),h=e("\u638C\u63E1\u5E76\u4E86\u89E3 Android APK \u5185\u90E8\u7ED3\u6784\u4EE5\u53CA\u7B80\u5355\u7684\u53CD\u7F16\u8BD1\u77E5\u8BC6\u8981\u9886\uFF0C\u53EF\u53C2\u8003 "),k={href:"https://github.com/skylot/jadx",target:"_blank",rel:"noopener noreferrer"},_=e("Jadx"),u=e(" \u4E0E "),g={href:"https://github.com/iBotPeaches/Apktool",target:"_blank",rel:"noopener noreferrer"},b=e("ApkTool"),A=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u719F\u7EC3\u4F7F\u7528 Java \u53CD\u5C04\uFF0C\u4E86\u89E3\u7B80\u5355\u7684 Smali \u8BED\u6CD5\uFF0C\u4E86\u89E3 DEX \u6587\u4EF6\u7ED3\u6784\uFF0C\u4F1A\u4F7F\u7528\u9006\u5411\u5206\u6790\u5B9A\u4F4D\u65B9\u6CD5\u4F4D\u7F6E")],-1),X=e("\u638C\u63E1\u57FA\u7840\u7684\u539F\u751F "),x={href:"https://api.xposed.info",target:"_blank",rel:"noopener noreferrer"},f=e("Xposed API"),P=e(" \u7528\u6CD5\uFF0C\u4E86\u89E3 Xposed \u7684\u8FD0\u884C\u539F\u7406\uFF0C\u53EF\u53C2\u8003\u672C\u6587\u4EE5\u53CA "),E={href:"https://blog.ketal.icu/cn/Xposed%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/",target:"_blank",rel:"noopener noreferrer"},m=e("\u8FD9\u91CC"),y=e(),H=o("strong",null,"(\u53CB\u60C5\u94FE\u63A5)",-1),v=e("\u638C\u63E1 Kotlin \u8BED\u8A00\uFF0C\u5B66\u4F1A\u7075\u6D3B\u8FD0\u7528 "),q={href:"https://blog.ketal.icu/cn/kotlin-lambda%E5%85%A5%E9%97%A8/",target:"_blank",rel:"noopener noreferrer"},I=e("Kotlin lambda"),B=e(),K=o("strong",null,"(\u53CB\u60C5\u94FE\u63A5)",-1),R=o("li",null,[o("p",null,"\u638C\u63E1\u5E76\u4E86\u89E3 Kotlin \u4E0E Java \u6DF7\u7F16\u3001\u4E92\u76F8\u8C03\u7528\u4EE5\u53CA Kotlin \u751F\u6210\u7684 Java \u5B57\u8282\u7801")],-1);function V(w,F){const s=t("ExternalLinkIcon");return r(),p("div",null,[c,o("ul",null,[i,o("li",null,[o("p",null,[h,o("a",k,[_,n(s)]),u,o("a",g,[b,n(s)])])]),A,o("li",null,[o("p",null,[X,o("a",x,[f,n(s)]),P,o("a",E,[m,n(s)]),y,H])]),o("li",null,[o("p",null,[v,o("a",q,[I,n(s)]),B,K])]),R])])}const D=a(d,[["render",V],["__file","knowledge.html.vue"]]);export{D as default}; diff --git a/docs/assets/knowledge.html.1352f5de.js b/docs/assets/knowledge.html.830e8c66.js similarity index 90% rename from docs/assets/knowledge.html.1352f5de.js rename to docs/assets/knowledge.html.830e8c66.js index b1cc839b1..88ef12120 100644 --- a/docs/assets/knowledge.html.1352f5de.js +++ b/docs/assets/knowledge.html.830e8c66.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-b4f1a468","path":"/zh-cn/guide/knowledge.html","title":"\u57FA\u7840\u77E5\u8BC6","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u76F8\u5173\u4ECB\u7ECD","slug":"\u76F8\u5173\u4ECB\u7ECD","link":"#\u76F8\u5173\u4ECB\u7ECD","children":[{"level":3,"title":"Xposed \u662F\u4EC0\u4E48","slug":"xposed-\u662F\u4EC0\u4E48","link":"#xposed-\u662F\u4EC0\u4E48","children":[]},{"level":3,"title":"Xposed \u80FD\u505A\u4EC0\u4E48","slug":"xposed-\u80FD\u505A\u4EC0\u4E48","link":"#xposed-\u80FD\u505A\u4EC0\u4E48","children":[]},{"level":3,"title":"\u53D1\u5C55\u8FC7\u7A0B","slug":"\u53D1\u5C55\u8FC7\u7A0B","link":"#\u53D1\u5C55\u8FC7\u7A0B","children":[]},{"level":3,"title":"\u884D\u751F\u4EA7\u54C1","slug":"\u884D\u751F\u4EA7\u54C1","link":"#\u884D\u751F\u4EA7\u54C1","children":[]},{"level":3,"title":"YukiHookAPI \u505A\u4E86\u4EC0\u4E48","slug":"yukihookapi-\u505A\u4E86\u4EC0\u4E48","link":"#yukihookapi-\u505A\u4E86\u4EC0\u4E48","children":[]}]},{"level":2,"title":"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","slug":"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","link":"#\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","children":[]}],"git":{"updatedTime":1664361931000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/guide/knowledge.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-b4f1a468","path":"/zh-cn/guide/knowledge.html","title":"\u57FA\u7840\u77E5\u8BC6","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u76F8\u5173\u4ECB\u7ECD","slug":"\u76F8\u5173\u4ECB\u7ECD","link":"#\u76F8\u5173\u4ECB\u7ECD","children":[{"level":3,"title":"Xposed \u662F\u4EC0\u4E48","slug":"xposed-\u662F\u4EC0\u4E48","link":"#xposed-\u662F\u4EC0\u4E48","children":[]},{"level":3,"title":"Xposed \u80FD\u505A\u4EC0\u4E48","slug":"xposed-\u80FD\u505A\u4EC0\u4E48","link":"#xposed-\u80FD\u505A\u4EC0\u4E48","children":[]},{"level":3,"title":"\u53D1\u5C55\u8FC7\u7A0B","slug":"\u53D1\u5C55\u8FC7\u7A0B","link":"#\u53D1\u5C55\u8FC7\u7A0B","children":[]},{"level":3,"title":"\u884D\u751F\u4EA7\u54C1","slug":"\u884D\u751F\u4EA7\u54C1","link":"#\u884D\u751F\u4EA7\u54C1","children":[]},{"level":3,"title":"YukiHookAPI \u505A\u4E86\u4EC0\u4E48","slug":"yukihookapi-\u505A\u4E86\u4EC0\u4E48","link":"#yukihookapi-\u505A\u4E86\u4EC0\u4E48","children":[]}]},{"level":2,"title":"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","slug":"\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","link":"#\u8BA9\u6211\u4EEC\u5F00\u59CB\u5427","children":[]}],"git":{"updatedTime":1673547665000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/guide/knowledge.md"}');export{e as data}; diff --git a/docs/assets/knowledge.html.9d79bd88.js b/docs/assets/knowledge.html.9d79bd88.js new file mode 100644 index 000000000..a48baf320 --- /dev/null +++ b/docs/assets/knowledge.html.9d79bd88.js @@ -0,0 +1,13 @@ +import{_ as a,r,o as i,c as d,b as e,d as s,a as n,e as o}from"./app.6074a838.js";const l={},p=n(`

    Basic Knowledge

    Here is a collection of Xposed-related introductions and the key points of knowledge that need to be grasped before start.

    Anyone who already knows can skip it.

    The basic knowledge content not necessarily completely accurate, please read it according to your own opinion.

    If you find any errors in this page, please correct it and help us improve.

    Here's an introduction to Xposed and how Hooks work.

    What is Xposed

    Xposed Framework is a set of open source framework services that run in Android high-privilege mode. It can affect program operation (modify the system) without modifying the APK file. Based on it, many Powerful modules that operate simultaneously without conflicting functions.

    The above content is copied from Baidu Encyclopedia.

    What can Xposed do

    The structure below describes the basic workings and principles of Xposed.

    Xposed Framework
    +\u2514\u2500\u2500 App's Environment
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +    App's Environment
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +    ...
    +

    We can achieve the ultimate goal of controlling its behavior by injecting the Host (App) when the Host (App) is running.

    This mode of operation of Xposed is called parasitism. The Xposed Module follows the lifecycle of the host and completes its own life course within the lifecycle of the Host.

    We can call the Host's methods, fields, and constructors through reflection, and use the Hook operation provided by XposedBridge to dynamically insert our own code before and after the method to be executed by the Host (App), or completely replace the target, or even intercept.

    Development Process

    Today's Xposed Manager has been completely replaced by its derivative works, and the era of SuperSU has ended, and now, with Magisk, everything behind is possible again.

    Its development history can be roughly divided into Xposed(Dalvik) \u2192 Xposed(ART) \u2192 Xposed(Magisk) \u2192 EdXposed(Riru)/LSPosed(Riru/ Zygisk)

    Derivatives

    The structure below describes how and how the Xposed-like Hook Framework works.

    App's Environment
    +\u2514\u2500\u2500 Hook Framework
    +    \u2514\u2500\u2500 Hooker (Hooked)
    +        ...
    +

    Through the operation principle of Xposed, many frameworks of the same type have been derived. As mobile devices in today's era are more and more difficult to obtain Root permissions or even flash, and when they are not just needed, some Root-free frameworks are also produced, such as LSPatch\u3001TaiChi.

    These Hook Frameworks at the ART level can also complete the Hook process with the same principle as Xposed without using the Xposed API. The operating principle of Root-free is to modify the APK and inject the Hook process into the Host, and control it through external modules.

    Another product is to use the existing functions of the Android operating environment to virtualize an environment that is completely the same as the current device system, and run App in it. This is the virtual App technology VirtualApp, which was later derived as VirtualXposed .

    `,24),c=o("The Root-free frameworks mentioned above are "),h={href:"https://github.com/LSPosed/LSPatch",target:"_blank",rel:"noopener noreferrer"},u=o("LSPatch"),g=o("\u3001"),f={href:"https://taichi.cool/",target:"_blank",rel:"noopener noreferrer"},m=o("TaiChi"),k=o("\u3001"),_={href:"https://github.com/asLody/VirtualApp",target:"_blank",rel:"noopener noreferrer"},b=o("VirtualApp"),y=o("\u3001"),v={href:"https://github.com/asLody/SandVXposed",target:"_blank",rel:"noopener noreferrer"},w=o("SandVXposed"),A=o("."),x=n('

    What YukiHookAPI does

    Since Xposed appeared until now, apart from XposedHelpers, which is well known to developers, there is still no set of syntactic sugar for Kotlin and API with complete usage encapsulation.

    The birth of this API framework is to hope that in the current era of Xposed, more capable Xposed Module developers can avoid detours and complete the entire development process more easily and simply.

    In the future, YukiHookAPI will adapt to more third-party Hook Frameworks based on the goal of using the Xposed API, so as to improve the entire ecosystem and help more developers make Xposed Module development simpler and easier to understand.

    Let's Started

    Before starting, you need to have the following basics to better use YukiHookAPI.

    ',6),X=e("li",null,[e("p",null,"Grasp and understand Android development and simple system operation principles")],-1),H=o("To grasp and understand the internal structure of Android APK and simple decompilation knowledge, you can refer to "),T={href:"https://github.com/skylot/jadx",target:"_blank",rel:"noopener noreferrer"},E=o("Jadx"),P=o(" and "),I={href:"https://github.com/iBotPeaches/Apktool",target:"_blank",rel:"noopener noreferrer"},B=o("ApkTool"),S=e("li",null,[e("p",null,"Grasp and proficient in using Java reflection, understand simple Smali syntax, understand Dex file structure, and use reverse analysis to locate method locations")],-1),q=o("Grasp the basic native "),L={href:"https://api.xposed.info",target:"_blank",rel:"noopener noreferrer"},V=o("Xposed API"),F=o(" usage, understand the operation principle of Xposed, see "),K={href:"https://blog.ketal.icu/en/Xposed%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/",target:"_blank",rel:"noopener noreferrer"},R=o("here"),D=o(),M=e("strong",null,"(Friend Link)",-1),G=e("li",null,[e("p",null,[o("Grasp Kotlin language and learn to use "),e("strong",null,"Kotlin lambda")])],-1),W=e("li",null,[e("p",null,"Grasp and understand Kotlin and Java mixing, calling each other, and Java bytecode generated by Kotlin")],-1);function j(C,J){const t=r("ExternalLinkIcon");return i(),d("div",null,[p,e("p",null,[c,e("a",h,[u,s(t)]),g,e("a",f,[m,s(t)]),k,e("a",_,[b,s(t)]),y,e("a",v,[w,s(t)]),A]),x,e("ul",null,[X,e("li",null,[e("p",null,[H,e("a",T,[E,s(t)]),P,e("a",I,[B,s(t)])])]),S,e("li",null,[e("p",null,[q,e("a",L,[V,s(t)]),F,e("a",K,[R,s(t)]),D,M])]),G,W])])}const Y=a(l,[["render",j],["__file","knowledge.html.vue"]]);export{Y as default}; diff --git a/docs/assets/logger.html.6370ce77.js b/docs/assets/logger.html.0cf87819.js similarity index 66% rename from docs/assets/logger.html.6370ce77.js rename to docs/assets/logger.html.0cf87819.js index 8e7b819fb..55676bf85 100644 --- a/docs/assets/logger.html.6370ce77.js +++ b/docs/assets/logger.html.0cf87819.js @@ -1,8 +1,8 @@ -import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

    Debug Logs

    Log is the most important part of the debugging process, YukiHookAPI encapsulates a set of stable and efficient debugging log functions for developers.

    Normal Logs

    You can call loggerD, loggerI, loggerW to print normal logs to the console.

    The usage method is as follows.

    The following example

    loggerD(msg = "This is a log")
    -

    At this point, YukiHookAPI will call android.util.Log and XposedBridge.log to print this log at the same time.

    The default TAG of the log is the value you set in YukiHookLogger.Configs.tag.

    You can also customize this value dynamically, but it is not recommended to modify TAG easily to prevent logs from being filtered.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
    +import{_ as s,o as e,c as o,a}from"./app.6074a838.js";const n={},l=a(`

    Debug Logs

    Log is the most important part of the debugging process, YukiHookAPI encapsulates a set of stable and efficient debugging log functions for developers.

    Normal Logs

    You can call loggerD, loggerI, loggerW to print normal logs to the console.

    The usage method is as follows.

    The following example

    loggerD(msg = "This is a log")
    +

    At this ponit, YukiHookAPI will call android.util.Log and log function in (Xposed) Host environment to print this log at the same time.

    The default TAG of the log is the value you set in YukiHookLogger.Configs.tag.

    You can also customize this value dynamically, but it is not recommended to modify TAG easily to prevent logs from being filtered.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
     

    The printed result is as shown below.

    The following example

    [YukiHookAPI][D][host package name]--> This is a log
    -

    You can also use LoggerType to customize the type of log printing.

    You can choose to use android.util.Log or XposedBridge.log to print logs.

    The default type is LoggerType.BOTH, which means that both methods are used to print logs.

    For example we only use android.util.Log to print logs.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    -

    Or just use XposedBridge.log to print the log, this method can only be used in the (Xposed) Host environment.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE)
    +

    You can also use LoggerType to customize the type of log printing.

    You can choose to use android.util.Log or the log function in the (Xposed) Host environment to print logs.

    The default type is LoggerType.BOTH, which means that both methods are used to print logs.

    For example we only use android.util.Log to print logs.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    +

    Or just use XposedBridge.log to print the log, this method can only be used in the (Xposed) Host environment.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSED_ENVIRONMENT)
     

    If you want to intelligently distinguish the (Xposed) Host environment from the Module environment, you can write it in the following form.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE)
     

    In this way, the API will intelligently select the specified method type to print this log in different environments.

    Tips

    For more functions, please refer to loggerD, loggerI and loggerW methods.

    Error Logs

    You can call loggerE to print E level logs to the console.

    The usage method is as follows.

    The following example

    loggerE(msg = "This is an error")
     

    The error log is the highest level, regardless of whether you have filtered only E level logs.

    For error-level logging, you can also append an exception stack.

    // Assume this is the exception that was thrown
    @@ -32,11 +32,20 @@ import{_ as s,o as e,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

    it.throwable // Get exception // ... } -

    The above features require YukiHookLogger.Configs.isRecord to be enabled.

    Pay Attention

    The obtained log data is isolated from each other in the Host App and the Module App's process.

    You can only get the corresponding log data in the corresponding process.

    If you need to get these log data in real time anywhere, please refer to Xposed Module and Host Channel, Register Module App's Activity.

    If you only want to get log data in real time through Module App or Host App, Please refer to the optional solution YukiHookDataChannel.obtainLoggerInMemoryData method.

    You can also use YukiHookLogger.Configs.elements to customize the elements that debug logs display externally.

    This function requires YukiHookAPI.Configs to be configured in onInit of the Hook entry class.

    The following example

    override fun onInit() = configs {
    +

    If you want to format or save the obtained custom log data to a file, you only need to use the following method.

    The following example

    // Assume this is the custom log data you get
    +val data: ArrayList<YukiLoggerData>
    +// Format log data to String
    +val dataString = YukiHookLogger.contents(data)
    +// Save log data to file
    +// Please note
    +// The saved file path must have read and write permissions
    +// Otherwise an exception will be thrown
    +YukiHookLogger.saveToFile("/sdcard/Documents/debug_log.log", data)
    +

    Pay Attention

    You need to enable YukiHookLogger.Configs.isRecord to get the contents of YukiHookLogger.inMemoryData.

    The obtained log data is isolated from each other in the Host App and the Module App's process.

    You can only get the corresponding log data in the corresponding process.

    If you need to get these log data in real time anywhere, please refer to Xposed Module and Host Channel, Register Module App's Activity.

    If you only want to get log data in real time through Module App or Host App, Please refer to the optional solution YukiHookDataChannel.obtainLoggerInMemoryData method.

    You can also use YukiHookLogger.Configs.elements to customize the elements that debug logs display externally.

    This function requires YukiHookAPI.Configs to be configured in onInit of the Hook entry class.

    The following example

    override fun onInit() = configs {
         debugLog {
             // ...
             elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
         }
         // ...
     }
    -
    `,62),p=[l];function t(i,c){return e(),o("div",null,p)}const d=s(n,[["render",t],["__file","logger.html.vue"]]);export{d as default}; +
    `,64),t=[l];function p(i,c){return e(),o("div",null,t)}const d=s(n,[["render",p],["__file","logger.html.vue"]]);export{d as default}; diff --git a/docs/assets/logger.html.9fbe7076.js b/docs/assets/logger.html.6a9600dc.js similarity index 61% rename from docs/assets/logger.html.9fbe7076.js rename to docs/assets/logger.html.6a9600dc.js index 8aa38aedf..933cef398 100644 --- a/docs/assets/logger.html.9fbe7076.js +++ b/docs/assets/logger.html.6a9600dc.js @@ -1,8 +1,8 @@ -import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    \u8C03\u8BD5\u65E5\u5FD7

    \u65E5\u5FD7\u662F\u8C03\u8BD5\u8FC7\u7A0B\u6700\u91CD\u8981\u7684\u4E00\u73AF\uFF0CYukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u4E00\u5957\u7A33\u5B9A\u9AD8\u6548\u7684\u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\u3002

    \u666E\u901A\u65E5\u5FD7

    \u4F60\u53EF\u4EE5\u8C03\u7528 loggerD\u3001loggerI\u3001loggerW \u6765\u5411\u63A7\u5236\u53F0\u6253\u5370\u666E\u901A\u65E5\u5FD7\u3002

    \u4F7F\u7528\u65B9\u6CD5\u5982\u4E0B\u6240\u793A\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(msg = "This is a log")
    -

    \u6B64\u65F6\uFF0CYukiHookAPI \u4F1A\u8C03\u7528 android.util.Log \u4E0E XposedBridge.log \u540C\u65F6\u6253\u5370\u8FD9\u6761\u65E5\u5FD7\u3002

    \u65E5\u5FD7\u9ED8\u8BA4\u7684 TAG \u4E3A\u4F60\u5728 YukiHookLogger.Configs.tag \u4E2D\u8BBE\u7F6E\u7684\u503C\u3002

    \u4F60\u4E5F\u53EF\u4EE5\u52A8\u6001\u81EA\u5B9A\u4E49\u8FD9\u4E2A\u503C\uFF0C\u4F46\u662F\u4E0D\u5EFA\u8BAE\u8F7B\u6613\u4FEE\u6539 TAG \u9632\u6B62\u8FC7\u6EE4\u4E0D\u5230\u65E5\u5FD7\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
    +import{_ as s,o as a,c as o,a as n}from"./app.6074a838.js";const e={},l=n(`

    \u8C03\u8BD5\u65E5\u5FD7

    \u65E5\u5FD7\u662F\u8C03\u8BD5\u8FC7\u7A0B\u6700\u91CD\u8981\u7684\u4E00\u73AF\uFF0CYukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u4E00\u5957\u7A33\u5B9A\u9AD8\u6548\u7684\u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\u3002

    \u666E\u901A\u65E5\u5FD7

    \u4F60\u53EF\u4EE5\u8C03\u7528 loggerD\u3001loggerI\u3001loggerW \u6765\u5411\u63A7\u5236\u53F0\u6253\u5370\u666E\u901A\u65E5\u5FD7\u3002

    \u4F7F\u7528\u65B9\u6CD5\u5982\u4E0B\u6240\u793A\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(msg = "This is a log")
    +

    \u6B64\u65F6\uFF0CYukiHookAPI \u4F1A\u8C03\u7528 android.util.Log \u4E0E (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u7684\u65E5\u5FD7\u529F\u80FD\u540C\u65F6\u6253\u5370\u8FD9\u6761\u65E5\u5FD7\u3002

    \u65E5\u5FD7\u9ED8\u8BA4\u7684 TAG \u4E3A\u4F60\u5728 YukiHookLogger.Configs.tag \u4E2D\u8BBE\u7F6E\u7684\u503C\u3002

    \u4F60\u4E5F\u53EF\u4EE5\u52A8\u6001\u81EA\u5B9A\u4E49\u8FD9\u4E2A\u503C\uFF0C\u4F46\u662F\u4E0D\u5EFA\u8BAE\u8F7B\u6613\u4FEE\u6539 TAG \u9632\u6B62\u8FC7\u6EE4\u4E0D\u5230\u65E5\u5FD7\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
     

    \u6253\u5370\u7684\u7ED3\u679C\u4E3A\u5982\u4E0B\u6240\u793A\u3002

    \u793A\u4F8B\u5982\u4E0B

    [YukiHookAPI][D][\u5BBF\u4E3B\u5305\u540D]--> This is a log
    -

    \u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 LoggerType \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370\u7684\u7C7B\u578B\uFF0C\u53EF\u9009\u62E9\u4F7F\u7528 android.util.Log \u8FD8\u662F XposedBridge.log \u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u9ED8\u8BA4\u7C7B\u578B\u4E3A LoggerType.BOTH\uFF0C\u542B\u4E49\u4E3A\u540C\u65F6\u4F7F\u7528\u8FD9\u4E24\u4E2A\u65B9\u6CD5\u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u6BD4\u5982\u6211\u4EEC\u4EC5\u4F7F\u7528 android.util.Log \u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    -

    \u6216\u53C8\u4EC5\u4F7F\u7528 XposedBridge.log \u6765\u6253\u5370\u65E5\u5FD7\uFF0C\u6B64\u65B9\u6CD5\u4EC5\u53EF\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE)
    +

    \u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 LoggerType \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370\u7684\u7C7B\u578B\uFF0C\u53EF\u9009\u62E9\u4F7F\u7528 android.util.Log \u8FD8\u662F (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E2D\u7684\u65E5\u5FD7\u529F\u80FD\u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u9ED8\u8BA4\u7C7B\u578B\u4E3A LoggerType.BOTH\uFF0C\u542B\u4E49\u4E3A\u540C\u65F6\u4F7F\u7528\u8FD9\u4E24\u4E2A\u65B9\u6CD5\u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u6BD4\u5982\u6211\u4EEC\u4EC5\u4F7F\u7528 android.util.Log \u6765\u6253\u5370\u65E5\u5FD7\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    +

    \u6216\u53C8\u4EC5\u4F7F\u7528 XposedBridge.log \u6765\u6253\u5370\u65E5\u5FD7\uFF0C\u6B64\u65B9\u6CD5\u4EC5\u53EF\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSED_ENVIRONMENT)
     

    \u82E5\u4F60\u60F3\u667A\u80FD\u533A\u5206 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0E\u6A21\u5757\u73AF\u5883\uFF0C\u53EF\u4EE5\u5199\u4E3A\u5982\u4E0B\u5F62\u5F0F\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE)
     

    \u8FD9\u6837 API \u5C31\u4F1A\u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u6307\u5B9A\u7684\u65B9\u6CD5\u7C7B\u578B\u53BB\u6253\u5370\u8FD9\u6761\u65E5\u5FD7\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 loggerD\u3001loggerI \u53CA loggerW \u65B9\u6CD5\u3002

    \u9519\u8BEF\u65E5\u5FD7

    \u4F60\u53EF\u4EE5\u8C03\u7528 loggerE \u6765\u5411\u63A7\u5236\u53F0\u6253\u5370 E \u7EA7\u522B\u7684\u65E5\u5FD7\u3002

    \u4F7F\u7528\u65B9\u6CD5\u5982\u4E0B\u6240\u793A\u3002

    \u793A\u4F8B\u5982\u4E0B

    loggerE(msg = "This is an error")
     

    \u9519\u8BEF\u65E5\u5FD7\u7684\u7EA7\u522B\u662F\u6700\u9AD8\u7684\uFF0C\u65E0\u8BBA\u4F60\u6709\u6CA1\u6709\u8FC7\u6EE4\u4EC5\u4E3A E \u7EA7\u522B\u7684\u65E5\u5FD7\u3002

    \u5BF9\u4E8E\u9519\u8BEF\u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u5728\u540E\u9762\u52A0\u4E0A\u4E00\u4E2A\u5F02\u5E38\u5806\u6808\u3002

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u88AB\u629B\u51FA\u7684\u5F02\u5E38
    @@ -30,11 +30,18 @@ import{_ as s,o,c as a,a as e}from"./app.99fcdd51.js";const n={},l=e(`

    it.throwable // \u83B7\u53D6\u5F02\u5E38 // ... } -

    \u4EE5\u4E0A\u529F\u80FD\u9700\u8981\u542F\u7528 YukiHookLogger.Configs.isRecord\u3002

    \u7279\u522B\u6CE8\u610F

    \u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

    \u4F60\u53EA\u80FD\u5728\u5BF9\u5E94\u7684\u8FDB\u7A0B\u4E2D\u83B7\u53D6\u5BF9\u5E94\u7684\u65E5\u5FD7\u6570\u636E\uFF0C\u5982\u679C\u4F60\u9700\u8981\u5728\u4EFB\u4F55\u5730\u65B9\u5B9E\u65F6\u5F97\u5230\u8FD9\u4E9B\u65E5\u5FD7\u6570\u636E\uFF0C\u8BF7\u53C2\u8003 Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865\u3001\u6CE8\u518C\u6A21\u5757 Activity\u3002

    \u5982\u679C\u4F60\u53EA\u60F3\u901A\u8FC7\u6A21\u5757\u6216\u5BBF\u4E3B\u6765\u5B9E\u65F6\u5F97\u5230\u65E5\u5FD7\u6570\u636E\uFF0C\u8BF7\u53C2\u8003\u53EF\u9009\u65B9\u6848 YukiHookDataChannel.obtainLoggerInMemoryData \u65B9\u6CD5\u3002

    \u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 YukiHookLogger.Configs.elements \u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

    \u6B64\u529F\u80FD\u9700\u8981\u5728 Hook \u5165\u53E3\u7C7B\u7684 onInit \u4E2D\u5BF9 YukiHookAPI.Configs \u8FDB\u884C\u914D\u7F6E\u3002

    \u793A\u4F8B\u5982\u4E0B

    override fun onInit() = configs {
    +

    \u5982\u679C\u4F60\u60F3\u5BF9\u5F97\u5230\u7684\u81EA\u5B9A\u4E49\u65E5\u5FD7\u6570\u636E\u8FDB\u884C\u683C\u5F0F\u5316\u6216\u4FDD\u5B58\u5230\u6587\u4EF6\uFF0C\u4F60\u53EA\u9700\u8981\u4F7F\u7528\u5982\u4E0B\u65B9\u6CD5\u5373\u53EF\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u4F60\u5F97\u5230\u7684\u81EA\u5B9A\u4E49\u65E5\u5FD7\u6570\u636E
    +val data: ArrayList<YukiLoggerData>
    +// \u683C\u5F0F\u5316\u65E5\u5FD7\u6570\u636E\u5230\u5B57\u7B26\u4E32
    +val dataString = YukiHookLogger.contents(data)
    +// \u4FDD\u5B58\u65E5\u5FD7\u6570\u636E\u5230\u6587\u4EF6
    +// \u8BF7\u6CE8\u610F\u4FDD\u5B58\u7684\u6587\u4EF6\u8DEF\u5F84\u5FC5\u987B\u62E5\u6709\u8BFB\u5199\u6743\u9650\uFF0C\u5426\u5219\u4F1A\u629B\u51FA\u5F02\u5E38
    +YukiHookLogger.saveToFile("/sdcard/Documents/debug_log.log", data)
    +

    \u7279\u522B\u6CE8\u610F

    \u4F60\u9700\u8981\u542F\u7528 YukiHookLogger.Configs.isRecord \u624D\u80FD\u83B7\u53D6\u5230 YukiHookLogger.inMemoryData \u7684\u5185\u5BB9\u3002

    \u83B7\u53D6\u5230\u7684\u65E5\u5FD7\u6570\u636E\u5728 Hook APP (\u5BBF\u4E3B) \u53CA\u6A21\u5757\u8FDB\u7A0B\u4E2D\u662F\u76F8\u4E92\u9694\u79BB\u7684\u3002

    \u4F60\u53EA\u80FD\u5728\u5BF9\u5E94\u7684\u8FDB\u7A0B\u4E2D\u83B7\u53D6\u5BF9\u5E94\u7684\u65E5\u5FD7\u6570\u636E\uFF0C\u5982\u679C\u4F60\u9700\u8981\u5728\u4EFB\u4F55\u5730\u65B9\u5B9E\u65F6\u5F97\u5230\u8FD9\u4E9B\u65E5\u5FD7\u6570\u636E\uFF0C\u8BF7\u53C2\u8003 Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865\u3001\u6CE8\u518C\u6A21\u5757 Activity\u3002

    \u5982\u679C\u4F60\u53EA\u60F3\u901A\u8FC7\u6A21\u5757\u6216\u5BBF\u4E3B\u6765\u5B9E\u65F6\u5F97\u5230\u65E5\u5FD7\u6570\u636E\uFF0C\u8BF7\u53C2\u8003\u53EF\u9009\u65B9\u6848 YukiHookDataChannel.obtainLoggerInMemoryData \u65B9\u6CD5\u3002

    \u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 YukiHookLogger.Configs.elements \u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002

    \u6B64\u529F\u80FD\u9700\u8981\u5728 Hook \u5165\u53E3\u7C7B\u7684 onInit \u4E2D\u5BF9 YukiHookAPI.Configs \u8FDB\u884C\u914D\u7F6E\u3002

    \u793A\u4F8B\u5982\u4E0B

    override fun onInit() = configs {
         debugLog {
             // ...
             elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
         }
         // ...
     }
    -

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookLogger.inMemoryData\u3001YukiHookLogger.contents\u3001YukiHookLogger.saveToFile \u65B9\u6CD5\u4EE5\u53CA YukiHookLogger.Configs\u3002

    `,61),p=[l];function c(i,r){return o(),a("div",null,p)}const d=s(n,[["render",c],["__file","logger.html.vue"]]);export{d as default}; +

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookLogger.inMemoryData\u3001YukiHookLogger.contents\u3001YukiHookLogger.contents\u3001YukiHookLogger.saveToFile \u65B9\u6CD5\u4EE5\u53CA YukiHookLogger.Configs\u3002

    `,63),p=[l];function c(i,r){return a(),o("div",null,p)}const d=s(e,[["render",c],["__file","logger.html.vue"]]);export{d as default}; diff --git a/docs/assets/logger.html.f841b55d.js b/docs/assets/logger.html.9662b4ff.js similarity index 71% rename from docs/assets/logger.html.f841b55d.js rename to docs/assets/logger.html.9662b4ff.js index 215c05796..3c30f64b0 100644 --- a/docs/assets/logger.html.f841b55d.js +++ b/docs/assets/logger.html.9662b4ff.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-33c1dc26","path":"/en/api/special-features/logger.html","title":"Debug Logs","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Normal Logs","slug":"normal-logs","link":"#normal-logs","children":[]},{"level":2,"title":"Error Logs","slug":"error-logs","link":"#error-logs","children":[]},{"level":2,"title":"Save Logs and Custom Elements","slug":"save-logs-and-custom-elements","link":"#save-logs-and-custom-elements","children":[]}],"git":{"updatedTime":1664834451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"en/api/special-features/logger.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-33c1dc26","path":"/en/api/special-features/logger.html","title":"Debug Logs","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Normal Logs","slug":"normal-logs","link":"#normal-logs","children":[]},{"level":2,"title":"Error Logs","slug":"error-logs","link":"#error-logs","children":[]},{"level":2,"title":"Save Logs and Custom Elements","slug":"save-logs-and-custom-elements","link":"#save-logs-and-custom-elements","children":[]}],"git":{"updatedTime":1673455422000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/api/special-features/logger.md"}');export{e as data}; diff --git a/docs/assets/logger.html.c841577b.js b/docs/assets/logger.html.c120d3dc.js similarity index 77% rename from docs/assets/logger.html.c841577b.js rename to docs/assets/logger.html.c120d3dc.js index 51b02c9a9..895cda59a 100644 --- a/docs/assets/logger.html.c841577b.js +++ b/docs/assets/logger.html.c120d3dc.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-1f0f591e","path":"/zh-cn/api/special-features/logger.html","title":"\u8C03\u8BD5\u65E5\u5FD7","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u666E\u901A\u65E5\u5FD7","slug":"\u666E\u901A\u65E5\u5FD7","link":"#\u666E\u901A\u65E5\u5FD7","children":[]},{"level":2,"title":"\u9519\u8BEF\u65E5\u5FD7","slug":"\u9519\u8BEF\u65E5\u5FD7","link":"#\u9519\u8BEF\u65E5\u5FD7","children":[]},{"level":2,"title":"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","slug":"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","link":"#\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","children":[]}],"git":{"updatedTime":1664834451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"zh-cn/api/special-features/logger.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-1f0f591e","path":"/zh-cn/api/special-features/logger.html","title":"\u8C03\u8BD5\u65E5\u5FD7","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u666E\u901A\u65E5\u5FD7","slug":"\u666E\u901A\u65E5\u5FD7","link":"#\u666E\u901A\u65E5\u5FD7","children":[]},{"level":2,"title":"\u9519\u8BEF\u65E5\u5FD7","slug":"\u9519\u8BEF\u65E5\u5FD7","link":"#\u9519\u8BEF\u65E5\u5FD7","children":[]},{"level":2,"title":"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","slug":"\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","link":"#\u4FDD\u5B58\u65E5\u5FD7\u4E0E\u81EA\u5B9A\u4E49\u5143\u7D20","children":[]}],"git":{"updatedTime":1673455422000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":9}]},"filePathRelative":"zh-cn/api/special-features/logger.md"}');export{e as data}; diff --git a/docs/assets/move-to-new-api.html.99d85464.js b/docs/assets/move-to-new-api.html.28f5adf0.js similarity index 94% rename from docs/assets/move-to-new-api.html.99d85464.js rename to docs/assets/move-to-new-api.html.28f5adf0.js index 23d3982c1..e7afb8da6 100644 --- a/docs/assets/move-to-new-api.html.99d85464.js +++ b/docs/assets/move-to-new-api.html.28f5adf0.js @@ -1,4 +1,4 @@ -import{_ as p,r as c,o as i,c as t,d as n,w as e,a as r,b as s,e as l}from"./app.99fcdd51.js";const A={},y=r('

    \u4ECE Xposed API \u8FC1\u79FB

    \u82E5\u4F60\u719F\u6089 Xposed API\uFF0C\u4F60\u53EF\u4EE5\u53C2\u8003\u4E0B\u65B9\u7684\u76F8\u540C\u70B9\u5C06\u81EA\u5DF1\u7684 API \u5FEB\u901F\u8FC1\u79FB\u5230 YukiHookAPI\u3002

    \u8FC1\u79FB Hook \u5165\u53E3\u70B9

    \u4ECE XC_LoadPackage.LoadPackageParam \u8FC1\u79FB\u81F3 PackageParam\u3002

    YukiHookAPI \u5BF9 PackageParam \u5B9E\u73B0\u4E86 lambda \u65B9\u6CD5\u4F53 this \u7528\u6CD5\uFF0C\u5728 encase \u65B9\u6CD5\u4F53\u5185\u5373\u53EF\u5168\u5C40\u5F97\u5230 PackageParam \u5BF9\u8C61\u3002

    API \u529F\u80FD\u5DEE\u5F02\u5BF9\u6BD4\u5982\u4E0B

    ',6),d=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),l(` +import{_ as p,r as c,o as i,c as t,d as n,w as e,a as r,b as s,e as l}from"./app.6074a838.js";const A={},y=r('

    \u4ECE Xposed API \u8FC1\u79FB

    \u82E5\u4F60\u719F\u6089 Xposed API\uFF0C\u4F60\u53EF\u4EE5\u53C2\u8003\u4E0B\u65B9\u7684\u76F8\u540C\u70B9\u5C06\u81EA\u5DF1\u7684 API \u5FEB\u901F\u8FC1\u79FB\u5230 YukiHookAPI\u3002

    \u8FC1\u79FB Hook \u5165\u53E3\u70B9

    \u4ECE XC_LoadPackage.LoadPackageParam \u8FC1\u79FB\u81F3 PackageParam\u3002

    YukiHookAPI \u5BF9 PackageParam \u5B9E\u73B0\u4E86 lambda \u65B9\u6CD5\u4F53 this \u7528\u6CD5\uFF0C\u5728 encase \u65B9\u6CD5\u4F53\u5185\u5373\u53EF\u5168\u5C40\u5F97\u5230 PackageParam \u5BF9\u8C61\u3002

    API \u529F\u80FD\u5DEE\u5F02\u5BF9\u6BD4\u5982\u4E0B

    ',6),d=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5F97\u5230\u5F53\u524D Hook \u7684\u5305\u540D")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," packageName")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5F97\u5230\u5F53\u524D Hook \u7684 ApplicationInfo")]),l(` @@ -95,6 +95,8 @@ import{_ as p,r as c,o as i,c as t,d as n,w as e,a as r,b as s,e as l}from"./app `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5220\u9664\u8FD4\u56DE\u503C\u5185\u5BB9")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," resultNull()")]),l(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u83B7\u53D6\u5F53\u524D\u56DE\u8C03\u65B9\u6CD5\u4F53\u8303\u56F4\u5185\u7684\u6570\u636E\u5B58\u50A8\u5B9E\u4F8B")]),l(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," dataExtra")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5411 Hook APP \u629B\u51FA\u5F02\u5E38")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},").throwToApp()")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u6267\u884C\u672A\u7ECF Hook \u7684\u539F\u59CB\u65B9\u6CD5\u5E76\u4F7F\u7528\u539F\u59CB\u65B9\u6CD5\u53C2\u6570\u8C03\u7528\uFF0C\u6CDB\u578B\u53EF\u7565")]),l(` @@ -102,7 +104,7 @@ import{_ as p,r as c,o as i,c as t,d as n,w as e,a as r,b as s,e as l}from"./app `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u6267\u884C\u672A\u7ECF Hook \u7684\u539F\u59CB\u65B9\u6CD5\u5E76\u81EA\u5B9A\u4E49\u65B9\u6CD5\u53C2\u6570\u8C03\u7528\uFF0C\u6CDB\u578B\u53EF\u7565")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," invokeOriginal"),s("span",{style:{color:"#F47067"}},"<"),s("span",{style:{color:"#6CB6FF"}},"Any?"),s("span",{style:{color:"#F47067"}},">"),s("span",{style:{color:"#ADBAC7"}},"(...)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),B=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),l(` +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),B=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5F97\u5230\u5F53\u524D Hook \u7684\u5B9E\u4F8B")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.thisObject")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5F97\u5230\u5F53\u524D Hook \u7684 Class \u5B9E\u4F8B")]),l(` @@ -127,12 +129,14 @@ import{_ as p,r as c,o as i,c as t,d as n,w as e,a as r,b as s,e as l}from"./app `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," ...")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5220\u9664\u8FD4\u56DE\u503C\u5185\u5BB9")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),l(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u83B7\u53D6\u5F53\u524D\u56DE\u8C03\u65B9\u6CD5\u4F53\u8303\u56F4\u5185\u7684\u6570\u636E\u5B58\u50A8\u5B9E\u4F8B")]),l(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.extra")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u5411 Hook APP \u629B\u51FA\u5F02\u5E38")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.throwable "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},")")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u6267\u884C\u672A\u7ECF Hook \u7684\u539F\u59CB\u65B9\u6CD5")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"XposedBridge"),s("span",{style:{color:"#ADBAC7"}},".invokeOriginalMethod(param.method, param.thisObject, ...)")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),l(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),m=s("h3",{id:"replace-hook",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#replace-hook","aria-hidden":"true"},"#"),l(" Replace Hook")],-1),b=s("p",null,[s("code",null,"replaceHook"),l(" \u65B9\u6CD5\u6BD4\u8F83\u7279\u6B8A\uFF0C"),s("code",null,"YukiHookAPI"),l(" \u4E3A\u5B83\u505A\u51FA\u4E86\u591A\u79CD\u5F62\u5F0F\u4EE5\u4F9B\u9009\u62E9\u3002")],-1),v=s("blockquote",null,[s("p",null,"API \u529F\u80FD\u5DEE\u5F02\u5BF9\u6BD4\u5982\u4E0B")],-1),F=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// \u65E0\u8FD4\u56DE\u503C\u7684\u65B9\u6CD5 void")]),l(` +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),m=s("h3",{id:"replace-hook",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#replace-hook","aria-hidden":"true"},"#"),l(" Replace Hook")],-1),b=s("p",null,[s("code",null,"replaceHook"),l(" \u65B9\u6CD5\u6BD4\u8F83\u7279\u6B8A\uFF0C"),s("code",null,"YukiHookAPI"),l(" \u4E3A\u5B83\u505A\u51FA\u4E86\u591A\u79CD\u5F62\u5F0F\u4EE5\u4F9B\u9009\u62E9\u3002")],-1),v=s("blockquote",null,[s("p",null,"API \u529F\u80FD\u5DEE\u5F02\u5BF9\u6BD4\u5982\u4E0B")],-1),F=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// \u65E0\u8FD4\u56DE\u503C\u7684\u65B9\u6CD5 void")]),l(` `),s("span",{class:"line"}),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"replaceUnit {")]),l(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// \u76F4\u63A5\u5728\u8FD9\u91CC\u5B9E\u73B0\u88AB\u66FF\u6362\u7684\u903B\u8F91")]),l(` diff --git a/docs/assets/move-to-new-api.html.508c5312.js b/docs/assets/move-to-new-api.html.4bf89a9b.js similarity index 88% rename from docs/assets/move-to-new-api.html.508c5312.js rename to docs/assets/move-to-new-api.html.4bf89a9b.js index 2ce9abc40..c8a7baa24 100644 --- a/docs/assets/move-to-new-api.html.508c5312.js +++ b/docs/assets/move-to-new-api.html.4bf89a9b.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-c0d5dada","path":"/zh-cn/guide/move-to-new-api.html","title":"\u4ECE Xposed API \u8FC1\u79FB","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u8FC1\u79FB Hook \u5165\u53E3\u70B9","slug":"\u8FC1\u79FB-hook-\u5165\u53E3\u70B9","link":"#\u8FC1\u79FB-hook-\u5165\u53E3\u70B9","children":[]},{"level":2,"title":"\u8FC1\u79FB Hook \u65B9\u6CD5\u4F53","slug":"\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53","link":"#\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53","children":[{"level":3,"title":"Before/After Hook","slug":"before-after-hook","link":"#before-after-hook","children":[]},{"level":3,"title":"Replace Hook","slug":"replace-hook","link":"#replace-hook","children":[]}]},{"level":2,"title":"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","slug":"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","link":"#\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/guide/move-to-new-api.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-c0d5dada","path":"/zh-cn/guide/move-to-new-api.html","title":"\u4ECE Xposed API \u8FC1\u79FB","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u8FC1\u79FB Hook \u5165\u53E3\u70B9","slug":"\u8FC1\u79FB-hook-\u5165\u53E3\u70B9","link":"#\u8FC1\u79FB-hook-\u5165\u53E3\u70B9","children":[]},{"level":2,"title":"\u8FC1\u79FB Hook \u65B9\u6CD5\u4F53","slug":"\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53","link":"#\u8FC1\u79FB-hook-\u65B9\u6CD5\u4F53","children":[{"level":3,"title":"Before/After Hook","slug":"before-after-hook","link":"#before-after-hook","children":[]},{"level":3,"title":"Replace Hook","slug":"replace-hook","link":"#replace-hook","children":[]}]},{"level":2,"title":"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","slug":"\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","link":"#\u8FC1\u79FB\u5176\u5B83\u529F\u80FD","children":[]}],"git":{"updatedTime":1673539143000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/guide/move-to-new-api.md"}');export{e as data}; diff --git a/docs/assets/move-to-new-api.html.45e76cd4.js b/docs/assets/move-to-new-api.html.e805247b.js similarity index 94% rename from docs/assets/move-to-new-api.html.45e76cd4.js rename to docs/assets/move-to-new-api.html.e805247b.js index 0b963cecf..b59919de0 100644 --- a/docs/assets/move-to-new-api.html.45e76cd4.js +++ b/docs/assets/move-to-new-api.html.e805247b.js @@ -1,4 +1,4 @@ -import{_ as t,r as c,o as p,c as i,d as l,w as n,a as r,b as s,e}from"./app.99fcdd51.js";const A={},y=r('

    Migrate from Xposed API

    If you are familiar with Xposed API, you can refer to the same point below to quickly migrate your API to YukiHookAPI.

    Migrate Hook Entry Point

    Migrated from XC_LoadPackage.LoadPackageParam to PackageParam.

    YukiHookAPI implements the lambda method body this usage for PackageParam, and the PackageParam object can be obtained globally in the encase method body.

    The API function differences are compared as follows

    ',6),d=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),e(` +import{_ as t,r as c,o as i,c as p,d as l,w as n,a as r,b as s,e}from"./app.6074a838.js";const A={},y=r('

    Migrate from Xposed API

    If you are familiar with Xposed API, you can refer to the same point below to quickly migrate your API to YukiHookAPI.

    Migrate Hook Entry Point

    Migrated from XC_LoadPackage.LoadPackageParam to PackageParam.

    YukiHookAPI implements the lambda method body this usage for PackageParam, and the PackageParam object can be obtained globally in the encase method body.

    The API function differences are compared as follows

    ',6),d=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"onHook"),s("span",{style:{color:"#ADBAC7"}},"() "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," encase {")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the package name of the current Hook")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," packageName")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the ApplicationInfo of the current Hook")]),e(` @@ -95,6 +95,8 @@ import{_ as t,r as c,o as p,c as i,d as l,w as n,a as r,b as s,e}from"./app.99fc `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," ...")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Remove the content of the return value")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," resultNull()")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the data storage instance within the scope of the current callback method body")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," dataExtra")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Throw an exception to the Hook app")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},").throwToApp()")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Execute the original method without hook and call with the original method parameters, generics can be omitted")]),e(` @@ -102,7 +104,7 @@ import{_ as t,r as c,o as p,c as i,d as l,w as n,a as r,b as s,e}from"./app.99fc `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Execute the original method without Hook and customize the method parameter call, the generic type can be omitted")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," invokeOriginal"),s("span",{style:{color:"#F47067"}},"<"),s("span",{style:{color:"#6CB6FF"}},"Any?"),s("span",{style:{color:"#F47067"}},">"),s("span",{style:{color:"#ADBAC7"}},"(...)")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),e(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),C=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),e(` +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),C=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"afterHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") {")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the current Hook instance")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.thisObject")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the Class instance of the current Hook")]),e(` @@ -127,12 +129,14 @@ import{_ as t,r as c,o as p,c as i,d as l,w as n,a as r,b as s,e}from"./app.99fc `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," ...")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Remove the content of the return value")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.result "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Get the data storage instance within the scope of the current callback method body")]),e(` +`),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.extra")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Throw an exception to the Hook app")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," param.throwable "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"Throwable"),s("span",{style:{color:"#ADBAC7"}},"("),s("span",{style:{color:"#96D0FF"}},'"Fatal"'),s("span",{style:{color:"#ADBAC7"}},")")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Execute the original method without hooking")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"XposedBridge"),s("span",{style:{color:"#ADBAC7"}},".invokeOriginalMethod(param.method, param.thisObject, ...)")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"}")]),e(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),B=s("h3",{id:"replace-hook",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#replace-hook","aria-hidden":"true"},"#"),e(" Replace Hook")],-1),h=s("p",null,[e("The "),s("code",null,"replaceHook"),e(" method is special, and the "),s("code",null,"YukiHookAPI"),e(" makes a variety of forms for it to choose from.")],-1),b=s("blockquote",null,[s("p",null,"The API function differences are compared as follows")],-1),v=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// A method with no return value void")]),e(` +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),B=s("h3",{id:"replace-hook",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#replace-hook","aria-hidden":"true"},"#"),e(" Replace Hook")],-1),h=s("p",null,[e("The "),s("code",null,"replaceHook"),e(" method is special, and the "),s("code",null,"YukiHookAPI"),e(" makes a variety of forms for it to choose from.")],-1),b=s("blockquote",null,[s("p",null,"The API function differences are compared as follows")],-1),v=s("div",{class:"language-kotlin ext-kt line-numbers-mode"},[s("pre",{class:"shiki",style:{"background-color":"#22272e"}},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"/// A method with no return value void")]),e(` `),s("span",{class:"line"}),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}},"replaceUnit {")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#768390"}},"// Implement the replaced logic directly here")]),e(` @@ -181,4 +185,4 @@ import{_ as t,r as c,o as p,c as i,d as l,w as n,a as r,b as s,e}from"./app.99fc `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"true")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#768390"}},"// Intercept return value")]),e(` `),s("span",{class:"line"},[s("span",{style:{color:"#F47067"}},"override"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F47067"}},"fun"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#DCBDFB"}},"replaceHookedMethod"),s("span",{style:{color:"#ADBAC7"}},"(param"),s("span",{style:{color:"#F47067"}},":"),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#F69D50"}},"MethodHookParam"),s("span",{style:{color:"#ADBAC7"}},") "),s("span",{style:{color:"#F47067"}},"="),s("span",{style:{color:"#ADBAC7"}}," "),s("span",{style:{color:"#6CB6FF"}},"null")]),e(` -`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),k=s("h2",{id:"migrate-other-features",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#migrate-other-features","aria-hidden":"true"},"#"),e(" Migrate Other Features")],-1),f=s("p",null,[s("code",null,"YukiHookAPI"),e(" is a complete rewrite of the Xposed API, you can refer to "),s("a",{href:"../api/home"},"API Document"),e(" and "),s("a",{href:"../api/special-features/reflection"},"Special Features"),e(" to determine some functional Migration and use.")],-1);function g(H,_){const a=c("CodeGroupItem"),o=c("CodeGroup");return p(),i("div",null,[y,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[d]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[u]),_:1})]),_:1}),m,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[D]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[C]),_:1})]),_:1}),B,h,b,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[v]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[F]),_:1})]),_:1}),k,f])}const I=t(A,[["render",g],["__file","move-to-new-api.html.vue"]]);export{I as default}; +`),s("span",{class:"line"})])]),s("div",{class:"line-numbers","aria-hidden":"true"},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1),k=s("h2",{id:"migrate-other-features",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#migrate-other-features","aria-hidden":"true"},"#"),e(" Migrate Other Features")],-1),f=s("p",null,[s("code",null,"YukiHookAPI"),e(" is a complete rewrite of the Xposed API, you can refer to "),s("a",{href:"../api/home"},"API Document"),e(" and "),s("a",{href:"../api/special-features/reflection"},"Special Features"),e(" to determine some functional Migration and use.")],-1);function g(H,_){const a=c("CodeGroupItem"),o=c("CodeGroup");return i(),p("div",null,[y,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[d]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[u]),_:1})]),_:1}),m,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[D]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[C]),_:1})]),_:1}),B,h,b,l(o,null,{default:n(()=>[l(a,{title:"Yuki Hook API"},{default:n(()=>[v]),_:1}),l(a,{title:"Xposed API"},{default:n(()=>[F]),_:1})]),_:1}),k,f])}const I=t(A,[["render",g],["__file","move-to-new-api.html.vue"]]);export{I as default}; diff --git a/docs/assets/move-to-new-api.html.78f39fa5.js b/docs/assets/move-to-new-api.html.f91df01f.js similarity index 86% rename from docs/assets/move-to-new-api.html.78f39fa5.js rename to docs/assets/move-to-new-api.html.f91df01f.js index 9f2b8fc27..6dc4ead09 100644 --- a/docs/assets/move-to-new-api.html.78f39fa5.js +++ b/docs/assets/move-to-new-api.html.f91df01f.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-77d752a2","path":"/en/guide/move-to-new-api.html","title":"Migrate from Xposed API","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Migrate Hook Entry Point","slug":"migrate-hook-entry-point","link":"#migrate-hook-entry-point","children":[]},{"level":2,"title":"Migrate Hook Method Body","slug":"migrate-hook-method-body","link":"#migrate-hook-method-body","children":[{"level":3,"title":"Before/After Hook","slug":"before-after-hook","link":"#before-after-hook","children":[]},{"level":3,"title":"Replace Hook","slug":"replace-hook","link":"#replace-hook","children":[]}]},{"level":2,"title":"Migrate Other Features","slug":"migrate-other-features","link":"#migrate-other-features","children":[]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"en/guide/move-to-new-api.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-77d752a2","path":"/en/guide/move-to-new-api.html","title":"Migrate from Xposed API","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Migrate Hook Entry Point","slug":"migrate-hook-entry-point","link":"#migrate-hook-entry-point","children":[]},{"level":2,"title":"Migrate Hook Method Body","slug":"migrate-hook-method-body","link":"#migrate-hook-method-body","children":[{"level":3,"title":"Before/After Hook","slug":"before-after-hook","link":"#before-after-hook","children":[]},{"level":3,"title":"Replace Hook","slug":"replace-hook","link":"#replace-hook","children":[]}]},{"level":2,"title":"Migrate Other Features","slug":"migrate-other-features","link":"#migrate-other-features","children":[]}],"git":{"updatedTime":1673539143000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/guide/move-to-new-api.md"}');export{e as data}; diff --git a/docs/assets/quick-start.html.e309979a.js b/docs/assets/quick-start.html.02af8471.js similarity index 89% rename from docs/assets/quick-start.html.e309979a.js rename to docs/assets/quick-start.html.02af8471.js index 68872866f..da4507963 100644 --- a/docs/assets/quick-start.html.e309979a.js +++ b/docs/assets/quick-start.html.02af8471.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-72889797","path":"/en/guide/quick-start.html","title":"Quick Start","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Environment Requirements","slug":"environment-requirements","link":"#environment-requirements","children":[]},{"level":2,"title":"Automatically Build Project","slug":"automatically-build-project","link":"#automatically-build-project","children":[]},{"level":2,"title":"Manually Configure Project","slug":"manually-configure-project","link":"#manually-configure-project","children":[{"level":3,"title":"Create Project","slug":"create-project","link":"#create-project","children":[]},{"level":3,"title":"Integration Dependencies","slug":"integration-dependencies","link":"#integration-dependencies","children":[]},{"level":3,"title":"Use as Xposed Module","slug":"use-as-xposed-module","link":"#use-as-xposed-module","children":[]},{"level":3,"title":"Use as Hook API","slug":"use-as-hook-api","link":"#use-as-hook-api","children":[]}]}],"git":{"updatedTime":1664300349000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/guide/quick-start.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-72889797","path":"/en/guide/quick-start.html","title":"Quick Start","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Environment Requirements","slug":"environment-requirements","link":"#environment-requirements","children":[]},{"level":2,"title":"Automatically Build Project","slug":"automatically-build-project","link":"#automatically-build-project","children":[]},{"level":2,"title":"Manually Configure Project","slug":"manually-configure-project","link":"#manually-configure-project","children":[{"level":3,"title":"Create Project","slug":"create-project","link":"#create-project","children":[]},{"level":3,"title":"Integration Dependencies","slug":"integration-dependencies","link":"#integration-dependencies","children":[]},{"level":3,"title":"Use as Xposed Module","slug":"use-as-xposed-module","link":"#use-as-xposed-module","children":[]},{"level":3,"title":"Use as Hook API","slug":"use-as-hook-api","link":"#use-as-hook-api","children":[]}]}],"git":{"updatedTime":1672500479000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":7}]},"filePathRelative":"en/guide/quick-start.md"}');export{e as data}; diff --git a/docs/assets/quick-start.html.eacb83f2.js b/docs/assets/quick-start.html.3cf0abe8.js similarity index 91% rename from docs/assets/quick-start.html.eacb83f2.js rename to docs/assets/quick-start.html.3cf0abe8.js index ef24ac483..6d60da1a4 100644 --- a/docs/assets/quick-start.html.eacb83f2.js +++ b/docs/assets/quick-start.html.3cf0abe8.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-24840ff0","path":"/zh-cn/guide/quick-start.html","title":"\u5FEB\u901F\u5F00\u59CB","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u73AF\u5883\u8981\u6C42","slug":"\u73AF\u5883\u8981\u6C42","link":"#\u73AF\u5883\u8981\u6C42","children":[]},{"level":2,"title":"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","slug":"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","link":"#\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","children":[]},{"level":2,"title":"\u624B\u52A8\u914D\u7F6E\u9879\u76EE","slug":"\u624B\u52A8\u914D\u7F6E\u9879\u76EE","link":"#\u624B\u52A8\u914D\u7F6E\u9879\u76EE","children":[{"level":3,"title":"\u521B\u5EFA\u9879\u76EE","slug":"\u521B\u5EFA\u9879\u76EE","link":"#\u521B\u5EFA\u9879\u76EE","children":[]},{"level":3,"title":"\u96C6\u6210\u4F9D\u8D56","slug":"\u96C6\u6210\u4F9D\u8D56","link":"#\u96C6\u6210\u4F9D\u8D56","children":[]},{"level":3,"title":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528","slug":"\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528","link":"#\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528","children":[]},{"level":3,"title":"\u4F5C\u4E3A Hook API \u4F7F\u7528","slug":"\u4F5C\u4E3A-hook-api-\u4F7F\u7528","link":"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528","children":[]}]}],"git":{"updatedTime":1663397167000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":1}]},"filePathRelative":"zh-cn/guide/quick-start.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-24840ff0","path":"/zh-cn/guide/quick-start.html","title":"\u5FEB\u901F\u5F00\u59CB","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u73AF\u5883\u8981\u6C42","slug":"\u73AF\u5883\u8981\u6C42","link":"#\u73AF\u5883\u8981\u6C42","children":[]},{"level":2,"title":"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","slug":"\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","link":"#\u81EA\u52A8\u6784\u5EFA\u9879\u76EE","children":[]},{"level":2,"title":"\u624B\u52A8\u914D\u7F6E\u9879\u76EE","slug":"\u624B\u52A8\u914D\u7F6E\u9879\u76EE","link":"#\u624B\u52A8\u914D\u7F6E\u9879\u76EE","children":[{"level":3,"title":"\u521B\u5EFA\u9879\u76EE","slug":"\u521B\u5EFA\u9879\u76EE","link":"#\u521B\u5EFA\u9879\u76EE","children":[]},{"level":3,"title":"\u96C6\u6210\u4F9D\u8D56","slug":"\u96C6\u6210\u4F9D\u8D56","link":"#\u96C6\u6210\u4F9D\u8D56","children":[]},{"level":3,"title":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528","slug":"\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528","link":"#\u4F5C\u4E3A-xposed-\u6A21\u5757\u4F7F\u7528","children":[]},{"level":3,"title":"\u4F5C\u4E3A Hook API \u4F7F\u7528","slug":"\u4F5C\u4E3A-hook-api-\u4F7F\u7528","link":"#\u4F5C\u4E3A-hook-api-\u4F7F\u7528","children":[]}]}],"git":{"updatedTime":1673456451000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":5}]},"filePathRelative":"zh-cn/guide/quick-start.md"}');export{e as data}; diff --git a/docs/assets/quick-start.html.b66f71d7.js b/docs/assets/quick-start.html.991be43b.js similarity index 81% rename from docs/assets/quick-start.html.b66f71d7.js rename to docs/assets/quick-start.html.991be43b.js index bb062e125..912a942e6 100644 --- a/docs/assets/quick-start.html.b66f71d7.js +++ b/docs/assets/quick-start.html.991be43b.js @@ -1,4 +1,4 @@ -import{_ as o,r as l,o as i,c as p,b as n,d as t,a as e,e as s}from"./app.99fcdd51.js";const r={},c=e(`

    Quick Start

    Integrate YukiHookAPI into your project.

    Environment Requirements

    • Windows 7 and above / macOS 10.14 and above / Linux distributions (Arch/Debian)

    • Android Studio 2021.1 and above

    • IntelliJ IDEA 2021.1 and above

    • Kotlin 1.7.0 and above

    • Android Gradle Plugin 7.0 and above

    • Gradle 7.0 and above

    • JVM 11 and above (Since API 1.0.80)

    Automatically Build Project

    YukiHookAPI provides an automated build tool that can help you quickly build an Android standard project template with Xposed Module dependencies, and use the built template to start the next step directly.

    You can click here to check it out.

    Manually Configure Project

    If you don't want to use automated build tools, you can still manually configure project dependencies as follows.

    Create Project

    Use Android Studio or IntelliJ IDEA to create a new Android project and select Kotlin in the Language column to automatically add basic dependencies.

    Integration Dependencies

    Add dependencies to your project build.gradle.

    The following example

    repositories {
    +import{_ as o,r as l,o as i,c as p,b as n,d as t,a as e,e as s}from"./app.6074a838.js";const r={},c=e(`

    Quick Start

    Integrate YukiHookAPI into your project.

    Environment Requirements

    • Windows 7 and above / macOS 10.14 and above / Linux distributions (Arch/Debian)

    • Android Studio 2021.1 and above

    • IntelliJ IDEA 2021.1 and above

    • Kotlin 1.7.0 and above

    • Android Gradle Plugin 7.0 and above

    • Gradle 7.0 and above

    • JVM 11 and above (Since API 1.0.80)

    Automatically Build Project

    YukiHookAPI provides an automated build tool that can help you quickly build an Android standard project template with Xposed Module dependencies, and use the built template to start the next step directly.

    You can click here to check it out.

    Manually Configure Project

    If you don't want to use automated build tools, you can still manually configure project dependencies as follows.

    Create Project

    Use Android Studio or IntelliJ IDEA to create a new Android project and select Kotlin in the Language column to automatically add basic dependencies.

    Integration Dependencies

    Add dependencies to your project build.gradle.

    The following example

    repositories {
         google()
         mavenCentral()
         // \u2757If your Plugin version is too low, be sure to add it as an Xposed Module, other cases are optional
    @@ -45,18 +45,21 @@ import{_ as o,r as l,o as i,c as p,b as n,d as t,a as e,e as s}from"./app.99fcdd
         android:name="xposedminversion"
         android:value="93" />
     
    -<!-- Optional: Configure support for New XSharePrefs without adjusting xposedminversion to 93 -->
    +<!-- Optional: Configure support for New XSharedPreferences without adjusting xposedminversion to 93 -->
     <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
     

    Create a Hook entry class in your project, implements IYukiHookXposedInit and add the annotation @InjectYukiHookWithXposed.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry : IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = YukiHookAPI.encase {
             // Your code here.
         }
     }
    -

    Suggestion

    You can extends Application of your Module App from ModuleApplication to achieve a complete user experience.

    For more functions, please refer to ModuleApplication.

    Then, you can start writing Hook code.

    For configuration details related to use as an Xposed Module, you can click here to continue reading.

    If you are currently using Xposed API, you can refer to Migrate from Xposed API.

    Use as Hook API

    Integration

    Create your custom Application.

    Pay Attention

    Regardless of the Hook Framework you use, you need to add its docking Xposed dependency support.

    If the target Hook Framework does not integrate Xposed API, you need to implement and connect XposedBridge by yourself.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    override fun attachBaseContext(base: Context?) {
    +

    Suggestion

    Please configure YukiHookAPI in the onInit method and set the isDebug mode to the following form.

    The following example

    override fun onInit() = configs {
    +    isDebug = BuildConfig.DEBUG
    +}
    +

    YukiHookAPI will print all logs for debugging by default.

    For a release build, be sure to turn off debugging to prevent a lot of log stuffing on the user's device.

    You can also extends Application of your Module App from ModuleApplication to achieve a complete user experience.

    For more functions, please refer to ModuleApplication.

    Then, you can start writing Hook code.

    For configuration details related to use as an Xposed Module, you can click here to continue reading.

    If you are currently using Xposed API, you can refer to Migrate from Xposed API.

    Use as Hook API

    Integration

    Create your custom Application.

    Pay Attention

    Regardless of the Hook Framework you use, you need to add its docking Xposed dependency support.

    If the target Hook Framework does not integrate Xposed API, you need to implement and connect XposedBridge by yourself.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    override fun attachBaseContext(base: Context?) {
         // Load Hook Framework
         //
         // Your code here.
    @@ -67,4 +70,4 @@ import{_ as o,r as l,o as i,c as p,b as n,d as t,a as e,e as s}from"./app.99fcdd
         }
         super.attachBaseContext(base)
     }
    -

    Then, you can start writing Hook code in much the same way you would use it as an Xposed Module.

    For configuration details related to use as a Hook API, you can click here to continue reading.

    Notice

    YukiHookModuleStatus, YukiHookModulePrefs, YukiHookDataChannel and Resources Hook functionality will not work when using a custom Hook Framework instead of the full Xposed Module.

    `,27);function D(C,B){const a=l("ExternalLinkIcon");return i(),p("div",null,[c,n("p",null,[d,u,y,n("a",v,[A,t(a)]),m,h,b]),g])}const F=o(r,[["render",D],["__file","quick-start.html.vue"]]);export{F as default}; +

    Then, you can start writing Hook code in much the same way you would use it as an Xposed Module.

    For configuration details related to use as a Hook API, you can click here to continue reading.

    Notice

    YukiHookModuleStatus, YukiHookModulePrefs, YukiHookDataChannel and Resources Hook functionality will not work when using a custom Hook Framework instead of the full Xposed Module.

    `,27);function D(B,C){const a=l("ExternalLinkIcon");return i(),p("div",null,[c,n("p",null,[d,u,y,n("a",v,[A,t(a)]),m,h,b]),g])}const F=o(r,[["render",D],["__file","quick-start.html.vue"]]);export{F as default}; diff --git a/docs/assets/quick-start.html.1d7f6624.js b/docs/assets/quick-start.html.c3581766.js similarity index 78% rename from docs/assets/quick-start.html.1d7f6624.js rename to docs/assets/quick-start.html.c3581766.js index ff03a2f8f..90b42a195 100644 --- a/docs/assets/quick-start.html.1d7f6624.js +++ b/docs/assets/quick-start.html.c3581766.js @@ -1,4 +1,4 @@ -import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.99fcdd51.js";const r={},t=a(`

    \u5FEB\u901F\u5F00\u59CB

    \u96C6\u6210 YukiHookAPI \u5230\u4F60\u7684\u9879\u76EE\u4E2D\u3002

    \u73AF\u5883\u8981\u6C42

    • 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)

    \u81EA\u52A8\u6784\u5EFA\u9879\u76EE

    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

    \u624B\u52A8\u914D\u7F6E\u9879\u76EE

    \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

    \u521B\u5EFA\u9879\u76EE

    \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

    \u96C6\u6210\u4F9D\u8D56

    \u5728\u4F60\u7684\u9879\u76EE build.gradle \u4E2D\u6DFB\u52A0\u4F9D\u8D56\u3002

    \u793A\u4F8B\u5982\u4E0B

    repositories {
    +import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.6074a838.js";const r={},t=a(`

    \u5FEB\u901F\u5F00\u59CB

    \u96C6\u6210 YukiHookAPI \u5230\u4F60\u7684\u9879\u76EE\u4E2D\u3002

    \u73AF\u5883\u8981\u6C42

    • 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)

    \u81EA\u52A8\u6784\u5EFA\u9879\u76EE

    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

    \u624B\u52A8\u914D\u7F6E\u9879\u76EE

    \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

    \u521B\u5EFA\u9879\u76EE

    \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

    \u96C6\u6210\u4F9D\u8D56

    \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
    @@ -20,7 +20,7 @@ import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.99fcdd51.js
         // \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>'
     }
    -
    `,21),d=s("\u8BF7\u5C06 "),u=n("strong",null,"",-1),v=s(" \u4FEE\u6539\u4E3A "),A={href:"https://github.com/google/ksp/releases",target:"_blank",rel:"noopener noreferrer"},y=s("\u8FD9\u91CC"),m=s(" \u7684\u6700\u65B0\u7248\u672C "),b=n("strong",null,"(\u8BF7\u6CE8\u610F\u9009\u62E9\u4F60\u5F53\u524D\u5BF9\u5E94\u7684 Kotlin \u7248\u672C)",-1),D=s("\u3002"),h=a(`

    \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 {
    +
    `,21),d=s("\u8BF7\u5C06 "),u=n("strong",null,"",-1),A=s(" \u4FEE\u6539\u4E3A "),v={href:"https://github.com/google/ksp/releases",target:"_blank",rel:"noopener noreferrer"},y=s("\u8FD9\u91CC"),m=s(" \u7684\u6700\u65B0\u7248\u672C "),b=n("strong",null,"(\u8BF7\u6CE8\u610F\u9009\u62E9\u4F60\u5F53\u524D\u5BF9\u5E94\u7684 Kotlin \u7248\u672C)",-1),D=s("\u3002"),B=a(`

    \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
    @@ -44,18 +44,21 @@ import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.99fcdd51.js
         android:name="xposedminversion"
         android:value="93" />
     
    -<!-- \u53EF\u9009\uFF1A\u914D\u7F6E\u652F\u6301 New XSharePrefs \u53EF\u65E0\u9700\u8C03\u6574 xposedminversion \u4E3A 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
    -class HookEntry : IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = YukiHookAPI.encase {
             // Your code here.
         }
     }
    -

    \u5EFA\u8BAE

    \u4F60\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

    \u4F5C\u4E3A Hook API \u4F7F\u7528

    \u96C6\u6210\u65B9\u5F0F

    \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?) {
    +

    \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

    \u4F5C\u4E3A Hook API \u4F7F\u7528

    \u96C6\u6210\u65B9\u5F0F

    \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.
    @@ -66,4 +69,4 @@ import{_ as l,r as o,o as p,c as i,b as n,d as c,a,e as s}from"./app.99fcdd51.js
         }
         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 \u6846\u67B6\u800C\u5E76\u975E\u5B8C\u6574\u7684 Xposed \u6A21\u5757\u65F6\uFF0CYukiHookModuleStatus\u3001YukiHookModulePrefs\u3001YukiHookDataChannel \u4EE5\u53CA Resources Hook \u529F\u80FD\u5C06\u5931\u6548\u3002

    `,27);function C(B,k){const e=o("ExternalLinkIcon");return p(),i("div",null,[t,n("p",null,[d,u,v,n("a",A,[y,c(e)]),m,b,D]),h])}const F=l(r,[["render",C],["__file","quick-start.html.vue"]]);export{F as default}; +

    \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\uFF0CYukiHookModuleStatus\u3001YukiHookModulePrefs\u3001YukiHookDataChannel \u4EE5\u53CA Resources Hook \u529F\u80FD\u5C06\u5931\u6548\u3002

    `,27);function C(h,g){const e=o("ExternalLinkIcon");return p(),i("div",null,[t,n("p",null,[d,u,A,n("a",v,[y,c(e)]),m,b,D]),B])}const F=l(r,[["render",C],["__file","quick-start.html.vue"]]);export{F as default}; diff --git a/docs/assets/r8-proguard.html.6013d73f.js b/docs/assets/r8-proguard.html.22bbf90d.js similarity index 97% rename from docs/assets/r8-proguard.html.6013d73f.js rename to docs/assets/r8-proguard.html.22bbf90d.js index a845c07a2..cb062b970 100644 --- a/docs/assets/r8-proguard.html.6013d73f.js +++ b/docs/assets/r8-proguard.html.22bbf90d.js @@ -1,2 +1,2 @@ -import{_ as e,o,c as r,a}from"./app.99fcdd51.js";const d={},s=a(`

    R8 \u4E0E Proguard \u6DF7\u6DC6

    \u5927\u90E8\u5206\u573A\u666F\u4E0B Xposed \u6A21\u5757\u53EF\u901A\u8FC7\u539F\u751F\u6DF7\u6DC6\u538B\u7F29\u4F53\u79EF\uFF0C\u8FD9\u91CC\u4ECB\u7ECD\u4E86\u6DF7\u6DC6\u7684\u914D\u7F6E\u65B9\u6CD5\u3002

    R8

    \u5982\u679C\u4F60\u4F7F\u7528\u7684\u662F R8\uFF0C\u90A3\u4E48\u4F60\u65E0\u9700\u5BF9 YukiHookAPI \u8FDB\u884C\u4EFB\u4F55\u7279\u6B8A\u914D\u7F6E\u3002

    Proguard

    \u5982\u679C\u4F60\u4ECD\u7136\u5728\u4F7F\u7528 Proguard\uFF0C\u4F60\u9700\u8981\u505A\u4E00\u4E9B\u89C4\u5219\u914D\u7F6E\u3002

    \u7279\u522B\u6CE8\u610F

    Proguard \u89C4\u5219\u5DF2\u88AB\u5F03\u7528\uFF0C\u8BF7\u4E0D\u8981\u518D\u4F7F\u7528\uFF0C\u81EA\u4ECE Android Gradle Plugin 4.2 \u540E\uFF0C\u62E5\u6709 Android Jetpack \u5957\u4EF6\u6700\u65B0\u7248\u672C\u7684\u6DF7\u6DC6\u5904\u7406\u7A0B\u5E8F\u9ED8\u8BA4\u5747\u4E3A R8\uFF0C\u4E0D\u518D\u9700\u8981\u8003\u8651\u6DF7\u6DC6\u7684\u95EE\u9898\u3002

    \u82E5\u8981\u5728\u4EFB\u4F55\u7248\u672C\u4E0B\u542F\u7528 R8\uFF0C\u8BF7\u5728 gradle.properties \u6587\u4EF6\u4E2D\u52A0\u5165\u5982\u4E0B\u89C4\u5219\uFF0CAndroid Gradle Plugin 7.0 \u53CA\u4EE5\u4E0A\u7248\u672C\u65E0\u9700\u4EFB\u4F55\u914D\u7F6E\u3002

    android.enableR8=true
    +import{_ as e,o,c as r,a}from"./app.6074a838.js";const d={},s=a(`

    R8 \u4E0E Proguard \u6DF7\u6DC6

    \u5927\u90E8\u5206\u573A\u666F\u4E0B Xposed \u6A21\u5757\u53EF\u901A\u8FC7\u539F\u751F\u6DF7\u6DC6\u538B\u7F29\u4F53\u79EF\uFF0C\u8FD9\u91CC\u4ECB\u7ECD\u4E86\u6DF7\u6DC6\u7684\u914D\u7F6E\u65B9\u6CD5\u3002

    R8

    \u5982\u679C\u4F60\u4F7F\u7528\u7684\u662F R8\uFF0C\u90A3\u4E48\u4F60\u65E0\u9700\u5BF9 YukiHookAPI \u8FDB\u884C\u4EFB\u4F55\u7279\u6B8A\u914D\u7F6E\u3002

    Proguard

    \u5982\u679C\u4F60\u4ECD\u7136\u5728\u4F7F\u7528 Proguard\uFF0C\u4F60\u9700\u8981\u505A\u4E00\u4E9B\u89C4\u5219\u914D\u7F6E\u3002

    \u7279\u522B\u6CE8\u610F

    Proguard \u89C4\u5219\u5DF2\u88AB\u5F03\u7528\uFF0C\u8BF7\u4E0D\u8981\u518D\u4F7F\u7528\uFF0C\u81EA\u4ECE Android Gradle Plugin 4.2 \u540E\uFF0C\u62E5\u6709 Android Jetpack \u5957\u4EF6\u6700\u65B0\u7248\u672C\u7684\u6DF7\u6DC6\u5904\u7406\u7A0B\u5E8F\u9ED8\u8BA4\u5747\u4E3A R8\uFF0C\u4E0D\u518D\u9700\u8981\u8003\u8651\u6DF7\u6DC6\u7684\u95EE\u9898\u3002

    \u82E5\u8981\u5728\u4EFB\u4F55\u7248\u672C\u4E0B\u542F\u7528 R8\uFF0C\u8BF7\u5728 gradle.properties \u6587\u4EF6\u4E2D\u52A0\u5165\u5982\u4E0B\u89C4\u5219\uFF0CAndroid Gradle Plugin 7.0 \u53CA\u4EE5\u4E0A\u7248\u672C\u65E0\u9700\u4EFB\u4F55\u914D\u7F6E\u3002

    android.enableR8=true
     
    `,9),n=[s];function c(l,t){return o(),r("div",null,n)}const p=e(d,[["render",c],["__file","r8-proguard.html.vue"]]);export{p as default}; diff --git a/docs/assets/r8-proguard.html.3e207302.js b/docs/assets/r8-proguard.html.f59eb363.js similarity index 96% rename from docs/assets/r8-proguard.html.3e207302.js rename to docs/assets/r8-proguard.html.f59eb363.js index ba7d2a81f..f1af06941 100644 --- a/docs/assets/r8-proguard.html.3e207302.js +++ b/docs/assets/r8-proguard.html.f59eb363.js @@ -1,2 +1,2 @@ -import{_ as e,o,c as a,a as r}from"./app.99fcdd51.js";const n={},s=r(`

    R8 & Proguard Obfuscate

    In most scenarios, the Xposed Module can be compressed by native obfuscation.

    Here is the configuration method of obfuscation.

    R8

    If you are using R8 then you don't need any special configuration for YukiHookAPI.

    Proguard

    If you are still using Proguard, you need to do some rule configuration.

    Pay Attention

    Proguard rules have been deprecated, please don't use them anymore.

    Since Android Gradle Plugin 4.2, the obfuscator with the latest version of the Android Jetpack default is R8, and you no longer need to consider obfuscation.

    To enable R8 in any version, please add the following rules to the gradle.properties file, no configuration is required for Android Gradle Plugin 7.0 and above.

    android.enableR8=true
    +import{_ as e,o,c as a,a as r}from"./app.6074a838.js";const n={},s=r(`

    R8 & Proguard Obfuscate

    In most scenarios, the Xposed Module can be compressed by native obfuscation.

    Here is the configuration method of obfuscation.

    R8

    If you are using R8 then you don't need any special configuration for YukiHookAPI.

    Proguard

    If you are still using Proguard, you need to do some rule configuration.

    Pay Attention

    Proguard rules have been deprecated, please don't use them anymore.

    Since Android Gradle Plugin 4.2, the obfuscator with the latest version of the Android Jetpack default is R8, and you no longer need to consider obfuscation.

    To enable R8 in any version, please add the following rules to the gradle.properties file, no configuration is required for Android Gradle Plugin 7.0 and above.

    android.enableR8=true
     
    `,9),t=[s];function d(c,i){return o(),a("div",null,t)}const u=e(n,[["render",d],["__file","r8-proguard.html.vue"]]);export{u as default}; diff --git a/docs/assets/reflection.html.31159190.js b/docs/assets/reflection.html.01ee432f.js similarity index 92% rename from docs/assets/reflection.html.31159190.js rename to docs/assets/reflection.html.01ee432f.js index 6928c1824..7e93ad704 100644 --- a/docs/assets/reflection.html.31159190.js +++ b/docs/assets/reflection.html.01ee432f.js @@ -1,4 +1,4 @@ -import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js";const i={},r=n(`

    Reflection Extensions

    YukiHookAPI encapsulates a set of reflection API with near-zero reflection writing for developers, which can almost completely replace the usage of reflection API in Java.

    Class Extensions

    Here are the extension functions related to the Class object itself.

    Object Conversion

    Suppose we want to get a Class that cannot be called directly.

    Normally, we can use the standard reflection API to find this Class.

    The following example

    // Class in the default ClassLoader environment
    +import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.6074a838.js";const i={},r=n(`

    Reflection Extensions

    YukiHookAPI encapsulates a set of reflection API with near-zero reflection writing for developers, which can almost completely replace the usage of reflection API in Java.

    Class Extensions

    Here are the extension functions related to the Class object itself.

    Object Conversion

    Suppose we want to get a Class that cannot be called directly.

    Normally, we can use the standard reflection API to find this Class.

    The following example

    // Class in the default ClassLoader environment
     var instance = Class.forName("com.demo.Test")
     // Specify the Class in the ClassLoader environment
     val customClassLoader: ClassLoader? = ... // Assume this is your ClassLoader
    @@ -100,10 +100,10 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         implements("java.io.Serializable")
         // Specify the type and style of the constructor
         // And the number count that exists in the current class
    -    constructor { param(StringType) }.count(num = 1)
    +    constructor { param(StringClass) }.count(num = 1)
         // Specify the type and style of the variable
         // And the number that exists in the current class count
    -    field { type = StringType }.count(num = 2)
    +    field { type = StringClass }.count(num = 2)
         // Specify the type and style of the variable
         // And the number that exists in the current class count
         field { type = BooleanType }.count(num = 1)
    @@ -123,15 +123,15 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // Specify the modifier, and the number count in the current class
         method {
             modifiers { isStatic && isPrivate }
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }.count(num = 1)
         // Specify the type and style of the method
         // Specify the modifier, and the number count in the current class
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, StringType)
    -        returnType = StringType
    +        param(BooleanType, StringClass)
    +        returnType = StringClass
         }.count(num = 1)
         // Specify the type and style of the method
         // Specify the modifier, and the number count in the current class
    @@ -145,7 +145,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // And the number count that exists in the current class
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, VagueType, VagueType, StringType)
    +        param(BooleanType, VagueType, VagueType, StringClass)
             returnType = UnitType
         }.count(num = 1)
         // Directly specify the number of all methods that exist in the current class count
    @@ -297,7 +297,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doTask"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    Tips

    For more features, please refer to MethodFinder.

    Similarly, we need to get the isTaskRunning field can also be written as follows.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -316,7 +316,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     Test::class.java.method {
         name = "getName"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get(instance).string() // Get the result of the method
     

    Through observation, it is found that there is only one method named getName in this Class, so can we make it simpler?

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -341,14 +341,23 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         name = "release"
         // Use VagueType to fill in the type you don't want to fill in
         // While ensuring that other types can match
    -    param(StringType, VagueType, BooleanType)
    +    param(StringClass, VagueType, BooleanType)
     }.get(instance) // Get this method
    -

    Find in Super Class

    You will notice that Test extends BaseTest, now we want to get the doBaseTask method of BaseTest, how do we do it without knowing the name of the super class?

    Referring to the above find conditions, we only need to add a superClass to the find conditions to achieve this function.

    The following example

    // Assume this is an instance of this Class
    +

    If you are not sure about the type of each parameter, you can create a conditional method body with the param { ... } method.

    The following example

    // Assume this is an instance of this Class
    +val instance = Test()
    +// Call and execute using YukiHookAPI
    +Test::class.java.method {
    +     name = "release"
    +     // Get the it (Class) method parameter type array instance
    +     // To only determine the known type and its position
    +     param { it[0] == StringClass && it[2] == BooleanType }
    +}.get(instance) // Get this method
    +

    Tips

    Use param { ... } to create a conditional method body, where the variable it is the Class type array instance of the current method parameter, and you can freely use Class all objects and their methods in.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.type, MethodFinder.param, MethodFinder.returnType, ConstructorFinder.param method.

    Find in Super Class

    You will notice that Test extends BaseTest, now we want to get the doBaseTask method of BaseTest, how do we do it without knowing the name of the super class?

    Referring to the above find conditions, we only need to add a superClass to the find conditions to achieve this function.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // Just add this condition
         superClass()
     }.get(instance).call("task_name")
    @@ -357,7 +366,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // Add a find condition
         superClass(isOnlySuperClass = true)
     }.get(instance).call("task_name")
    @@ -369,7 +378,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
             // Set name is case insensitive
             it.equals("dotask", isIgnoreCase = true)
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    Knowing that there is currently only one doTask method in Class, we can also judge that the method name contains only the characters specified in it.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -379,7 +388,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
             // Only contains oTas
             it.contains("oTas")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    We can also judge based on the first and last strings.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -389,7 +398,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
             // Contains do at the beginning and Task at the end
             it.startsWith("do") && it.endsWith("Task")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    By observing that this method name contains only letters, we can add a precise search condition.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -399,9 +408,9 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
             // Start with do, end with Task, just letters
             it.startsWith("do") && it.endsWith("Task") && it.isOnlyLetters()
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
    -

    Tips

    Use name { ... } to create a conditional method body, where the variable it is the string of the current name, and you can freely use it in the extension method of NameRules function.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to NameRules.

    Multiple Find

    Sometimes, we may need to find a set of methods, constructors, and fields with the same characteristics in a Class.

    At this time, we can use relative condition matching to complete.

    Based on the result of the find condition, we only need to replace get with all to get all the bytecodes that match the condition.

    Suppose this time we want to get all methods in Class with the number of method parameters in the range 1..3, you can use the following implementation.

    The following example

    // Assume this is an instance of this Class
    +

    Tips

    Use name { ... } to create a conditional method body, where the variable it is the string of the current name, and you can freely use it in the extension method of NameRules function.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.name, MethodFinder.name methods and NameRules.

    Multiple Find

    Sometimes, we may need to find a set of methods, constructors, and fields with the same characteristics in a Class.

    At this time, we can use relative condition matching to complete.

    Based on the result of the find condition, we only need to replace get with all to get all the bytecodes that match the condition.

    Suppose this time we want to get all methods in Class with the number of method parameters in the range 1..3, you can use the following implementation.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
    @@ -428,13 +437,13 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // Call and execute each method
         instance.call(...)
     }
    -

    The above example can be perfectly matched to the following 2 methods.

    private void b()

    private void b(String a)

    Tips

    Use paramCount { ... } to create a conditional method body, where the variable it is the integer of the current number of parameters, and you can use it freely in the extension method of CountRules function in it.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to CountRules.

    Static Bytecode

    Some methods and fields are statically implemented in Class, at this time, we can call them without passing in an instance.

    Suppose we want to get the contents of the static field TAG this time.

    The following example

    Test::class.java.field {
    +

    The above example can be perfectly matched to the following 2 methods.

    private void b()

    private void b(String a)

    Tips

    Use paramCount { ... } to create a conditional method body, where the variable it is the integer of the current number of parameters, and you can use it freely in the extension method of CountRules function in it.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to MethodFinder.paramCount, ConstructorFinder.paramCount methods and CountRules.

    Static Bytecode

    Some methods and fields are statically implemented in Class, at this time, we can call them without passing in an instance.

    Suppose we want to get the contents of the static field TAG this time.

    The following example

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
     }.get().string() // The type of Field is string and can be cast directly
     

    Assuming that there is a non-static TAG field with the same name in Class, what should I do at this time?

    Just add a filter.

    The following example

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
         // This field to identify the lookup needs to be static
         modifiers { isStatic }
     }.get().string() // The type of Field is string and can be cast directly
    @@ -448,7 +457,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // This method of identity find needs to be static
         modifiers { isStatic }
     }.get().call()
    -

    Tips

    Use modifiers { ... } to create a conditional method body, at which point you can freely use its functionality in ModifierRules.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more features, please refer to ModifierRules.

    Obfuscated Bytecode

    You may have noticed that the example Class given here has two obfuscated field names, both of which are a, how do we get them at this time?

    There are two options.

    The first option is to determine the name and type of the field.

    The following example

    // Assume this is an instance of this Class
    +

    Tips

    Use modifiers { ... } to create a conditional method body, at which point you can freely use its functionality in ModifierRules.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.modifiers, MethodFinder.modifiers, ConstructorFinder.modifiers methods and ModifierRules.

    Obfuscated Bytecode

    You may have noticed that the example Class given here has two obfuscated field names, both of which are a, how do we get them at this time?

    There are two options.

    The first option is to determine the name and type of the field.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.field {
    @@ -466,13 +475,13 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "b"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("test_string") // Get the method whose name is b and whose parameter is [String]
     

    The second option is to determine where the parameters of the method are located.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
    -    param(StringType).index().first()
    +    param(StringClass).index().first()
     }.get(instance).call("test_string") // Get the method whose first method parameter is [String]
     

    Since it is observed that this method is last in Class, then we have an alternative.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -487,7 +496,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // Execute the doTask method
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
         // Execute the stop method
         method {
    @@ -504,7 +513,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         // Execute the doBaseTask method of the parent class
         superClass().method {
             name = "doBaseTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    If you don't like to use a lambda to create the namespace of the current instance, you can use the current() method directly.

    The following example

    // Assuming this is an instance of this Class, this Class cannot be obtained directly
    @@ -514,7 +523,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         .current()
         .method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     // Execute the stop method
     instance
    @@ -531,7 +540,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     instance.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }.current()
         .method {
    @@ -551,7 +560,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         }.current {
             method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }.call("task_name")
         }
         // <Plan 2>
    @@ -560,7 +569,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         }.current()
             ?.method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }?.call("task_name")
     }
     

    Notice

    The above current method is equivalent to calling the field { ... }.any()?.current() method in CurrentClass for you.

    If there is no CurrentClass calling field, you need to use field { ... }.get(instance).current() to call it.

    The problem comes again, I want to use reflection to create the following instance and call the method in it, how to do it?

    The following example

    Test(true).doTask("task_name")
    @@ -577,7 +586,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     

    But I feel that this approach is very troublesome.

    Is there a more concise way to call it?

    At this time, we can also use the buildOf method to create an instance.

    The following example

    "com.demo.Test".toClass().buildOf(true) { param(BooleanType) }?.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    If you want the buildOf method to return the type of the current instance, you can include a type-generic declaration in it instead of using as to cast the target type.

    In this case, the constructor of the instance itself is private, but the method inside is public, so we only need to create its constructor by reflection.

    The following example

    // Assume this Class can be obtained directly
    @@ -594,7 +603,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
             method {
                 name = "getString"
                 emptyParam()
    -            returnType = StringType
    +            returnType = StringClass
             }
             replaceTo("Hooked")
         }
    @@ -603,13 +612,13 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().string()
     

    If we want to get the original method and result of this method without hooking, we just need to add original to the result.

    The following example

    // Result will be "Original"
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().original().string()
     

    Tips

    For more functions, please refer to the MethodFinder.Result.original method.

    Find Again

    Suppose there are three different versions of Class, all of which are the same Class for different versions of this Host App.

    There is also a method doTask in it, assuming they function the same.

    The following example of version A

    public class Test {
     
    @@ -638,13 +647,13 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     }.remedys {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.onFind {
             // Found logic can be implemented here
         }
         method {
             name = "doTask"
    -        param(StringType, IntType)
    +        param(StringClass, IntType)
         }.onFind {
             // Found logic can be implemented here
         }
    @@ -782,7 +791,7 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
         name = "test"
         param(BooleanType).index(num = 2)
         // \u2757 Wrong usage, please keep only one index method
    -    returnType(StringType).index(num = 1)
    +    returnType(StringClass).index(num = 1)
     }
     

    The following find conditions can be used without any problems.

    The following example

    method {
         name = "test"
    @@ -825,14 +834,14 @@ import{_ as e,r as l,o,c as p,b as s,d as t,a as n,e as c}from"./app.99fcdd51.js
     }.get().boolean().toString() // \u2705 The correct way to use, get the type and then convert
     

    Common Type Extensions

    When find methods and fields, we usually need to specify the type in find conditions.

    The following example

    field {
         name = "test"
    -    type = Boolean::class.java
    +    type = Boolean::class.javaPrimitiveType
     }
    -

    Expressing the type Boolean::class.java in Kotlin is very long and not convenient.

    Therefore, YukiHookAPI encapsulates common type calls for developers, including Android's basic types and Java's basic types.

    At this time, the above type can be written in the following form.

    The following example

    field {
    +

    Expressing the type of Boolean::class.javaPrimitiveType in Kotlin is very long and inconvenient.

    Therefore, YukiHookAPI encapsulates common type calls for developers, including Android related types and Java common types and primitive type keywords.

    At this time, the above type can be written in the following form.

    The following example

    field {
         name = "test"
         type = BooleanType
     }
    -

    Common basic types in Java have been encapsulated as Name + Type, such as IntType, FloatType.

    Correspondingly, array types also have convenient usage methods, assuming we want to get an array of type String[].

    You need to write java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass to get this type.

    Does it feel very troublesome? At this time, we can use the extension method ArrayClass(StringType) to get this type.

    At the same time, since String is a common type, you can also directly use StringArrayClass to get this type.

    Some common methods found in Hook have their corresponding encapsulation types for use, in the format Name + Class.

    For example, the Hook onCreate method needs to find the Bundle::class.java type.

    The following example

    method {
    +

    The primitive type keywords in common Java types have been encapsulated as Type(Class Name) + Type, such as IntType, FloatType (their bytecode types are int, float).

    Correspondingly, array types also have convenient usage methods, assuming we want to get an array of type String[].

    You need to write java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass to get this type.

    Does it feel very troublesome, at this time we can use the method ArrayClass(StringClass) to get this type.

    At the same time, since String is a common type, you can also directly use StringArrayClass to get this type.

    Some common methods found in Hook have their corresponding encapsulation types for use, in the format Type(Class Name) + Class.

    For example, the Hook onCreate method needs to look up the Bundle::class.java type.

    The following example

    method {
         name = "onCreate"
         param(BundleClass)
     }
    -

    At the same time, you are welcome to contribute more commonly used types.

    `,367);function m(v,h){const a=l("Badge");return o(),p("div",null,[r,s("h3",d,[y,A,t(a,{type:"tip",text:"Beta",vertical:"middle"})]),u])}const D=e(i,[["render",m],["__file","reflection.html.vue"]]);export{D as default}; +

    The following are wrapper names for some special case types in Java represented in YukiHookAPI.

    • void \u2192 UnitType

    • java.lang.Void \u2192 UnitClass

    • java.lang.Object \u2192 AnyClass

    • java.lang.Integer \u2192 IntClass

    • java.lang.Character \u2192 CharClass

    Notice

    Encapsulating types with Type(Class Name) + Type will and only be represented as Java primitive type keywords.

    Since the concept of primitive types does not exist in Kotlin, they will all be defined as KClass.

    There are 9 primitive type keywords in Java, of which 8 are primitive type, namely boolean, char, byte, short , int, float, long, double, of which the void type is a special case.

    At the same time, they all have their own corresponding package types in Java, such as java.lang.Boolean, java.lang.Integer, these types are unequal, Please note the distinction.

    Similarly, arrays also have corresponding wrapper types, which also need to be distinguished from Java primitive type keywords.

    For example, the encapsulation type of byte[] is ByteArrayType or ArrayClass(ByteType), and the encapsulation type of Byte[] is ByteArrayClass or ArrayClass(ByteClass ), these types are also unequal.

    At the same time, you are welcome to contribute more commonly used types.

    `,374);function m(v,h){const a=l("Badge");return o(),p("div",null,[r,s("h3",d,[y,A,t(a,{type:"tip",text:"Beta",vertical:"middle"})]),u])}const D=e(i,[["render",m],["__file","reflection.html.vue"]]);export{D as default}; diff --git a/docs/assets/reflection.html.2e612549.js b/docs/assets/reflection.html.0e88a14d.js similarity index 95% rename from docs/assets/reflection.html.2e612549.js rename to docs/assets/reflection.html.0e88a14d.js index 28f3209bd..fe97968f4 100644 --- a/docs/assets/reflection.html.2e612549.js +++ b/docs/assets/reflection.html.0e88a14d.js @@ -1 +1 @@ -const l=JSON.parse('{"key":"v-001858e3","path":"/zh-cn/api/special-features/reflection.html","title":"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Class \u6269\u5C55","slug":"class-\u6269\u5C55","link":"#class-\u6269\u5C55","children":[{"level":3,"title":"\u5BF9\u8C61\u8F6C\u6362","slug":"\u5BF9\u8C61\u8F6C\u6362","link":"#\u5BF9\u8C61\u8F6C\u6362","children":[]},{"level":3,"title":"\u5B58\u5728\u5224\u65AD","slug":"\u5B58\u5728\u5224\u65AD","link":"#\u5B58\u5728\u5224\u65AD","children":[]},{"level":3,"title":"\u6A21\u7CCA\u67E5\u627E","slug":"\u6A21\u7CCA\u67E5\u627E","link":"#\u6A21\u7CCA\u67E5\u627E","children":[]}]},{"level":2,"title":"Member \u6269\u5C55","slug":"member-\u6269\u5C55","link":"#member-\u6269\u5C55","children":[{"level":3,"title":"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","slug":"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","link":"#\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","children":[]},{"level":3,"title":"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","slug":"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","link":"#\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","children":[]},{"level":3,"title":"\u5728\u7236\u7C7B\u67E5\u627E","slug":"\u5728\u7236\u7C7B\u67E5\u627E","link":"#\u5728\u7236\u7C7B\u67E5\u627E","children":[]},{"level":3,"title":"\u6A21\u7CCA\u67E5\u627E","slug":"\u6A21\u7CCA\u67E5\u627E-1","link":"#\u6A21\u7CCA\u67E5\u627E-1","children":[]},{"level":3,"title":"\u591A\u91CD\u67E5\u627E","slug":"\u591A\u91CD\u67E5\u627E-1","link":"#\u591A\u91CD\u67E5\u627E-1","children":[]},{"level":3,"title":"\u9759\u6001\u5B57\u8282\u7801","slug":"\u9759\u6001\u5B57\u8282\u7801","link":"#\u9759\u6001\u5B57\u8282\u7801","children":[]},{"level":3,"title":"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","slug":"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","link":"#\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","children":[]},{"level":3,"title":"\u76F4\u63A5\u8C03\u7528","slug":"\u76F4\u63A5\u8C03\u7528","link":"#\u76F4\u63A5\u8C03\u7528","children":[]},{"level":3,"title":"\u539F\u59CB\u8C03\u7528","slug":"\u539F\u59CB\u8C03\u7528","link":"#\u539F\u59CB\u8C03\u7528","children":[]},{"level":3,"title":"\u518D\u6B21\u67E5\u627E","slug":"\u518D\u6B21\u67E5\u627E","link":"#\u518D\u6B21\u67E5\u627E","children":[]},{"level":3,"title":"\u76F8\u5BF9\u5339\u914D","slug":"\u76F8\u5BF9\u5339\u914D","link":"#\u76F8\u5BF9\u5339\u914D","children":[]},{"level":3,"title":"\u8C03\u7528\u6CDB\u578B","slug":"\u8C03\u7528\u6CDB\u578B","link":"#\u8C03\u7528\u6CDB\u578B","children":[]},{"level":3,"title":"\u6CE8\u610F\u8BEF\u533A","slug":"\u6CE8\u610F\u8BEF\u533A","link":"#\u6CE8\u610F\u8BEF\u533A","children":[]}]},{"level":2,"title":"\u5E38\u7528\u7C7B\u578B\u6269\u5C55","slug":"\u5E38\u7528\u7C7B\u578B\u6269\u5C55","link":"#\u5E38\u7528\u7C7B\u578B\u6269\u5C55","children":[]}],"git":{"updatedTime":1664281516000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":6}]},"filePathRelative":"zh-cn/api/special-features/reflection.md"}');export{l as data}; +const l=JSON.parse('{"key":"v-001858e3","path":"/zh-cn/api/special-features/reflection.html","title":"\u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Class \u6269\u5C55","slug":"class-\u6269\u5C55","link":"#class-\u6269\u5C55","children":[{"level":3,"title":"\u5BF9\u8C61\u8F6C\u6362","slug":"\u5BF9\u8C61\u8F6C\u6362","link":"#\u5BF9\u8C61\u8F6C\u6362","children":[]},{"level":3,"title":"\u5B58\u5728\u5224\u65AD","slug":"\u5B58\u5728\u5224\u65AD","link":"#\u5B58\u5728\u5224\u65AD","children":[]},{"level":3,"title":"\u6A21\u7CCA\u67E5\u627E","slug":"\u6A21\u7CCA\u67E5\u627E","link":"#\u6A21\u7CCA\u67E5\u627E","children":[]}]},{"level":2,"title":"Member \u6269\u5C55","slug":"member-\u6269\u5C55","link":"#member-\u6269\u5C55","children":[{"level":3,"title":"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","slug":"\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","link":"#\u67E5\u627E\u4E0E\u53CD\u5C04\u8C03\u7528","children":[]},{"level":3,"title":"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","slug":"\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","link":"#\u53EF\u9009\u7684\u67E5\u627E\u6761\u4EF6","children":[]},{"level":3,"title":"\u5728\u7236\u7C7B\u67E5\u627E","slug":"\u5728\u7236\u7C7B\u67E5\u627E","link":"#\u5728\u7236\u7C7B\u67E5\u627E","children":[]},{"level":3,"title":"\u6A21\u7CCA\u67E5\u627E","slug":"\u6A21\u7CCA\u67E5\u627E-1","link":"#\u6A21\u7CCA\u67E5\u627E-1","children":[]},{"level":3,"title":"\u591A\u91CD\u67E5\u627E","slug":"\u591A\u91CD\u67E5\u627E-1","link":"#\u591A\u91CD\u67E5\u627E-1","children":[]},{"level":3,"title":"\u9759\u6001\u5B57\u8282\u7801","slug":"\u9759\u6001\u5B57\u8282\u7801","link":"#\u9759\u6001\u5B57\u8282\u7801","children":[]},{"level":3,"title":"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","slug":"\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","link":"#\u6DF7\u6DC6\u7684\u5B57\u8282\u7801","children":[]},{"level":3,"title":"\u76F4\u63A5\u8C03\u7528","slug":"\u76F4\u63A5\u8C03\u7528","link":"#\u76F4\u63A5\u8C03\u7528","children":[]},{"level":3,"title":"\u539F\u59CB\u8C03\u7528","slug":"\u539F\u59CB\u8C03\u7528","link":"#\u539F\u59CB\u8C03\u7528","children":[]},{"level":3,"title":"\u518D\u6B21\u67E5\u627E","slug":"\u518D\u6B21\u67E5\u627E","link":"#\u518D\u6B21\u67E5\u627E","children":[]},{"level":3,"title":"\u76F8\u5BF9\u5339\u914D","slug":"\u76F8\u5BF9\u5339\u914D","link":"#\u76F8\u5BF9\u5339\u914D","children":[]},{"level":3,"title":"\u8C03\u7528\u6CDB\u578B","slug":"\u8C03\u7528\u6CDB\u578B","link":"#\u8C03\u7528\u6CDB\u578B","children":[]},{"level":3,"title":"\u6CE8\u610F\u8BEF\u533A","slug":"\u6CE8\u610F\u8BEF\u533A","link":"#\u6CE8\u610F\u8BEF\u533A","children":[]}]},{"level":2,"title":"\u5E38\u7528\u7C7B\u578B\u6269\u5C55","slug":"\u5E38\u7528\u7C7B\u578B\u6269\u5C55","link":"#\u5E38\u7528\u7C7B\u578B\u6269\u5C55","children":[]}],"git":{"updatedTime":1672424518000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":8}]},"filePathRelative":"zh-cn/api/special-features/reflection.md"}');export{l as data}; diff --git a/docs/assets/reflection.html.ff24950f.js b/docs/assets/reflection.html.2a870d09.js similarity index 94% rename from docs/assets/reflection.html.ff24950f.js rename to docs/assets/reflection.html.2a870d09.js index 7373d71f4..22af9bf17 100644 --- a/docs/assets/reflection.html.ff24950f.js +++ b/docs/assets/reflection.html.2a870d09.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-581ddb9c","path":"/en/api/special-features/reflection.html","title":"Reflection Extensions","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Class Extensions","slug":"class-extensions","link":"#class-extensions","children":[{"level":3,"title":"Object Conversion","slug":"object-conversion","link":"#object-conversion","children":[]},{"level":3,"title":"Existential Judgment","slug":"existential-judgment","link":"#existential-judgment","children":[]},{"level":3,"title":"Vague Search","slug":"vague-search","link":"#vague-search","children":[]}]},{"level":2,"title":"Member Extensions","slug":"member-extensions","link":"#member-extensions","children":[{"level":3,"title":"Find and Reflection","slug":"find-and-reflection","link":"#find-and-reflection","children":[]},{"level":3,"title":"Optional Find Conditions","slug":"optional-find-conditions","link":"#optional-find-conditions","children":[]},{"level":3,"title":"Find in Super Class","slug":"find-in-super-class","link":"#find-in-super-class","children":[]},{"level":3,"title":"Vague Find","slug":"vague-find","link":"#vague-find","children":[]},{"level":3,"title":"Multiple Find","slug":"multiple-find","link":"#multiple-find","children":[]},{"level":3,"title":"Static Bytecode","slug":"static-bytecode","link":"#static-bytecode","children":[]},{"level":3,"title":"Obfuscated Bytecode","slug":"obfuscated-bytecode","link":"#obfuscated-bytecode","children":[]},{"level":3,"title":"Directly Called","slug":"directly-called","link":"#directly-called","children":[]},{"level":3,"title":"Original Called","slug":"original-called","link":"#original-called","children":[]},{"level":3,"title":"Find Again","slug":"find-again","link":"#find-again","children":[]},{"level":3,"title":"Relative Matching","slug":"relative-matching","link":"#relative-matching","children":[]},{"level":3,"title":"Calling Generics","slug":"calling-generics","link":"#calling-generics","children":[]},{"level":3,"title":"Pay Attention of Trap","slug":"pay-attention-of-trap","link":"#pay-attention-of-trap","children":[]}]},{"level":2,"title":"Common Type Extensions","slug":"common-type-extensions","link":"#common-type-extensions","children":[]}],"git":{"updatedTime":1664281530000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/special-features/reflection.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-581ddb9c","path":"/en/api/special-features/reflection.html","title":"Reflection Extensions","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Class Extensions","slug":"class-extensions","link":"#class-extensions","children":[{"level":3,"title":"Object Conversion","slug":"object-conversion","link":"#object-conversion","children":[]},{"level":3,"title":"Existential Judgment","slug":"existential-judgment","link":"#existential-judgment","children":[]},{"level":3,"title":"Vague Search","slug":"vague-search","link":"#vague-search","children":[]}]},{"level":2,"title":"Member Extensions","slug":"member-extensions","link":"#member-extensions","children":[{"level":3,"title":"Find and Reflection","slug":"find-and-reflection","link":"#find-and-reflection","children":[]},{"level":3,"title":"Optional Find Conditions","slug":"optional-find-conditions","link":"#optional-find-conditions","children":[]},{"level":3,"title":"Find in Super Class","slug":"find-in-super-class","link":"#find-in-super-class","children":[]},{"level":3,"title":"Vague Find","slug":"vague-find","link":"#vague-find","children":[]},{"level":3,"title":"Multiple Find","slug":"multiple-find","link":"#multiple-find","children":[]},{"level":3,"title":"Static Bytecode","slug":"static-bytecode","link":"#static-bytecode","children":[]},{"level":3,"title":"Obfuscated Bytecode","slug":"obfuscated-bytecode","link":"#obfuscated-bytecode","children":[]},{"level":3,"title":"Directly Called","slug":"directly-called","link":"#directly-called","children":[]},{"level":3,"title":"Original Called","slug":"original-called","link":"#original-called","children":[]},{"level":3,"title":"Find Again","slug":"find-again","link":"#find-again","children":[]},{"level":3,"title":"Relative Matching","slug":"relative-matching","link":"#relative-matching","children":[]},{"level":3,"title":"Calling Generics","slug":"calling-generics","link":"#calling-generics","children":[]},{"level":3,"title":"Pay Attention of Trap","slug":"pay-attention-of-trap","link":"#pay-attention-of-trap","children":[]}]},{"level":2,"title":"Common Type Extensions","slug":"common-type-extensions","link":"#common-type-extensions","children":[]}],"git":{"updatedTime":1672424518000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/api/special-features/reflection.md"}');export{e as data}; diff --git a/docs/assets/reflection.html.4d705ea1.js b/docs/assets/reflection.html.c2b91b4b.js similarity index 91% rename from docs/assets/reflection.html.4d705ea1.js rename to docs/assets/reflection.html.c2b91b4b.js index 492b3f38d..3533ebfb8 100644 --- a/docs/assets/reflection.html.4d705ea1.js +++ b/docs/assets/reflection.html.c2b91b4b.js @@ -1,4 +1,4 @@ -import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd51.js";const i={},t=n(`

    \u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55

    YukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u4E00\u5957\u63A5\u8FD1\u96F6\u53CD\u5C04\u5199\u6CD5\u7684\u53CD\u5C04 API\uFF0C\u5B83\u51E0\u4E4E\u53EF\u4EE5\u5B8C\u5168\u53D6\u4EE3\u539F\u751F Java \u7684\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u3002

    Class \u6269\u5C55

    \u8FD9\u91CC\u662F Class \u5BF9\u8C61\u81EA\u8EAB\u76F8\u5173\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u5BF9\u8C61\u8F6C\u6362

    \u5047\u8BBE\u6211\u4EEC\u8981\u5F97\u5230\u4E00\u4E2A\u4E0D\u80FD\u76F4\u63A5\u8C03\u7528\u7684 Class\uFF0C\u901A\u5E38\u60C5\u51B5\u4E0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6807\u51C6\u7684\u53CD\u5C04 API \u53BB\u67E5\u627E\u8FD9\u4E2A Class\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u9ED8\u8BA4 ClassLoader \u73AF\u5883\u4E0B\u7684 Class
    +import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.6074a838.js";const i={},t=n(`

    \u5B57\u8282\u7801\u4E0E\u53CD\u5C04\u6269\u5C55

    YukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u4E00\u5957\u63A5\u8FD1\u96F6\u53CD\u5C04\u5199\u6CD5\u7684\u53CD\u5C04 API\uFF0C\u5B83\u51E0\u4E4E\u53EF\u4EE5\u5B8C\u5168\u53D6\u4EE3\u539F\u751F Java \u7684\u53CD\u5C04 API \u76F8\u5173\u7528\u6CD5\u3002

    Class \u6269\u5C55

    \u8FD9\u91CC\u662F Class \u5BF9\u8C61\u81EA\u8EAB\u76F8\u5173\u7684\u6269\u5C55\u529F\u80FD\u3002

    \u5BF9\u8C61\u8F6C\u6362

    \u5047\u8BBE\u6211\u4EEC\u8981\u5F97\u5230\u4E00\u4E2A\u4E0D\u80FD\u76F4\u63A5\u8C03\u7528\u7684 Class\uFF0C\u901A\u5E38\u60C5\u51B5\u4E0B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6807\u51C6\u7684\u53CD\u5C04 API \u53BB\u67E5\u627E\u8FD9\u4E2A Class\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u9ED8\u8BA4 ClassLoader \u73AF\u5883\u4E0B\u7684 Class
     var instance = Class.forName("com.demo.Test")
     // \u6307\u5B9A ClassLoader \u73AF\u5883\u4E0B\u7684 Class
     val customClassLoader: ClassLoader? = ... // \u5047\u8BBE\u8FD9\u4E2A\u5C31\u662F\u4F60\u7684 ClassLoader
    @@ -92,9 +92,9 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6307\u5B9A\u5B9E\u73B0\u7684\u63A5\u53E3\uFF0C\u53EF\u4EE5\u76F4\u63A5\u5199\u4E3A\u5B8C\u6574\u7C7B\u540D\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u540C\u65F6\u6307\u5B9A\u591A\u4E2A
         implements("java.io.Serializable")
         // \u6307\u5B9A\u6784\u9020\u65B9\u6CD5\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
    -    constructor { param(StringType) }.count(num = 1)
    +    constructor { param(StringClass) }.count(num = 1)
         // \u6307\u5B9A\u53D8\u91CF\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
    -    field { type = StringType }.count(num = 2)
    +    field { type = StringClass }.count(num = 2)
         // \u6307\u5B9A\u53D8\u91CF\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
         field { type = BooleanType }.count(num = 1)
         // \u76F4\u63A5\u6307\u5B9A\u6240\u6709\u53D8\u91CF\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
    @@ -110,14 +110,14 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6307\u5B9A\u65B9\u6CD5\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u540C\u65F6\u6307\u5B9A\u4FEE\u9970\u7B26\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
         method {
             modifiers { isStatic && isPrivate }
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }.count(num = 1)
         // \u6307\u5B9A\u65B9\u6CD5\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u540C\u65F6\u6307\u5B9A\u4FEE\u9970\u7B26\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, StringType)
    -        returnType = StringType
    +        param(BooleanType, StringClass)
    +        returnType = StringClass
         }.count(num = 1)
         // \u6307\u5B9A\u65B9\u6CD5\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u540C\u65F6\u6307\u5B9A\u4FEE\u9970\u7B26\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
         method {
    @@ -128,7 +128,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6307\u5B9A\u65B9\u6CD5\u7684\u7C7B\u578B\u4E0E\u6837\u5F0F\uFF0C\u540C\u65F6\u6307\u5B9A\u4FEE\u9970\u7B26\u548C\u6A21\u7CCA\u7C7B\u578B VagueType\uFF0C\u4EE5\u53CA\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, VagueType, VagueType, StringType)
    +        param(BooleanType, VagueType, VagueType, StringClass)
             returnType = UnitType
         }.count(num = 1)
         // \u76F4\u63A5\u6307\u5B9A\u6240\u6709\u65B9\u6CD5\u5728\u5F53\u524D\u7C7B\u4E2D\u5B58\u5728\u7684\u4E2A\u6570 count
    @@ -278,7 +278,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
         name = "doTask"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 MethodFinder\u3002

    \u540C\u6837\u5730\uFF0C\u6211\u4EEC\u9700\u8981\u5F97\u5230 isTaskRunning \u53D8\u91CF\u4E5F\u53EF\u4EE5\u5199\u4F5C\u5982\u4E0B\u5F62\u5F0F\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -297,7 +297,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     Test::class.java.method {
         name = "getName"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get(instance).string() // \u5F97\u5230\u65B9\u6CD5\u7684\u7ED3\u679C
     

    \u901A\u8FC7\u89C2\u5BDF\u53D1\u73B0\uFF0C\u8FD9\u4E2A Class \u4E2D\u53EA\u6709\u4E00\u4E2A\u540D\u4E3A getName \u7684\u65B9\u6CD5\uFF0C\u90A3\u6211\u4EEC\u53EF\u4E0D\u53EF\u4EE5\u518D\u7B80\u5355\u4E00\u70B9\u5462\uFF1F

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -320,14 +320,22 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     Test::class.java.method {
         name = "release"
         // \u4F7F\u7528 VagueType \u6765\u586B\u5145\u4E0D\u60F3\u586B\u5199\u7684\u7C7B\u578B\uFF0C\u540C\u65F6\u4FDD\u8BC1\u5176\u5B83\u7C7B\u578B\u80FD\u591F\u5339\u914D
    -    param(StringType, VagueType, BooleanType)
    +    param(StringClass, VagueType, BooleanType)
     }.get(instance) // \u5F97\u5230\u8FD9\u4E2A\u65B9\u6CD5
    -

    \u5728\u7236\u7C7B\u67E5\u627E

    \u4F60\u4F1A\u6CE8\u610F\u5230 Test \u7EE7\u627F\u4E8E BaseTest\uFF0C\u73B0\u5728\u6211\u4EEC\u60F3\u5F97\u5230 BaseTest \u7684 doBaseTask \u65B9\u6CD5\uFF0C\u5728\u4E0D\u77E5\u9053\u7236\u7C7B\u540D\u79F0\u7684\u60C5\u51B5\u4E0B\uFF0C\u8981\u600E\u4E48\u505A\u5462\uFF1F

    \u53C2\u7167\u4E0A\u9762\u7684\u67E5\u627E\u6761\u4EF6\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u52A0\u5165\u4E00\u4E2A superClass \u5373\u53EF\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
    +

    \u5982\u679C\u4F60\u5E76\u4E0D\u786E\u5B9A\u6BCF\u4E00\u4E2A\u53C2\u6570\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u901A\u8FC7 param { ... } \u65B9\u6CD5\u6765\u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
    +val instance = Test()
    +// \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
    +Test::class.java.method {
    +    name = "release"
    +    // \u5F97\u5230 it (Class) \u65B9\u6CD5\u53C2\u6570\u7C7B\u578B\u6570\u7EC4\u5B9E\u4F8B\u6765\u4EC5\u5224\u65AD\u5DF2\u77E5\u7684\u7C7B\u578B\u548C\u5B83\u7684\u4F4D\u7F6E
    +    param { it[0] == StringClass && it[2] == BooleanType }
    +}.get(instance) // \u5F97\u5230\u8FD9\u4E2A\u65B9\u6CD5
    +

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 param { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u5176\u4E2D\u7684\u53D8\u91CF it \u5373\u5F53\u524D\u65B9\u6CD5\u53C2\u6570\u7684 Class \u7C7B\u578B\u6570\u7EC4\u5B9E\u4F8B\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u81EA\u7531\u4F7F\u7528 Class \u4E2D\u7684\u6240\u6709\u5BF9\u8C61\u53CA\u5176\u65B9\u6CD5\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 FieldFinder.type\u3001MethodFinder.param\u3001MethodFinder.returnType\u3001ConstructorFinder.param \u65B9\u6CD5\u3002

    \u5728\u7236\u7C7B\u67E5\u627E

    \u4F60\u4F1A\u6CE8\u610F\u5230 Test \u7EE7\u627F\u4E8E BaseTest\uFF0C\u73B0\u5728\u6211\u4EEC\u60F3\u5F97\u5230 BaseTest \u7684 doBaseTask \u65B9\u6CD5\uFF0C\u5728\u4E0D\u77E5\u9053\u7236\u7C7B\u540D\u79F0\u7684\u60C5\u51B5\u4E0B\uFF0C\u8981\u600E\u4E48\u505A\u5462\uFF1F

    \u53C2\u7167\u4E0A\u9762\u7684\u67E5\u627E\u6761\u4EF6\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u5728\u67E5\u627E\u6761\u4EF6\u4E2D\u52A0\u5165\u4E00\u4E2A superClass \u5373\u53EF\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // \u53EA\u9700\u8981\u6DFB\u52A0\u8FD9\u4E2A\u6761\u4EF6
         superClass()
     }.get(instance).call("task_name")
    @@ -336,7 +344,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // \u52A0\u5165\u4E00\u4E2A\u67E5\u627E\u6761\u4EF6
         superClass(isOnlySuperClass = true)
     }.get(instance).call("task_name")
    @@ -348,7 +356,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
             // \u8BBE\u7F6E\u540D\u79F0\u4E0D\u533A\u5206\u5927\u5C0F\u5199
             it.equals("dotask", isIgnoreCase = true)
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    \u5DF2\u77E5\u5F53\u524D Class \u4E2D\u4EC5\u6709\u4E00\u4E2A doTask \u65B9\u6CD5\uFF0C\u6211\u4EEC\u8FD8\u53EF\u4EE5\u5224\u65AD\u65B9\u6CD5\u540D\u79F0\u4EC5\u5305\u542B\u5176\u4E2D\u6307\u5B9A\u7684\u5B57\u7B26\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -358,7 +366,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
             // \u4EC5\u5305\u542B oTas
             it.contains("oTas")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    \u6211\u4EEC\u8FD8\u53EF\u4EE5\u6839\u636E\u9996\u5C3E\u5B57\u7B26\u4E32\u8FDB\u884C\u5224\u65AD\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -368,7 +376,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
             // \u5F00\u5934\u5305\u542B do\uFF0C\u7ED3\u5C3E\u5305\u542B Task
             it.startsWith("do") && it.endsWith("Task")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    \u901A\u8FC7\u89C2\u5BDF\u53D1\u73B0\u8FD9\u4E2A\u65B9\u6CD5\u540D\u79F0\u4E2D\u53EA\u5305\u542B\u5B57\u6BCD\uFF0C\u6211\u4EEC\u8FD8\u53EF\u4EE5\u518D\u589E\u52A0\u4E00\u4E2A\u7CBE\u786E\u7684\u67E5\u627E\u6761\u4EF6\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -378,9 +386,9 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
             // \u5F00\u5934\u5305\u542B do\uFF0C\u7ED3\u5C3E\u5305\u542B Task\uFF0C\u4EC5\u5305\u542B\u5B57\u6BCD
             it.startsWith("do") && it.endsWith("Task") && it.isOnlyLetters()
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
    -

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 name { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u5176\u4E2D\u7684\u53D8\u91CF it \u5373\u5F53\u524D\u540D\u79F0\u7684\u5B57\u7B26\u4E32\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 NameRules \u7684\u6269\u5C55\u65B9\u6CD5\u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 NameRules\u3002

    \u591A\u91CD\u67E5\u627E

    \u6709\u4E9B\u65F6\u5019\uFF0C\u6211\u4EEC\u53EF\u80FD\u9700\u8981\u67E5\u627E\u4E00\u4E2A Class \u4E2D\u5177\u6709\u76F8\u540C\u7279\u5F81\u7684\u4E00\u7EC4\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\uFF0C\u6B64\u65F6\uFF0C\u6211\u4EEC\u5C31\u53EF\u4EE5\u5229\u7528\u76F8\u5BF9\u6761\u4EF6\u5339\u914D\u6765\u5B8C\u6210\u3002

    \u5728\u67E5\u627E\u6761\u4EF6\u7ED3\u679C\u7684\u57FA\u7840\u4E0A\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u628A get \u6362\u4E3A all \u5373\u53EF\u5F97\u5230\u5339\u914D\u6761\u4EF6\u7684\u5168\u90E8\u5B57\u8282\u7801\u3002

    \u5047\u8BBE\u8FD9\u6B21\u6211\u4EEC\u8981\u5F97\u5230 Class \u4E2D\u65B9\u6CD5\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u5728 1..3 \u7684\u5168\u90E8\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u4F7F\u7528\u5982\u4E0B\u5B9E\u73B0\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
    +

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 name { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u5176\u4E2D\u7684\u53D8\u91CF it \u5373\u5F53\u524D\u540D\u79F0\u7684\u5B57\u7B26\u4E32\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 NameRules \u7684\u6269\u5C55\u65B9\u6CD5\u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 FieldFinder.name\u3001MethodFinder.name \u65B9\u6CD5\u4EE5\u53CA NameRules\u3002

    \u591A\u91CD\u67E5\u627E

    \u6709\u4E9B\u65F6\u5019\uFF0C\u6211\u4EEC\u53EF\u80FD\u9700\u8981\u67E5\u627E\u4E00\u4E2A Class \u4E2D\u5177\u6709\u76F8\u540C\u7279\u5F81\u7684\u4E00\u7EC4\u65B9\u6CD5\u3001\u6784\u9020\u65B9\u6CD5\u3001\u53D8\u91CF\uFF0C\u6B64\u65F6\uFF0C\u6211\u4EEC\u5C31\u53EF\u4EE5\u5229\u7528\u76F8\u5BF9\u6761\u4EF6\u5339\u914D\u6765\u5B8C\u6210\u3002

    \u5728\u67E5\u627E\u6761\u4EF6\u7ED3\u679C\u7684\u57FA\u7840\u4E0A\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u628A get \u6362\u4E3A all \u5373\u53EF\u5F97\u5230\u5339\u914D\u6761\u4EF6\u7684\u5168\u90E8\u5B57\u8282\u7801\u3002

    \u5047\u8BBE\u8FD9\u6B21\u6211\u4EEC\u8981\u5F97\u5230 Class \u4E2D\u65B9\u6CD5\u53C2\u6570\u4E2A\u6570\u8303\u56F4\u5728 1..3 \u7684\u5168\u90E8\u65B9\u6CD5\uFF0C\u53EF\u4EE5\u4F7F\u7528\u5982\u4E0B\u5B9E\u73B0\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
    @@ -407,13 +415,13 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u8C03\u7528\u6267\u884C\u6BCF\u4E2A\u65B9\u6CD5
         instance.call(...)
     }
    -

    \u4E0A\u8FF0\u793A\u4F8B\u53EF\u5B8C\u7F8E\u5339\u914D\u5230\u5982\u4E0B 2 \u4E2A\u65B9\u6CD5\u3002

    private void b()

    private void b(String a)

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 paramCount { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u5176\u4E2D\u7684\u53D8\u91CF it \u5373\u5F53\u524D\u53C2\u6570\u4E2A\u6570\u7684\u6574\u6570\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 CountRules \u7684\u6269\u5C55\u65B9\u6CD5\u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 CountRules\u3002

    \u9759\u6001\u5B57\u8282\u7801

    \u6709\u4E9B\u65B9\u6CD5\u548C\u53D8\u91CF\u5728 Class \u4E2D\u662F\u9759\u6001\u7684\u5B9E\u73B0\uFF0C\u8FD9\u4E2A\u65F6\u5019\uFF0C\u6211\u4EEC\u4E0D\u9700\u8981\u4F20\u5165\u5B9E\u4F8B\u5C31\u53EF\u4EE5\u8C03\u7528\u5B83\u4EEC\u3002

    \u5047\u8BBE\u6211\u4EEC\u8FD9\u6B21\u8981\u5F97\u5230\u9759\u6001\u53D8\u91CF TAG \u7684\u5185\u5BB9\u3002

    \u793A\u4F8B\u5982\u4E0B

    Test::class.java.field {
    +

    \u4E0A\u8FF0\u793A\u4F8B\u53EF\u5B8C\u7F8E\u5339\u914D\u5230\u5982\u4E0B 2 \u4E2A\u65B9\u6CD5\u3002

    private void b()

    private void b(String a)

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 paramCount { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u5176\u4E2D\u7684\u53D8\u91CF it \u5373\u5F53\u524D\u53C2\u6570\u4E2A\u6570\u7684\u6574\u6570\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 CountRules \u7684\u6269\u5C55\u65B9\u6CD5\u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 MethodFinder.paramCount\u3001ConstructorFinder.paramCount \u65B9\u6CD5\u4EE5\u53CA CountRules\u3002

    \u9759\u6001\u5B57\u8282\u7801

    \u6709\u4E9B\u65B9\u6CD5\u548C\u53D8\u91CF\u5728 Class \u4E2D\u662F\u9759\u6001\u7684\u5B9E\u73B0\uFF0C\u8FD9\u4E2A\u65F6\u5019\uFF0C\u6211\u4EEC\u4E0D\u9700\u8981\u4F20\u5165\u5B9E\u4F8B\u5C31\u53EF\u4EE5\u8C03\u7528\u5B83\u4EEC\u3002

    \u5047\u8BBE\u6211\u4EEC\u8FD9\u6B21\u8981\u5F97\u5230\u9759\u6001\u53D8\u91CF TAG \u7684\u5185\u5BB9\u3002

    \u793A\u4F8B\u5982\u4E0B

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
     }.get().string() // Field \u7684\u7C7B\u578B\u662F\u5B57\u7B26\u4E32\uFF0C\u53EF\u76F4\u63A5\u8FDB\u884C cast
     

    \u5047\u8BBE Class \u4E2D\u5B58\u5728\u540C\u540D\u7684\u975E\u9759\u6001 TAG \u53D8\u91CF\uFF0C\u8FD9\u4E2A\u65F6\u5019\u600E\u4E48\u529E\u5462\uFF1F

    \u52A0\u5165\u4E00\u4E2A\u7B5B\u9009\u6761\u4EF6\u5373\u53EF\u3002

    \u793A\u4F8B\u5982\u4E0B

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
         // \u6807\u8BC6\u67E5\u627E\u7684\u8FD9\u4E2A\u53D8\u91CF\u9700\u8981\u662F\u9759\u6001
         modifiers { isStatic }
     }.get().string() // Field \u7684\u7C7B\u578B\u662F\u5B57\u7B26\u4E32\uFF0C\u53EF\u76F4\u63A5\u8FDB\u884C cast
    @@ -427,7 +435,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6807\u8BC6\u67E5\u627E\u7684\u8FD9\u4E2A\u65B9\u6CD5\u9700\u8981\u662F\u9759\u6001
         modifiers { isStatic }
     }.get().call()
    -

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 modifiers { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 ModifierRules \u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 ModifierRules\u3002

    \u6DF7\u6DC6\u7684\u5B57\u8282\u7801

    \u4F60\u53EF\u80FD\u5DF2\u7ECF\u6CE8\u610F\u5230\u4E86\uFF0C\u8FD9\u91CC\u7ED9\u51FA\u7684\u793A\u4F8B Class \u4E2D\u6709\u4E24\u4E2A\u6DF7\u6DC6\u7684\u53D8\u91CF\u540D\u79F0\uFF0C\u5B83\u4EEC\u90FD\u662F a\uFF0C\u8FD9\u4E2A\u65F6\u5019\u6211\u4EEC\u8981\u600E\u4E48\u5F97\u5230\u5B83\u4EEC\u5462\uFF1F

    \u6709\u4E24\u79CD\u65B9\u6848\u3002

    \u7B2C\u4E00\u79CD\u65B9\u6848\uFF0C\u786E\u5B9A\u53D8\u91CF\u7684\u540D\u79F0\u548C\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
    +

    \u5C0F\u63D0\u793A

    \u4F7F\u7528 modifiers { ... } \u521B\u5EFA\u4E00\u4E2A\u6761\u4EF6\u65B9\u6CD5\u4F53\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u5728 ModifierRules \u4E2D\u81EA\u7531\u4F7F\u7528\u5176\u4E2D\u7684\u529F\u80FD\u3002

    \u65B9\u6CD5\u4F53\u672B\u5C3E\u6761\u4EF6\u9700\u8981\u8FD4\u56DE\u4E00\u4E2A Boolean\uFF0C\u5373\u6700\u7EC8\u7684\u6761\u4EF6\u5224\u65AD\u7ED3\u679C\u3002

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 FieldFinder.modifiers\u3001MethodFinder.modifiers\u3001ConstructorFinder.modifiers \u65B9\u6CD5\u4EE5\u53CA ModifierRules\u3002

    \u6DF7\u6DC6\u7684\u5B57\u8282\u7801

    \u4F60\u53EF\u80FD\u5DF2\u7ECF\u6CE8\u610F\u5230\u4E86\uFF0C\u8FD9\u91CC\u7ED9\u51FA\u7684\u793A\u4F8B Class \u4E2D\u6709\u4E24\u4E2A\u6DF7\u6DC6\u7684\u53D8\u91CF\u540D\u79F0\uFF0C\u5B83\u4EEC\u90FD\u662F a\uFF0C\u8FD9\u4E2A\u65F6\u5019\u6211\u4EEC\u8981\u600E\u4E48\u5F97\u5230\u5B83\u4EEC\u5462\uFF1F

    \u6709\u4E24\u79CD\u65B9\u6848\u3002

    \u7B2C\u4E00\u79CD\u65B9\u6848\uFF0C\u786E\u5B9A\u53D8\u91CF\u7684\u540D\u79F0\u548C\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.field {
    @@ -445,13 +453,13 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
         name = "b"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("test_string") // \u5F97\u5230\u540D\u79F0\u4E3A b \u65B9\u6CD5\u53C2\u6570\u4E3A [String] \u7684\u65B9\u6CD5
     

    \u7B2C\u4E8C\u79CD\u65B9\u6848\uFF0C\u786E\u5B9A\u65B9\u6CD5\u7684\u53C2\u6570\u6240\u5728\u7684\u4F4D\u7F6E\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
     // \u4F7F\u7528 YukiHookAPI \u8C03\u7528\u5E76\u6267\u884C
     Test::class.java.method {
    -    param(StringType).index().first()
    +    param(StringClass).index().first()
     }.get(instance).call("test_string") // \u5F97\u5230\u7B2C\u4E00\u4E2A\u65B9\u6CD5\u53C2\u6570\u4E3A [String] \u7684\u65B9\u6CD5
     

    \u7531\u4E8E\u89C2\u5BDF\u5230\u8FD9\u4E2A\u65B9\u6CD5\u5728 Class \u7684\u6700\u540E\u4E00\u4E2A\uFF0C\u90A3\u6211\u4EEC\u8FD8\u6709\u4E00\u4E2A\u5907\u9009\u65B9\u6848\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B
     val instance = Test()
    @@ -466,7 +474,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6267\u884C doTask \u65B9\u6CD5
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
         // \u6267\u884C stop \u65B9\u6CD5
         method {
    @@ -483,7 +491,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         // \u6267\u884C\u7236\u7C7B\u7684 doBaseTask \u65B9\u6CD5
         superClass().method {
             name = "doBaseTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    \u5982\u679C\u4F60\u4E0D\u559C\u6B22\u4F7F\u7528\u4E00\u4E2A\u5927\u62EC\u53F7\u7684\u8C03\u7528\u57DF\u6765\u521B\u5EFA\u5F53\u524D\u5B9E\u4F8B\u7684\u547D\u540D\u7A7A\u95F4\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 current() \u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u5C31\u662F\u8FD9\u4E2A Class \u7684\u5B9E\u4F8B\uFF0C\u8FD9\u4E2A Class \u662F\u4E0D\u80FD\u88AB\u76F4\u63A5\u5F97\u5230\u7684
    @@ -493,7 +501,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         .current()
         .method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     // \u6267\u884C stop \u65B9\u6CD5
     instance
    @@ -510,7 +518,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     instance.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }.current()
         .method {
    @@ -529,7 +537,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         }.current {
             method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }.call("task_name")
         }
         // <\u65B9\u68482>
    @@ -538,7 +546,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         }.current()
             ?.method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }?.call("task_name")
     }
     

    \u6CE8\u610F

    \u4E0A\u8FF0 current \u65B9\u6CD5\u76F8\u5F53\u4E8E\u5E2E\u4F60\u8C03\u7528\u4E86 CurrentClass \u4E2D\u7684 field { ... }.any()?.current() \u65B9\u6CD5\u3002

    \u82E5\u4E0D\u5B58\u5728 CurrentClass \u8C03\u7528\u57DF\uFF0C\u4F60\u9700\u8981\u4F7F\u7528 field { ... }.get(instance).current() \u6765\u8FDB\u884C\u8C03\u7528\u3002

    \u95EE\u9898\u53C8\u6765\u4E86\uFF0C\u6211\u60F3\u4F7F\u7528\u53CD\u5C04\u7684\u65B9\u5F0F\u521B\u5EFA\u5982\u4E0B\u7684\u5B9E\u4F8B\u5E76\u8C03\u7528\u5176\u4E2D\u7684\u65B9\u6CD5\uFF0C\u8BE5\u600E\u4E48\u505A\u5462\uFF1F

    \u793A\u4F8B\u5982\u4E0B

    Test(true).doTask("task_name")
    @@ -555,7 +563,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     

    \u4F46\u662F\u611F\u89C9\u8FD9\u79CD\u505A\u6CD5\u597D\u9EBB\u70E6\uFF0C\u6709\u6CA1\u6709\u66F4\u7B80\u6D01\u7684\u8C03\u7528\u65B9\u6CD5\u5462\uFF1F

    \u8FD9\u4E2A\u65F6\u5019\uFF0C\u6211\u4EEC\u8FD8\u53EF\u4EE5\u501F\u52A9 buildOf \u65B9\u6CD5\u6765\u521B\u5EFA\u4E00\u4E2A\u5B9E\u4F8B\u3002

    \u793A\u4F8B\u5982\u4E0B

    "com.demo.Test".toClass().buildOf(true) { param(BooleanType) }?.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    \u82E5\u4F60\u5E0C\u671B buildOf \u65B9\u6CD5\u8FD4\u56DE\u5F53\u524D\u5B9E\u4F8B\u7684\u7C7B\u578B\uFF0C\u4F60\u53EF\u4EE5\u5728\u5176\u4E2D\u52A0\u5165\u7C7B\u578B\u6CDB\u578B\u58F0\u660E\uFF0C\u800C\u65E0\u9700\u4F7F\u7528 as \u6765 cast \u76EE\u6807\u7C7B\u578B\u3002

    \u8FD9\u79CD\u60C5\u51B5\u591A\u7528\u4E8E\u5B9E\u4F8B\u672C\u8EAB\u7684\u6784\u9020\u65B9\u6CD5\u662F\u79C1\u6709\u7684\uFF0C\u4F46\u662F\u91CC\u9762\u7684\u65B9\u6CD5\u662F\u516C\u6709\u7684\uFF0C\u8FD9\u6837\u6211\u4EEC\u53EA\u9700\u8981\u5BF9\u5176\u6784\u9020\u65B9\u6CD5\u8FDB\u884C\u53CD\u5C04\u521B\u5EFA\u5373\u53EF\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u5047\u8BBE\u8FD9\u4E2A Class \u662F\u80FD\u591F\u76F4\u63A5\u88AB\u5F97\u5230\u7684
    @@ -572,7 +580,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
             method {
                 name = "getString"
                 emptyParam()
    -            returnType = StringType
    +            returnType = StringClass
             }
             replaceTo("Hooked")
         }
    @@ -581,13 +589,13 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().string()
     

    \u5982\u679C\u6211\u4EEC\u60F3\u5F97\u5230\u8FD9\u4E2A\u65B9\u6CD5\u672A\u7ECF Hook \u7684\u539F\u59CB\u65B9\u6CD5\u53CA\u7ED3\u679C\uFF0C\u53EA\u9700\u8981\u5728\u7ED3\u679C\u4E2D\u52A0\u5165 original \u5373\u53EF\u3002

    \u793A\u4F8B\u5982\u4E0B

    // result \u7684\u7ED3\u679C\u4F1A\u662F "Original"
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().original().string()
     

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 MethodFinder.Result.original \u65B9\u6CD5\u3002

    \u518D\u6B21\u67E5\u627E

    \u5047\u8BBE\u6709\u4E09\u4E2A\u4E0D\u540C\u7248\u672C\u7684 Class\uFF0C\u5B83\u4EEC\u90FD\u662F\u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u540C\u7248\u672C\u76F8\u540C\u7684 Class\u3002

    \u8FD9\u91CC\u9762\u540C\u6837\u90FD\u6709\u4E00\u4E2A\u65B9\u6CD5 doTask\uFF0C\u5047\u8BBE\u5B83\u4EEC\u7684\u529F\u80FD\u662F\u4E00\u6837\u7684\u3002

    \u7248\u672C A \u793A\u4F8B\u5982\u4E0B

    public class Test {
     
    @@ -616,13 +624,13 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     }.remedys {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.onFind {
             // \u53EF\u5728\u8FD9\u91CC\u5B9E\u73B0\u627E\u5230\u7684\u903B\u8F91
         }
         method {
             name = "doTask"
    -        param(StringType, IntType)
    +        param(StringClass, IntType)
         }.onFind {
             // \u53EF\u5728\u8FD9\u91CC\u5B9E\u73B0\u627E\u5230\u7684\u903B\u8F91
         }
    @@ -756,7 +764,7 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
         name = "test"
         param(BooleanType).index(num = 2)
         // \u2757\u9519\u8BEF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u8BF7\u4EC5\u4FDD\u7559\u4E00\u4E2A index \u65B9\u6CD5
    -    returnType(StringType).index(num = 1)
    +    returnType(StringClass).index(num = 1)
     }
     

    \u4EE5\u4E0B\u67E5\u627E\u6761\u4EF6\u7684\u4F7F\u7528\u662F\u6CA1\u6709\u4EFB\u4F55\u95EE\u9898\u7684\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
         name = "test"
    @@ -799,14 +807,14 @@ import{_ as l,r as e,o as p,c as o,b as s,d as c,a as n,e as r}from"./app.99fcdd
     }.get().boolean().toString() // \u2705 \u6B63\u786E\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5F97\u5230\u7C7B\u578B\u540E\u518D\u8FDB\u884C\u8F6C\u6362
     

    \u5E38\u7528\u7C7B\u578B\u6269\u5C55

    \u5728\u67E5\u627E\u65B9\u6CD5\u3001\u53D8\u91CF\u7684\u65F6\u5019\u6211\u4EEC\u901A\u5E38\u9700\u8981\u6307\u5B9A\u6240\u67E5\u627E\u7684\u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    field {
         name = "test"
    -    type = Boolean::class.java
    +    type = Boolean::class.javaPrimitiveType
     }
    -

    \u5728 Kotlin \u4E2D\u8868\u8FBE\u51FA Boolean::class.java \u8FD9\u4E2A\u7C7B\u578B\u7684\u5199\u6CD5\u5F88\u957F\uFF0C\u611F\u89C9\u5E76\u4E0D\u65B9\u4FBF\u3002

    \u56E0\u6B64\uFF0CYukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u5E38\u89C1\u7684\u7C7B\u578B\u8C03\u7528\uFF0C\u5176\u4E2D\u5305\u542B\u4E86 Android \u7684\u57FA\u672C\u7C7B\u578B\u548C Java \u7684\u57FA\u672C\u7C7B\u578B\u3002

    \u8FD9\u4E2A\u65F6\u5019\u4E0A\u9762\u7684\u7C7B\u578B\u5C31\u53EF\u4EE5\u5199\u4F5C\u5982\u4E0B\u5F62\u5F0F\u4E86\u3002

    \u793A\u4F8B\u5982\u4E0B

    field {
    +

    \u5728 Kotlin \u4E2D\u8868\u8FBE\u51FA Boolean::class.javaPrimitiveType \u8FD9\u4E2A\u7C7B\u578B\u7684\u5199\u6CD5\u5F88\u957F\uFF0C\u611F\u89C9\u5E76\u4E0D\u65B9\u4FBF\u3002

    \u56E0\u6B64\uFF0CYukiHookAPI \u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u5E38\u89C1\u7684\u7C7B\u578B\u8C03\u7528\uFF0C\u5176\u4E2D\u5305\u542B\u4E86 Android \u7684\u76F8\u5173\u7C7B\u578B\u548C Java \u7684\u5E38\u89C1\u7C7B\u578B\u4E0E\u539F\u59CB\u7C7B\u578B\u5173\u952E\u5B57\u3002

    \u8FD9\u4E2A\u65F6\u5019\u4E0A\u9762\u7684\u7C7B\u578B\u5C31\u53EF\u4EE5\u5199\u4F5C\u5982\u4E0B\u5F62\u5F0F\u4E86\u3002

    \u793A\u4F8B\u5982\u4E0B

    field {
         name = "test"
         type = BooleanType
     }
    -

    \u5728 Java \u4E2D\u5E38\u89C1\u7684\u57FA\u672C\u7C7B\u578B\u90FD\u5DF2\u88AB\u5C01\u88C5\u4E3A \u7C7B\u578B + Type \u7684\u65B9\u5F0F\uFF0C\u4F8B\u5982 IntType\u3001FloatType\u3002

    \u76F8\u5E94\u5730\uFF0C\u6570\u7EC4\u7C7B\u578B\u4E5F\u6709\u65B9\u4FBF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5047\u8BBE\u6211\u4EEC\u8981\u83B7\u5F97 String[] \u7C7B\u578B\u7684\u6570\u7EC4\u3002

    \u9700\u8981\u5199\u505A java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass \u624D\u80FD\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u611F\u89C9\u662F\u4E0D\u662F\u5F88\u9EBB\u70E6\uFF0C\u8FD9\u4E2A\u65F6\u5019\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u6269\u5C55\u65B9\u6CD5 ArrayClass(StringType) \u6765\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u540C\u65F6\u7531\u4E8E String \u662F\u5E38\u89C1\u7C7B\u578B\uFF0C\u6240\u4EE5\u8FD8\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 StringArrayClass \u6765\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u4E00\u4E9B\u5E38\u89C1\u7684 Hook \u4E2D\u67E5\u627E\u7684\u65B9\u6CD5\uFF0C\u90FD\u6709\u5176\u5BF9\u5E94\u7684\u5C01\u88C5\u7C7B\u578B\u4EE5\u4F9B\u4F7F\u7528\uFF0C\u683C\u5F0F\u4E3A \u7C7B\u578B + Class\u3002

    \u4F8B\u5982 Hook onCreate \u65B9\u6CD5\u9700\u8981\u67E5\u627E Bundle::class.java \u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
    +

    \u5728 Java \u5E38\u89C1\u7C7B\u578B\u4E2D\u7684\u539F\u59CB\u7C7B\u578B (\u6216\u57FA\u672C\u7C7B\u578B) \u5173\u952E\u5B57\u90FD\u5DF2\u88AB\u5C01\u88C5\u4E3A \u7C7B\u578B + Type \u7684\u65B9\u5F0F\uFF0C\u4F8B\u5982 IntType\u3001FloatType (\u5B83\u4EEC\u7684\u5B57\u8282\u7801\u7C7B\u578B\u4E3A int\u3001float)\u3002

    \u76F8\u5E94\u5730\uFF0C\u6570\u7EC4\u7C7B\u578B\u4E5F\u6709\u65B9\u4FBF\u7684\u4F7F\u7528\u65B9\u6CD5\uFF0C\u5047\u8BBE\u6211\u4EEC\u8981\u83B7\u5F97 String[] \u7C7B\u578B\u7684\u6570\u7EC4\u3002

    \u9700\u8981\u5199\u505A java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass \u624D\u80FD\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u611F\u89C9\u662F\u4E0D\u662F\u5F88\u9EBB\u70E6\uFF0C\u8FD9\u4E2A\u65F6\u5019\u6211\u4EEC\u53EF\u4EE5\u4F7F\u7528\u65B9\u6CD5 ArrayClass(StringClass) \u6765\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u540C\u65F6\u7531\u4E8E String \u662F\u5E38\u89C1\u7C7B\u578B\uFF0C\u6240\u4EE5\u8FD8\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 StringArrayClass \u6765\u5F97\u5230\u8FD9\u4E2A\u7C7B\u578B\u3002

    \u4E00\u4E9B\u5E38\u89C1\u7684 Hook \u4E2D\u67E5\u627E\u7684\u65B9\u6CD5\uFF0C\u90FD\u6709\u5176\u5BF9\u5E94\u7684\u5C01\u88C5\u7C7B\u578B\u4EE5\u4F9B\u4F7F\u7528\uFF0C\u683C\u5F0F\u4E3A \u7C7B\u578B + Class\u3002

    \u4F8B\u5982 Hook onCreate \u65B9\u6CD5\u9700\u8981\u67E5\u627E Bundle::class.java \u7C7B\u578B\u3002

    \u793A\u4F8B\u5982\u4E0B

    method {
         name = "onCreate"
         param(BundleClass)
     }
    -

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u7C7B\u578B\u53EF\u67E5\u770B ComponentTypeFactory\u3001GraphicsTypeFactory\u3001ViewTypeFactory\u3001VariableTypeFactory\u3002

    \u540C\u65F6\uFF0C\u6B22\u8FCE\u4F60\u80FD\u8D21\u732E\u66F4\u591A\u7684\u5E38\u7528\u7C7B\u578B\u3002

    `,358);function v(C,D){const a=e("Badge");return p(),o("div",null,[t,s("h3",d,[A,y,c(a,{type:"tip",text:"Beta",vertical:"middle"})]),u])}const m=l(i,[["render",v],["__file","reflection.html.vue"]]);export{m as default}; +

    \u4EE5\u4E0B\u662F Java \u4E2D\u4E00\u4E9B\u7279\u4F8B\u7C7B\u578B\u5728 YukiHookAPI \u4E2D\u7684\u5C01\u88C5\u540D\u79F0\u3002

    • void \u2192 UnitType

    • java.lang.Void \u2192 UnitClass

    • java.lang.Object \u2192 AnyClass

    • java.lang.Integer \u2192 IntClass

    • java.lang.Character \u2192 CharClass

    \u6CE8\u610F

    \u4EE5 \u7C7B\u578B + Type \u5C01\u88C5\u7C7B\u578B\u4F1A\u4E14\u4EC5\u4F1A\u8868\u793A\u4E3A Java \u539F\u59CB\u7C7B\u578B\u5173\u952E\u5B57\uFF0C\u7531\u4E8E Kotlin \u4E2D\u4E0D\u5B58\u5728\u539F\u59CB\u7C7B\u578B\u8FD9\u4E2A\u6982\u5FF5\uFF0C\u6240\u4EE5\u5B83\u4EEC\u90FD\u4F1A\u88AB\u5B9A\u4E49\u4E3A KClass\u3002

    Java \u4E2D\u5171\u6709 9 \u4E2A\u539F\u59CB\u7C7B\u578B\u5173\u952E\u5B57\uFF0C\u5176\u4E2D 8 \u4E2A\u4E3A\u539F\u59CB\u7C7B\u578B\uFF0C\u5206\u522B\u4E3A boolean\u3001char\u3001byte\u3001short\u3001int\u3001float\u3001long\u3001double\uFF0C\u5176\u4E2D void \u7C7B\u578B\u662F\u4E00\u4E2A\u7279\u4F8B\u3002

    \u540C\u65F6\u5B83\u4EEC\u90FD\u6709 Java \u81EA\u8EAB\u5BF9\u5E94\u7684\u5C01\u88C5\u7C7B\u578B\uFF0C\u4F8B\u5982 java.lang.Boolean\u3001java.lang.Integer\uFF0C\u8FD9\u4E9B\u7C7B\u578B\u662F\u4E0D\u76F8\u7B49\u7684\uFF0C\u8BF7\u6CE8\u610F\u533A\u5206\u3002

    \u540C\u6837\u5730\uFF0C\u6570\u7EC4\u4E5F\u6709\u5BF9\u5E94\u7684\u5C01\u88C5\u7C7B\u578B\uFF0C\u5B83\u4EEC\u4E5F\u9700\u8981\u4E0E Java \u539F\u59CB\u7C7B\u578B\u5173\u952E\u5B57 \u8FDB\u884C\u533A\u5206\u3002

    \u4F8B\u5982 byte[] \u7684\u5C01\u88C5\u7C7B\u578B\u4E3A ByteArrayType \u6216 ArrayClass(ByteType)\uFF0C\u800C Byte[] \u7684\u5C01\u88C5\u7C7B\u578B\u4E3A ByteArrayClass \u6216 ArrayClass(ByteClass)\uFF0C\u8FD9\u4E9B\u7C7B\u578B\u4E5F\u662F\u4E0D\u76F8\u7B49\u7684\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u7C7B\u578B\u53EF\u67E5\u770B ComponentTypeFactory\u3001GraphicsTypeFactory\u3001ViewTypeFactory\u3001VariableTypeFactory\u3002

    \u540C\u65F6\uFF0C\u6B22\u8FCE\u4F60\u80FD\u8D21\u732E\u66F4\u591A\u7684\u5E38\u7528\u7C7B\u578B\u3002

    `,365);function v(C,D){const a=e("Badge");return p(),o("div",null,[t,s("h3",d,[A,y,c(a,{type:"tip",text:"Beta",vertical:"middle"})]),u])}const m=l(i,[["render",v],["__file","reflection.html.vue"]]);export{m as default}; diff --git a/docs/assets/xposed-channel.html.b798a8f8.js b/docs/assets/xposed-channel.html.325b6181.js similarity index 89% rename from docs/assets/xposed-channel.html.b798a8f8.js rename to docs/assets/xposed-channel.html.325b6181.js index 0edffd219..5a70ea24f 100644 --- a/docs/assets/xposed-channel.html.b798a8f8.js +++ b/docs/assets/xposed-channel.html.325b6181.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-598546c6","path":"/zh-cn/api/special-features/xposed-channel.html","title":"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u57FA\u672C\u7528\u6CD5","slug":"\u57FA\u672C\u7528\u6CD5","link":"#\u57FA\u672C\u7528\u6CD5","children":[]},{"level":2,"title":"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","slug":"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","link":"#\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","children":[]},{"level":2,"title":"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","slug":"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","link":"#\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","children":[]},{"level":2,"title":"\u5B89\u5168\u6027\u8BF4\u660E","slug":"\u5B89\u5168\u6027\u8BF4\u660E","link":"#\u5B89\u5168\u6027\u8BF4\u660E","children":[]}],"git":{"updatedTime":1664028301000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/api/special-features/xposed-channel.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-598546c6","path":"/zh-cn/api/special-features/xposed-channel.html","title":"Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u57FA\u672C\u7528\u6CD5","slug":"\u57FA\u672C\u7528\u6CD5","link":"#\u57FA\u672C\u7528\u6CD5","children":[]},{"level":2,"title":"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","slug":"\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","link":"#\u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D","children":[]},{"level":2,"title":"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","slug":"\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","link":"#\u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219","children":[]},{"level":2,"title":"\u5B89\u5168\u6027\u8BF4\u660E","slug":"\u5B89\u5168\u6027\u8BF4\u660E","link":"#\u5B89\u5168\u6027\u8BF4\u660E","children":[]}],"git":{"updatedTime":1672749687000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/api/special-features/xposed-channel.md"}');export{e as data}; diff --git a/docs/assets/xposed-channel.html.4864ff1b.js b/docs/assets/xposed-channel.html.4864ff1b.js deleted file mode 100644 index ba7b3eef0..000000000 --- a/docs/assets/xposed-channel.html.4864ff1b.js +++ /dev/null @@ -1,62 +0,0 @@ -import{_ as s,o as e,c as n,a}from"./app.99fcdd51.js";const l={},o=a(`

    Xposed Module and Host Channel

    This is a solution that uses system out-of-order broadcasting to send and receive data between the Module App and the Host App.

    Condition that needs to be met

    The Module App and the Host App need to remain alive, otherwise communication cannot be established.

    Basic Usage

    The basic usage of the wait and put methods is described here.

    By using dataChannel to realize the communication bridge between the Module App and the Host App, the principle is to send and receive system out-of-order broadcasts.

    The Module App example is as follows

    // Get from the Host App of the specified package name
    -dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
    -    // Your code here.
    -}
    -// Send to the Host App with the specified package name
    -dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module")
    -

    The Host App example is as follows

    // Get from the Module App
    -dataChannel.wait<String>(key = "key_from_module") { value ->
    -    // Your code here.
    -}
    -// Send to the Module App
    -dataChannel.put(key = "key_from_host", value = "I am host")
    -

    You can leave the value of dataChannel unset to only notify the Module App or Host App to call back the wait method.

    The Module App example is as follows

    // Get from the Host App of the specified package name
    -dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") {
    -    // Your code here.
    -}
    -// Send to the Host App with the specified package name
    -dataChannel(packageName = "com.example.demo").put(key = "listener_from_module")
    -

    The Host App example is as follows

    // Get from the Module App
    -dataChannel.wait(key = "listener_from_module") {
    -    // Your code here.
    -}
    -// Send to the Module App
    -dataChannel.put(key = "listener_from_host")
    -

    Pay Attention

    The receiver needs to stay alive to receive the communication data.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Determine Module App and Host App Version Match

    Through the communication bridge function, YukiHookAPI also provides a solution for you to determine whether the Module App matches the Host App version after the user updates the Module App.

    We only need to call the checkingVersionEquals method to achieve this function.

    Bidirectional judgment can be performed between the Module App and the Host App.

    You can check in the Module App whether the Host App of the specified package name matches the version of the current Module App.

    The following example

    // Get from the Host App of the specified package name
    -dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals ->
    -    // Your code here.
    -}
    -

    You can also determine in the Host App whether it matches the current Module App version.

    The following example

    // Get from the Module App
    -dataChannel.checkingVersionEquals { isEquals ->
    -    // Your code here.
    -}
    -

    Condition of method callback

    The Host App and Module App must be stay alive, and after activating the Module App restart the Hook target Host App object in scope.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Rules for Callback Event Response

    Only examples used in Module App are listed here, the same key in the Host App is always not allowed to be created repeatedly.

    Pay Attention

    In the Module App and Host App, each key callback event corresponding to dataChannel is not allowed to be repeatedly created, if repeated, the previous callback event will be replaced by the newly added callback event.

    When used in the Module App, it cannot be repeated in the same Activity, and the same key in different Activity is allowed to be repeated.

    The following example

    class MainActivity : AppCompatActivity() {
    -
    -    override fun onCreate(savedInstanceState: Bundle?) {
    -        super.onCreate(savedInstanceState)
    -        // Callback event A
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -        // Callback event B
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -        // Callback event C
    -        dataChannel(packageName = "com.example.demo").wait(key = "other_test_key") {
    -            // Your code here.
    -        }
    -    }
    -}
    -
    -class OtherActivity : AppCompatActivity() {
    -
    -    override fun onCreate(savedInstanceState: Bundle?) {
    -        super.onCreate(savedInstanceState)
    -        // Callback event D
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -    }
    -}
    -

    In the above example, the callback event A will be replaced by the callback event B, the key of the callback event C is not repeated with others, and the callback event D is in another Activity, So the final callback events B, C, and D can all be created successfully.

    Pay Attention

    A callback event with the same key will only call back the callback event registered in the Activity that the current Module App is displaying, such as test_key in the above, if OtherActivity is being displayed, then test_key in MainActivity will not be called back.

    The same key registers dataChannel in the same Activity but different Fragment, they will still be called back in the current Activity at the same time.

    In a Module App, you can only use Context of Activity to register dataChannel, you cannot use dataChannel in Application and Service.

    If you want to use dataChannel in Fragment, use activity?.dataChannel(...).

    Security Instructions

    In the Module environment, you can only receive communication data sent by the Host App with the specified package name and only send it to the Host App with the specified package name.

    Pay Attention

    In order to further prevent broadcast abuse, the API in the communication data will automatically specify the package name of the Host App and Module App to prevent other apps from monitoring and using broadcast to make overrun behaviors.

    `,39),t=[o];function p(c,i){return e(),n("div",null,t)}const d=s(l,[["render",p],["__file","xposed-channel.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-channel.html.96712a39.js b/docs/assets/xposed-channel.html.5975332b.js similarity index 86% rename from docs/assets/xposed-channel.html.96712a39.js rename to docs/assets/xposed-channel.html.5975332b.js index 4f0b55150..c9f72f65b 100644 --- a/docs/assets/xposed-channel.html.96712a39.js +++ b/docs/assets/xposed-channel.html.5975332b.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-2e6ad66c","path":"/en/api/special-features/xposed-channel.html","title":"Xposed Module and Host Channel","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Basic Usage","slug":"basic-usage","link":"#basic-usage","children":[]},{"level":2,"title":"Determine Module App and Host App Version Match","slug":"determine-module-app-and-host-app-version-match","link":"#determine-module-app-and-host-app-version-match","children":[]},{"level":2,"title":"Rules for Callback Event Response","slug":"rules-for-callback-event-response","link":"#rules-for-callback-event-response","children":[]},{"level":2,"title":"Security Instructions","slug":"security-instructions","link":"#security-instructions","children":[]}],"git":{"updatedTime":1664028585000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/api/special-features/xposed-channel.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-2e6ad66c","path":"/en/api/special-features/xposed-channel.html","title":"Xposed Module and Host Channel","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Basic Usage","slug":"basic-usage","link":"#basic-usage","children":[]},{"level":2,"title":"Determine Module App and Host App Version Match","slug":"determine-module-app-and-host-app-version-match","link":"#determine-module-app-and-host-app-version-match","children":[]},{"level":2,"title":"Rules for Callback Event Response","slug":"rules-for-callback-event-response","link":"#rules-for-callback-event-response","children":[]},{"level":2,"title":"Security Instructions","slug":"security-instructions","link":"#security-instructions","children":[]}],"git":{"updatedTime":1672749687000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/api/special-features/xposed-channel.md"}');export{e as data}; diff --git a/docs/assets/xposed-channel.html.6965bccc.js b/docs/assets/xposed-channel.html.6965bccc.js new file mode 100644 index 000000000..a5e604bcd --- /dev/null +++ b/docs/assets/xposed-channel.html.6965bccc.js @@ -0,0 +1,120 @@ +import{_ as s,o as n,c as a,a as e}from"./app.6074a838.js";const l={},o=e(`

    Xposed Module and Host Channel

    This is a solution that uses system out-of-order broadcasting to send and receive data between the Module App and the Host App.

    Condition that needs to be met

    The Module App and the Host App need to remain alive, otherwise communication cannot be established.

    Basic Usage

    The basic usage of the wait and put methods is described here.

    By using dataChannel to realize the communication bridge between the Module App and the Host App, the principle is to send and receive system out-of-order broadcasts.

    The Module App example is as follows

    // Get from the Host App of the specified package name
    +dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
    +    // Your code here.
    +}
    +// Send to the Host App with the specified package name
    +dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module")
    +

    The Host App example is as follows

    // Get from the Module App
    +dataChannel.wait<String>(key = "key_from_module") { value ->
    +    // Your code here.
    +}
    +// Send to the Module App
    +dataChannel.put(key = "key_from_host", value = "I am host")
    +

    You can leave the value of dataChannel unset to only notify the Module App or Host App to call back the wait method.

    The Module App example is as follows

    // Get from the Host App of the specified package name
    +dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") {
    +    // Your code here.
    +}
    +// Send to the Host App with the specified package name
    +dataChannel(packageName = "com.example.demo").put(key = "listener_from_module")
    +

    The Host App example is as follows

    // Get from the Module App
    +dataChannel.wait(key = "listener_from_module") {
    +    // Your code here.
    +}
    +// Send to the Module App
    +dataChannel.put(key = "listener_from_host")
    +

    Pay Attention

    The receiver needs to stay alive to receive the communication data.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Determine Module App and Host App Version Match

    Through the communication bridge function, YukiHookAPI also provides a solution for you to determine whether the Module App matches the Host App version after the user updates the Module App.

    We only need to call the checkingVersionEquals method to achieve this function.

    Bidirectional judgment can be performed between the Module App and the Host App.

    You can check in the Module App whether the Host App of the specified package name matches the version of the current Module App.

    The following example

    // Get from the Host App of the specified package name
    +dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals ->
    +    // Your code here.
    +}
    +

    You can also determine in the Host App whether it matches the current Module App version.

    The following example

    // Get from the Module App
    +dataChannel.checkingVersionEquals { isEquals ->
    +    // Your code here.
    +}
    +

    Condition of method callback

    The Host App and Module App must be stay alive, and after activating the Module App restart the Hook target Host App object in scope.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Rules for Callback Event Response

    Only the examples used in Module App are listed here.

    The same key in same Host App is always not allowed to be created repeatedly, but the same key is allowed in different Host Apps.

    Pay Attention

    In the Module App and Host App, each key callback event corresponding to dataChannel is not allowed to be repeatedly created, if repeated, the previous callback event will be replaced by the newly added callback event.

    When used in the Module App, it cannot be repeated in the same Activity, and the same key in different Activity is allowed to be repeated.

    The following example

    class MainActivity : AppCompatActivity() {
    +
    +    override fun onCreate(savedInstanceState: Bundle?) {
    +        super.onCreate(savedInstanceState)
    +        // Callback event A
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // Callback event B
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // Callback event C
    +        dataChannel(packageName = "com.example.demo1").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +        // Callback event D
    +        dataChannel(packageName = "com.example.demo2").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +    }
    +}
    +
    +class OtherActivity : AppCompatActivity() {
    +
    +    override fun onCreate(savedInstanceState: Bundle?) {
    +        super.onCreate(savedInstanceState)
    +        // Callback event E
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // Callback event F
    +        dataChannel(packageName = "com.example.demo2").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +    }
    +}
    +

    In the above example, although callback events A and B are callback events in the same Host App, their key is the same, so callback event A will be replaced by callback event B.

    The key of callback event C is not duplicated with others.

    Although the key of callback event D is the same as that of callback event C, their Host Apps are different, so they can exist at the same time.

    Callback event E is in another Activity, although the key of callback event F and callback event E is the same, but they are not the same Host App, so they can exist at the same time.

    In summary, the final callback events B, C, D, E, and F can all be created successfully.

    Compatibility Notes

    Setting the same key on different Host Apps in previous historical versions of the API would result in only the last event callback, but the latest version has corrected this problem, please make sure you are using the latest API version.

    Pay Attention

    A callback event with the same key will only call back the callback event registered in the Activity that the current Module App is displaying, such as test_key in the above, if OtherActivity is being displayed, then test_key in MainActivity will not be called back.

    The same key registers dataChannel in the same Activity but different Fragment, they will still be called back in the current Activity at the same time.

    In a Module App, you can only use Context of Activity to register dataChannel, you cannot use dataChannel in Application and Service.

    If you want to use dataChannel in Fragment, use activity?.dataChannel(...).

    If you want to manually set the response priority (condition) of each callback event in the same Activity, you can use ChannelPriority.

    For example, if you are using one Activity binding multiple Fragment cases, this will be able to solve this problem.

    The following example

    open class BaseFragment : Fragment() {
    +
    +    /** Identify that the current Fragment is in the onResume lifecycle */
    +    var isResume = false
    +
    +    override fun onResume() {
    +        super. onResume()
    +        isResume = true
    +    }
    +
    +    override fun onPause() {
    +        super. onPause()
    +        isResume = false
    +    }
    +
    +    override fun onStop() {
    +        super. onStop()
    +        isResume = false
    +    }
    +}
    +
    +class FragmentA : BaseFragment() {
    +
    +    // Omit part of initialization code
    +    //...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // Use the custom isResume combined with the isVisible condition
    +        // To judge that the current Fragment is in the displayed state
    +        activity?.dataChannel(packageName = "com.example.demo1")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +
    +class FragmentB : BaseFragment() {
    +
    +    // Omit part of initialization code
    +    //...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // Use the custom isResume combined with the isVisible condition
    +        // To judge that the current Fragment is in the displayed state
    +        activity?.dataChannel(packageName = "com.example.demo2")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +

    Security Instructions

    In the Module environment, you can only receive the communication data sent by the Host App of the specified package name and can only send to the Host App of the specified package name, except for System Framework.

    Pay Attention

    In order to further prevent broadcast abuse, the API in the communication data will automatically specify the package name of the Host App and Module App to prevent other apps from monitoring and using broadcast to make overrun behaviors.

    `,49),p=[o];function t(c,i){return n(),a("div",null,p)}const d=s(l,[["render",t],["__file","xposed-channel.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-channel.html.7069024e.js b/docs/assets/xposed-channel.html.7069024e.js new file mode 100644 index 000000000..d628b5079 --- /dev/null +++ b/docs/assets/xposed-channel.html.7069024e.js @@ -0,0 +1,118 @@ +import{_ as s,o as n,c as a,a as l}from"./app.6074a838.js";const e={},o=l(`

    Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865

    \u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u53D1\u9001\u548C\u63A5\u6536\u6570\u636E\u7684\u89E3\u51B3\u65B9\u6848\u3002

    \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5426\u5219\u65E0\u6CD5\u5EFA\u7ACB\u901A\u8BAF\u3002

    \u57FA\u672C\u7528\u6CD5

    \u8FD9\u91CC\u63CF\u8FF0\u4E86 wait \u4E0E put \u65B9\u6CD5\u7684\u57FA\u672C\u4F7F\u7528\u65B9\u6CD5\u3002

    \u901A\u8FC7\u4F7F\u7528 dataChannel \u6765\u5B9E\u73B0\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684\u901A\u8BAF\u6865\uFF0C\u539F\u7406\u4E3A\u53D1\u9001\u63A5\u6536\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u3002

    \u6A21\u5757\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    +dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
    +    // Your code here.
    +}
    +// \u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B
    +dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module")
    +

    \u5BBF\u4E3B\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    +dataChannel.wait<String>(key = "key_from_module") { value ->
    +    // Your code here.
    +}
    +// \u53D1\u9001\u7ED9\u6A21\u5757
    +dataChannel.put(key = "key_from_host", value = "I am host")
    +

    \u4F60\u53EF\u4EE5\u4E0D\u8BBE\u7F6E dataChannel \u7684 value \u6765\u8FBE\u5230\u4EC5\u901A\u77E5\u6A21\u5757\u6216\u5BBF\u4E3B\u56DE\u8C03 wait \u65B9\u6CD5\u3002

    \u6A21\u5757\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    +dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") {
    +    // Your code here.
    +}
    +// \u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B
    +dataChannel(packageName = "com.example.demo").put(key = "listener_from_module")
    +

    \u5BBF\u4E3B\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    +dataChannel.wait(key = "listener_from_module") {
    +    // Your code here.
    +}
    +// \u53D1\u9001\u7ED9\u6A21\u5757
    +dataChannel.put(key = "listener_from_host")
    +

    \u7279\u522B\u6CE8\u610F

    \u63A5\u6536\u65B9\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\u624D\u80FD\u6536\u5230\u901A\u8BAF\u6570\u636E\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookDataChannel\u3002

    \u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D

    \u901A\u8FC7\u901A\u8BAF\u6865\u529F\u80FD\uFF0CYukiHookAPI \u8FD8\u4E3A\u4F60\u63D0\u4F9B\u4E86\u5728\u7528\u6237\u66F4\u65B0\u6A21\u5757\u540E\uFF0C\u5224\u65AD\u6A21\u5757\u662F\u5426\u4E0E\u5BBF\u4E3B\u7248\u672C\u5339\u914D\u7684\u89E3\u51B3\u65B9\u6848\u3002

    \u6211\u4EEC\u53EA\u9700\u8981\u8C03\u7528 checkingVersionEquals \u65B9\u6CD5\uFF0C\u5373\u53EF\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

    \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u53EF\u8FDB\u884C\u53CC\u5411\u5224\u65AD\u3002

    \u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E2D\u5224\u65AD\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u662F\u5426\u4E0E\u5F53\u524D\u6A21\u5757\u7684\u7248\u672C\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    +dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals ->
    +    // Your code here.
    +}
    +

    \u4F60\u8FD8\u53EF\u4EE5\u5728\u5BBF\u4E3B\u4E2D\u5224\u65AD\u662F\u5426\u81EA\u8EAB\u4E0E\u5F53\u524D\u6A21\u5757\u7684\u7248\u672C\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    +dataChannel.checkingVersionEquals { isEquals ->
    +    // Your code here.
    +}
    +

    \u65B9\u6CD5\u56DE\u8C03\u7684\u6761\u4EF6

    \u5BBF\u4E3B\u3001\u6A21\u5757\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5E76\u5728\u6FC0\u6D3B\u6A21\u5757\u540E\u91CD\u542F\u4E86\u4F5C\u7528\u57DF\u4E2D\u7684 Hook \u76EE\u6807\u5BBF\u4E3B\u5BF9\u8C61\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookDataChannel\u3002

    \u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219

    \u8FD9\u91CC\u53EA\u5217\u51FA\u4E86\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u7684\u4F8B\u5B50\uFF0C\u5728\u540C\u4E00\u4E2A\u5BBF\u4E3B\u4E2D\u76F8\u540C\u7684 key \u59CB\u7EC8\u4E0D\u5141\u8BB8\u91CD\u590D\u521B\u5EFA\uFF0C\u4F46\u4E0D\u540C\u7684\u5BBF\u4E3B\u4E2D\u5141\u8BB8\u5B58\u5728\u76F8\u540C\u7684 key\u3002

    \u7279\u522B\u6CE8\u610F

    \u5728\u6A21\u5757\u548C\u5BBF\u4E3B\u4E2D\uFF0C\u6BCF\u4E00\u4E2A dataChannel \u5BF9\u5E94\u7684 key \u7684\u56DE\u8C03\u4E8B\u4EF6\u90FD\u4E0D\u5141\u8BB8\u91CD\u590D\u521B\u5EFA\uFF0C\u82E5\u91CD\u590D\uFF0C\u4E4B\u524D\u7684\u56DE\u8C03\u4E8B\u4EF6\u4F1A\u88AB\u65B0\u589E\u52A0\u7684\u56DE\u8C03\u4E8B\u4EF6\u66FF\u6362\uFF0C\u82E5\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\uFF0C\u5728\u540C\u4E00\u4E2A Activity \u4E2D\u4E0D\u53EF\u4EE5\u91CD\u590D\uFF0C\u4E0D\u540C\u7684 Activity \u4E2D\u76F8\u540C\u7684 key \u5141\u8BB8\u91CD\u590D\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MainActivity : AppCompatActivity() {
    +
    +    override fun onCreate(savedInstanceState: Bundle?) {
    +        super.onCreate(savedInstanceState)
    +        // \u56DE\u8C03\u4E8B\u4EF6 A
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // \u56DE\u8C03\u4E8B\u4EF6 B
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // \u56DE\u8C03\u4E8B\u4EF6 C
    +        dataChannel(packageName = "com.example.demo1").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +        // \u56DE\u8C03\u4E8B\u4EF6 D
    +        dataChannel(packageName = "com.example.demo2").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +    }
    +}
    +
    +class OtherActivity : AppCompatActivity() {
    +
    +    override fun onCreate(savedInstanceState: Bundle?) {
    +        super.onCreate(savedInstanceState)
    +        // \u56DE\u8C03\u4E8B\u4EF6 E
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // \u56DE\u8C03\u4E8B\u4EF6 F
    +        dataChannel(packageName = "com.example.demo2").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +    }
    +}
    +

    \u5728\u4E0A\u8FF0\u793A\u4F8B\u4E2D\uFF0C\u867D\u7136\u56DE\u8C03\u4E8B\u4EF6 A \u4E0E B \u662F\u540C\u4E00\u4E2A\u5BBF\u4E3B\u4E2D\u7684\u56DE\u8C03\u4E8B\u4EF6\uFF0C\u4F46\u662F\u5B83\u4EEC\u7684 key \u76F8\u540C\uFF0C\u6240\u4EE5\u56DE\u8C03\u4E8B\u4EF6 A \u4F1A\u88AB\u56DE\u8C03\u4E8B\u4EF6 B \u66FF\u6362\u6389\u3002

    \u56DE\u8C03\u4E8B\u4EF6 C \u7684 key \u4E0D\u4E0E\u5176\u5B83\u91CD\u590D\uFF0C\u867D\u7136\u56DE\u8C03\u4E8B\u4EF6 D \u7684 key \u4E0E\u56DE\u8C03\u4E8B\u4EF6 C \u76F8\u540C\uFF0C\u4F46\u662F\u5B83\u4EEC\u7684\u5BBF\u4E3B\u4E0D\u540C\uFF0C\u6240\u4EE5\u53EF\u4EE5\u540C\u65F6\u5B58\u5728\u3002

    \u56DE\u8C03\u4E8B\u4EF6 E \u5728\u53E6\u4E00\u4E2A Activity \u4E2D\uFF0C\u56DE\u8C03\u4E8B\u4EF6 F \u4E0E\u56DE\u8C03\u4E8B\u4EF6 E \u7684 key \u867D\u7136\u76F8\u540C\uFF0C\u4F46\u5B83\u4EEC\u4E5F\u4E0D\u662F\u540C\u4E00\u4E2A\u5BBF\u4E3B\uFF0C\u6240\u4EE5\u53EF\u4EE5\u540C\u65F6\u5B58\u5728\u3002

    \u7EFC\u4E0A\u6240\u8FF0\uFF0C\u6700\u7EC8\u56DE\u8C03\u4E8B\u4EF6 B\u3001C\u3001D\u3001E\u3001F \u90FD\u53EF\u88AB\u521B\u5EFA\u6210\u529F\u3002

    \u517C\u5BB9\u6027\u8BF4\u660E

    \u5728\u8FC7\u5F80\u5386\u53F2\u7248\u672C\u7684 API \u4E2D\u4E0D\u540C\u7684\u5BBF\u4E3B\u8BBE\u7F6E\u76F8\u540C\u7684 key \u4F1A\u9020\u6210\u53EA\u6709\u6700\u540E\u4E00\u4E2A\u4E8B\u4EF6\u56DE\u8C03\uFF0C\u4F46\u662F\u6700\u65B0\u7248\u672C\u66F4\u6B63\u4E86\u8FD9\u4E00\u95EE\u9898\uFF0C\u8BF7\u786E\u4FDD\u4F60\u4F7F\u7528\u7684\u662F\u6700\u65B0\u7684 API \u7248\u672C\u3002

    \u7279\u522B\u6CE8\u610F

    \u4E00\u4E2A\u76F8\u540C key \u7684\u56DE\u8C03\u4E8B\u4EF6\u53EA\u4F1A\u56DE\u8C03\u5F53\u524D\u6A21\u5757\u6B63\u5728\u663E\u793A\u7684 Activity \u4E2D\u6CE8\u518C\u7684\u56DE\u8C03\u4E8B\u4EF6\uFF0C\u4F8B\u5982\u4E0A\u8FF0\u4E2D\u7684 test_key\uFF0C\u5982\u679C OtherActivity \u6B63\u5728\u663E\u793A\uFF0C\u90A3\u4E48 MainActivity \u4E2D\u7684 test_key \u5C31\u4E0D\u4F1A\u88AB\u56DE\u8C03\u3002

    \u76F8\u540C\u7684 key \u5728\u540C\u4E00\u4E2A Activity \u4E0D\u540C\u7684 Fragment \u4E2D\u6CE8\u518C dataChannel\uFF0C\u5B83\u4EEC\u4F9D\u7136\u4F1A\u5728\u5F53\u524D Activity \u4E2D\u540C\u65F6\u88AB\u56DE\u8C03\u3002

    \u5728\u6A21\u5757\u4E2D\uFF0C\u4F60\u53EA\u80FD\u4F7F\u7528 Activity \u7684 Context \u6CE8\u518C dataChannel\uFF0C\u4F60\u4E0D\u80FD\u5728 Application \u4EE5\u53CA Service \u7B49\u5730\u65B9\u4F7F\u7528 dataChannel\u3002

    \u82E5\u8981\u5728 Fragment \u4E2D\u4F7F\u7528 dataChannel\uFF0C\u8BF7\u4F7F\u7528 activity?.dataChannel(...)\u3002

    \u5982\u679C\u4F60\u5E0C\u671B\u5728\u540C\u4E00\u4E2A Activity \u4E2D\u624B\u52A8\u8BBE\u7F6E\u6BCF\u4E2A\u56DE\u8C03\u4E8B\u4EF6\u7684\u54CD\u5E94\u4F18\u5148\u7EA7 (\u6761\u4EF6)\uFF0C\u4F60\u53EF\u4EE5\u4F7F\u7528 ChannelPriority\u3002

    \u4F8B\u5982\uFF0C\u4F60\u6B63\u5728\u4F7F\u7528\u4E00\u4E2A Activity \u7ED1\u5B9A\u591A\u4E2A Fragment \u7684\u60C5\u51B5\uFF0C\u8FD9\u5C06\u80FD\u591F\u89E3\u51B3\u8FD9\u4E2A\u95EE\u9898\u3002

    \u793A\u4F8B\u5982\u4E0B

    open class BaseFragment : Fragment() {
    +
    +    /** \u6807\u8BC6\u5F53\u524D Fragment \u5904\u4E8E onResume \u751F\u547D\u5468\u671F */
    +    var isResume = false
    +
    +    override fun onResume() {
    +        super.onResume()
    +        isResume = true
    +    }
    +
    +    override fun onPause() {
    +        super.onPause()
    +        isResume = false
    +    }
    +
    +    override fun onStop() {
    +        super.onStop()
    +        isResume = false
    +    }
    +}
    +
    +class FragmentA : BaseFragment() {
    +
    +    // \u7701\u7565\u90E8\u5206\u88C5\u8F7D\u4EE3\u7801
    +    // ...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // \u4F7F\u7528\u81EA\u5B9A\u4E49\u7684 isResume \u7ED3\u5408 isVisible \u6761\u4EF6\u5224\u65AD\u5F53\u524D Fragment \u6B63\u5904\u4E8E\u663E\u793A\u72B6\u6001
    +        activity?.dataChannel(packageName = "com.example.demo1")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +
    +class FragmentB : BaseFragment() {
    +
    +    // \u7701\u7565\u90E8\u5206\u88C5\u8F7D\u4EE3\u7801
    +    // ...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // \u4F7F\u7528\u81EA\u5B9A\u4E49\u7684 isResume \u7ED3\u5408 isVisible \u6761\u4EF6\u5224\u65AD\u5F53\u524D Fragment \u6B63\u5904\u4E8E\u663E\u793A\u72B6\u6001
    +        activity?.dataChannel(packageName = "com.example.demo2")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +

    \u5B89\u5168\u6027\u8BF4\u660E

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\uFF0C\u4F60\u53EA\u80FD\u63A5\u6536\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u53D1\u9001\u7684\u901A\u8BAF\u6570\u636E\u4E14\u53EA\u80FD\u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\uFF0C\u7CFB\u7EDF\u6846\u67B6\u9664\u5916\u3002

    \u7279\u522B\u6CE8\u610F

    \u4E3A\u4E86\u8FDB\u4E00\u6B65\u9632\u6B62\u5E7F\u64AD\u6EE5\u7528\uFF0C\u901A\u8BAF\u6570\u636E\u4E2D API \u4F1A\u81EA\u52A8\u6307\u5B9A\u5BBF\u4E3B\u548C\u6A21\u5757\u7684\u5305\u540D\uFF0C\u9632\u6B62\u5176\u5B83 APP \u76D1\u542C\u5E76\u5229\u7528\u5E7F\u64AD\u505A\u51FA\u8D85\u9650\u884C\u4E3A\u3002

    `,47),p=[o];function c(t,r){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","xposed-channel.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-channel.html.e26f5994.js b/docs/assets/xposed-channel.html.e26f5994.js deleted file mode 100644 index fbab007a1..000000000 --- a/docs/assets/xposed-channel.html.e26f5994.js +++ /dev/null @@ -1,62 +0,0 @@ -import{_ as s,o as n,c as a,a as l}from"./app.99fcdd51.js";const e={},o=l(`

    Xposed \u6A21\u5757\u4E0E\u5BBF\u4E3B\u901A\u8BAF\u6865

    \u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u53D1\u9001\u548C\u63A5\u6536\u6570\u636E\u7684\u89E3\u51B3\u65B9\u6848\u3002

    \u9700\u8981\u6EE1\u8DB3\u7684\u6761\u4EF6

    \u6A21\u5757\u4E0E\u5BBF\u4E3B\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5426\u5219\u65E0\u6CD5\u5EFA\u7ACB\u901A\u8BAF\u3002

    \u57FA\u672C\u7528\u6CD5

    \u8FD9\u91CC\u63CF\u8FF0\u4E86 wait \u4E0E put \u65B9\u6CD5\u7684\u57FA\u672C\u4F7F\u7528\u65B9\u6CD5\u3002

    \u901A\u8FC7\u4F7F\u7528 dataChannel \u6765\u5B9E\u73B0\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E4B\u95F4\u7684\u901A\u8BAF\u6865\uFF0C\u539F\u7406\u4E3A\u53D1\u9001\u63A5\u6536\u7CFB\u7EDF\u65E0\u5E8F\u5E7F\u64AD\u3002

    \u6A21\u5757\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    -dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
    -    // Your code here.
    -}
    -// \u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B
    -dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module")
    -

    \u5BBF\u4E3B\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    -dataChannel.wait<String>(key = "key_from_module") { value ->
    -    // Your code here.
    -}
    -// \u53D1\u9001\u7ED9\u6A21\u5757
    -dataChannel.put(key = "key_from_host", value = "I am host")
    -

    \u4F60\u53EF\u4EE5\u4E0D\u8BBE\u7F6E dataChannel \u7684 value \u6765\u8FBE\u5230\u4EC5\u901A\u77E5\u6A21\u5757\u6216\u5BBF\u4E3B\u56DE\u8C03 wait \u65B9\u6CD5\u3002

    \u6A21\u5757\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    -dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") {
    -    // Your code here.
    -}
    -// \u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B
    -dataChannel(packageName = "com.example.demo").put(key = "listener_from_module")
    -

    \u5BBF\u4E3B\u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    -dataChannel.wait(key = "listener_from_module") {
    -    // Your code here.
    -}
    -// \u53D1\u9001\u7ED9\u6A21\u5757
    -dataChannel.put(key = "listener_from_host")
    -

    \u7279\u522B\u6CE8\u610F

    \u63A5\u6536\u65B9\u9700\u8981\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\u624D\u80FD\u6536\u5230\u901A\u8BAF\u6570\u636E\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookDataChannel\u3002

    \u5224\u65AD\u6A21\u5757\u4E0E\u5BBF\u4E3B\u7248\u672C\u662F\u5426\u5339\u914D

    \u901A\u8FC7\u901A\u8BAF\u6865\u529F\u80FD\uFF0CYukiHookAPI \u8FD8\u4E3A\u4F60\u63D0\u4F9B\u4E86\u5728\u7528\u6237\u66F4\u65B0\u6A21\u5757\u540E\uFF0C\u5224\u65AD\u6A21\u5757\u662F\u5426\u4E0E\u5BBF\u4E3B\u7248\u672C\u5339\u914D\u7684\u89E3\u51B3\u65B9\u6848\u3002

    \u6211\u4EEC\u53EA\u9700\u8981\u8C03\u7528 checkingVersionEquals \u65B9\u6CD5\uFF0C\u5373\u53EF\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

    \u5728\u6A21\u5757\u4E0E\u5BBF\u4E3B\u4E2D\u53EF\u8FDB\u884C\u53CC\u5411\u5224\u65AD\u3002

    \u4F60\u53EF\u4EE5\u5728\u6A21\u5757\u4E2D\u5224\u65AD\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u662F\u5426\u4E0E\u5F53\u524D\u6A21\u5757\u7684\u7248\u672C\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u83B7\u53D6
    -dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals ->
    -    // Your code here.
    -}
    -

    \u4F60\u8FD8\u53EF\u4EE5\u5728\u5BBF\u4E3B\u4E2D\u5224\u65AD\u662F\u5426\u81EA\u8EAB\u4E0E\u5F53\u524D\u6A21\u5757\u7684\u7248\u672C\u5339\u914D\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u4ECE\u6A21\u5757\u83B7\u53D6
    -dataChannel.checkingVersionEquals { isEquals ->
    -    // Your code here.
    -}
    -

    \u65B9\u6CD5\u56DE\u8C03\u7684\u6761\u4EF6

    \u5BBF\u4E3B\u3001\u6A21\u5757\u4FDD\u6301\u5B58\u6D3B\u72B6\u6001\uFF0C\u5E76\u5728\u6FC0\u6D3B\u6A21\u5757\u540E\u91CD\u542F\u4E86\u4F5C\u7528\u57DF\u4E2D\u7684 Hook \u76EE\u6807\u5BBF\u4E3B\u5BF9\u8C61\u3002

    \u5C0F\u63D0\u793A

    \u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookDataChannel\u3002

    \u56DE\u8C03\u4E8B\u4EF6\u54CD\u5E94\u7684\u89C4\u5219

    \u8FD9\u91CC\u53EA\u5217\u51FA\u4E86\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\u7684\u4F8B\u5B50\uFF0C\u5728\u5BBF\u4E3B\u4E2D\u76F8\u540C\u7684 key \u59CB\u7EC8\u4E0D\u5141\u8BB8\u91CD\u590D\u521B\u5EFA\u3002

    \u7279\u522B\u6CE8\u610F

    \u5728\u6A21\u5757\u548C\u5BBF\u4E3B\u4E2D\uFF0C\u6BCF\u4E00\u4E2A dataChannel \u5BF9\u5E94\u7684 key \u7684\u56DE\u8C03\u4E8B\u4EF6\u90FD\u4E0D\u5141\u8BB8\u91CD\u590D\u521B\u5EFA\uFF0C\u82E5\u91CD\u590D\uFF0C\u4E4B\u524D\u7684\u56DE\u8C03\u4E8B\u4EF6\u4F1A\u88AB\u65B0\u589E\u52A0\u7684\u56DE\u8C03\u4E8B\u4EF6\u66FF\u6362\uFF0C\u82E5\u5728\u6A21\u5757\u4E2D\u4F7F\u7528\uFF0C\u5728\u540C\u4E00\u4E2A Activity \u4E2D\u4E0D\u53EF\u4EE5\u91CD\u590D\uFF0C\u4E0D\u540C\u7684 Activity \u4E2D\u76F8\u540C\u7684 key \u5141\u8BB8\u91CD\u590D\u3002

    \u793A\u4F8B\u5982\u4E0B

    class MainActivity : AppCompatActivity() {
    -
    -    override fun onCreate(savedInstanceState: Bundle?) {
    -        super.onCreate(savedInstanceState)
    -        // \u56DE\u8C03\u4E8B\u4EF6 A
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -        // \u56DE\u8C03\u4E8B\u4EF6 B
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -        // \u56DE\u8C03\u4E8B\u4EF6 C
    -        dataChannel(packageName = "com.example.demo").wait(key = "other_test_key") {
    -            // Your code here.
    -        }
    -    }
    -}
    -
    -class OtherActivity : AppCompatActivity() {
    -
    -    override fun onCreate(savedInstanceState: Bundle?) {
    -        super.onCreate(savedInstanceState)
    -        // \u56DE\u8C03\u4E8B\u4EF6 D
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    -            // Your code here.
    -        }
    -    }
    -}
    -

    \u5728\u4E0A\u8FF0\u793A\u4F8B\u4E2D\uFF0C\u56DE\u8C03\u4E8B\u4EF6 A \u4F1A\u88AB\u56DE\u8C03\u4E8B\u4EF6 B \u66FF\u6362\u6389\uFF0C\u56DE\u8C03\u4E8B\u4EF6 C \u7684 key \u4E0D\u4E0E\u5176\u5B83\u91CD\u590D\uFF0C\u56DE\u8C03\u4E8B\u4EF6 D \u5728\u53E6\u4E00\u4E2A Activity \u4E2D\uFF0C\u6240\u4EE5\u6700\u7EC8\u56DE\u8C03\u4E8B\u4EF6 B\u3001C\u3001D \u90FD\u53EF\u88AB\u521B\u5EFA\u6210\u529F\u3002

    \u7279\u522B\u6CE8\u610F

    \u4E00\u4E2A\u76F8\u540C key \u7684\u56DE\u8C03\u4E8B\u4EF6\u53EA\u4F1A\u56DE\u8C03\u5F53\u524D\u6A21\u5757\u6B63\u5728\u663E\u793A\u7684 Activity \u4E2D\u6CE8\u518C\u7684\u56DE\u8C03\u4E8B\u4EF6\uFF0C\u4F8B\u5982\u4E0A\u8FF0\u4E2D\u7684 test_key\uFF0C\u5982\u679C OtherActivity \u6B63\u5728\u663E\u793A\uFF0C\u90A3\u4E48 MainActivity \u4E2D\u7684 test_key \u5C31\u4E0D\u4F1A\u88AB\u56DE\u8C03\u3002

    \u76F8\u540C\u7684 key \u5728\u540C\u4E00\u4E2A Activity \u4E0D\u540C\u7684 Fragment \u4E2D\u6CE8\u518C dataChannel\uFF0C\u5B83\u4EEC\u4F9D\u7136\u4F1A\u5728\u5F53\u524D Activity \u4E2D\u540C\u65F6\u88AB\u56DE\u8C03\u3002

    \u5728\u6A21\u5757\u4E2D\uFF0C\u4F60\u53EA\u80FD\u4F7F\u7528 Activity \u7684 Context \u6CE8\u518C dataChannel\uFF0C\u4F60\u4E0D\u80FD\u5728 Application \u4EE5\u53CA Service \u7B49\u5730\u65B9\u4F7F\u7528 dataChannel\u3002

    \u82E5\u8981\u5728 Fragment \u4E2D\u4F7F\u7528 dataChannel\uFF0C\u8BF7\u4F7F\u7528 activity?.dataChannel(...)\u3002

    \u5B89\u5168\u6027\u8BF4\u660E

    \u5728\u6A21\u5757\u73AF\u5883\u4E2D\uFF0C\u4F60\u53EA\u80FD\u63A5\u6536\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u53D1\u9001\u7684\u901A\u8BAF\u6570\u636E\u4E14\u53EA\u80FD\u53D1\u9001\u7ED9\u6307\u5B9A\u5305\u540D\u7684\u5BBF\u4E3B\u3002

    \u7279\u522B\u6CE8\u610F

    \u4E3A\u4E86\u8FDB\u4E00\u6B65\u9632\u6B62\u5E7F\u64AD\u6EE5\u7528\uFF0C\u901A\u8BAF\u6570\u636E\u4E2D API \u4F1A\u81EA\u52A8\u6307\u5B9A\u5BBF\u4E3B\u548C\u6A21\u5757\u7684\u5305\u540D\uFF0C\u9632\u6B62\u5176\u5B83 APP \u76D1\u542C\u5E76\u5229\u7528\u5E7F\u64AD\u505A\u51FA\u8D85\u9650\u884C\u4E3A\u3002

    `,39),p=[o];function t(c,r){return n(),a("div",null,p)}const d=s(e,[["render",t],["__file","xposed-channel.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-storage.html.f78666ac.js b/docs/assets/xposed-storage.html.6a4180bb.js similarity index 99% rename from docs/assets/xposed-storage.html.f78666ac.js rename to docs/assets/xposed-storage.html.6a4180bb.js index 5ec9f7ba7..0159488aa 100644 --- a/docs/assets/xposed-storage.html.f78666ac.js +++ b/docs/assets/xposed-storage.html.6a4180bb.js @@ -1,4 +1,4 @@ -import{_ as e,o as s,c as o,a}from"./app.99fcdd51.js";const n={},t=a(`

    Xposed Module Data Storage

    This is an efficient Module App data storage solution that automatically connects SharedPreferences and XSharedPreferences.

    We need to store the data of the Module App for the Host App to call.

    At this time, we will encounter the data exchange obstacle of the native Sp storage.

    The native Xposed provides us with a XSharedPreferences for reading the Sp data of the Module App.

    Use in Activity

    Loading YukiHookModulePrefs in Activity is described here.

    Usually we can initialize it in Host App like this.

    The following example

    XSharedPreferences(BuildConfig.APPLICATION_ID)
    +import{_ as e,o as s,c as o,a}from"./app.6074a838.js";const n={},t=a(`

    Xposed Module Data Storage

    This is an efficient Module App data storage solution that automatically connects SharedPreferences and XSharedPreferences.

    We need to store the data of the Module App for the Host App to call.

    At this time, we will encounter the data exchange obstacle of the native Sp storage.

    The native Xposed provides us with a XSharedPreferences for reading the Sp data of the Module App.

    Use in Activity

    Loading YukiHookModulePrefs in Activity is described here.

    Usually we can initialize it in Host App like this.

    The following example

    XSharedPreferences(BuildConfig.APPLICATION_ID)
     

    Is there a convenient and quick solution?

    At this point, you can use the extension capability of YukiHookAPI to quickly implement this function.

    When you store data in a Module App, you can use the following methods if you are currently in an Activity.

    The following example

    modulePrefs.putString("test_name", "saved_value")
     

    When you read data in a Host App, you can use the following methods.

    The following example

    val testName = prefs.getString("test_name", "default_value")
     

    You don't need to consider the module package name and a series of complicated permission configurations, everything is handled by YukiHookModulePrefs.

    To achieve localization of storage, you can specify the name of each prefs file.

    This is used in the Activity of the Module App.

    The following example

    // Recommended usage
    diff --git a/docs/assets/xposed-storage.html.3cad78fc.js b/docs/assets/xposed-storage.html.ede06577.js
    similarity index 99%
    rename from docs/assets/xposed-storage.html.3cad78fc.js
    rename to docs/assets/xposed-storage.html.ede06577.js
    index b0d72c14f..366c3b1bf 100644
    --- a/docs/assets/xposed-storage.html.3cad78fc.js
    +++ b/docs/assets/xposed-storage.html.ede06577.js
    @@ -1,4 +1,4 @@
    -import{_ as e,o as s,c as o,a}from"./app.99fcdd51.js";const n={},l=a(`

    Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8

    \u8FD9\u662F\u4E00\u4E2A\u81EA\u52A8\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences \u7684\u9AD8\u6548\u6A21\u5757\u6570\u636E\u5B58\u50A8\u89E3\u51B3\u65B9\u6848\u3002

    \u6211\u4EEC\u9700\u8981\u5B58\u50A8\u6A21\u5757\u7684\u6570\u636E\uFF0C\u4EE5\u4F9B\u5BBF\u4E3B\u8C03\u7528\uFF0C\u8FD9\u4E2A\u65F6\u5019\u4F1A\u9047\u5230\u539F\u751F Sp \u5B58\u50A8\u7684\u6570\u636E\u4E92\u901A\u963B\u788D\u3002

    \u539F\u751F\u7684 Xposed \u7ED9\u6211\u4EEC\u63D0\u4F9B\u4E86\u4E00\u4E2A XSharedPreferences \u7528\u4E8E\u8BFB\u53D6\u6A21\u5757\u7684 Sp \u6570\u636E\u3002

    \u5728 Activity \u4E2D\u4F7F\u7528

    \u8FD9\u91CC\u63CF\u8FF0\u4E86\u5728 Activity \u4E2D\u88C5\u8F7D YukiHookModulePrefs \u7684\u573A\u666F\u3002

    \u901A\u5E38\u60C5\u51B5\u4E0B\u6211\u4EEC\u53EF\u4EE5\u8FD9\u6837\u5728 Hook APP (\u5BBF\u4E3B) \u5185\u5BF9\u5176\u8FDB\u884C\u521D\u59CB\u5316\u3002

    \u793A\u4F8B\u5982\u4E0B

    XSharedPreferences(BuildConfig.APPLICATION_ID)
    +import{_ as e,o as s,c as o,a}from"./app.6074a838.js";const n={},l=a(`

    Xposed \u6A21\u5757\u6570\u636E\u5B58\u50A8

    \u8FD9\u662F\u4E00\u4E2A\u81EA\u52A8\u5BF9\u63A5 SharedPreferences \u548C XSharedPreferences \u7684\u9AD8\u6548\u6A21\u5757\u6570\u636E\u5B58\u50A8\u89E3\u51B3\u65B9\u6848\u3002

    \u6211\u4EEC\u9700\u8981\u5B58\u50A8\u6A21\u5757\u7684\u6570\u636E\uFF0C\u4EE5\u4F9B\u5BBF\u4E3B\u8C03\u7528\uFF0C\u8FD9\u4E2A\u65F6\u5019\u4F1A\u9047\u5230\u539F\u751F Sp \u5B58\u50A8\u7684\u6570\u636E\u4E92\u901A\u963B\u788D\u3002

    \u539F\u751F\u7684 Xposed \u7ED9\u6211\u4EEC\u63D0\u4F9B\u4E86\u4E00\u4E2A XSharedPreferences \u7528\u4E8E\u8BFB\u53D6\u6A21\u5757\u7684 Sp \u6570\u636E\u3002

    \u5728 Activity \u4E2D\u4F7F\u7528

    \u8FD9\u91CC\u63CF\u8FF0\u4E86\u5728 Activity \u4E2D\u88C5\u8F7D YukiHookModulePrefs \u7684\u573A\u666F\u3002

    \u901A\u5E38\u60C5\u51B5\u4E0B\u6211\u4EEC\u53EF\u4EE5\u8FD9\u6837\u5728 Hook APP (\u5BBF\u4E3B) \u5185\u5BF9\u5176\u8FDB\u884C\u521D\u59CB\u5316\u3002

    \u793A\u4F8B\u5982\u4E0B

    XSharedPreferences(BuildConfig.APPLICATION_ID)
     

    \u6709\u6CA1\u6709\u65B9\u4FBF\u5FEB\u6377\u7684\u89E3\u51B3\u65B9\u6848\u5462\uFF0C\u6B64\u65F6\u4F60\u5C31\u53EF\u4EE5\u4F7F\u7528 YukiHookAPI \u7684\u6269\u5C55\u80FD\u529B\u5FEB\u901F\u5B9E\u73B0\u8FD9\u4E2A\u529F\u80FD\u3002

    \u5F53\u4F60\u5728\u6A21\u5757\u4E2D\u5B58\u50A8\u6570\u636E\u7684\u65F6\u5019\uFF0C\u82E5\u5F53\u524D\u5904\u4E8E Activity \u5185\uFF0C\u53EF\u4EE5\u4F7F\u7528\u5982\u4E0B\u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    modulePrefs.putString("test_name", "saved_value")
     

    \u5F53\u4F60\u5728 Hook APP (\u5BBF\u4E3B) \u4E2D\u8BFB\u53D6\u6570\u636E\u65F6\uFF0C\u53EF\u4EE5\u4F7F\u7528\u5982\u4E0B\u65B9\u6CD5\u3002

    \u793A\u4F8B\u5982\u4E0B

    val testName = prefs.getString("test_name", "default_value")
     

    \u4F60\u4E0D\u9700\u8981\u8003\u8651\u4F20\u5165\u6A21\u5757\u7684\u5305\u540D\u4EE5\u53CA\u4E00\u7CFB\u5217\u590D\u6742\u7684\u6743\u9650\u914D\u7F6E\uFF0C\u4E00\u5207\u90FD\u4EA4\u7ED9 YukiHookModulePrefs \u6765\u5904\u7406\u3002

    \u82E5\u8981\u5B9E\u73B0\u5B58\u50A8\u7684\u533A\u57DF\u5212\u5206\uFF0C\u4F60\u53EF\u4EE5\u6307\u5B9A\u6BCF\u4E2A prefs \u6587\u4EF6\u7684\u540D\u79F0\u3002

    \u5728\u6A21\u5757\u7684 Activity \u4E2D\u8FD9\u6837\u4F7F\u7528\u3002

    \u793A\u4F8B\u5982\u4E0B

    // \u63A8\u8350\u7528\u6CD5
    diff --git a/docs/assets/xposed-using.html.59211920.js b/docs/assets/xposed-using.html.0026a400.js
    similarity index 85%
    rename from docs/assets/xposed-using.html.59211920.js
    rename to docs/assets/xposed-using.html.0026a400.js
    index af2226161..fe5ba392a 100644
    --- a/docs/assets/xposed-using.html.59211920.js
    +++ b/docs/assets/xposed-using.html.0026a400.js
    @@ -1,4 +1,4 @@
    -import{_ as s,o as e,c as a,a as n}from"./app.99fcdd51.js";const o={},l=n(`

    Use as Xposed Module Configs

    Here are the related configuration methods used by YukiHookAPI as an Xposed Module.

    Dependency Configs

    As an Xposed Module, YukiHookAPI provides an automatic builder.

    You need to integrate the latest version of the com.highcapable.yukihookapi:ksp-xposed dependency in your build.gradle.

    Custom Automatic Builder

    You can configure how YukiHookAPI will generate the xposed_init entry point.

    InjectYukiHookWithXposed Annotation

    annotation class InjectYukiHookWithXposed(
    +import{_ as s,o as e,c as a,a as n}from"./app.6074a838.js";const o={},l=n(`

    Use as Xposed Module Configs

    Here are the related configuration methods used by YukiHookAPI as an Xposed Module.

    Dependency Configs

    As an Xposed Module, YukiHookAPI provides an automatic builder.

    You need to integrate the latest version of the com.highcapable.yukihookapi:ksp-xposed dependency in your build.gradle.

    Custom Automatic Builder

    You can configure how YukiHookAPI will generate the xposed_init entry point.

    InjectYukiHookWithXposed Annotation

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
    @@ -16,18 +16,18 @@ import{_ as s,o as e,c as a,a as n}from"./app.99fcdd51.js";const o={},l=n(`

    If your module package name is automatically generated by unconventional means, or you think it is necessary to manually define the module package name, then you can directly set the modulePackageName parameter.

    The following example

    @InjectYukiHookWithXposed(modulePackageName = "com.example.demo")
     

    As long as you customize the modulePackageName parameter, you will get a warning at compile time.

    The following example

    You set the customize module package name to "com.example.demo", please check for yourself if it is correct
     

    Notice

    In addition to the format of the manually defined module package name, the automatic builder will no longer check whether the module package name is correct, and you need to confirm its validity by yourself.

    entryClassName Parameter

    entryClassName determines how the automatic builder generates the entry class name in xposed_init.

    By default, it will use your entry class package name to insert the _YukiHookXposedInit suffix for generation.

    Suppose this is your entry class.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit
    -

    The Xposed entry class is handled as follows.

    The following example

    class HookEntry_YukiHookXposedInit: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    The Xposed entry class is handled as follows.

    The following example

    class HookEntry_YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    The compiled class name structure is as follows.

    The following example

    ...hook.HookEntry \u2190 Your entry class
     ...hook.HookEntry_Impl \u2190 Auto-generated Impl class
     ...hook.HookEntry_YukiHookXposedInit \u2190 Automatically generated Xposed entry class
     

    We now define the entry class name as HookXposedEntry.

    The following example

    @InjectYukiHookWithXposed(entryClassName = "HookXposedEntry")
    -class HookEntry: IYukiHookXposedInit
    -

    The Xposed entry class is handled as follows.

    The following example

    class HookXposedEntry: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    The Xposed entry class is handled as follows.

    The following example

    class HookXposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    The compiled class name structure is as follows.

    The following example

    ...hook.HookEntry \u2190 Your entry class
     ...hook.HookEntry_Impl \u2190 Auto-generated Impl class
     ...hook.HookXposedEntry \u2190 Automatically generated Xposed entry class
    -

    Pay Attention

    The entryClassName you define must not be the same as the class name in xposed_init, otherwise the automatic builder throws an exception at compile time.

    isUsingResourcesHook Parameter

    isUsingResourcesHook determines whether the automatic builder generates relevant code for the Resources Hook, this feature is enabled by default.

    The generated entry class after enabling it will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
    +

    Tips

    The entry class can be defined using class or object, but it is recommended to use object definition to ensure that each injected process is a single instance.

    Pay Attention

    The entryClassName you define must not be the same as the class name in xposed_init, otherwise the automatic builder throws an exception at compile time.

    isUsingResourcesHook Parameter

    isUsingResourcesHook determines whether the automatic builder generates relevant code for the Resources Hook, this feature is enabled by default.

    The generated entry class after enabling it will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
             // ...
    @@ -41,7 +41,7 @@ import{_ as s,o as e,c as a,a as n}from"./app.99fcdd51.js";const o={},l=n(`

    // ... } } -

    If your current project does not need to use Reources Hook, you can set isUsingResourcesHook = false to disable automatic generation.

    The following example

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
    +

    If your current project does not need to use Resources Hook, you can set isUsingResourcesHook = false to disable automatic generation.

    The following example

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
     

    The resulting entry class after closing will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
    @@ -53,7 +53,7 @@ import{_ as s,o as e,c as a,a as n}from"./app.99fcdd51.js";const o={},l=n(`

    } }

    IYukiHookXposedInit Interface

    The IYukiHookXposedInit interface that your HookEntryClass must implements it, which is the entry point for your Module App to start hooking.

    Tips

    For more functions, please refer to IYukiHookXposedInit.

    When your Module App is loaded by Xposed, the onHook method will be called back, you need to start using YukiHookAPI in this method.

    The basic calling process is _YukiHookXposedInit \u2192 IYukiHookXposedInit.onXposedEvent \u2192 IYukiHookXposedInit.onInit \u2192 IYukiHookXposedInit.onHook

    For details, please refer to API Basic Configs.

    Native Xposed API Events

    If your current Xposed Module uses third-party resources, but may not be able to transfer them in a short time, you can use onXposedEvent to monitor all loading events of the native Xposed API.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() {
             // Your code here.
    @@ -74,4 +74,4 @@ import{_ as s,o as e,c as a,a as n}from"./app.99fcdd51.js";const o={},l=n(`

    } } } -

    onXposedEvent and onHook methods exist completely independently and do not affect each other. You can continue to use YukiHookAPI in the onHook method.

    Tips

    For more functions, please refer to the IYukiHookXposedInit.onXposedEvent method.

    `,82),p=[l];function t(c,r){return e(),a("div",null,p)}const d=s(o,[["render",t],["__file","xposed-using.html.vue"]]);export{d as default}; +

    onXposedEvent and onHook methods exist completely independently and do not affect each other. You can continue to use YukiHookAPI in the onHook method.

    Tips

    For more functions, please refer to the IYukiHookXposedInit.onXposedEvent method.

    `,83),p=[l];function t(c,r){return e(),a("div",null,p)}const d=s(o,[["render",t],["__file","xposed-using.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-using.html.873df271.js b/docs/assets/xposed-using.html.278102c7.js similarity index 86% rename from docs/assets/xposed-using.html.873df271.js rename to docs/assets/xposed-using.html.278102c7.js index 4589069d0..02b4b9ffa 100644 --- a/docs/assets/xposed-using.html.873df271.js +++ b/docs/assets/xposed-using.html.278102c7.js @@ -1,4 +1,4 @@ -import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u65B9\u6CD5\u3002

    \u4F9D\u8D56\u914D\u7F6E

    \u4F5C\u4E3A Xposed \u6A21\u5757\uFF0CYukiHookAPI \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

    \u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F

    \u4F60\u53EF\u4EE5\u5BF9 YukiHookAPI \u5C06\u5982\u4F55\u751F\u6210 xposed_init \u5165\u53E3\u8FDB\u884C\u76F8\u5173\u914D\u7F6E\u3002

    InjectYukiHookWithXposed \u6CE8\u89E3

    annotation class InjectYukiHookWithXposed(
    +import{_ as s,o as n,c as a,a as o}from"./app.6074a838.js";const e={},l=o(`

    \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E

    \u8FD9\u91CC\u4ECB\u7ECD\u4E86 YukiHookAPI \u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E\u65B9\u6CD5\u3002

    \u4F9D\u8D56\u914D\u7F6E

    \u4F5C\u4E3A Xposed \u6A21\u5757\uFF0CYukiHookAPI \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

    \u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F

    \u4F60\u53EF\u4EE5\u5BF9 YukiHookAPI \u5C06\u5982\u4F55\u751F\u6210 xposed_init \u5165\u53E3\u8FDB\u884C\u76F8\u5173\u914D\u7F6E\u3002

    InjectYukiHookWithXposed \u6CE8\u89E3

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
    @@ -16,18 +16,18 @@ import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    \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 \u53C2\u6570

    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
    -class HookEntry: IYukiHookXposedInit
    -

    Xposed \u5165\u53E3\u7C7B\u5904\u7406\u5982\u4E0B\u3002

    \u793A\u4F8B\u5982\u4E0B

    class HookEntry_YukiHookXposedInit: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +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")
    -class HookEntry: IYukiHookXposedInit
    -

    Xposed \u5165\u53E3\u7C7B\u5904\u7406\u5982\u4E0B\u3002

    \u793A\u4F8B\u5982\u4E0B

    class HookXposedEntry: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +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
    -

    \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 \u53C2\u6570

    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 {
    +

    \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 \u53C2\u6570

    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?) {
             // ...
    @@ -41,7 +41,7 @@ import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    // ... } } -

    \u82E5\u4F60\u5F53\u524D\u7684\u9879\u76EE\u5E76\u4E0D\u9700\u8981\u7528\u5230 Reources Hook\uFF0C\u53EF\u4EE5\u8BBE\u7F6E isUsingResourcesHook = false \u6765\u5173\u95ED\u81EA\u52A8\u751F\u6210\u3002

    \u793A\u4F8B\u5982\u4E0B

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
    +

    \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?) {
    @@ -53,7 +53,7 @@ import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    } }

    IYukiHookXposedInit \u63A5\u53E3

    IYukiHookXposedInit \u63A5\u53E3\u4E3A\u4F60\u7684 HookEntryClass \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 \u2192 IYukiHookXposedInit.onXposedEvent \u2192 IYukiHookXposedInit.onInit \u2192 IYukiHookXposedInit.onHook

    \u8BE6\u60C5\u8BF7\u53C2\u8003 API \u57FA\u672C\u914D\u7F6E\u3002

    \u539F\u751F Xposed API \u4E8B\u4EF6

    \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
    -class HookEntry: IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() {
             // Your code here.
    @@ -74,4 +74,4 @@ import{_ as s,o as n,c as a,a as o}from"./app.99fcdd51.js";const e={},l=o(`

    } } } -

    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

    `,79),p=[l];function c(t,r){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","xposed-using.html.vue"]]);export{d as default}; +

    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

    `,80),p=[l];function c(t,r){return n(),a("div",null,p)}const d=s(e,[["render",c],["__file","xposed-using.html.vue"]]);export{d as default}; diff --git a/docs/assets/xposed-using.html.cd65195d.js b/docs/assets/xposed-using.html.44c15d78.js similarity index 87% rename from docs/assets/xposed-using.html.cd65195d.js rename to docs/assets/xposed-using.html.44c15d78.js index d26b32dcf..55edc014e 100644 --- a/docs/assets/xposed-using.html.cd65195d.js +++ b/docs/assets/xposed-using.html.44c15d78.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-24e71de7","path":"/en/config/xposed-using.html","title":"Use as Xposed Module Configs","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Dependency Configs","slug":"dependency-configs","link":"#dependency-configs","children":[]},{"level":2,"title":"Custom Automatic Builder","slug":"custom-automatic-builder","link":"#custom-automatic-builder","children":[{"level":3,"title":"InjectYukiHookWithXposed Annotation","slug":"injectyukihookwithxposed-annotation","link":"#injectyukihookwithxposed-annotation","children":[]},{"level":3,"title":"IYukiHookXposedInit Interface","slug":"iyukihookxposedinit-interface","link":"#iyukihookxposedinit-interface","children":[]}]},{"level":2,"title":"Native Xposed API Events","slug":"native-xposed-api-events","link":"#native-xposed-api-events","children":[]}],"git":{"updatedTime":1663945651000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"en/config/xposed-using.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-24e71de7","path":"/en/config/xposed-using.html","title":"Use as Xposed Module Configs","lang":"en-US","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"Dependency Configs","slug":"dependency-configs","link":"#dependency-configs","children":[]},{"level":2,"title":"Custom Automatic Builder","slug":"custom-automatic-builder","link":"#custom-automatic-builder","children":[{"level":3,"title":"InjectYukiHookWithXposed Annotation","slug":"injectyukihookwithxposed-annotation","link":"#injectyukihookwithxposed-annotation","children":[]},{"level":3,"title":"IYukiHookXposedInit Interface","slug":"iyukihookxposedinit-interface","link":"#iyukihookxposedinit-interface","children":[]}]},{"level":2,"title":"Native Xposed API Events","slug":"native-xposed-api-events","link":"#native-xposed-api-events","children":[]}],"git":{"updatedTime":1672500479000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"en/config/xposed-using.md"}');export{e as data}; diff --git a/docs/assets/xposed-using.html.557dcdf1.js b/docs/assets/xposed-using.html.649a9099.js similarity index 89% rename from docs/assets/xposed-using.html.557dcdf1.js rename to docs/assets/xposed-using.html.649a9099.js index e3b884148..3a5c92bc3 100644 --- a/docs/assets/xposed-using.html.557dcdf1.js +++ b/docs/assets/xposed-using.html.649a9099.js @@ -1 +1 @@ -const e=JSON.parse('{"key":"v-af73b3d0","path":"/zh-cn/config/xposed-using.html","title":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u4F9D\u8D56\u914D\u7F6E","slug":"\u4F9D\u8D56\u914D\u7F6E","link":"#\u4F9D\u8D56\u914D\u7F6E","children":[]},{"level":2,"title":"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","slug":"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","link":"#\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","children":[{"level":3,"title":"InjectYukiHookWithXposed \u6CE8\u89E3","slug":"injectyukihookwithxposed-\u6CE8\u89E3","link":"#injectyukihookwithxposed-\u6CE8\u89E3","children":[]},{"level":3,"title":"IYukiHookXposedInit \u63A5\u53E3","slug":"iyukihookxposedinit-\u63A5\u53E3","link":"#iyukihookxposedinit-\u63A5\u53E3","children":[]}]},{"level":2,"title":"\u539F\u751F Xposed API \u4E8B\u4EF6","slug":"\u539F\u751F-xposed-api-\u4E8B\u4EF6","link":"#\u539F\u751F-xposed-api-\u4E8B\u4EF6","children":[]}],"git":{"updatedTime":1663945172000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":2}]},"filePathRelative":"zh-cn/config/xposed-using.md"}');export{e as data}; +const e=JSON.parse('{"key":"v-af73b3d0","path":"/zh-cn/config/xposed-using.html","title":"\u4F5C\u4E3A Xposed \u6A21\u5757\u4F7F\u7528\u7684\u76F8\u5173\u914D\u7F6E","lang":"zh-CN","frontmatter":{},"excerpt":"","headers":[{"level":2,"title":"\u4F9D\u8D56\u914D\u7F6E","slug":"\u4F9D\u8D56\u914D\u7F6E","link":"#\u4F9D\u8D56\u914D\u7F6E","children":[]},{"level":2,"title":"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","slug":"\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","link":"#\u81EA\u5B9A\u4E49\u5904\u7406\u7A0B\u5E8F","children":[{"level":3,"title":"InjectYukiHookWithXposed \u6CE8\u89E3","slug":"injectyukihookwithxposed-\u6CE8\u89E3","link":"#injectyukihookwithxposed-\u6CE8\u89E3","children":[]},{"level":3,"title":"IYukiHookXposedInit \u63A5\u53E3","slug":"iyukihookxposedinit-\u63A5\u53E3","link":"#iyukihookxposedinit-\u63A5\u53E3","children":[]}]},{"level":2,"title":"\u539F\u751F Xposed API \u4E8B\u4EF6","slug":"\u539F\u751F-xposed-api-\u4E8B\u4EF6","link":"#\u539F\u751F-xposed-api-\u4E8B\u4EF6","children":[]}],"git":{"updatedTime":1672500479000,"contributors":[{"name":"fankesyooni","email":"qzmmcn@163.com","commits":4}]},"filePathRelative":"zh-cn/config/xposed-using.md"}');export{e as data}; diff --git a/docs/assets/yukihookapi-projectbuilder.html.0e3e500d.js b/docs/assets/yukihookapi-projectbuilder.html.5ded7ae6.js similarity index 98% rename from docs/assets/yukihookapi-projectbuilder.html.0e3e500d.js rename to docs/assets/yukihookapi-projectbuilder.html.5ded7ae6.js index 261b4414c..0534633d2 100644 --- a/docs/assets/yukihookapi-projectbuilder.html.0e3e500d.js +++ b/docs/assets/yukihookapi-projectbuilder.html.5ded7ae6.js @@ -1 +1 @@ -import{_ as n,r as i,o as c,c as s,b as t,d as a,a as r,e}from"./app.99fcdd51.js";const l="/YukiHookAPI/images/yukihookapi-projectbuilder-en.png",d={},u=r('

    YukiHookAPI Project Builder

    This is an automatic building tool for Xposed Modules using YukiHookAPI as the core.

    Implementing automated search relies on quickly building an Android project template that includes a Xposed Module environment.

    Get Project

    This project is open source and free, and will be maintained continuously according to your usage.

    The original version may have imperfections or bugs. We welcome to your feedback.

    ',6),h=e("Project Address "),p={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder",target:"_blank",rel:"noopener noreferrer"},g=e("YukiHookAPI-ProjectBuilder"),f=e("\u3002"),m=e("If you want to download directly, you can "),k={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder/releases",target:"_blank",rel:"noopener noreferrer"},_=e("click here"),b=e(" to go to the Release address."),y=r('

    Usage

    Here contains the basic usage and function explanation.

    Basic Usage

    • The software use process requires your device connected to the Internet.

    • After starting the software, simply configure the project you want to create, click the button in the lower right corner or select Project > Run Build from the menu bar to start the task.

    • After waiting for the automatic dependency search to complete, you can configure the project dependencies. It is recommended to use the latest dependencies to ensure the stability of the project, and the build tools only support the latest dependencies.

    • Select the folder where you need to create the project. After starting, the project will be created in the location you selected, and wait for the whole process to complete and the project will be created.

    Config Template

    Config template is an extension function, you can select menu bar Project > Config Template > New Template.

    And then, you can create a template with the current config, and you can re-create it from Saved Template next time Load the template to restore the current config.

    Multilingual Support

    The software language follows the current system, and you can manually select the software interface language in the Language column of the menu bar.

    ',9);function j(w,x){const o=i("ExternalLinkIcon");return c(),s("div",null,[u,t("p",null,[h,t("a",p,[g,a(o)]),f]),t("p",null,[m,t("a",k,[_,a(o)]),b]),y])}const A=n(d,[["render",j],["__file","yukihookapi-projectbuilder.html.vue"]]);export{A as default}; +import{_ as n,r as i,o as c,c as s,b as t,d as a,a as r,e}from"./app.6074a838.js";const l="/YukiHookAPI/images/yukihookapi-projectbuilder-en.png",d={},u=r('

    YukiHookAPI Project Builder

    This is an automatic building tool for Xposed Modules using YukiHookAPI as the core.

    Implementing automated search relies on quickly building an Android project template that includes a Xposed Module environment.

    Get Project

    This project is open source and free, and will be maintained continuously according to your usage.

    The original version may have imperfections or bugs. We welcome to your feedback.

    ',6),h=e("Project Address "),p={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder",target:"_blank",rel:"noopener noreferrer"},g=e("YukiHookAPI-ProjectBuilder"),f=e("\u3002"),m=e("If you want to download directly, you can "),k={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder/releases",target:"_blank",rel:"noopener noreferrer"},_=e("click here"),b=e(" to go to the Release address."),y=r('

    Usage

    Here contains the basic usage and function explanation.

    Basic Usage

    • The software use process requires your device connected to the Internet.

    • After starting the software, simply configure the project you want to create, click the button in the lower right corner or select Project > Run Build from the menu bar to start the task.

    • After waiting for the automatic dependency search to complete, you can configure the project dependencies. It is recommended to use the latest dependencies to ensure the stability of the project, and the build tools only support the latest dependencies.

    • Select the folder where you need to create the project. After starting, the project will be created in the location you selected, and wait for the whole process to complete and the project will be created.

    Config Template

    Config template is an extension function, you can select menu bar Project > Config Template > New Template.

    And then, you can create a template with the current config, and you can re-create it from Saved Template next time Load the template to restore the current config.

    Multilingual Support

    The software language follows the current system, and you can manually select the software interface language in the Language column of the menu bar.

    ',9);function j(w,x){const o=i("ExternalLinkIcon");return c(),s("div",null,[u,t("p",null,[h,t("a",p,[g,a(o)]),f]),t("p",null,[m,t("a",k,[_,a(o)]),b]),y])}const A=n(d,[["render",j],["__file","yukihookapi-projectbuilder.html.vue"]]);export{A as default}; diff --git a/docs/assets/yukihookapi-projectbuilder.html.6785eea5.js b/docs/assets/yukihookapi-projectbuilder.html.69dbcb86.js similarity index 98% rename from docs/assets/yukihookapi-projectbuilder.html.6785eea5.js rename to docs/assets/yukihookapi-projectbuilder.html.69dbcb86.js index 13f15c229..ae0327403 100644 --- a/docs/assets/yukihookapi-projectbuilder.html.6785eea5.js +++ b/docs/assets/yukihookapi-projectbuilder.html.69dbcb86.js @@ -1 +1 @@ -import{_ as i,r as n,o as s,c as d,b as o,d as r,a,e}from"./app.99fcdd51.js";const h="/YukiHookAPI/images/yukihookapi-projectbuilder-zh-cn.png",c={},l=a('

    YukiHookAPI \u6784\u5EFA\u5DE5\u5177

    \u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528 YukiHookAPI \u4F5C\u4E3A\u6838\u5FC3\u7684 Xposed \u6A21\u5757\u81EA\u52A8\u6784\u5EFA\u5DE5\u5177\u3002

    \u5B9E\u73B0\u81EA\u52A8\u5316\u641C\u7D22\u4F9D\u8D56\u5FEB\u901F\u642D\u5EFA\u4E00\u4E2A\u5305\u542B Xposed \u6A21\u5757\u73AF\u5883\u7684 Android \u9879\u76EE\u6A21\u677F\u3002

    \u83B7\u53D6\u9879\u76EE

    \u672C\u9879\u76EE\u5B8C\u5168\u5F00\u6E90\u514D\u8D39\uFF0C\u4E14\u4F1A\u6839\u636E\u5927\u5BB6\u7684\u4F7F\u7528\u60C5\u51B5\u6301\u7EED\u7EF4\u62A4\uFF0C\u521D\u4EE3\u7248\u672C\u53EF\u80FD\u5B58\u5728\u4E0D\u5B8C\u5584\u6216 BUG\uFF0C\u6B22\u8FCE\u53CD\u9988\u3002

    ',5),p=e("\u9879\u76EE\u5730\u5740 "),u={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder",target:"_blank",rel:"noopener noreferrer"},_=e("YukiHookAPI-ProjectBuilder"),k=e("\u3002"),g=e("\u82E5\u4F60\u60F3\u76F4\u63A5\u4E0B\u8F7D\u53EF\u4EE5 "),f={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder/releases",target:"_blank",rel:"noopener noreferrer"},b=e("\u70B9\u51FB\u8FD9\u91CC"),m=e(" \u524D\u5F80 Release \u53D1\u5E03\u5730\u5740\u3002"),x=a('

    \u4F7F\u7528\u65B9\u6CD5

    \u8FD9\u91CC\u5305\u542B\u4E86\u57FA\u672C\u7684\u4F7F\u7528\u65B9\u6CD5\u548C\u529F\u80FD\u8BB2\u89E3\u3002

    \u57FA\u672C\u7528\u6CD5

    • \u8F6F\u4EF6\u4F7F\u7528\u8FC7\u7A0B\u9700\u8981\u5F53\u524D\u8BBE\u5907\u5DF2\u8FDE\u63A5\u4E92\u8054\u7F51\uFF0C\u82E5\u9879\u76EE\u4F9D\u8D56\u65E0\u6CD5\u641C\u7D22\u8BF7\u5C1D\u8BD5 \u79D1\u5B66\u4E0A\u7F51 \u3002

    • \u542F\u52A8\u8F6F\u4EF6\u540E\uFF0C\u5BF9\u4F60\u671F\u671B\u521B\u5EFA\u7684\u9879\u76EE\u8FDB\u884C\u7B80\u5355\u914D\u7F6E\uFF0C\u70B9\u51FB\u53F3\u4E0B\u89D2\u7684 \u6309\u94AE \u6216\u83DC\u5355\u680F\u9009\u62E9 \u9879\u76EE > \u5F00\u59CB\u521B\u5EFA \u5373\u53EF\u5F00\u59CB\u4EFB\u52A1\u3002

    • \u7B49\u5F85\u4F9D\u8D56\u81EA\u52A8\u641C\u7D22\u5B8C\u6210\u540E\uFF0C\u4F60\u53EF\u4EE5\u5BF9\u9879\u76EE\u4F9D\u8D56\u8FDB\u884C\u914D\u7F6E\uFF0C\u5EFA\u8BAE\u4F7F\u7528\u6700\u65B0\u4F9D\u8D56\u4FDD\u8BC1\u9879\u76EE\u7684\u7A33\u5B9A\u6027\uFF0C\u6784\u5EFA\u5DE5\u5177\u4E5F\u4EC5\u5BF9\u6700\u65B0\u4F9D\u8D56\u8FDB\u884C\u652F\u6301\u3002

    • \u9009\u62E9\u4F60\u9700\u8981\u521B\u5EFA\u9879\u76EE\u7684\u76EE\u5F55\uFF0C\u5F00\u59CB\u540E\u9879\u76EE\u4F1A\u5728\u4F60\u9009\u62E9\u7684\u4F4D\u7F6E\u4E2D\u521B\u5EFA\uFF0C\u5E76\u7B49\u5F85\u6574\u4E2A\u8FC7\u7A0B\u5B8C\u6210\uFF0C\u9879\u76EE\u5C31\u521B\u5EFA\u597D\u4E86\u3002

    \u914D\u7F6E\u6A21\u677F

    \u914D\u7F6E\u6A21\u677F\u662F\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u9009\u62E9\u83DC\u5355\u680F \u9879\u76EE > \u914D\u7F6E\u6A21\u677F > \u65B0\u5EFA\u6A21\u677F\uFF0C\u5373\u53EF\u4F7F\u7528\u5F53\u524D\u586B\u5199\u7684\u914D\u7F6E\u521B\u5EFA\u4E00\u4EFD\u6A21\u677F\uFF0C\u4E0B\u6B21\u53EF\u4EE5\u4ECE \u5DF2\u4FDD\u5B58\u7684\u6A21\u677F \u4E2D\u91CD\u65B0\u8F7D\u5165\u6A21\u677F\uFF0C\u5373\u53EF\u8FD8\u539F\u5F53\u524D\u914D\u7F6E\u3002

    \u591A\u8BED\u8A00\u652F\u6301

    \u8F6F\u4EF6\u8BED\u8A00\u8DDF\u968F\u5F53\u524D\u7CFB\u7EDF\uFF0C\u4F60\u53EF\u4EE5\u5728\u83DC\u5355\u680F \u8BED\u8A00 (Language) \u4E00\u680F\u624B\u52A8\u9009\u62E9\u8F6F\u4EF6\u7684\u754C\u9762\u8BED\u8A00\u3002

    ',8);function P(I,A){const t=n("ExternalLinkIcon");return s(),d("div",null,[l,o("p",null,[p,o("a",u,[_,r(t)]),k]),o("p",null,[g,o("a",f,[b,r(t)]),m]),x])}const j=i(c,[["render",P],["__file","yukihookapi-projectbuilder.html.vue"]]);export{j as default}; +import{_ as i,r as n,o as s,c as d,b as o,d as r,a,e}from"./app.6074a838.js";const h="/YukiHookAPI/images/yukihookapi-projectbuilder-zh-cn.png",c={},l=a('

    YukiHookAPI \u6784\u5EFA\u5DE5\u5177

    \u8FD9\u662F\u4E00\u4E2A\u4F7F\u7528 YukiHookAPI \u4F5C\u4E3A\u6838\u5FC3\u7684 Xposed \u6A21\u5757\u81EA\u52A8\u6784\u5EFA\u5DE5\u5177\u3002

    \u5B9E\u73B0\u81EA\u52A8\u5316\u641C\u7D22\u4F9D\u8D56\u5FEB\u901F\u642D\u5EFA\u4E00\u4E2A\u5305\u542B Xposed \u6A21\u5757\u73AF\u5883\u7684 Android \u9879\u76EE\u6A21\u677F\u3002

    \u83B7\u53D6\u9879\u76EE

    \u672C\u9879\u76EE\u5B8C\u5168\u5F00\u6E90\u514D\u8D39\uFF0C\u4E14\u4F1A\u6839\u636E\u5927\u5BB6\u7684\u4F7F\u7528\u60C5\u51B5\u6301\u7EED\u7EF4\u62A4\uFF0C\u521D\u4EE3\u7248\u672C\u53EF\u80FD\u5B58\u5728\u4E0D\u5B8C\u5584\u6216 BUG\uFF0C\u6B22\u8FCE\u53CD\u9988\u3002

    ',5),p=e("\u9879\u76EE\u5730\u5740 "),u={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder",target:"_blank",rel:"noopener noreferrer"},_=e("YukiHookAPI-ProjectBuilder"),k=e("\u3002"),g=e("\u82E5\u4F60\u60F3\u76F4\u63A5\u4E0B\u8F7D\u53EF\u4EE5 "),f={href:"https://github.com/fankes/YukiHookAPI-ProjectBuilder/releases",target:"_blank",rel:"noopener noreferrer"},b=e("\u70B9\u51FB\u8FD9\u91CC"),m=e(" \u524D\u5F80 Release \u53D1\u5E03\u5730\u5740\u3002"),x=a('

    \u4F7F\u7528\u65B9\u6CD5

    \u8FD9\u91CC\u5305\u542B\u4E86\u57FA\u672C\u7684\u4F7F\u7528\u65B9\u6CD5\u548C\u529F\u80FD\u8BB2\u89E3\u3002

    \u57FA\u672C\u7528\u6CD5

    • \u8F6F\u4EF6\u4F7F\u7528\u8FC7\u7A0B\u9700\u8981\u5F53\u524D\u8BBE\u5907\u5DF2\u8FDE\u63A5\u4E92\u8054\u7F51\uFF0C\u82E5\u9879\u76EE\u4F9D\u8D56\u65E0\u6CD5\u641C\u7D22\u8BF7\u5C1D\u8BD5 \u79D1\u5B66\u4E0A\u7F51 \u3002

    • \u542F\u52A8\u8F6F\u4EF6\u540E\uFF0C\u5BF9\u4F60\u671F\u671B\u521B\u5EFA\u7684\u9879\u76EE\u8FDB\u884C\u7B80\u5355\u914D\u7F6E\uFF0C\u70B9\u51FB\u53F3\u4E0B\u89D2\u7684 \u6309\u94AE \u6216\u83DC\u5355\u680F\u9009\u62E9 \u9879\u76EE > \u5F00\u59CB\u521B\u5EFA \u5373\u53EF\u5F00\u59CB\u4EFB\u52A1\u3002

    • \u7B49\u5F85\u4F9D\u8D56\u81EA\u52A8\u641C\u7D22\u5B8C\u6210\u540E\uFF0C\u4F60\u53EF\u4EE5\u5BF9\u9879\u76EE\u4F9D\u8D56\u8FDB\u884C\u914D\u7F6E\uFF0C\u5EFA\u8BAE\u4F7F\u7528\u6700\u65B0\u4F9D\u8D56\u4FDD\u8BC1\u9879\u76EE\u7684\u7A33\u5B9A\u6027\uFF0C\u6784\u5EFA\u5DE5\u5177\u4E5F\u4EC5\u5BF9\u6700\u65B0\u4F9D\u8D56\u8FDB\u884C\u652F\u6301\u3002

    • \u9009\u62E9\u4F60\u9700\u8981\u521B\u5EFA\u9879\u76EE\u7684\u76EE\u5F55\uFF0C\u5F00\u59CB\u540E\u9879\u76EE\u4F1A\u5728\u4F60\u9009\u62E9\u7684\u4F4D\u7F6E\u4E2D\u521B\u5EFA\uFF0C\u5E76\u7B49\u5F85\u6574\u4E2A\u8FC7\u7A0B\u5B8C\u6210\uFF0C\u9879\u76EE\u5C31\u521B\u5EFA\u597D\u4E86\u3002

    \u914D\u7F6E\u6A21\u677F

    \u914D\u7F6E\u6A21\u677F\u662F\u4E00\u4E2A\u6269\u5C55\u529F\u80FD\uFF0C\u4F60\u53EF\u4EE5\u9009\u62E9\u83DC\u5355\u680F \u9879\u76EE > \u914D\u7F6E\u6A21\u677F > \u65B0\u5EFA\u6A21\u677F\uFF0C\u5373\u53EF\u4F7F\u7528\u5F53\u524D\u586B\u5199\u7684\u914D\u7F6E\u521B\u5EFA\u4E00\u4EFD\u6A21\u677F\uFF0C\u4E0B\u6B21\u53EF\u4EE5\u4ECE \u5DF2\u4FDD\u5B58\u7684\u6A21\u677F \u4E2D\u91CD\u65B0\u8F7D\u5165\u6A21\u677F\uFF0C\u5373\u53EF\u8FD8\u539F\u5F53\u524D\u914D\u7F6E\u3002

    \u591A\u8BED\u8A00\u652F\u6301

    \u8F6F\u4EF6\u8BED\u8A00\u8DDF\u968F\u5F53\u524D\u7CFB\u7EDF\uFF0C\u4F60\u53EF\u4EE5\u5728\u83DC\u5355\u680F \u8BED\u8A00 (Language) \u4E00\u680F\u624B\u52A8\u9009\u62E9\u8F6F\u4EF6\u7684\u754C\u9762\u8BED\u8A00\u3002

    ',8);function P(I,A){const t=n("ExternalLinkIcon");return s(),d("div",null,[l,o("p",null,[p,o("a",u,[_,r(t)]),k]),o("p",null,[g,o("a",f,[b,r(t)]),m]),x])}const j=i(c,[["render",P],["__file","yukihookapi-projectbuilder.html.vue"]]);export{j as default}; diff --git a/docs/en/about/about.html b/docs/en/about/about.html index 66de87878..e83dc1fd9 100644 --- a/docs/en/about/about.html +++ b/docs/en/about/about.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - About this Document | Yuki Hook API - + About this Document | Yuki Hook API + -

    About this Document

    This document is powered by VuePressopen in new window.

    License

    The MIT License (MIT)open in new window

    MIT License
    +    

    About this Document

    This document is powered by VuePressopen in new window.

    License

    The MIT License (MIT)open in new window

    MIT License
     
    -Copyright (C) 2019-2022 HighCapable
    +Copyright (C) 2019-2023 HighCapable
     
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
    @@ -48,7 +48,7 @@
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     SOFTWARE.
    -

    Copyright © 2019-2022 HighCapable

    - +

    Copyright © 2019-2023 HighCapable

    + diff --git a/docs/en/about/changelog.html b/docs/en/about/changelog.html index 870c8d319..8b9c8a42b 100644 --- a/docs/en/about/changelog.html +++ b/docs/en/about/changelog.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Changelog | Yuki Hook API - + Changelog | Yuki Hook API + -

    Changelog

    The version update history of YukiHookAPI is recorded here.

    Pay Attention

    We will only maintain the latest API version, if you are using an outdate API version, you voluntarily renounce any possibility of maintenance.

    Notice

    To avoid translation time consumption, Changelog will use Google Translation from Chinese to English, please refer to the original text for actual reference.

    Time zone of version release date: UTC+8

    1.1.4 | 2022.10.04  latest

    • Fixed the issue that YukiHookDataChannel may not respond to broadcast events in the system framework, reproduced in A13
    • Fixed the issue that YukiHookDataChannel could not communicate with Module App in Host App for multiple versions
    • Added obtainLoggerInMemoryData method in YukiHookDataChannel to share debug log data between module and host
    • Modify the type of YukiHookLogger.inMemoryData to ArrayList and change YukiLoggerData to data class
    • Fixed YukiLoggerData printing blank when the package name is empty in the module
    • Added loadApp, loadZygote, loadSystem, withProcess multi-parameter methods of the same name in PackageParam
    • Fixed some possible bugs

    1.1.3 | 2022.09.30  stale

    • Fixed a fatal bug where the Hook entry class name could not be customized
    • Added some code notes in LoggerFactory and updated special features documentation

    1.1.2 | 2022.09.30  stale

    • Documentation Basic Knowledge page add a friend link to the English version
    • Fixed YukiBaseHooker comments in English code note link errors
    • Fixed ClassCastException in ModuleClassLoader
    • Fixed and standardize some code notes
    • Added ModuleClassLoader exclusion list function, you can use excludeHostClasses and excludeModuleClasses methods to customize the exclusion list
    • Added YukiLoggerData real-time log data class, you can get the log array in real time through YukiHookLogger.inMemoryData
    • Added ClassLoader.listOfClasses method, which can directly get all Class in the current Dex

    1.1.1 | 2022.09.28  stale

    • Fixed the problem of wrong document friend links in Basic Knowledge page
    • Fixed document favicon not showing up
    • Fixed bug in DexClassFinder search conditions

    1.1.0 | 2022.09.28  stale

    • This is a major version update, please refer to API Document and Special Features for the changes and usage mentioned in the changelog
    • Change the help documentation framework to VuePressopen in new window
    • Unify and standardize the terms and nouns in the document, for example, "query" is always changed to "find", XposedHelper is misspelled and changed to XposedHelpers
    • Documentation Basic Knowledge page to add friend links, Simplified Chinese only
    • Convert Class and Method of Hook App Demo to Java to provide better demo effect
    • Fixed code comment naming in Hook Module Demo
    • Refactored a lot of low-level Hook logic and the docking method of Xposed API
    • Removed HookParamWrapper, it now interfaces directly with YukiBridgeFactory
    • Moved methods in section YukiHookBridge to AppParasitics
    • Removed HookParam.args and the underlying direct connection method setArgs, directly get and set the object of the current array
    • Optimized automatic handler to merge referenced jar into stub project
    • Fixed the problem that the module package name cannot be correctly matched when multi-project packaging, and modify the module package name matching logic of the automatic handler, thanks to 5ec1cffopen in new window for the feedback and solutions provided
    • Internal closure processing for the methods of API private tool classes to avoid polluting the top-level namespace
    • Fixed Creater naming to Creator for all reflection and Hook classes
    • Added YukiHookAPI.Status.compiledTimestamp function, which can get the compilation completion timestamp when used as an Xposed module
    • Added YukiHookAPI.Status.isXposedEnvironment function, which can determine whether the current (Xposed) host environment or module environment is
    • The debug logging function has been overhauled, and functions such as YukiHookAPI.Configs.debugTag have been merged into YukiHookLogger.Configs
    • The debug log can be added to specify the printing method as XposedBridge.log or Logd
    • The package name of the current host and the current user ID are added to the debug log by default for debugging, you can change it yourself in the debugLog configuration
    • Added generic function to reflect and call generics, you can use it in Class or CurrentClass
    • obsolete the buildOfAny method, now use the buildOf method directly (without generics) to use the constructor to create a new object and get the result Any
    • Fixed the issue of null pointer exception when using hasExtends
    • CurrentClass added non-lambda method of calling
    • CurrentClass adds name and simpleName functions
    • Completely rewrite the core method of ReflectionTool, sorting and classifying different search conditions
    • Fixed the problem that Member obtained by directly calling declared in ReflectionTool throws an exception
    • Fixed UndefinedType in ReflectionTool is not correctly judged in Method and Constructor conditions
    • Added a friendly prompt method when the reflection search result is abnormal, which can specifically locate the problem that Member cannot be found under specified conditions
    • Added VagueType condition in Method and Constructor for reflection search, which can be used in param condition to ignore parameters you don't want to fill in
    • Added paramCount { ... } condition in Method and Constructor of reflection search, now you can directly get it in it to customize your judgment condition
    • The current method is added to the FieldFinder result, which can directly create a call space for the result instance
    • Modified the modifiers condition and name condition in the reflection lookup function, now you need to return a Boolean at the end of the method body to make the condition true
    • as* function in ModifierRules renamed to is*, thanks to Kitsuneopen in new window suggestion
    • Added RemedyPlan feature in FieldFinder
    • Added Class fuzzy search function (Beta) in Dex, you can now directly use searchClass function to fuzzy search Class with specified conditions
    • Added multiple search function in reflection search, you can use relative search conditions to obtain multiple search results at the same time, thanks to AA and Kitsuneopen in new window for suggestions
    • Fixed the problem that the object obtained by appClassLoader is incorrect in system applications in some systems, thanks to Luckyzyxopen in new window for the feedback
    • Modified the calling method of XposedBridge.invokeOriginalMethod and added original function in MethodFinder.Result.Instance
    • Fixed the problem of wrong value of getStringSet method in YukiHookModulePrefs and optimize the code style, thanks to Teddy_Zhuopen in new window PRopen in new window
    • Modify YukiHookModulePrefs to intercept exceptions that may not exist in XSharePreference
    • Fixed the problem that YukiHookDataChannel could not be successfully registered in some third-party ROM system frameworks
    • Secured YukiHookDataChannel, now it can only communicate between modules from the specified package name and the host
    • Added automatic hook SharedPreferences to fix the problem that file permissions are not 0664 in some systems, thanks to 5ec1cffopen in new window for the feedback and implementation code provided
    • Added YukiHookAPI.Configs.isEnableHookSharedPreferences function, which is disabled by default and can be enabled if the permission of SharedPreferences is incorrect
    • Fixed the bug that the no-parameter construction method cannot be found when searching for Constructor without filling in the search conditions, thanks B5 KAKA for the feedback
    • Detach Result instances located in method, constructor in injectMember to Process
    • Added the useDangerousOperation method in the Hook process, which will automatically stop the Hook and print an error after the function in the Hook Dangerous List is not declared
    • Added module resource injection and Activity proxy functions, you can call injectModuleAppResources and registerModuleAppActivities to use
    • Added ModuleContextThemeWrapper function, you can call applyModuleTheme to create the Context of a module in any Activity
    • Added ClassLoader.onLoadClass function, which can be used to listen for events when the loadClass method of ClassLoader is called
    • obsolete classOf and clazz extension methods, add toClass and toClassOrNull usage, please move to the new method now
    • VariousClass adds a getOrNull method, which can return null instead of throwing an exception when it can't match Class
    • Removed isUseAppClassLoader parameter in PackageParam.hook, changed it to isForceUseAbsolute and automatically matched the target Class
    • PackageParam adds systemContext function, you can call this function at any time to get a persistent Context
    • no longer expose any methods in HookClass
    • Added throwToApp function in HookParam, which can throw exceptions directly to the host
    • The onFailureThrowToApp function is added to the Hook callback, which can be directly thrown to the host when an exception occurs
    • Modified the printing logic of the debug log, the time-consuming records in the reflection search function will only be printed during the Hook process
    • Added the function of removing Hook in the Hook process, you can use the remove and removeSelf methods to remove the hook
    • Fixed the issue that caused the host to throw an exception when ReplaceHook failed, and now it is modified to call the original method to ensure the normal operation of the host function
    • Added the function of checking the return value of the method in the Hook process. If the return value does not match, it will automatically throw an exception or print an error according to the situation
    • Added array type to Resources Hook, thanks to PRopen in new window of GSWXXNopen in new window
    • Moved me.weishu.reflection to thirdparty to prevent conflicting dependencies of the same name introduced at the same time
    • Remove the exception thrown when the Hook method body is empty, and modify it to print the warning log
    • Modify the exception handling logic of AppLifecycle and throw it directly to the host when an exception occurs
    • Updated Demo API version to 33

    1.0.92 | 2022.05.31  outdate

    • Fixed the naming method of callback in a large number of methods
    • Changed the solution to fix the problem that YukiHookDataChannel cannot call back the current Activity broadcast on devices lower than Android 12
    • The InjectYukiHookWithXposed annotation adds the isUsingResourcesHook function, now you can selectively disable the dependency interface that automatically generates IXposedHookInitPackageResources

    1.0.91 | 2022.05.29  outdate

    • Fixed the ClassLoader error when the customized system of some devices is booted in the LSPosed environment, thanks to Luckyzyxopen in new window for the feedback
    • Fixed YukiHookDataChannel not being able to call back the current Activity broadcast on ZUI and systems below Android 12
    • Integrate the YukiHookModuleStatus function into YukiHookAPI.Status, rewrite a lot of methods, now you can judge the status information such as module activation in the module and the host in both directions

    1.0.90 | 2022.05.27  outdate

    • Fixed YukiHookDataChannel crashing when the module sets the listener callback
    • Fixed YukiHookDataChannel still calling back when not in current Activity
    • Remove the default value of YukiHookDataChannel callback event, no callback
    • Removed YukiHookModulePrefs warning printed if XShare is unreadable
    • Added the isXSharePrefsReadable method in YukiHookModulePrefs to determine whether the current XShare is available

    1.0.89 | 2022.05.26  outdate

    • Fixed the problem that YukiHookDataChannel cannot be repeatedly set to monitor, and added the function of repeating response in different Activity modules and automatically following Activity to destroy the monitor function
    • Added YukiHookDataChannel repeated listening use case description document
    • Add the onAlreadyHooked method to determine whether the current method is repeated Hook
    • Modify part of the logic of repeatedly adding HashMap, remove the putIfAbsent method, allow to override the addition
    • Fixed several possible bugs

    1.0.88 | 2022.05.25  outdate

    • Fully decoupled from Xposed API
    • Added android type in type
    • Separate YukiHookModuleStatus from auto-generated code and add isEnableHookModuleStatus switch, it is up to you to enable or not
    • Internal closure processing for the constructors of a large number of classes in the API
    • Set YukiHookModulePrefs to run as a singleton to prevent repeated creation and waste of system resources
    • Fixed the bug that Hook cannot be nested since version 1.0.80, and optimize the related functions of nested Hook
    • Modify the Hooker storage scheme from HashSet to HashMap to prevent the problem of repeatedly adding Hookers
    • Modify the core implementation method of Hook, add duplicate checking to avoid repeating the Hook multiple callbacks to the HookParam method
    • MethodFinder and FieldFinder add the function of finding fuzzy methods and variable names, you can call name { ... } to set search conditions, and support regular expressions
    • Optimize and modify the way to get appContext to reduce the possibility of getting empty
    • Modify the print TAG of logger in the automatically generated code to default to your custom name, which is convenient for debugging
    • Optimize the Hooker implementation of YukiHookBridge to improve Hook performance
    • PackageParam adds the onAppLifecycle method, which can natively monitor the life cycle of the host and implement the registration system broadcast function
    • Added YukiHookDataChannel function to communicate using system out-of-order broadcast while the module and the host remain alive
    • YukiHookDataChannel adds the checkingVersionEquals method, which can be monitored to verify that the host has not updated the version mismatch problem after the module is updated
    • Added Java version example in the example code of demo-module for reference only

    1.0.87 | 2022.05.10  outdate

    • Added refreshModuleAppResources function to adapt Resources refresh when the language region, font size, resolution changes, etc.
    • Added isEnableModuleAppResourcesCache function, you can set whether to automatically cache the resources of the current module

    1.0.86 | 2022.05.06  outdate

    • Fixed the problem of continuous error reporting during initZygote when Resources Hook is not supported, reproduced in ZUI/LSPosed CI(1.8.3-6550)
    • Optimize and handle exceptions for Resources Hook, only print errors and warnings if they are used and not supported

    1.0.85 | 2022.05.04  outdate

    • Fixed a serious problem of not being able to hook the system framework, since 1.0.80
    • Added in the debug log to distinguish the package name loaded by initZygote as android-zygote, packageName keeps android unchanged

    1.0.83 | 2022.05.04  outdate

    • Fixed YukiHookModuleStatus reporting a lot of errors after loadSystem
    • Added android type in type
    • Updated example descriptions in help documentation

    1.0.82 | 2022.05.04  outdate

    • Fixed a concept confusion error, distinguishing the relationship between initZygote and the system framework, there are problems with the previous comments and documentation, I am very sorry
    • PackageParam adds loadSystem method, no need to write loadApp(name = "android") to hook the system framework

    1.0.81 | 2022.05.04  outdate

    • Fixed the problem that the method and constructor that cannot be found in the Hook method body still output the error log after setting the condition using the by method
    • Added a global log to display the package name of the current Hook APP during the execution of the Hook, and fixed a problem with the printing style of the error log

    1.0.80 | 2022.05.01  outdate

    • The InjectYukiHookWithXposed annotation adds the entryClassName function, which can customize the generated xposed_init entry class name
    • YukiHookXposedInitProxy renamed to IYukiHookXposedInit, the original interface name has been invalidated and will be deleted directly in subsequent versions
    • Added initZygote and Resources Hook functions to support Hook Layout
    • Added onXposedEvent method to listen to all events of native Xposed API
    • Perform inline processing on the lambda of the Hook function to avoid generating excessively broken anonymous classes and improve the running performance after compilation
    • Fixed PrefsData compiled method body copy is too large
    • Added XSharePreference readability test, which will automatically print a warning log if it fails
    • PackageParam adds appResources, moduleAppResources, moduleAppFilePath functions
    • loadApp of PackageParam adds the function of not writing name, and all APPs are filtered by default
    • PackageParam adds the loadZygote method, which can directly hook the system framework
    • PackageParam added resources().hook function
    • Optimization method, construction method, variable search function, the error log that cannot be found will display the set query conditions first
    • Added hasExtends extension method to determine whether the current Class has an inheritance relationship
    • Added isSupportResourcesHook function to determine whether resource hooks are currently supported (Resources Hook)
    • current function adds superClass method to call superclass
    • New superClass query conditions for search methods, construction methods and variables, you can continue to search in the parent class
    • YukiHookAPI lots of methods are decoupled from Xposed API
    • Added native Hook priority function of Xposed API
    • Fixed the problem that isFirstApplication may be inaccurate
    • Block the problem that MiuiCatcherPatch repeatedly calls the Hook entry method on the MIUI system
    • Optimize Hook entry calling method to avoid multiple calls due to Hook Framework issues
    • Fixed the problem that Hook ClassLoader causes Hook to freeze, thanks to WankkoReeopen in new window for the feedback
    • Improve the performance after the XC_Callback interface is connected
    • Java type added ClassLoader type
    • Optimize the API help documentation, fix the problem that the page may be continuously cached

    1.0.78 | 2022.04.18  outdate

    • YukiHookModulePrefs adds isRunInNewXShareMode method, which can be used to determine whether the module is currently in New XSharePreference mode
    • Fixed YukiHookModulePrefs working in New XSharePreference mode
    • Added ModulePreferenceFragment, now you can completely replace PreferenceFragmentCompat and start using the new functionality
    • Adapt the Sp data storage solution of PreferenceFragmentCompat, thanks to mahoshojoHCGopen in new window for feedback
    • Update autohandlers and Kotlin dependencies to the latest version
    • Fixed some bugs in documentation and code comments

    1.0.77 | 2022.04.15  outdate

    • YukiHookModulePrefs added clear method, thanks to WankkoReeopen in new window for the suggestion
    • YukiHookModulePrefs added getStringSet, putStringSet, all methods
    • Added any method to args of HookParam
    • Added ModuleApplication, which can be inherited in modules to achieve more functions
    • Connect all findClass functions to the Xposed API, and continue to use native ClassLoader in non-hosted environments
    • Fixed some possible bugs

    1.0.75 | 2022.04.13  outdate

    • Corrected the logic recognition part of the automatic handler, thanks to ApeaSuperzopen in new window contribution
    • Fixed an issue where the reference to a doc comment was not changed
    • firstArgs and lastArgs methods have been removed from HookParam, now you can use args().first() and args().last() instead of it
    • Removed default parameter index = 0 in args() in HookParam, now you can use args().first() or args(index = 0) to replace it
    • The result function in HookParam adds generic matching, now you can use result<T> to match the known return value type of your target method
    • The emptyParam condition is added to the method and constructor query function, and the misunderstanding of the query condition that needs to be paid attention to in the document has been improved
    • Added android type in type

    1.0.73 | 2022.04.10  outdate

    • Fixed some Chinese translation errors in documents, thanks to WankkoReeopen in new window for their contributions
    • Fixed the problem that XC_LoadPackage.LoadPackageParam throws an exception when the content is empty in some cases, thanks to Luckyzyxopen in new window for the feedback
    • Fixed some known bugs and improve Hook stability

    1.0.72 | 2022.04.09  outdate

    • Update API documentation to new address
    • Add appContext function to PackageParam
    • Fixed some known bugs and improve Hook stability

    1.0.71 | 2022.04.04  outdate

    • Fixed a serious issue that would stop the Hook from throwing an exception when VariousClass could not be matched

    1.0.70 | 2022.04.04  outdate

    • Fixed instanceClass reporting an error after being called in a static instance
    • Add isUseAppClassLoader function in Hook process, thanks to WankkoReeopen in new window for feedback
    • Added the withProcess function, which can be hooked according to the currently specified process of the APP
    • Fixed critical logic errors in lookup methods, constructor classes and variables
    • Fixed the problem that the abnormal output cannot be ignored when the Hook target class does not exist
    • Fixed the problem that the Hook could not take effect due to the fast loading of the APP startup method in some cases
    • Fixed allMethods not throwing an exception when it is not hooked to a method, thanks to WankkoReeopen in new window for the feedback
    • Added Hook status monitoring function, thanks to WankkoReeopen in new window for the suggestion
    • Modify the way the Xposed entry is injected into the class, and redefine the definition domain of the API
    • Added obfuscated method and variable lookup function, you can use different types of filter index to locate the specified method and variable, thanks to WankkoReeopen in new window for the ideas provided
    • When looking for methods and variables, multiple types are allowed, such as the class name declared by String and VariousClass
    • Add a new current function, which can build a reflection method operation space for any class, and easily call and modify the methods and variables in it
    • Fixed a lot of bugs in the hook process, thanks to WankkoReeopen in new window for contributing to this project

    1.0.69 | 2022.03.30  outdate

    • Added and improved annotations for some method functions
    • Added more example Hook content in Demo
    • Fixed the issue that only the last one takes effect when allMethods is used multiple times in a Hook instance, thanks to WankkoReeopen in new window for the feedback

    1.0.68 | 2022.03.29  outdate

    • Added new use case and LSPosed scope in Demo
    • Added Member lookup cache and lookup cache configuration switches
    • Removed and modified MethodFinder, FieldFinder and HookParam related method calls
    • Add more cast types in Finder and support cast as array
    • Overall performance and stability improvements
    • Fixed bugs that may exist in the previous version

    1.0.67 | 2022.03.27  outdate

    • Added three modifiers functions in Finder, which can filter static, native, public, abstract and many other description types
    • When searching for methods and constructors, the method parameter type can be blurred to a specified number for searching
    • Added hasModifiers extension for Member
    • Added give method in MethodFinder and ConstructorFinder to get primitive types
    • Added PrefsData template function in YukiHookModulePrefs
    • Completely refactored method, constructor and variable lookup scheme
    • Optimized code comments and fixed possible bugs

    1.0.66 | 2022.03.25  outdate

    • Fixed a serious bug in MethodFinder
    • Added args call method in hookParam
    • Fixed other possible problems and fix some class annotation problems

    1.0.65 | 2022.03.25  outdate

    • Republished version to fix the incorrect new version of the Maven repository due to cache issues
    • Added MethodFinder and FieldFinder new return value calling methods
    • Fixed possible problems and fix possible problems during the use of Tai Chi
    • Fixed possible problems with auto-generated Xposed entry classes
    • Added android type and java type in type

    1.0.6 | 2022.03.20  outdate

    • Fixed YukiHookModulePrefs being ignored every time after using direct once to ignore cache
    • Added new API, abolished the traditional usage of isActive to judge module activation
    • Fixed the issue of printing debug logs when using the API in a non-Xposed environment
    • Fixed log output issue and unintercepted exception issue when looking for Field
    • Decoupling Xposed API in ReflectionUtils
    • Added YukiHookModuleStatus method name confusion to reduce the size of module generation
    • The welcome message will no longer be printed when loading the module's own Hook
    • Fixed some bugs that still exist in the previous version

    1.0.55 | 2022.03.18  outdate

    • Fixed an annotation error
    • Temporarily fix a bug
    • Added a large number of android types in type and a small number of java types
    • Fixed compatibility issues between new and old Kotlin APIs

    1.0.5 | 2022.03.18  outdate

    • Fixed the problem that the welcome message was printed multiple times in the case of the old version of the LSPosed framework
    • Added onInit method to configure YukiHookAPI
    • Added executorName and executorVersion to get the name and version number of the current hook framework
    • Added by method to set the timing and condition of Hook
    • YukiHookModulePrefs adds a controllable key-value cache, which can dynamically update data when the host is running
    • Fixed some possible bugs

    1.0.4 | 2022.03.06  outdate

    • Fixed LSPosed cannot find XposedBridge after enabling "Only module classloader can use Xposed API" option in latest version
    • Added constant version name and version number for YukiHookAPI
    • Added hasField method and isAllowPrintingLogs configuration parameter
    • Added isDebug to enable the API to automatically print the welcome message to test whether the module is valid

    1.0.3 | 2022.03.02  outdate

    • Fixed a potential exception not intercepted BUG
    • Added ignoredError function
    • Added android type in type
    • Added ClassNotFound function after listening to hook

    1.0.2 | 2022.02.18  outdate

    • Fixed the problem that the project path cannot be found under Windows
    • Remove part of reflection API, merge into BaseFinder for integration
    • Add a method to create Hook directly using string

    1.0.1 | 2022.02.15  outdate

    • RemedyPlan adds onFind function
    • Integrate and modify some reflection API code
    • Added java type in type
    • Fixed the issue that ignored errors still output in the console

    1.0 | 2022.02.14  outdate

    • The first version is submitted to Maven
    - +

    Changelog

    The version update history of YukiHookAPI is recorded here.

    Pay Attention

    We will only maintain the latest API version, if you are using an outdate API version, you voluntarily renounce any possibility of maintenance.

    Notice

    To avoid translation time consumption, Changelog will use Google Translation from Chinese to English, please refer to the original text for actual reference.

    Time zone of version release date: UTC+8

    1.1.5 | 2023.01.13  latest

    • Standardize and optimize the overall code style
    • Privatized some APIs called internally
    • The underlying API interface is decoupled as a whole to prepare for compatibility with more Hook Frameworks
    • Move some of the functions integrated in the API to ksp-xposed dependencies (decoupling), and the separate introduction of api dependencies will no longer contain references to functions such as third-party libraries
    • Documentation Quick Start page added instructions on when YukiHookAPI.Configs.isDebug needs to be closed
    • Standardize Java Primitive Types in type definitions and sync update to docs
    • Java type adds NumberClass type
    • Improved (Xposed) Host environment recognition
    • Take over all exceptions after loading the Xposed Module, if an exception occurs, it will automatically intercept and print the error log
    • Modify the Class that does not exist in the lower Android system version (Android 5.0) in the type definition to be an empty safe type
    • Adapt and support native Xposed, the minimum recommended version is Android 7.0
    • Added support for Hook entry class declared as object type (singleton)
    • Fixed the problem that the system below Android 8 does not support the Executable type, causing the Hook to fail
    • Fixed the problem of reporting an error when using the Activity proxy function for systems below Android 9 and limit the minimum supported version of this function to Android 7.0
    • Added the prohibition of resource injection and Activity proxy function injection into the current module's own instance process to prevent problems
    • Fixed a serious error that the return value of a method in the Hook process is not consistent with the target's inherited class and interface.
    • Fixed the problem that the object is empty when calling HookParam.callOriginal and HookParam.invokeOriginal when the current Hook instance object is static
    • Optimize the function of judging the Tai Chi activation method and update the relevant instructions of the document synchronously
    • Obsolete YukiHookAPI.Status.executorName, YukiHookAPI.Status.executorVersion, please move to YukiHookAPI.Status.Executor
    • Adapted the YukiHookAPI.Status.Executor.name name display function of some third-party Hook Frameworks
    • Added Class.extends, Class.implements and other methods, which can more conveniently judge the inheritance and interface relationship of the current Class
    • Added generic methods of the same name as Class.toClass, Class.toClassOrNull and other related methods, you can use generics to constrain the instance object type of known Class
    • Modify the return value of the classOf<T> method to the generic type T to constrain the instance object type of the known Class
    • Added initialize parameter of Class related extension method, which can control whether to initialize its static method block at the same time when getting Class object
    • Added param { ... }, type { ... } and other usages in the variable, method, and construction method search functions, which can add more specific conditional judgments to the searched objects
    • The loadApp method of PackageParam adds the isExcludeSelf parameter, which can be used to exclude Hook-related functions from injecting into the module's own instance process
    • The onAppLifecycle method of PackageParam adds the isOnFailureThrowToApp parameter, which can directly throw the exception that occurs in the lifecycle method body to the host
    • Modify appClassLoader in PackageParam to be a modifiable variable, which can dynamically set the ClassLoader used by the host in the Hook process
    • Added dataExtra function in HookParam, which can be used to temporarily store the data in the Hook method body
    • Obsolete isRunInNewXShareMode, isXSharePrefsReadable in YukiHookModulePrefs, merged into isPreferencesAvailable
    • Class.allFields, Class.allMethods and other related methods add the isAccessible parameter, which can control when the member object can be set as an accessible type
    • Fixed the problem that only the last method body will be called back when receiving the same key-value data in an Activity when there are multiple hosts in YukiHookDataChannel
    • Added priority parameter in wait and other related methods of YukiHookDataChannel, you can pass in ChannelPriority to customize the conditions for callback data results
    • YukiHookDataChannel adds the function of automatically using ChannelDataWrapper type wrapper when sending data, which improves the user experience and enhances data protection
    • YukiHookDataChannel has added the function of limiting the maximum byte size of data sent at one time to prevent the app from crashing due to excessive data
    • YukiHookDataChannel has added the function of automatically segmenting when the sent data is too large, only supports List, Map, Set, String types
    • YukiHookLogger adds the contents method and the data parameter of saveToFile, which can be passed in custom debug log data for formatting or saving to a file
    • Fixed the problem that the debug log data package name processed by YukiHookLogger may be incorrect in the (Xposed) Host environment
    • Fixed the problem that the package name may be incorrect on some systems (in some system apps) when the Xposed Module loads the Resource Hook event

    1.1.4 | 2022.10.04  stale

    • Fixed the issue that YukiHookDataChannel may not respond to broadcast events in the system framework, reproduced in A13
    • Fixed the issue that YukiHookDataChannel could not communicate with Module App in Host App for multiple versions
    • Added obtainLoggerInMemoryData method in YukiHookDataChannel to share debug log data between module and host
    • Modify the type of YukiHookLogger.inMemoryData to ArrayList and change YukiLoggerData to data class
    • Fixed YukiLoggerData printing blank when the package name is empty in the module
    • Added loadApp, loadZygote, loadSystem, withProcess multi-parameter methods of the same name in PackageParam
    • Fixed some possible bugs

    1.1.3 | 2022.09.30  stale

    • Fixed a fatal bug where the Hook entry class name could not be customized
    • Added some code notes in LoggerFactory and updated special features documentation

    1.1.2 | 2022.09.30  outdate

    • Documentation Basic Knowledge page add a friend link to the English version
    • Fixed YukiBaseHooker comments in English code note link errors
    • Fixed ClassCastException in ModuleClassLoader
    • Fixed and standardize some code notes
    • Added ModuleClassLoader exclusion list function, you can use excludeHostClasses and excludeModuleClasses methods to customize the exclusion list
    • Added YukiLoggerData real-time log data class, you can get the log array in real time through YukiHookLogger.inMemoryData
    • Added ClassLoader.listOfClasses method, which can directly get all Class in the current Dex

    1.1.1 | 2022.09.28  outdate

    • Fixed the problem of wrong document friend links in Basic Knowledge page
    • Fixed document favicon not showing up
    • Fixed bug in DexClassFinder search conditions

    1.1.0 | 2022.09.28  outdate

    • This is a major version update, please refer to API Document and Special Features for the changes and usage mentioned in the changelog
    • Change the help documentation framework to VuePressopen in new window
    • Unify and standardize the terms and nouns in the document, for example, "query" is always changed to "find", XposedHelper is misspelled and changed to XposedHelpers
    • Documentation Basic Knowledge page to add friend links, Simplified Chinese only
    • Convert Class and Method of Hook App Demo to Java to provide better demo effect
    • Fixed code comment naming in Hook Module Demo
    • Refactored a lot of low-level Hook logic and the docking method of Xposed API
    • Removed HookParamWrapper, it now interfaces directly with YukiBridgeFactory
    • Moved methods in section YukiHookBridge to AppParasitics
    • Removed HookParam.args and the underlying direct connection method setArgs, directly get and set the object of the current array
    • Optimized automatic handler to merge referenced jar into stub project
    • Fixed the problem that the module package name cannot be correctly matched when multi-project packaging, and modify the module package name matching logic of the automatic handler, thanks to 5ec1cffopen in new window for the feedback and solutions provided
    • Internal closure processing for the methods of API private tool classes to avoid polluting the top-level namespace
    • Fixed Creater naming to Creator for all reflection and Hook classes
    • Added YukiHookAPI.Status.compiledTimestamp function, which can get the compilation completion timestamp when used as an Xposed module
    • Added YukiHookAPI.Status.isXposedEnvironment function, which can determine whether the current (Xposed) host environment or module environment is
    • The debug logging function has been overhauled, and functions such as YukiHookAPI.Configs.debugTag have been merged into YukiHookLogger.Configs
    • The debug log can be added to specify the printing method as XposedBridge.log or Logd
    • The package name of the current host and the current user ID are added to the debug log by default for debugging, you can change it yourself in the debugLog configuration
    • Added generic function to reflect and call generics, you can use it in Class or CurrentClass
    • obsolete the buildOfAny method, now use the buildOf method directly (without generics) to use the constructor to create a new object and get the result Any
    • Fixed the issue of null pointer exception when using hasExtends
    • CurrentClass added non-lambda method of calling
    • CurrentClass adds name and simpleName functions
    • Completely rewrite the core method of ReflectionTool, sorting and classifying different search conditions
    • Fixed the problem that Member obtained by directly calling declared in ReflectionTool throws an exception
    • Fixed UndefinedType in ReflectionTool is not correctly judged in Method and Constructor conditions
    • Added a friendly prompt method when the reflection search result is abnormal, which can specifically locate the problem that Member cannot be found under specified conditions
    • Added VagueType condition in Method and Constructor for reflection search, which can be used in param condition to ignore parameters you don't want to fill in
    • Added paramCount { ... } condition in Method and Constructor of reflection search, now you can directly get it in it to customize your judgment condition
    • The current method is added to the FieldFinder result, which can directly create a call space for the result instance
    • Modified the modifiers condition and name condition in the reflection lookup function, now you need to return a Boolean at the end of the method body to make the condition true
    • as* function in ModifierRules renamed to is*, thanks to Kitsuneopen in new window suggestion
    • Added RemedyPlan feature in FieldFinder
    • Added Class fuzzy search function (Beta) in Dex, you can now directly use searchClass function to fuzzy search Class with specified conditions
    • Added multiple search function in reflection search, you can use relative search conditions to obtain multiple search results at the same time, thanks to AA and Kitsuneopen in new window for suggestions
    • Fixed the problem that the object obtained by appClassLoader is incorrect in system applications in some systems, thanks to Luckyzyxopen in new window for the feedback
    • Modified the calling method of XposedBridge.invokeOriginalMethod and added original function in MethodFinder.Result.Instance
    • Fixed the problem of wrong value of getStringSet method in YukiHookModulePrefs and optimize the code style, thanks to Teddy_Zhuopen in new window PRopen in new window
    • Modify YukiHookModulePrefs to intercept exceptions that may not exist in XSharePreference
    • Fixed the problem that YukiHookDataChannel could not be successfully registered in some third-party ROM system frameworks
    • Secured YukiHookDataChannel, now it can only communicate between modules from the specified package name and the host
    • Added automatic hook SharedPreferences to fix the problem that file permissions are not 0664 in some systems, thanks to 5ec1cffopen in new window for the feedback and implementation code provided
    • Added YukiHookAPI.Configs.isEnableHookSharedPreferences function, which is disabled by default and can be enabled if the permission of SharedPreferences is incorrect
    • Fixed the bug that the no-parameter construction method cannot be found when searching for Constructor without filling in the search conditions, thanks B5 KAKA for the feedback
    • Detach Result instances located in method, constructor in injectMember to Process
    • Added the useDangerousOperation method in the Hook process, which will automatically stop the Hook and print an error after the function in the Hook Dangerous List is not declared
    • Added module resource injection and Activity proxy functions, you can call injectModuleAppResources and registerModuleAppActivities to use
    • Added ModuleContextThemeWrapper function, you can call applyModuleTheme to create the Context of a module in any Activity
    • Added ClassLoader.onLoadClass function, which can be used to listen for events when the loadClass method of ClassLoader is called
    • obsolete classOf and clazz extension methods, add toClass and toClassOrNull usage, please move to the new method now
    • VariousClass adds a getOrNull method, which can return null instead of throwing an exception when it can't match Class
    • Removed isUseAppClassLoader parameter in PackageParam.hook, changed it to isForceUseAbsolute and automatically matched the target Class
    • PackageParam adds systemContext function, you can call this function at any time to get a persistent Context
    • no longer expose any methods in HookClass
    • Added throwToApp function in HookParam, which can throw exceptions directly to the host
    • The onFailureThrowToApp function is added to the Hook callback, which can be directly thrown to the host when an exception occurs
    • Modified the printing logic of the debug log, the time-consuming records in the reflection search function will only be printed during the Hook process
    • Added the function of removing Hook in the Hook process, you can use the remove and removeSelf methods to remove the hook
    • Fixed the issue that caused the host to throw an exception when ReplaceHook failed, and now it is modified to call the original method to ensure the normal operation of the host function
    • Added the function of checking the return value of the method in the Hook process. If the return value does not match, it will automatically throw an exception or print an error according to the situation
    • Added array type to Resources Hook, thanks to PRopen in new window of GSWXXNopen in new window
    • Moved me.weishu.reflection to thirdparty to prevent conflicting dependencies of the same name introduced at the same time
    • Remove the exception thrown when the Hook method body is empty, and modify it to print the warning log
    • Modify the exception handling logic of AppLifecycle and throw it directly to the host when an exception occurs
    • Updated Demo API version to 33

    1.0.92 | 2022.05.31  outdate

    • Fixed the naming method of callback in a large number of methods
    • Changed the solution to fix the problem that YukiHookDataChannel cannot call back the current Activity broadcast on devices lower than Android 12
    • The InjectYukiHookWithXposed annotation adds the isUsingResourcesHook function, now you can selectively disable the dependency interface that automatically generates IXposedHookInitPackageResources

    1.0.91 | 2022.05.29  outdate

    • Fixed the ClassLoader error when the customized system of some devices is booted in the LSPosed environment, thanks to Luckyzyxopen in new window for the feedback
    • Fixed YukiHookDataChannel not being able to call back the current Activity broadcast on ZUI and systems below Android 12
    • Integrate the YukiHookModuleStatus function into YukiHookAPI.Status, rewrite a lot of methods, now you can judge the status information such as module activation in the module and the host in both directions

    1.0.90 | 2022.05.27  outdate

    • Fixed YukiHookDataChannel crashing when the module sets the listener callback
    • Fixed YukiHookDataChannel still calling back when not in current Activity
    • Remove the default value of YukiHookDataChannel callback event, no callback
    • Removed YukiHookModulePrefs warning printed if XShare is unreadable
    • Added the isXSharePrefsReadable method in YukiHookModulePrefs to determine whether the current XShare is available

    1.0.89 | 2022.05.26  outdate

    • Fixed the problem that YukiHookDataChannel cannot be repeatedly set to monitor, and added the function of repeating response in different Activity modules and automatically following Activity to destroy the monitor function
    • Added YukiHookDataChannel repeated listening use case description document
    • Add the onAlreadyHooked method to determine whether the current method is repeated Hook
    • Modify part of the logic of repeatedly adding HashMap, remove the putIfAbsent method, allow to override the addition
    • Fixed several possible bugs

    1.0.88 | 2022.05.25  outdate

    • Fully decoupled from Xposed API
    • Added android type in type
    • Separate YukiHookModuleStatus from auto-generated code and add isEnableHookModuleStatus switch, it is up to you to enable or not
    • Internal closure processing for the constructors of a large number of classes in the API
    • Set YukiHookModulePrefs to run as a singleton to prevent repeated creation and waste of system resources
    • Fixed the bug that Hook cannot be nested since version 1.0.80, and optimize the related functions of nested Hook
    • Modify the Hooker storage scheme from HashSet to HashMap to prevent the problem of repeatedly adding Hookers
    • Modify the core implementation method of Hook, add duplicate checking to avoid repeating the Hook multiple callbacks to the HookParam method
    • MethodFinder and FieldFinder add the function of finding fuzzy methods and variable names, you can call name { ... } to set search conditions, and support regular expressions
    • Optimize and modify the way to get appContext to reduce the possibility of getting empty
    • Modify the print TAG of logger in the automatically generated code to default to your custom name, which is convenient for debugging
    • Optimize the Hooker implementation of YukiHookBridge to improve Hook performance
    • PackageParam adds the onAppLifecycle method, which can natively monitor the life cycle of the host and implement the registration system broadcast function
    • Added YukiHookDataChannel function to communicate using system out-of-order broadcast while the module and the host remain alive
    • YukiHookDataChannel adds the checkingVersionEquals method, which can be monitored to verify that the host has not updated the version mismatch problem after the module is updated
    • Added Java version example in the example code of demo-module for reference only

    1.0.87 | 2022.05.10  outdate

    • Added refreshModuleAppResources function to adapt Resources refresh when the language region, font size, resolution changes, etc.
    • Added isEnableModuleAppResourcesCache function, you can set whether to automatically cache the resources of the current module

    1.0.86 | 2022.05.06  outdate

    • Fixed the problem of continuous error reporting during initZygote when Resources Hook is not supported, reproduced in ZUI/LSPosed CI(1.8.3-6550)
    • Optimize and handle exceptions for Resources Hook, only print errors and warnings if they are used and not supported

    1.0.85 | 2022.05.04  outdate

    • Fixed a serious problem of not being able to hook the system framework, since 1.0.80
    • Added in the debug log to distinguish the package name loaded by initZygote as android-zygote, packageName keeps android unchanged

    1.0.83 | 2022.05.04  outdate

    • Fixed YukiHookModuleStatus reporting a lot of errors after loadSystem
    • Added android type in type
    • Updated example descriptions in help documentation

    1.0.82 | 2022.05.04  outdate

    • Fixed a concept confusion error, distinguishing the relationship between initZygote and the system framework, there are problems with the previous comments and documentation, I am very sorry
    • PackageParam adds loadSystem method, no need to write loadApp(name = "android") to hook the system framework

    1.0.81 | 2022.05.04  outdate

    • Fixed the problem that the method and constructor that cannot be found in the Hook method body still output the error log after setting the condition using the by method
    • Added a global log to display the package name of the current Hook APP during the execution of the Hook, and fixed a problem with the printing style of the error log

    1.0.80 | 2022.05.01  outdate

    • The InjectYukiHookWithXposed annotation adds the entryClassName function, which can customize the generated xposed_init entry class name
    • YukiHookXposedInitProxy renamed to IYukiHookXposedInit, the original interface name has been invalidated and will be deleted directly in subsequent versions
    • Added initZygote and Resources Hook functions to support Hook Layout
    • Added onXposedEvent method to listen to all events of native Xposed API
    • Perform inline processing on the lambda of the Hook function to avoid generating excessively broken anonymous classes and improve the running performance after compilation
    • Fixed PrefsData compiled method body copy is too large
    • Added XSharePreference readability test, which will automatically print a warning log if it fails
    • PackageParam adds appResources, moduleAppResources, moduleAppFilePath functions
    • loadApp of PackageParam adds the function of not writing name, and all APPs are filtered by default
    • PackageParam adds the loadZygote method, which can directly hook the system framework
    • PackageParam added resources().hook function
    • Optimization method, construction method, variable search function, the error log that cannot be found will display the set query conditions first
    • Added hasExtends extension method to determine whether the current Class has an inheritance relationship
    • Added isSupportResourcesHook function to determine whether resource hooks are currently supported (Resources Hook)
    • current function adds superClass method to call superclass
    • New superClass query conditions for search methods, construction methods and variables, you can continue to search in the parent class
    • YukiHookAPI lots of methods are decoupled from Xposed API
    • Added native Hook priority function of Xposed API
    • Fixed the problem that isFirstApplication may be inaccurate
    • Block the problem that MiuiCatcherPatch repeatedly calls the Hook entry method on the MIUI system
    • Optimize Hook entry calling method to avoid multiple calls due to Hook Framework issues
    • Fixed the problem that Hook ClassLoader causes Hook to freeze, thanks to WankkoReeopen in new window for the feedback
    • Improve the performance after the XC_Callback interface is connected
    • Java type added ClassLoader type
    • Optimize the API help documentation, fix the problem that the page may be continuously cached

    1.0.78 | 2022.04.18  outdate

    • YukiHookModulePrefs adds isRunInNewXShareMode method, which can be used to determine whether the module is currently in New XSharePreference mode
    • Fixed YukiHookModulePrefs working in New XSharePreference mode
    • Added ModulePreferenceFragment, now you can completely replace PreferenceFragmentCompat and start using the new functionality
    • Adapt the Sp data storage solution of PreferenceFragmentCompat, thanks to mahoshojoHCGopen in new window for feedback
    • Update autohandlers and Kotlin dependencies to the latest version
    • Fixed some bugs in documentation and code comments

    1.0.77 | 2022.04.15  outdate

    • YukiHookModulePrefs added clear method, thanks to WankkoReeopen in new window for the suggestion
    • YukiHookModulePrefs added getStringSet, putStringSet, all methods
    • Added any method to args of HookParam
    • Added ModuleApplication, which can be inherited in modules to achieve more functions
    • Connect all findClass functions to the Xposed API, and continue to use native ClassLoader in non-hosted environments
    • Fixed some possible bugs

    1.0.75 | 2022.04.13  outdate

    • Corrected the logic recognition part of the automatic handler, thanks to ApeaSuperzopen in new window contribution
    • Fixed an issue where the reference to a doc comment was not changed
    • firstArgs and lastArgs methods have been removed from HookParam, now you can use args().first() and args().last() instead of it
    • Removed default parameter index = 0 in args() in HookParam, now you can use args().first() or args(index = 0) to replace it
    • The result function in HookParam adds generic matching, now you can use result<T> to match the known return value type of your target method
    • The emptyParam condition is added to the method and constructor query function, and the misunderstanding of the query condition that needs to be paid attention to in the document has been improved
    • Added android type in type

    1.0.73 | 2022.04.10  outdate

    • Fixed some Chinese translation errors in documents, thanks to WankkoReeopen in new window for their contributions
    • Fixed the problem that XC_LoadPackage.LoadPackageParam throws an exception when the content is empty in some cases, thanks to Luckyzyxopen in new window for the feedback
    • Fixed some known bugs and improve Hook stability

    1.0.72 | 2022.04.09  outdate

    • Update API documentation to new address
    • Add appContext function to PackageParam
    • Fixed some known bugs and improve Hook stability

    1.0.71 | 2022.04.04  outdate

    • Fixed a serious issue that would stop the Hook from throwing an exception when VariousClass could not be matched

    1.0.70 | 2022.04.04  outdate

    • Fixed instanceClass reporting an error after being called in a static instance
    • Add isUseAppClassLoader function in Hook process, thanks to WankkoReeopen in new window for feedback
    • Added the withProcess function, which can be hooked according to the currently specified process of the APP
    • Fixed critical logic errors in lookup methods, constructor classes and variables
    • Fixed the problem that the abnormal output cannot be ignored when the Hook target class does not exist
    • Fixed the problem that the Hook could not take effect due to the fast loading of the APP startup method in some cases
    • Fixed allMethods not throwing an exception when it is not hooked to a method, thanks to WankkoReeopen in new window for the feedback
    • Added Hook status monitoring function, thanks to WankkoReeopen in new window for the suggestion
    • Modify the way the Xposed entry is injected into the class, and redefine the definition domain of the API
    • Added obfuscated method and variable lookup function, you can use different types of filter index to locate the specified method and variable, thanks to WankkoReeopen in new window for the ideas provided
    • When looking for methods and variables, multiple types are allowed, such as the class name declared by String and VariousClass
    • Add a new current function, which can build a reflection method operation space for any class, and easily call and modify the methods and variables in it
    • Fixed a lot of bugs in the hook process, thanks to WankkoReeopen in new window for contributing to this project

    1.0.69 | 2022.03.30  outdate

    • Added and improved annotations for some method functions
    • Added more example Hook content in Demo
    • Fixed the issue that only the last one takes effect when allMethods is used multiple times in a Hook instance, thanks to WankkoReeopen in new window for the feedback

    1.0.68 | 2022.03.29  outdate

    • Added new use case and LSPosed scope in Demo
    • Added Member lookup cache and lookup cache configuration switches
    • Removed and modified MethodFinder, FieldFinder and HookParam related method calls
    • Add more cast types in Finder and support cast as array
    • Overall performance and stability improvements
    • Fixed bugs that may exist in the previous version

    1.0.67 | 2022.03.27  outdate

    • Added three modifiers functions in Finder, which can filter static, native, public, abstract and many other description types
    • When searching for methods and constructors, the method parameter type can be blurred to a specified number for searching
    • Added hasModifiers extension for Member
    • Added give method in MethodFinder and ConstructorFinder to get primitive types
    • Added PrefsData template function in YukiHookModulePrefs
    • Completely refactored method, constructor and variable lookup scheme
    • Optimized code comments and fixed possible bugs

    1.0.66 | 2022.03.25  outdate

    • Fixed a serious bug in MethodFinder
    • Added args call method in hookParam
    • Fixed other possible problems and fix some class annotation problems

    1.0.65 | 2022.03.25  outdate

    • Republished version to fix the incorrect new version of the Maven repository due to cache issues
    • Added MethodFinder and FieldFinder new return value calling methods
    • Fixed possible problems and fix possible problems during the use of Tai Chi
    • Fixed possible problems with auto-generated Xposed entry classes
    • Added android type and java type in type

    1.0.6 | 2022.03.20  outdate

    • Fixed YukiHookModulePrefs being ignored every time after using direct once to ignore cache
    • Added new API, abolished the traditional usage of isActive to judge module activation
    • Fixed the issue of printing debug logs when using the API in a non-Xposed environment
    • Fixed log output issue and unintercepted exception issue when looking for Field
    • Decoupling Xposed API in ReflectionUtils
    • Added YukiHookModuleStatus method name confusion to reduce the size of module generation
    • The welcome message will no longer be printed when loading the module's own Hook
    • Fixed some bugs that still exist in the previous version

    1.0.55 | 2022.03.18  outdate

    • Fixed an annotation error
    • Temporarily fix a bug
    • Added a large number of android types in type and a small number of java types
    • Fixed compatibility issues between new and old Kotlin APIs

    1.0.5 | 2022.03.18  outdate

    • Fixed the problem that the welcome message was printed multiple times in the case of the old version of the LSPosed framework
    • Added onInit method to configure YukiHookAPI
    • Added executorName and executorVersion to get the name and version number of the current hook framework
    • Added by method to set the timing and condition of Hook
    • YukiHookModulePrefs adds a controllable key-value cache, which can dynamically update data when the host is running
    • Fixed some possible bugs

    1.0.4 | 2022.03.06  outdate

    • Fixed LSPosed cannot find XposedBridge after enabling "Only module classloader can use Xposed API" option in latest version
    • Added constant version name and version number for YukiHookAPI
    • Added hasField method and isAllowPrintingLogs configuration parameter
    • Added isDebug to enable the API to automatically print the welcome message to test whether the module is valid

    1.0.3 | 2022.03.02  outdate

    • Fixed a potential exception not intercepted BUG
    • Added ignoredError function
    • Added android type in type
    • Added ClassNotFound function after listening to hook

    1.0.2 | 2022.02.18  outdate

    • Fixed the problem that the project path cannot be found under Windows
    • Remove part of reflection API, merge into BaseFinder for integration
    • Add a method to create Hook directly using string

    1.0.1 | 2022.02.15  outdate

    • RemedyPlan adds onFind function
    • Integrate and modify some reflection API code
    • Added java type in type
    • Fixed the issue that ignored errors still output in the console

    1.0 | 2022.02.14  outdate

    • The first version is submitted to Maven
    + diff --git a/docs/en/about/contacts.html b/docs/en/about/contacts.html index b6e501448..1a4599654 100644 --- a/docs/en/about/contacts.html +++ b/docs/en/about/contacts.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Contact Us | Yuki Hook API - + Contact Us | Yuki Hook API + -

    Contact Us

    If you have any questions in use, or have any constructive suggestions, you can contact us.

    Join us Click to join Telegram groupopen in new window

    Find me on Twitter @fankesyooniopen in new window

    Help with Maintenance

    Thank you for choosing and using YukiHookAPI.

    If you have code-related suggestions and requests, you can submit a Pull Request on Github.

    - +

    Contact Us

    If you have any questions in use, or have any constructive suggestions, you can contact us.

    Join us Click to join Telegram groupopen in new window

    Find me on Twitter @fankesyooniopen in new window

    Help with Maintenance

    Thank you for choosing and using YukiHookAPI.

    If you have code-related suggestions and requests, you can submit a Pull Request on Github.

    + diff --git a/docs/en/about/future.html b/docs/en/about/future.html index da9e1c8a5..566374ad6 100644 --- a/docs/en/about/future.html +++ b/docs/en/about/future.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Looking for Future | Yuki Hook API - + Looking for Future | Yuki Hook API + -

    Looking for Future

    The future is bright and uncertain, let us look forward to the future development space of YukiHookAPI.

    Unresolved Issues

    Here are the unresolved issues with YukiHookAPI.

    YukiHookModulePrefs

    Currently only supports LSPosed perfectly, other Xposed Framework need to downgrade the module target api.

    TaiChi may not be supported at all, and TaiChi needs a lower target api to adapt on high-version systems.

    Some Xposed Module developers currently choose the Hook target app self's SharedPreferences storage solution to solve the module settings sharing problem.

    In the later period, the permissions of the Android system will become more and more strict, and selinux is a big problem currently facing, which needs to be discussed and studied.

    Future Plans

    Features that YukiHookAPI may add later are included here.

    Lite Version Supported for Standalone Use

    To be Discussed

    At present, the API only supports binding to xposed_init through the automatic handler.

    If you don't like the automatic handler, you must implement the module loading entry yourself.

    In the future, the Lite version with only API functions will be launched according to the number of people required.

    You can submit issues with us.

    We have provided the Xposed native API listening interface, you can find or view the implementation method of the Demo here.

    Support for More Hook Framework

    As an API, currently only docking XposedBridge as a compatibility layer still has certain limitations.

    Most inline hook do not have a Java compatibility layer, and the Java compatibility layer adaptation of native hook may be considered later.

    - +

    Looking for Future

    The future is bright and uncertain, let us look forward to the future development space of YukiHookAPI.

    Unresolved Issues

    Here are the unresolved issues with YukiHookAPI.

    YukiHookModulePrefs

    Currently only supports LSPosed perfectly, other Xposed Framework need to downgrade the module target api.

    TaiChi may not be supported at all, and TaiChi needs a lower target api to adapt on high-version systems.

    Some Xposed Module developers currently choose the Hook target app self's SharedPreferences storage solution to solve the module settings sharing problem.

    In the later period, the permissions of the Android system will become more and more strict, and selinux is a big problem currently facing, which needs to be discussed and studied.

    Future Plans

    Features that YukiHookAPI may add later are included here.

    Lite Version Supported for Standalone Use

    To be Discussed

    At present, the API only supports binding to xposed_init through the automatic handler.

    If you don't like the automatic handler, you must implement the module loading entry yourself.

    In the future, the Lite version with only API functions will be launched according to the number of people required.

    You can submit issues with us.

    We have provided the Xposed native API listening interface, you can find or view the implementation method of the Demo here.

    Support for More Hook Framework

    As an API, currently only docking XposedBridge as a compatibility layer still has certain limitations.

    Most inline hook do not have a Java compatibility layer, and the Java compatibility layer adaptation of native hook may be considered later.

    + diff --git a/docs/en/api/home.html b/docs/en/api/home.html index cb10935e3..9fb1278aa 100644 --- a/docs/en/api/home.html +++ b/docs/en/api/home.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Document Introduce | Yuki Hook API - + Document Introduce | Yuki Hook API + -

    Document Introduce

    The document here will synchronize the relevant usage of the latest API version, please keep YukiHookAPI as the latest version to use the latest version of the function.

    Function Description

    The function description mainly introduces the related usage and purpose of the current API.

    Function Example Description

    The function examples mainly show the basic usage examples of the current API for reference.

    Change Record Description

    The function of the first version will be marked as v<version> first;

    New function added later will be marked as v<version> added;

    Later modified function will be appended as v<version> modified;

    Later deprecated function will be marked as v<version> deprecated and strikethrough;

    Later removed function will be marked as v<version> removed and strikethrough.

    • kt  Kotlin Static File

    • annotation  Annotation Class

    • interface  Interface Class

    • object  Class (Singleton)

    • class  Class

    • field  Field or get / set method or read-only get method

    • method  Method

    • enum  Enum constant

    • ext-field  Extension field (global)

    • ext-method  Extension method (global)

    • i-ext-field  Extension field (internal)

    • i-ext-method  Extension method (internal)

    - +

    Document Introduce

    The document here will synchronize the relevant usage of the latest API version, please keep YukiHookAPI as the latest version to use the latest version of the function.

    Function Description

    The function description mainly introduces the related usage and purpose of the current API.

    Function Example Description

    The function examples mainly show the basic usage examples of the current API for reference.

    Change Record Description

    The function of the first version will be marked as v<version> first;

    New function added later will be marked as v<version> added;

    Later modified function will be appended as v<version> modified;

    Later deprecated function will be marked as v<version> deprecated and strikethrough;

    Later removed function will be marked as v<version> removed and strikethrough.

    • kt  Kotlin Static File

    • annotation  Annotation Class

    • interface  Interface Class

    • object  Class (Singleton)

    • class  Class

    • field  Field or get / set method or read-only get method

    • method  Method

    • enum  Enum constant

    • ext-field  Extension field (global)

    • ext-method  Extension method (global)

    • i-ext-field  Extension field (internal)

    • i-ext-method  Extension method (internal)

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html b/docs/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html index f3a9e5cad..a534ccb2a 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/YukiHookAPI.html @@ -22,24 +22,27 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookAPI - object | Yuki Hook API - + YukiHookAPI - object | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookAPI - object

    object YukiHookAPI
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookAPI - object

    object YukiHookAPI
     

    Change Records

    v1.0 first

    Function Illustrate

    这是 YukiHookAPI 的 API 调用总类,Hook 相关功能的开始、Hook 相关功能的配置都在这里。

    API_VERSION_NAME - field

    const val API_VERSION_NAME: String
     

    Change Records

    v1.0.4 added

    Function Illustrate

    获取当前 YukiHookAPI 的版本。

    API_VERSION_CODE - field

    const val API_VERSION_CODE: Int
    -

    Change Records

    v1.0.4 added

    Function Illustrate

    获取当前 YukiHookAPI 的版本号。

    executorName - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    请转移到 Status.executorName

    executorVersion - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    请转移到 Status.executorVersion

    Status - object

    object Status
    +

    Change Records

    v1.0.4 added

    Function Illustrate

    获取当前 YukiHookAPI 的版本号。

    executorName - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    请转移到 Status.Executor.name

    executorVersion - field

    Change Records

    v1.0.5 added

    v1.0.91 removed

    请转移到 Status.Executor.apiLevelStatus.Executor.versionNameStatus.Executor.versionCode

    Status - object

    object Status
     

    Change Records

    v1.0.91 added

    Function Illustrate

    当前 YukiHookAPI 的状态。

    compiledTimestamp - field

    val compiledTimestamp: Long
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获取项目编译完成的时间戳 (当前本地时间)。

    isXposedEnvironment - field

    val isXposedEnvironment: Boolean
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前是否为 (Xposed) 宿主环境。

    executorName - field

    val executorName: String
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    获取当前 Hook 框架的名称。

    无法获取会返回 unknownXposedBridge 不存在会返回 invalid

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    executorVersion - field

    val executorVersion: Int
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    获取当前 Hook 框架的版本。

    无法获取会返回 -1

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    isModuleActive - field

    val isModuleActive: Boolean
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前是否为 (Xposed) 宿主环境。

    executorName - field

    Change Records

    v1.0.91 added

    v1.1.5 deprecated

    请转移到 Executor.name

    executorVersion - field

    Change Records

    v1.0.91 added

    v1.1.5 deprecated

    请转移到 Executor.apiLevelExecutor.versionNameExecutor.versionCode

    isModuleActive - field

    val isModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    判断模块是否在 Xposed 或太极、无极中激活。

    Notice

    在模块环境中你需要将 Application 继承于 ModuleApplication

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中仅返回非 isTaiChiModuleActive 的激活状态。

    isXposedModuleActive - field

    val isXposedModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    仅判断模块是否在 Xposed 中激活。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中始终返回 true。

    isTaiChiModuleActive - field

    val isTaiChiModuleActive: Boolean
     

    Change Records

    v1.0.91 added

    Function Illustrate

    仅判断模块是否在太极、无极中激活。

    Notice

    在模块环境中你需要将 Application 继承于 ModuleApplication

    在 (Xposed) 宿主环境中始终返回 false。

    isSupportResourcesHook - field

    val isSupportResourcesHook: Boolean
    -

    Change Records

    v1.0.91 added

    Function Illustrate

    判断当前 Hook Framework 是否支持资源钩子(Resources Hook)。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中可能会延迟等待事件回调后才会返回 true。

    请注意你需要确保 InjectYukiHookWithXposed.isUsingResourcesHook 已启用,否则始终返回 false。

    Configs - object

    object Configs
    +

    Change Records

    v1.0.91 added

    Function Illustrate

    判断当前 Hook Framework 是否支持资源钩子(Resources Hook)。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中可能会延迟等待事件回调后才会返回 true。

    请注意你需要确保 InjectYukiHookWithXposed.isUsingResourcesHook 已启用,否则始终返回 false。

    Executor - object

    object Executor
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    当前 YukiHookAPI 使用的 Hook Framework 相关信息。

    name - field

    val name: String
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前 Hook Framework 名称。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    apiLevel - field

    val apiLevel: Int
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前 Hook Framework 的 API 版本。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    versionName - field

    val versionName: String
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前 Hook Framework 版本名称。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    versionCode - field

    val versionCode: Int
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前 Hook Framework 版本号。

    Notice

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    Configs - object

    object Configs
     

    Change Records

    v1.0 first

    Function Illustrate

    对 API 相关功能的配置类。

    debugLog - method

    inline fun debugLog(initiate: YukiHookLogger.Configs.() -> Unit)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    配置 YukiHookLogger.Configs 相关参数。

    debugTag - field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转移到 YukiHookLogger.Configs.tag

    isDebug - field

    var isDebug: Boolean
     

    Change Records

    v1.0 first

    Function Illustrate

    是否启用 DEBUG 模式。

    默认为开启状态,开启后模块将会向 LogcatXposedBridge.log 打印详细的 Hook 日志,关闭后仅会打印 E 级别的日志。

    isAllowPrintingLogs - field

    Change Records

    v1.0.4 added

    v1.1.0 deprecated

    请转移到 YukiHookLogger.Configs.isEnable

    isEnableModulePrefsCache - field

    var isEnableModulePrefsCache: Boolean
    @@ -125,6 +128,6 @@
     
    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     
    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
     

    Change Records

    v1.0 first

    Function Illustrate

    装载 Hook 入口的核心方法。

    Function Example

    详情请参考

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html b/docs/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html index 5f147a31d..352447817 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html @@ -22,18 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - InjectYukiHookWithXposed - annotation | Yuki Hook API - + InjectYukiHookWithXposed - annotation | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    InjectYukiHookWithXposed - annotation

    annotation class InjectYukiHookWithXposed(
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    InjectYukiHookWithXposed - annotation

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
         val isUsingResourcesHook: Boolean
     )
     

    Change Records

    v1.0 first

    v1.0.80 modified

    新增 entryClassName 参数

    v1.0.92 modified

    新增 isUsingResourcesHook 参数

    Function Illustrate

    标识 YukiHookAPI 注入 Xposed 入口的类注解。

    Function Example

    详情请参考 InjectYukiHookWithXposed Annotation

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html index cb7fd3a90..fe876c24d 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - CurrentClass - class | Yuki Hook API - + CurrentClass - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    CurrentClass - class

    class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    CurrentClass - class

    class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
     

    Change Records

    v1.0.70 added

    v1.1.0 modified

    调整了构造方法的参数名称

    Function Illustrate

    当前实例的类操作对象。

    name - field

    val name: String
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获得当前 classSetClass.getName

    simpleName - field

    val simpleName: String
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获得当前 classSetClass.getSimpleName

    generic - method

    fun generic(): GenericClass?
    @@ -43,6 +43,6 @@
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获得当前实例父类中的泛型父类。

    如果当前实例不存在泛型将返回 null

    field - method

    inline fun field(initiate: FieldConditions): FieldFinder.Result.Instance
     

    Change Records

    v1.0.80 added

    Function Illustrate

    调用父类实例中的变量。

    method - method

    inline fun method(initiate: MethodConditions): MethodFinder.Result.Instance
     

    Change Records

    v1.0.80 added

    Function Illustrate

    调用父类实例中的方法。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html index f4ab1ebba..ce1465b9f 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html @@ -22,14 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - GenericClass - class | Yuki Hook API - + GenericClass - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    GenericClass - class

    class GenericClass internal constructor(private val type: ParameterizedType)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    GenericClass - class

    class GenericClass internal constructor(private val type: ParameterizedType)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    当前 Class 的泛型父类操作对象。

    argument - method

    fun argument(index: Int): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    获得泛型参数数组下标的 Class 实例。

    - +
    inline fun <reified T> argument(index: Int): Class<T>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增泛型返回值 Class<T> 方法

    Function Illustrate

    获得泛型参数数组下标的 Class 实例。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html index 92743c6fc..37fda7ab8 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - HookClass - class | Yuki Hook API - + HookClass - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookClass - class

    class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    HookClass 相关功能不再对外开放

    Function Illustrate

    创建一个当前 Hook 的 Class 接管类。

    instance 为实例,name 为实例完整包名,throwable 为找不到实例的时候抛出的异常。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookClass - class

    class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
    +

    Change Records

    v1.0 first

    v1.1.0 modified

    HookClass 相关功能不再对外开放

    Function Illustrate

    创建一个当前 Hook 的 Class 接管类。

    instance 为实例,name 为实例完整包名,throwable 为找不到实例的时候抛出的异常。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html index 2ed3f30ee..aa3f78085 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - HookResources - class | Yuki Hook API - + HookResources - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookResources - class

    class HookResources internal constructor(var instance: YukiResources?)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookResources - class

    class HookResources internal constructor(var instance: YukiResources?)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    创建一个当前 Hook 的 YukiResources 接管类。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html index cf54a3cf8..931699a1c 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - VariousClass - class | Yuki Hook API - + VariousClass - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariousClass - class

    class VariousClass(vararg var name: String)
    -

    Change Records

    v1.0 first

    Function Illustrate

    这是一个不确定性 Class 类名装载器,通过 name 装载 Class 名称数组。

    get - method

    fun get(loader: ClassLoader? = null): Class<*>
    -

    Change Records

    v1.0.70 added

    Function Illustrate

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    匹配不到 Class 会返回 null,不会抛出异常。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariousClass - class

    class VariousClass(private vararg val name: String)
    +

    Change Records

    v1.0 first

    v1.1.5 modified

    私有化 name 参数并设置为不可修改

    Function Illustrate

    这是一个不确定性 Class 类名装载器,通过 name 装载 Class 名称数组。

    get - method

    fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*>
    +

    Change Records

    v1.0.70 added

    v1.1.5 modified

    新增 initialize 参数

    Function Illustrate

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增 initialize 参数

    Function Illustrate

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    匹配不到 Class 会返回 null,不会抛出异常。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html index 8ed71b8e1..d48c56c47 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - YukiMemberHookCreator - class | Yuki Hook API - + YukiMemberHookCreator - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiMemberHookCreator - class

    class YukiMemberHookCreator(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    -

    Change Records

    v1.0 first

    v1.0.80 modified

    hookClass 进行 inline 处理

    v1.1.0 modified

    修正拼写错误的 Creater 命名到 Creator

    Function Illustrate

    YukiHookAPIMember 核心 Hook 实现类。

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiMemberHookCreator - class

    class YukiMemberHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    +

    Change Records

    v1.0 first

    v1.0.80 modified

    hookClass 进行 inline 处理

    v1.1.0 modified

    修正拼写错误的 Creater 命名到 Creator

    v1.1.5 modified

    私有化构造方法

    Function Illustrate

    YukiHookAPIMember 核心 Hook 实现类。

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    默认 Hook 回调优先级。

    PRIORITY_LOWEST - field

    val PRIORITY_LOWEST: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    延迟回调 Hook 方法结果。

    PRIORITY_HIGHEST - field

    val PRIORITY_HIGHEST: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    更快回调 Hook 方法结果。

    instanceClass - field

    val instanceClass: Class<*>
    @@ -46,15 +46,15 @@
     

    Change Records

    v1.1.0 added

    Function Illustrate

    允许 Hook 过程中的所有危险行为。

    请在 option 中键入 Yes do as I say! 代表你同意允许所有危险行为。

    你还需要在整个调用域中声明注解 CauseProblemsApi 以消除警告。

    若你只需要 Hook ClassLoaderloadClass 方法,请参考 ClassLoader.onLoadClass

    Pay Attention

    若你不知道允许此功能会带来何种后果,请勿使用。

    MemberHookCreator - class

    inner class MemberHookCreator internal constructor(private val priority: Int, internal val tag: String)
     

    Change Records

    v1.0 first

    v1.0.80 modified

    增加 priority Hook 优先级

    v1.0.81 modified

    增加 packageName 当前 Hook 的 APP 包名

    v1.1.0 modified

    移除 packageName

    修正拼写错误的 Creater 命名到 Creator

    Function Illustrate

    Hook 核心功能实现类,查找和处理需要 Hook 的 MethodConstructor

    member - field

    Change Records

    v1.0 first

    v1.1.0 removed

    请转移到 members

    members - method

    fun members(vararg member: Member?)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    手动指定要 Hook 的 MethodConstructor

    Notice

    不建议使用此方法设置目标需要 Hook 的 Member 对象,你可以使用 methodconstructor 方法。

    Function Example

    你可以调用 instanceClass 来手动查找要 Hook 的 MethodConstructor

    The following example

    injectMember {
    -    members(instanceClass.getDeclaredMethod("test", StringType))
    +    members(instanceClass.getDeclaredMethod("test", StringClass))
         beforeHook {}
         afterHook {}
     }
     

    同样地,你也可以传入一组 Member 同时进行 Hook。

    The following example

    injectMember {
         members(
    -        instanceClass.getDeclaredMethod("test1", StringType),
    -        instanceClass.getDeclaredMethod("test2", StringType),
    -        instanceClass.getDeclaredMethod("test3", StringType)
    +        instanceClass.getDeclaredMethod("test1", StringClass),
    +        instanceClass.getDeclaredMethod("test2", StringClass),
    +        instanceClass.getDeclaredMethod("test3", StringClass)
         )
         beforeHook {}
         afterHook {}
    @@ -64,7 +64,7 @@
     

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    查找当前 Class 需要 Hook 的 Method

    Function Example

    你可参考 MethodFinder 查看详细用法。

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         beforeHook {}
    @@ -80,7 +80,7 @@
     }
     

    此时 beforeHookafterHook 会在每个查找到的结果中多次回调 Hook 方法体。

    Notice

    若没有 all,默认只会 Hook 当前条件查找到的数组下标结果第一位。

    constructor - method

    inline fun constructor(initiate: ConstructorConditions): ConstructorFinder.Result
     

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    查找当前 Class 需要 Hook 的 Constructor

    Function Example

    你可参考 ConstructorFinder 查看详细用法。

    The following example

    injectMember {
    -    constructor { param(StringType) }
    +    constructor { param(StringClass) }
         beforeHook {}
         afterHook {}
     }
    @@ -93,7 +93,7 @@
     

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    使用当前 hookClass 查找并得到 Field

    Function Example

    你可参考 FieldFinder 查看详细用法。

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         afterHook {
    @@ -148,6 +148,6 @@
     

    Change Records

    v1.0.70 added

    Function Illustrate

    监听 hookClass 存在时准备开始 Hook 的操作。

    onHookClassNotFoundFailure - method

    fun onHookClassNotFoundFailure(result: (Throwable) -> Unit): Result
     

    Change Records

    v1.0.3 added

    Function Illustrate

    监听 hookClass 找不到时发生错误的回调方法。

    ignoredHookClassNotFoundFailure - method

    fun ignoredHookClassNotFoundFailure(): Result
     

    Change Records

    v1.0.3 added

    Function Illustrate

    忽略 hookClass 找不到时出现的错误。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html index 646bc1ba3..d5babbdf1 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - YukiResourcesHookCreator - class | Yuki Hook API - + YukiResourcesHookCreator - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    -

    Change Records

    v1.0.80 added

    v1.1.0 modified

    修正拼写错误的 Creater 命名到 Creator

    Function Illustrate

    YukiHookAPIResources 核心 Hook 实现类。

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    +

    Change Records

    v1.0.80 added

    v1.1.0 modified

    修正拼写错误的 Creater 命名到 Creator

    v1.1.5 modified

    私有化构造方法

    Function Illustrate

    YukiHookAPIResources 核心 Hook 实现类。

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    注入要 Hook 的 Resources。

    Function Example

    你可以注入任意 Resources,使用 injectResource 即可创建一个 Hook 对象。

    The following example

    injectResource {
         // Your code here.
     }
    @@ -122,6 +122,6 @@
     

    Change Records

    v1.0.80 added

    Function Illustrate

    添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。

    onHookingFailure - method

    fun onHookingFailure(result: (Throwable) -> Unit): Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    监听 Hook 过程发生错误的回调方法。

    ignoredHookingFailure - method

    fun ignoredHookingFailure(): Result
     

    Change Records

    v1.0.80 added

    Function Illustrate

    忽略 Hook 过程出现的错误。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html index c6ca53b60..3c38875e1 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - BaseFinder - class | Yuki Hook API - + BaseFinder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    BaseFinder - class

    abstract class BaseFinder
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    BaseFinder - class

    abstract class BaseFinder
     

    Change Records

    v1.0.70 added

    v1.1.0 modified

    分离原始命名 BaseFinder 中的部分方法与参数到 MemberBaseFinder

    Function Illustrate

    这是 ClassMember 查找类功能的基本类实现。

    BaseFinder.IndexTypeCondition - class

    inner class IndexTypeCondition internal constructor(private val type: IndexConfigType)
     

    Change Records

    v1.0.70 added

    Function Illustrate

    字节码下标筛选实现类。

    index - method

    fun index(num: Int)
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置下标。

    index 小于零则为倒序,此时可以使用 IndexTypeConditionSort.reverse 方法实现。

    可使用 IndexTypeConditionSort.firstIndexTypeConditionSort.last 设置首位和末位筛选条件。

    index - method

    fun index(): IndexTypeConditionSort
    @@ -36,6 +36,6 @@
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置满足条件的第一个。

    last - method

    fun last()
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置满足条件的最后一个。

    reverse - method

    fun reverse(num: Int)
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置倒序下标。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html index 73a779195..f9806bc19 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - CountRules - class | Yuki Hook API - + CountRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    CountRules - class

    class CountRules private constructor()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    CountRules - class

    class CountRules private constructor()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    这是一个模糊 ClassMember 数组 (下标) 个数条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    Int.isZero - i-ext-method

    fun Int.isZero(): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    是否为 0。

    Int.moreThan - i-ext-method

    fun Int.moreThan(count: Int): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    大于 count

    Int.lessThan - i-ext-method

    fun Int.lessThan(count: Int): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    小于 count

    Int.inInterval - i-ext-method

    fun Int.inInterval(countRange: IntRange): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    countRange 区间 A ≤ this ≤ B。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html index c7788366d..941af68a0 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModifierRules - class | Yuki Hook API - + ModifierRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModifierRules - class

    class ModifierRules private constructor()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModifierRules - class

    class ModifierRules private constructor()
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    新增 Class 的描述符判断

    作为 lambda 整体判断条件使用

    移动到 base 包名

    私有化构造方法

    Function Illustrate

    这是一个 ClassMember 描述符条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    isPublic - i-ext-field

    val isPublic: Boolean
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    ClassMember 类型是否包含 public

    isPrivate - i-ext-field

    val isPrivate: Boolean
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    ClassMember 类型是否包含 private

    isProtected - i-ext-field

    val isProtected: Boolean
    @@ -41,6 +41,6 @@
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    Class 类型是否包含 interface

    isAbstract - i-ext-field

    val isAbstract: Boolean
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    ClassMember 类型是否包含 abstract

    对于任意的抽象 ClassMember 可添加此描述进行确定。

    isStrict - i-ext-field

    val isStrict: Boolean
     

    Change Records

    v1.0.67 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    ClassMember 类型是否包含 strictfp

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html index 8aaf6346d..9f613df79 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - NameRules - class | Yuki Hook API - + NameRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    NameRules - class

    class NameRules private constructor()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    NameRules - class

    class NameRules private constructor()
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    NameConditions 更名为 NameRules

    作为 lambda 整体判断条件使用

    移动到 base 包名

    私有化构造方法

    Function Illustrate

    这是一个模糊 ClassMember 名称条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    String.isSynthetic - i-ext-method

    fun String.isSynthetic(index: Int): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否为匿名类的主类调用对象。

    String.isOnlySymbols - i-ext-method

    fun String.isOnlySymbols(): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有符号。

    String.isOnlyLetters - i-ext-method

    fun String.isOnlyLetters(): Boolean
    @@ -35,7 +35,7 @@
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有数字。

    String.isOnlyLettersNumbers - i-ext-method

    fun String.isOnlyLettersNumbers(): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有字母或数字。

    String.isOnlyLowercase - i-ext-method

    fun String.isOnlyLowercase(): Boolean
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有小写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    String.isOnlyUppercase - i-ext-method

    fun String.isOnlyUppercase(): Boolean
    -

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有大写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    - +

    Change Records

    v1.0.88 added

    v1.1.0 modified

    统一合并到扩展方法并改名

    Function Illustrate

    是否只有大写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html new file mode 100644 index 000000000..a21114a24 --- /dev/null +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html @@ -0,0 +1,34 @@ + + + + + + + + + ObjectRules - class | Yuki Hook API + + + + +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ObjectRules - class

    class ObjectRules private constructor(private val instance: Any)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    这是一个任意对象条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    + + + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html index ad86ee9d7..efd92c236 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - DexClassFinder - class | Yuki Hook API - + DexClassFinder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    DexClassFinder - class

    class DexClassFinder internal constructor(
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    DexClassFinder - class

    class DexClassFinder internal constructor(
         internal var name: String,
         internal var async: Boolean,
         override val loaderSet: ClassLoader?
    @@ -72,6 +72,6 @@
     

    Change Records

    v1.1.0 added

    Function Illustrate

    得到 Class 本身数组 (异步)。

    回调全部查找条件匹配的多个 Class 实例。

    在查找条件找不到任何结果的时候将回调空的 HashSet

    你需要设置 async 后此方法才会被回调,否则请使用 all 方法。

    onNoClassDefFoundError - method

    fun onNoClassDefFoundError(result: (Throwable) -> Unit): Result
     

    Change Records

    v1.1.0 added

    Function Illustrate

    监听找不到 Class 时。

    ignored - method

    fun ignored(): Result
     

    Change Records

    v1.1.0 added

    Function Illustrate

    忽略异常并停止打印任何错误日志。

    此时若要监听异常结果,你需要手动实现 onNoClassDefFoundError 方法。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html index d1620f311..2f8f3c709 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html @@ -22,19 +22,20 @@ document.documentElement.classList.toggle('dark', true); } - ConstructorRules - class | Yuki Hook API - + ConstructorRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ConstructorRules - class

    class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ConstructorRules - class

    class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
     

    Change Records

    v1.1.0 added

    Function Illustrate

    Constructor 查找条件实现类。

    paramCount - field

    var paramCount: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 标识符筛选条件。

    可不设置筛选条件。

    emptyParam - method

    fun emptyParam()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 空参数、无参数。

    param - method

    fun param(vararg paramType: Any)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    paramCount - method

    fun paramCount(numRange: IntRange)
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    param - method

    fun param(conditions: ObjectsConditions)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Constructor 参数条件。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    paramCount - method

    fun paramCount(numRange: IntRange)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    paramCount - method

    fun paramCount(conditions: CountConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html index 814edda39..2d8c4d807 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html @@ -22,17 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - FieldRules - class | Yuki Hook API - + FieldRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    FieldRules - class

    class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    FieldRules - class

    class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
     

    Change Records

    v1.1.0 added

    Function Illustrate

    Field 查找条件实现类。

    name - field

    var name: String
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Field 名称。

    type - field

    var type: Any?
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Field 类型。

    可不填写类型。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Field 标识符筛选条件。

    可不设置筛选条件。

    name - method

    fun name(conditions: NameConditions)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Field 名称条件。

    - +

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Field 名称条件。

    type - method

    fun type(conditions: ObjectConditions)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Field 类型条件。

    可不填写类型。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html index 573a1559d..a64f036b9 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - MemberRules - class | Yuki Hook API - + MemberRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MemberRules - class

    class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MemberRules - class

    class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
     

    Change Records

    v1.1.0 added

    Function Illustrate

    Member 查找条件实现类。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Member 标识符筛选条件。

    可不设置筛选条件。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html index 1cee298a9..a26112b43 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html @@ -22,22 +22,24 @@ document.documentElement.classList.toggle('dark', true); } - MethodRules - class | Yuki Hook API - + MethodRules - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MethodRules - class

    class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MethodRules - class

    class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
     

    Change Records

    v1.1.0 added

    Function Illustrate

    Method 查找条件实现类。

    name - field

    var name: String
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 名称。

    paramCount - field

    var paramCount: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    returnType - field

    var returnType: Any?
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 返回值。

    可不填写返回值。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 标识符筛选条件。

    可不设置筛选条件。

    emptyParam - method

    fun emptyParam()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 空参数、无参数。

    param - method

    fun param(vararg paramType: Any)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    name - method

    fun name(conditions: NameConditions)
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    param - method

    fun param(conditions: ObjectsConditions)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Method 参数条件。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    name - method

    fun name(conditions: NameConditions)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 名称条件。

    paramCount - method

    fun paramCount(numRange: IntRange)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    paramCount - method

    fun paramCount(conditions: CountConditions)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    - +

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    returnType - method

    fun returnType(conditions: ObjectConditions)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Method 返回值条件。

    可不填写返回值。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html index ab9b46445..dc54e549e 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - MemberRulesResult - class | Yuki Hook API - + MemberRulesResult - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MemberRulesResult - class

    class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MemberRulesResult - class

    class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
     

    Change Records

    v1.1.0 added

    Function Illustrate

    当前 Member 查找条件结果实现类。

    none - method

    fun none(): MemberRulesResult
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前 Member 在查找条件中个数为 0

    count - method

    fun count(num: Int): MemberRulesResult
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前 Member 在查找条件中需要全部匹配的个数。

    count - method

    fun count(numRange: IntRange): MemberRulesResult
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前 Member 在查找条件中需要全部匹配的个数范围。

    count - method

    fun count(conditions: CountConditions): MemberRulesResult
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前 Member 在查找条件中需要全部匹配的个数条件。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html index 21e9b9e54..db3f013c1 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html @@ -22,17 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - ConstructorFinder - class | Yuki Hook API - + ConstructorFinder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ConstructorFinder - class

    class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ConstructorFinder - class

    class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
     

    Change Records

    v1.0 first

    v1.0.2 modified

    合并到 BaseFinder

    v1.1.0 modified

    合并到 MemberBaseFinder

    Function Illustrate

    Constructor 查找类。

    可通过指定类型查找指定 Constructor 或一组 Constructor

    paramCount - field

    var paramCount: Int
     

    Change Records

    v1.0.67 added

    Function Illustrate

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
     

    Change Records

    v1.0.67 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.0 modified

    合并到 ModifierConditions

    Function Illustrate

    设置 Constructor 标识符筛选条件。

    可不设置筛选条件,默认模糊查找并取第一个匹配的 Constructor

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    emptyParam - method

    fun emptyParam(): IndexTypeCondition
     

    Change Records

    v1.0.75 added

    Function Illustrate

    设置 Constructor 空参数、无参数。

    param - method

    fun param(vararg paramType: Any): IndexTypeCondition
    -

    Change Records

    v1.0 first

    Function Illustrate

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
    +

    Change Records

    v1.0 first

    Function Illustrate

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    param - method

    fun param(conditions: ObjectsConditions): IndexTypeCondition
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Constructor 参数条件。

    Pay Attention

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数。

    若参数个数小于零则忽略并使用 param

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(numRange: IntRange): IndexTypeCondition
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(conditions: CountConditions): IndexTypeCondition
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Constructor 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    @@ -114,6 +115,6 @@
     

    Change Records

    v1.0.2 added

    v1.1.0 modified

    新增 constructor 参数

    Function Illustrate

    Constructor 实例处理类。

    call - method

    fun call(vararg param: Any?): Any?
     

    Change Records

    v1.0.2 added

    Function Illustrate

    执行 Constructor 创建目标实例,不指定目标实例类型。

    newInstance - method

    fun <T> newInstance(vararg param: Any?): T?
     

    Change Records

    v1.0.2 added

    Function Illustrate

    执行 Constructor 创建目标实例 ,指定 T 目标实例类型。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html index cc48d959a..3db9997ef 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - FieldFinder - class | Yuki Hook API - + FieldFinder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    FieldFinder - class

    class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    FieldFinder - class

    class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
     

    Change Records

    v1.0 first

    v1.0.2 modified

    合并到 BaseFinder

    v1.1.0 modified

    合并到 MemberBaseFinder

    Function Illustrate

    Field 查找类。

    可通过指定类型查找指定 Field 或一组 Field

    classSet - field

    Change Records

    v1.0 first

    v1.0.2 removed

    name - field

    var name: String
     

    Change Records

    v1.0 first

    v1.0.70 modified

    允许不填写名称

    Function Illustrate

    设置 Field 名称。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    type - field

    var type: Any?
     

    Change Records

    v1.0 first

    Function Illustrate

    设置 Field 类型。

    可不填写类型。

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
    @@ -35,7 +35,8 @@
     

    Change Records

    v1.0.70 added

    Function Illustrate

    顺序筛选字节码的下标。

    name - method

    fun name(value: String): IndexTypeCondition
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Field 名称。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    name - method

    fun name(conditions: NameConditions): IndexTypeCondition
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    合并到 NameConditions

    Function Illustrate

    设置 Field 名称条件。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    type - method

    fun type(value: Any): IndexTypeCondition
    -

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Field 类型。

    Pay Attention

    可不填写类型。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    +

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Field 类型。

    可不填写类型。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    type - method

    fun type(conditions: ObjectConditions): IndexTypeCondition
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Field 类型条件。

    可不填写类型。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    设置在 classSet 的所有父类中查找当前 Field

    Notice

    若当前 classSet 的父类较多可能会耗时,API 会自动循环到父类继承是 Any 前的最后一个类。

    RemedyPlan - class

    inner class RemedyPlan internal constructor()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    Field 重查找实现类,可累计失败次数直到查找成功。

    field - method

    inline fun field(initiate: FieldConditions): Result
     

    Change Records

    v1.1.0 added

    Function Illustrate

    创建需要重新查找的 Field

    你可以添加多个备选 Field,直到成功为止,若最后依然失败,将停止查找并输出错误日志。

    Result - class

    inner class Result internal constructor()
    @@ -110,6 +111,6 @@
     

    Change Records

    v1.0 first

    Function Illustrate

    设置当前 Field 实例为 true

    Pay Attention

    请确保实例对象类型为 Boolean

    setFalse - method

    fun setFalse()
     

    Change Records

    v1.0 first

    Function Illustrate

    设置当前 Field 实例为 false

    Pay Attention

    请确保实例对象类型为 Boolean

    setNull - method

    fun setNull()
     

    Change Records

    v1.0 first

    Function Illustrate

    设置当前 Field 实例为 null

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html index ed0db4a2c..0f0777744 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html @@ -22,26 +22,28 @@ document.documentElement.classList.toggle('dark', true); } - MethodFinder - class | Yuki Hook API - + MethodFinder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MethodFinder - class

    class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    MethodFinder - class

    class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
     

    Change Records

    v1.0 first

    v1.0.2 modified

    合并到 BaseFinder

    v1.1.0 modified

    合并到 MemberBaseFinder

    Function Illustrate

    Method 查找类。

    可通过指定类型查找指定 Method 或一组 Method

    name - field

    var name: String
     

    Change Records

    v1.0 first

    v1.0.70 modified

    允许不填写名称

    Function Illustrate

    设置 Method 名称。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    paramCount - field

    var paramCount: Int
     

    Change Records

    v1.0.67 added

    Function Illustrate

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    returnType - field

    var returnType: Any?
     

    Change Records

    v1.0 first

    Function Illustrate

    设置 Method 返回值,可不填写返回值。

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
     

    Change Records

    v1.0.67 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.0 modified

    合并到 ModifierConditions

    Function Illustrate

    设置 Method 标识符筛选条件。

    可不设置筛选条件。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    emptyParam - method

    fun emptyParam(): IndexTypeCondition
     

    Change Records

    v1.0.75 added

    Function Illustrate

    设置 Method 空参数、无参数。

    param - method

    fun param(vararg paramType: Any): IndexTypeCondition
    -

    Change Records

    v1.0 first

    Function Illustrate

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    order - method

    fun order(): IndexTypeCondition
    +

    Change Records

    v1.0 first

    Function Illustrate

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    param - method

    fun param(conditions: ObjectsConditions): IndexTypeCondition
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Method 参数条件。

    Pay Attention

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    order - method

    fun order(): IndexTypeCondition
     

    Change Records

    v1.0.70 added

    Function Illustrate

    顺序筛选字节码的下标。

    name - method

    fun name(value: String): IndexTypeCondition
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Method 名称。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    name - method

    fun name(conditions: NameConditions): IndexTypeCondition
     

    Change Records

    v1.0.88 added

    v1.1.0 modified

    合并到 NameConditions

    Function Illustrate

    设置 Method 名称条件。

    Pay Attention

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
     

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数。

    若参数个数小于零则忽略并使用 param

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(numRange: IntRange): IndexTypeCondition
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(conditions: CountConditions): IndexTypeCondition
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    returnType - method

    fun returnType(value: Any): IndexTypeCondition
    -

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Method 返回值。

    可不填写返回值。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    +

    Change Records

    v1.0.70 added

    Function Illustrate

    设置 Method 返回值。

    可不填写返回值。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    returnType - method

    fun returnType(conditions: ObjectConditions): IndexTypeCondition
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    设置 Method 返回值条件。

    可不填写返回值。

    Pay Attention

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    设置在 classSet 的所有父类中查找当前 Method

    Notice

    若当前 classSet 的父类较多可能会耗时,API 会自动循环到父类继承是 Any 前的最后一个类。

    RemedyPlan - class

    inner class RemedyPlan internal constructor()
     

    Change Records

    v1.0 first

    Function Illustrate

    Method 重查找实现类,可累计失败次数直到查找成功。

    method - method

    inline fun method(initiate: MethodConditions): Result
     

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    创建需要重新查找的 Method

    你可以添加多个备选 Method,直到成功为止,若最后依然失败,将停止查找并输出错误日志。

    Result - class

    inner class Result internal constructor()
    @@ -129,6 +131,6 @@
     

    Change Records

    v1.0.65 added

    v1.0.68 modified

    修改 callBooleanboolean

    Function Illustrate

    执行 Method,指定 Boolean 返回值类型。

    array - method

    inline fun <reified T> array(vararg param: Any?): Array<T>
     

    Change Records

    v1.0.68 added

    Function Illustrate

    执行 Method,指定 Array 返回值类型。

    list - method

    inline fun <reified T> list(vararg param: Any?): List<T>
     

    Change Records

    v1.0.68 added

    Function Illustrate

    执行 Method,指定 List 返回值类型。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html index f97a1c438..5a308479b 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - YukiBaseHooker - class | Yuki Hook API - + YukiBaseHooker - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
     

    Change Records

    v1.0 first

    Function Illustrate

    YukiHookAPI 的子类 Hooker 实现。

    onHook - method

    fun onHook()
     

    Change Records

    v1.0 first

    Function Illustrate

    子类 Hook 开始。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html index 6e1250dc2..adcb174b2 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ReflectionFactory - kt | Yuki Hook API - + ReflectionFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ReflectionFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是自定义 MemberClass 相关功能的查找匹配以及 invoke 的封装类。

    MembersType - class

    enum class MembersType
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ReflectionFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是自定义 MemberClass 相关功能的查找匹配以及 invoke 的封装类。

    MembersType - class

    enum class MembersType
     

    Change Records

    v1.1.0 added

    Function Illustrate

    定义一个 Class 中的 Member 类型

    ALL - enum

    ALL
     

    Change Records

    v1.1.0 added

    Function Illustrate

    全部 MethodConstructor

    METHOD - enum

    METHOD
     

    Change Records

    v1.1.0 added

    Function Illustrate

    全部 Method

    CONSTRUCTOR - enum

    CONSTRUCTOR
    @@ -51,13 +51,62 @@
         }
     }
     

    hookClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    HookClass 相关功能不再对外开放

    normalClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    HookClass 相关功能不再对外开放

    hasClass - field

    Change Records

    v1.0 first

    v1.1.0 removed

    请直接使用 hasClass() 无参方法

    Class.hasExtends - ext-field

    val Class<*>.hasExtends: Boolean
    -

    Change Records

    v1.0.80 added

    Function Illustrate

    当前 Class 是否有继承关系,父类是 Any 将被认为没有继承关系。

    classOf - method

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转到 toClass(...) 方法

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过字符串类名转换为 loader 中的实体类。

    Function Example

    你可以直接填写你要查找的目标 Class,必须在默认 ClassLoader 下存在。

    The following example

    "com.example.demo.DemoClass".toClass()
    +

    Change Records

    v1.0.80 added

    Function Illustrate

    当前 Class 是否有继承关系,父类是 Any 将被认为没有继承关系。

    Class?.extends - ext-method

    infix fun Class<*>?.extends(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    当前 Class 是否继承于 other

    如果当前 Class 就是 other 也会返回 true

    如果当前 Classnullothernull 会返回 false

    Function Example

    你可以使用此方法来判断两个 Class 是否存在继承关系。

    The following example

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否继承于 B
    +if (classA extends classB) {
    +    // Your code here.
    +}
    +

    Class?.notExtends - ext-method

    infix fun Class<*>?.notExtends(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    当前 Class 是否不继承于 other

    此方法相当于 extends 的反向判断。

    Function Example

    你可以使用此方法来判断两个 Class 是否不存在继承关系。

    The following example

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否不继承于 B
    +if (classA notExtends classB) {
    +    // Your code here.
    +}
    +

    Class?.implements - ext-method

    infix fun Class<*>?.implements(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    当前 Class 是否实现了 other 接口类。

    如果当前 Classnullothernull 会返回 false

    Function Example

    你可以使用此方法来判断两个 Class 是否存在依赖关系。

    The following example

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否实现了 B 接口类
    +if (classA implements classB) {
    +    // Your code here.
    +}
    +

    Class?.notImplements - ext-method

    infix fun Class<*>?.notImplements(other: Class<*>?): Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    当前 Class 是否未实现 other 接口类。

    此方法相当于 implements 的反向判断。

    Function Example

    你可以使用此方法来判断两个 Class 是否不存在依赖关系。

    The following example

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否未实现 B 接口类
    +if (classA notImplements classB) {
    +    // Your code here.
    +}
    +

    Class.toJavaPrimitiveType - ext-method

    fun Class<*>.toJavaPrimitiveType(): Class<*>
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    自动转换当前 Class 为 Java 原始类型 (Primitive Type)。

    如果当前 Class 为 Java 或 Kotlin 基本类型将自动执行类型转换。

    当前能够自动转换的基本类型如下。

    • kotlin.Unit
    • java.lang.Void
    • java.lang.Boolean
    • java.lang.Integer
    • java.lang.Float
    • java.lang.Double
    • java.lang.Long
    • java.lang.Short
    • java.lang.Character
    • java.lang.Byte

    classOf - method

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转到 toClass(...) 方法

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    Function Illustrate

    通过字符串类名转换为 loader 中的实体类。

    Function Example

    你可以直接填写你要查找的目标 Class,必须在默认 ClassLoader 下存在。

    The following example

    "com.example.demo.DemoClass".toClass()
     

    你还可以自定义 Class 所在的 ClassLoader

    The following example

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过字符串类名转换为 loader 中的实体类。

    找不到 Class 会返回 null,不会抛出异常。

    Function Example

    用法请参考 String.toClass 方法。

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过 T 得到其 Class 实例并转换为实体类。

    Function Example

    我们要获取一个 ClassKotlin 下不通过反射时应该这样做。

    The following example

    DemoClass::class.java
    +

    你还可以指定 Class 的目标类型。

    The following example

    // 指定的 DemoClass 必须存在或为可访问的 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    你还可以设置在获取到这个 Class 时是否自动执行其默认的静态方法块,默认情况下不会执行。

    The following example

    // 获取并执行 DemoClass 默认的静态方法块
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    默认的静态方法块在 Java 中使用如下方式定义。

    The following example

    public class DemoClass {
    +
    +    static {
    +        // 这里是静态方法块的内容
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    Function Illustrate

    通过字符串类名转换为 loader 中的实体类。

    找不到 Class 会返回 null,不会抛出异常。

    Function Example

    用法请参考 String.toClass 方法。

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    将返回类型由 Class<*> cast 为 Class<T>

    新增 initialize 参数

    Function Illustrate

    通过 T 得到其 Class 实例并转换为实体类。

    Function Example

    我们要获取一个 ClassKotlin 下不通过反射时应该这样做。

    The following example

    DemoClass::class.java
     

    现在,你可以直接 cast 一个实例并获取它的 Class 对象,必须在当前 ClassLoader 下存在。

    The following example

    classOf<DemoClass>()
     

    若目标存在的 Classstub,通过这种方式,你还可以自定义 Class 所在的 ClassLoader

    The following example

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     classOf<DemoClass>(customClassLoader)
    @@ -83,10 +132,10 @@
     
    inline fun <reified T : Any> T.current(ignored: Boolean, initiate: CurrentClass.() -> Unit): T
     

    Change Records

    v1.0.70 added

    v1.1.0 added

    新增 ignored 参数,可以忽略在 CurrentClass 中出现的异常

    新增不使用 current { ... } 调用域直接使用 current() 得到实例的类操作对象

    Function Illustrate

    获得当前实例的类操作对象。

    Class.buildOfAny - ext-method

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.0 deprecated

    请转移到 buildOf 方法

    Class.buildOf - ext-method

    inline fun Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): Any?
     
    inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): T?
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.0 modified

    加入无泛型方法 buildOf

    Function Illustrate

    通过构造方法创建新实例,指定类型 T 或任意类型 Any

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(result: (index: Int, method: Method) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    遍历当前类中的所有方法。

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(result: (index: Int, constructor: Constructor<*>) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    遍历当前类中的所有构造方法。

    Class.allFields - ext-method

    inline fun Class<*>.allFields(result: (index: Int, field: Field) -> Unit)
    -

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    遍历当前类中的所有变量。

    - +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.0 modified

    加入无泛型方法 buildOf

    Function Illustrate

    通过构造方法创建新实例,指定类型 T 或任意类型 Any

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.5 modified

    新增 isAccessible 参数

    Function Illustrate

    遍历当前类中的所有方法。

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.5 modified

    新增 isAccessible 参数

    Function Illustrate

    遍历当前类中的所有构造方法。

    Class.allFields - ext-method

    inline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
    +

    Change Records

    v1.0.70 added

    v1.0.80 modified

    将方法体进行 inline

    v1.1.5 modified

    新增 isAccessible 参数

    Function Illustrate

    遍历当前类中的所有变量。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html index cabe68eba..6d3d0702d 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookFactory - kt | Yuki Hook API - + YukiHookFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookFactory - kt

    Change Records

    v1.0 first

    v1.0.80 modified

    合并到 IYukiHookXposedInit,将方法体进行 inline

    Function Illustrate

    这是 YukiHookAPI 相关 lambda 方法的封装类以及部分 API 用法。

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookFactory - kt

    Change Records

    v1.0 first

    v1.0.80 modified

    合并到 IYukiHookXposedInit,将方法体进行 inline

    Function Illustrate

    这是 YukiHookAPI 相关 lambda 方法的封装类以及部分 API 用法。

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
     

    Change Records

    v1.0.1 added

    v1.0.80 modified

    合并到 IYukiHookXposedInit

    Function Illustrate

    IYukiHookXposedInit 中配置 Configs

    IYukiHookXposedInit.encase - ext-method

    fun IYukiHookXposedInit.encase(initiate: PackageParam.() -> Unit)
     
    fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
     

    Change Records

    v1.0 first

    v1.0.80 modified

    合并到 IYukiHookXposedInit

    Function Illustrate

    IYukiHookXposedInit 中调用 YukiHookAPI

    Context.modulePrefs - ext-field

    val Context.modulePrefs: YukiHookModulePrefs
    @@ -37,8 +37,8 @@
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前进程名称。

    Context+Resources.injectModuleAppResources - ext-method

    fun Context.injectModuleAppResources()
     
    fun Resources.injectModuleAppResources()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    向 Hook APP (宿主) ContextResources 注入当前 Xposed 模块的资源。

    注入成功后,你就可以直接使用例如 ImageView.setImageResourceResources.getString 装载当前 Xposed 模块的资源 ID。

    注入的资源作用域仅限当前 ContextResources,你需要在每个用到宿主 ContextResources 的地方重复调用此方法进行注入才能使用。

    Pay Attention

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    Context.registerModuleAppActivities - ext-method

    fun Context.registerModuleAppActivities(proxy: Any?)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    向 Hook APP (宿主) 注册当前 Xposed 模块的 Activity

    注册成功后,你就可以直接使用 Context.startActivity 来启动未在宿主中注册的 Activity

    使用此方法会在未注册的 Activity 在 Hook APP (宿主) 中启动时自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    你要将需要在宿主启动的 Activity 继承于 ModuleAppActivityModuleAppCompatActivity

    Pay Attention

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    加入最低 API 版本限制

    Function Illustrate

    向 Hook APP (宿主) 注册当前 Xposed 模块的 Activity

    注册成功后,你就可以直接使用 Context.startActivity 来启动未在宿主中注册的 Activity

    使用此方法会在未注册的 Activity 在 Hook APP (宿主) 中启动时自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    你要将需要在宿主启动的 Activity 继承于 ModuleAppActivityModuleAppCompatActivity

    Pay Attention

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    最低支持 Android 7.0 (API 24)。

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
     

    Change Records

    v1.1.0 added

    Function Illustrate

    生成一个 ContextThemeWrapper 代理以应用当前 Xposed 模块的主题资源。

    在 Hook APP (宿主) 中使用此方法会自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    如果在 Hook APP (宿主) 中使用此方法发生 ClassCastException,请手动设置 configuration

    isSupportResourcesHook - field

    Change Records

    v1.0.80 added

    v1.0.91 removed

    请转移到 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    请转移到 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    Change Records

    v1.0.6 added

    v1.0.91 removed

    请转移到 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    Change Records

    v1.0 first

    v1.0.91 removed

    请转移到 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    Change Records

    v1.0 first

    v1.0.91 deprecated

    请转移到 YukiHookAPI.Status

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html index 060bfa9fd..b40bb32e1 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - LoggerFactory - kt | Yuki Hook API - + LoggerFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    LoggerFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是 YukiHookAPI 的日志封装类,可实现同时向 LogcatXposedBridge.log 打印日志的功能。

    LoggerType - class

    enum class LoggerType
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    LoggerFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是 YukiHookAPI 的日志封装类,可实现同时向 Logcat 和 (Xposed) 宿主环境打印日志的功能。

    LoggerType - class

    enum class LoggerType
     

    Change Records

    v1.1.0 added

    Function Illustrate

    需要打印的日志类型。

    决定于模块与 (Xposed) 宿主环境使用的打印方式。

    LOGD - enum

    LOGD
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    仅使用 android.util.Log

    XPOSEDBRIDGE - enum

    XPOSEDBRIDGE
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    仅使用 XposedBridge.log

    Pay Attention

    只能在 (Xposed) 宿主环境中使用,模块环境将不生效。

    SCOPE - enum

    SCOPE
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    分区使用。

    (Xposed) 宿主环境仅使用 XPOSEDBRIDGE

    模块环境仅使用 LOGD

    BOTH - enum

    BOTH
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    同时使用。

    (Xposed) 宿主环境使用 LOGDXPOSEDBRIDGE

    模块环境仅使用 LOGD

    YukiLoggerData - class

    data class YukiLoggerData internal constructor(
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    仅使用 android.util.Log

    XPOSEDBRIDGE - enum

    Change Records

    v1.1.0 added

    v1.1.5 deprecated

    请转移到 XPOSED_ENVIRONMENT

    XPOSED_ENVIRONMENT - enum

    XPOSED_ENVIRONMENT
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    仅在 (Xposed) 宿主环境使用。

    Pay Attention

    只能在 (Xposed) 宿主环境中使用,模块环境将不生效。

    SCOPE - enum

    SCOPE
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    分区使用。

    (Xposed) 宿主环境仅使用 XPOSED_ENVIRONMENT

    模块环境仅使用 LOGD

    BOTH - enum

    BOTH
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    同时使用。

    (Xposed) 宿主环境使用 LOGDXPOSED_ENVIRONMENT

    模块环境仅使用 LOGD

    YukiLoggerData - class

    data class YukiLoggerData internal constructor(
         var timestamp: Long,
         var time: String,
         var tag: String,
    @@ -45,9 +45,10 @@
     

    Change Records

    v1.1.2 added

    v1.1.4 modified

    实现 Serializable 接口并标识为 data class

    Function Illustrate

    调试日志数据实现类。

    YukiHookLogger - object

    object YukiHookLogger
     

    Change Records

    v1.1.0 added

    Function Illustrate

    调试日志实现类。

    inMemoryData - field

    val inMemoryData: ArrayList<YukiLoggerData>
     

    Change Records

    v1.1.2 added

    v1.1.4 modified

    类型由 HashSet 修改为 ArrayList

    Function Illustrate

    当前全部已记录的日志数据。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    contents - field

    val contents: String
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前日志文件内容。

    如果当前没有已记录的日志会返回空字符串。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    clear - method

    fun clear()
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    清除全部已记录的日志。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    你也可以直接获取 inMemoryData 来清除。

    saveToFile - method

    fun saveToFile(fileName: String)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    保存当前日志到文件。

    若当前未开启 Configs.isRecord 或记录为空则不会进行任何操作。

    日志文件会追加到 fileName 的文件结尾,若文件不存在会自动创建。

    Pay Attention

    文件读写权限取决于当前宿主、模块已获取的权限。

    Configs - object

    object Configs
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前日志文件内容。

    如果当前没有已记录的日志会返回空字符串。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    contents - method

    fun contents(data: ArrayList<YukiLoggerData>): String
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取、格式化当前日志文件内容。

    如果当前没有已记录的日志 (data 为空) 会返回空字符串。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    clear - method

    fun clear()
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    清除全部已记录的日志。

    Pay Attention

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    你也可以直接获取 inMemoryData 来清除。

    saveToFile - method

    fun saveToFile(fileName: String, data: ArrayList<YukiLoggerData>)
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增 data 参数

    Function Illustrate

    保存当前日志到文件。

    若当前未开启 Configs.isRecord 或记录为空则不会进行任何操作。

    日志文件会追加到 fileName 的文件结尾,若文件不存在会自动创建。

    Pay Attention

    文件读写权限取决于当前宿主、模块已获取的权限。

    Configs - object

    object Configs
     

    Change Records

    v1.1.0 added

    Function Illustrate

    配置 YukiHookLogger

    TAG - field

    const val TAG: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    标签。

    PRIORITY - field

    const val PRIORITY: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    优先级。

    PACKAGE_NAME - field

    const val PACKAGE_NAME: Int
    @@ -56,15 +57,15 @@
     

    Change Records

    v1.1.0 added

    Function Illustrate

    是否启用调试日志的输出功能。

    关闭后将会停用 YukiHookAPI 对全部日志的输出。

    但是不影响当你手动调用下面这些方法输出日志。

    loggerDloggerIloggerWloggerE

    isEnable 关闭后 YukiHookAPI.Configs.isDebug 也将同时关闭。

    isRecord - field

    var isRecord: Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    是否启用调试日志的记录功能。

    开启后将会在内存中记录全部可用的日志和异常堆栈。

    需要同时启用 isEnable 才能有效。

    Pay Attention

    过量的日志可能会导致宿主运行缓慢或造成频繁 GC。

    开启后你可以调用 YukiHookLogger.saveToFile 实时保存日志到文件或使用 YukiHookLogger.contents 获取实时日志文件。

    tag - field

    var tag: String
     

    Change Records

    v1.1.0 added

    Function Illustrate

    这是一个调试日志的全局标识。

    默认文案为 YukiHookAPI

    你可以修改为你自己的文案。

    elements - method

    fun elements(vararg item: Int)
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    自定义调试日志对外显示的元素。

    只对日志记录和 XposedBridge.log 生效。

    日志元素的排列将按照你在 item 中设置的顺序进行显示。

    你还可以留空 item 以不显示除日志内容外的全部元素。

    可用的元素有:TAGPRIORITYPACKAGE_NAMEUSER_ID

    Function Example

    打印的日志样式将按照你设置的排列顺序和元素内容进行。

    The following example

    elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    自定义调试日志对外显示的元素。

    只对日志记录和 (Xposed) 宿主环境的日志生效。

    日志元素的排列将按照你在 item 中设置的顺序进行显示。

    你还可以留空 item 以不显示除日志内容外的全部元素。

    可用的元素有:TAGPRIORITYPACKAGE_NAMEUSER_ID

    Function Example

    打印的日志样式将按照你设置的排列顺序和元素内容进行。

    The following example

    elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
     

    以上内容定义的日志将显示为如下样式。

    The following example

    [YukiHookAPI][D][com.demo.test][999]--> This is a log
     

    如果我们调整元素顺序以及减少个数,那么结果又会不一样。

    The following example

    elements(PACKAGE_NAME, USER_ID, PRIORITY)
     

    以上内容定义的日志将显示为如下样式。

    The following example

    [com.demo.test][999][D]--> This is a log
     

    loggerD - method

    fun loggerD(tag: String, msg: String, type: LoggerType)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    LogcatXposedBridge 打印日志,级别 D

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerI - method

    fun loggerI(tag: String, msg: String, type: LoggerType)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    LogcatXposedBridge 打印日志,级别 I

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerW - method

    fun loggerW(tag: String, msg: String, type: LoggerType)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    LogcatXposedBridge 打印日志,级别 W

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerE - method

    fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    LogcatXposedBridge 打印日志,级别 E,可携带 e 异常信息,将打印异常堆栈。

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    - +

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    Logcat 和 (Xposed) 宿主环境打印日志,级别 D

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerI - method

    fun loggerI(tag: String, msg: String, type: LoggerType)
    +

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    Logcat 和 (Xposed) 宿主环境打印日志,级别 I

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerW - method

    fun loggerW(tag: String, msg: String, type: LoggerType)
    +

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    Logcat 和 (Xposed) 宿主环境打印日志,级别 W

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerE - method

    fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
    +

    Change Records

    v1.0 first

    v1.1.0 modified

    新增 type 参数

    Function Illustrate

    Logcat 和 (Xposed) 宿主环境打印日志,级别 E,可携带 e 异常信息,将打印异常堆栈。

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html index 76d14bb6a..935f17438 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html @@ -22,20 +22,25 @@ document.documentElement.classList.toggle('dark', true); } - HookParam - class | Yuki Hook API - + HookParam - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookParam - class

    class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?)
    -

    Change Records

    v1.0 first

    v1.1.0 modified

    移动 HookParamWrapperYukiHookCallback.Param

    修正拼写错误的 creater 命名到 creator

    Function Illustrate

    Hook 方法、构造方法的目标对象实现类。

    args - field

    val args: Array<Any?>
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    HookParam - class

    class HookParam internal constructor(
    +    private val creatorInstance: YukiMemberHookCreator,
    +    private var paramId: String,
    +    private var param: YukiHookCallback.Param?
    +)
    +

    Change Records

    v1.0 first

    v1.1.0 modified

    移动 HookParamWrapperYukiHookCallback.Param

    修正拼写错误的 creater 命名到 creator

    v1.1.5 modified

    新增 paramId 参数

    Function Illustrate

    Hook 方法、构造方法的目标对象实现类。

    args - field

    val args: Array<Any?>
     

    Change Records

    v1.0 添加

    Function Illustrate

    获取当前 Hook 对象 memberconstructor 的参数对象数组。

    这里的数组每项类型默认为 Any,你可以使用 args 方法来实现 ArgsModifyer.cast 功能。

    firstArgs - field

    Change Records

    v1.0 first

    v1.0.75 removed

    请使用 args(index = 0)args().first()

    lastArgs - field

    Change Records

    v1.0 first

    v1.0.75 removed

    请使用 args().last()

    instance - field

    val instance: Any
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook 实例的对象。

    Pay Attention

    如果你当前 Hook 的对象是一个静态,那么它将不存在实例的对象。

    instanceClass - field

    val instanceClass: Class<*>
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook 实例的类对象。

    member - field

    val member: Member
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前 Hook 对象的 Member

    在不确定 Member 类型为 MethodConstructor 时可以使用此方法。

    method - field

    val method: Method
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook 对象的方法。

    constructor - field

    val constructor: Constructor
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook 对象的构造方法。

    result - field

    var result: Any?
    -

    Change Records

    v1.0 first

    Function Illustrate

    获取、设置当前 Hook 对象的 methodconstructor 的返回值。

    hasThrowable - field

    val hasThrowable: Boolean
    +

    Change Records

    v1.0 first

    Function Illustrate

    获取、设置当前 Hook 对象的 methodconstructor 的返回值。

    dataExtra - field

    val dataExtra: Bundle
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前回调方法体范围内的数据存储实例。

    hasThrowable - field

    val hasThrowable: Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    判断是否存在设置过的方法调用抛出异常。

    throwable - field

    val throwable: Throwable?
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获取设置的方法调用抛出异常。

    Throwable.throwToApp - i-ext-method

    fun Throwable.throwToApp()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    向 Hook APP 抛出异常。

    使用 hasThrowable 判断当前是否存在被抛出的异常。

    使用 throwable 获取当前设置的方法调用抛出异常。

    仅会在回调方法的 MemberHookCreator.beforeHookMemberHookCreator.afterHook 中生效。

    Pay Attention

    设置后会同时执行 resultNull 方法并将异常抛出给当前 Hook APP。

    Function Example

    Hook 过程中的异常仅会作用于 (Xposed) 宿主环境,目标 Hook APP 不会受到影响。

    若想将异常抛给 Hook APP,可以直接使用如下方法。

    The following example

    injectMember {
    @@ -62,8 +67,8 @@
     

    Change Records

    v1.1.0 added

    Function Illustrate

    执行原始 Member

    调用自身未进行 Hook 的原始 Member 并调用原始参数执行。

    功能实例

    此方法可以 invoke 原始未经 Hook 的 Member 对象,取决于原始 Member 的参数。

    调用自身原始的方法不会再经过当前 beforeHookafterHook 以及 replaceUnitreplaceAny

    比如我们 Hook 的这个方法被这样调用 test("test value"),使用此方法会调用其中的 "test value" 作为参数。

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    -        returnType = StringType
    +        param(StringClass)
    +        returnType = StringClass
         }
         afterHook {
             // <方案1> 不使用泛型,不获取方法执行结果,调用将使用原方法传入的 args 自动传参
    @@ -78,8 +83,8 @@
     

    Change Records

    v1.0 first

    v1.1.0 modified

    不再需要使用 member.invokeOriginal 进行调用

    Function Illustrate

    执行原始 Member

    调用自身未进行 Hook 的原始 Member 并自定义 args 执行。

    功能实例

    此方法可以 invoke 原始未经 Hook 的 Member 对象,可自定义需要调用的参数内容。

    调用自身原始的方法不会再经过当前 beforeHookafterHook 以及 replaceUnitreplaceAny

    比如我们 Hook 的这个方法被这样调用 test("test value"),使用此方法可自定义其中的 args 作为参数。

    The following example

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    -        returnType = StringType
    +        param(StringClass)
    +        returnType = StringClass
         }
         afterHook {
             // <方案1> 不使用泛型,不获取方法执行结果
    @@ -113,6 +118,6 @@
     

    Change Records

    v1.0 first

    Function Illustrate

    设置方法参数的实例对象为 null

    setTrue - method

    fun setTrue()
     

    Change Records

    v1.0 first

    Function Illustrate

    设置方法参数的实例对象为 true

    Pay Attention

    请确保目标对象的类型是 Boolean

    setFalse - method

    fun setFalse()
     

    Change Records

    v1.0 first

    Function Illustrate

    设置方法参数的实例对象为 false

    Pay Attention

    请确保目标对象的类型是 Boolean

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html index 435df9a96..d3d2eeed2 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - PackageParam - class | Yuki Hook API - + PackageParam - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    -

    Change Records

    v1.0 first

    Function Illustrate

    装载 Hook 的目标 APP 入口对象实现类。

    appClassLoader - field

    val appClassLoader:ClassLoader
    -

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook APP 的 ClassLoader

    appInfo - field

    val appInfo: ApplicationInfo
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    +

    Change Records

    v1.0 first

    Function Illustrate

    装载 Hook 的目标 APP 入口对象实现类。

    appClassLoader - field

    var appClassLoader:ClassLoader
    +

    Change Records

    v1.0 first

    v1.1.5 modified

    可以动态修改此变量的值

    Function Illustrate

    获取、设置当前 Hook APP 的 ClassLoader

    你可以在这里手动设置当前 Hook APP 的 ClassLoader,默认情况下会自动获取。

    Pay Attention

    如果设置了错误或无效的 ClassLoader 会造成功能异常,请谨慎操作。

    appInfo - field

    val appInfo: ApplicationInfo
     

    Change Records

    v1.0 first

    Function Illustrate

    获取当前 Hook APP 的 ApplicationInfo

    appUserId - field

    val appUserId: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    获取当前 Hook APP 的用户 ID。

    机主为 0,应用双开 (分身) 或工作资料因系统环境不同 ID 也各不相同。

    appContext - field

    val appContext: Application?
     

    Change Records

    v1.0.72 added

    v1.1.0 modified

    加入可空类型 (空安全)

    Function Illustrate

    获取当前 Hook APP 的 Application

    Pay Attention

    首次装载可能是空的,请延迟一段时间再获取或使用 onAppLifecycle 监听来完成。

    appResources - field

    val appResources:Resources?
    @@ -45,12 +45,15 @@
     

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    Function Illustrate

    获得当前使用的存取数据对象缓存实例。

    你可以通过 name 来自定义 Sp 存储的名称。

    Pay Attention

    作为 Hook API 装载时无法使用,会抛出异常。

    dataChannel - field

    val dataChannel: YukiHookDataChannel.NameSpace
     

    Change Records

    v1.0.88 added

    Function Illustrate

    获得当前使用的数据通讯桥命名空间对象。

    Pay Attention

    作为 Hook API 装载时无法使用,会抛出异常。

    resources - method

    fun resources(): HookResources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    获得当前 Hook APP 的 YukiResources 对象。

    请调用 HookResources.hook 方法开始 Hook。

    refreshModuleAppResources - method

    fun refreshModuleAppResources()
    -

    Change Records

    v1.0.87 added

    Function Illustrate

    刷新当前 Xposed 模块自身 Resources

    onAppLifecycle - method

    inline fun onAppLifecycle(initiate: AppLifecycle.() -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 生命周期装载事件。

    Notice

    loadZygote 中不会被装载,仅会在 loadSystemloadApp 中装载。

    作为 Hook API 装载时请使用原生的 Application 实现生命周期监听。

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
    +

    Change Records

    v1.0.87 added

    Function Illustrate

    刷新当前 Xposed 模块自身 Resources

    onAppLifecycle - method

    inline fun onAppLifecycle(isOnFailureThrowToApp: Boolean, initiate: AppLifecycle.() -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    新增 isOnFailureThrowToApp 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主

    Function Illustrate

    监听当前 Hook APP 生命周期装载事件。

    Notice

    loadZygote 中不会被装载,仅会在 loadSystemloadApp 中装载。

    作为 Hook API 装载时请使用原生的 Application 实现生命周期监听。

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, hooker: YukiBaseHooker)
     
    inline fun loadApp(vararg name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, vararg hooker: YukiBaseHooker)
    -

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    v1.1.4 modified

    新增两个方法,可以同时装载多个 APP 与子 Hooker

    Function Illustrate

    装载并 Hook 指定包名的 APP。

    name 为 APP 的包名,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    装载并 Hook 指定、全部包名的 APP。

    若要装载 APP Zygote 事件,请使用 loadZygote

    若要 Hook 系统框架,请使用 loadSystem

    Function Example

    你可以使用 loadApplambda 方法体形式或直接装载一个 Hooker。

    The following example

    // 使用 lambda
    +
    inline fun loadApp(isExcludeSelf: Boolean, initiate: PackageParam.() -> Unit)
    +
    fun loadApp(isExcludeSelf: Boolean, hooker: YukiBaseHooker)
    +
    fun loadApp(isExcludeSelf: Boolean, vararg hooker: YukiBaseHooker)
    +

    Change Records

    v1.0 first

    v1.0.80 modified

    将方法体进行 inline

    v1.1.4 modified

    新增两个方法,可以同时装载多个 APP 与子 Hooker

    v1.1.5 modified

    新增三个方法,可以使用参数 isExcludeSelf 排除模块自身

    Function Illustrate

    装载并 Hook 指定、全部包名的 APP。

    name 为 APP 的包名,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    装载并 Hook 指定、全部包名的 APP。

    若要装载 APP Zygote 事件,请使用 loadZygote

    若要 Hook 系统框架,请使用 loadSystem

    Function Example

    你可以使用 loadApplambda 方法体形式或直接装载一个 Hooker。

    The following example

    // 使用 lambda
     loadApp(name = "com.example.test") {
         // Your code here.
     }
    @@ -62,6 +65,12 @@
     }
     // 使用 Hooker
     loadApp(hooker = CustomHooker)
    +

    若要在全部可被 Hook 的 APP 中过滤掉模块自身,你只需加入 isExcludeSelf = true

    示例如下

    // 使用 lambda
    +loadApp(isExcludeSelf = true) {
    +    // Your code here.
    +}
    +// 使用 Hooker
    +loadApp(isExcludeSelf = true, hooker = CustomHooker)
     

    若想要同时装载多个需要 Hook 的 APP,可以直接使用如下方式。

    The following example

    // 同时装载多个需要 Hook 的 APP
     loadApp("com.example.test", "com.example.next") {
         // Your code here.
    @@ -80,17 +89,33 @@
     
    fun withProcess(name: String, vararg hooker: YukiBaseHooker)
     

    Change Records

    v1.0.70 added

    v1.1.4 modified

    新增两个方法,可以同时装载多个进程与子 Hooker

    Function Illustrate

    装载并 Hook APP 的指定进程。

    name 为 APP 的进程名称,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    loadHooker - method

    fun loadHooker(hooker: YukiBaseHooker)
     

    Change Records

    v1.0 first

    Function Illustrate

    装载 Hook 子类。

    你可以填入 hooker 在 Hooker 中继续装载 Hooker。

    searchClass - method

    inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过 appClassLoader 按指定条件查找并得到当前 Hook APP Dex 中的 Class

    Pay Attention

    此方法在 Class 数量过多及查找条件复杂时会非常耗时。

    建议启用 async 或设置 name 参数,name 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。

    此功能尚在试验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。

    String+VariousClass.clazz - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转移到 toClass(...) 方法

    String.hasClass - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转移到 hasClass(...) 方法

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -
    fun VariousClass.toClass(loader: ClassLoader?): Class<*>
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    Function Example

    你可以轻松地将 String 类型的 Class 包名转为 Class 实例。

    The following example

    "com.example.demo.DemoClass".toClass()
    +

    Change Records

    v1.1.0 added

    Function Illustrate

    通过 appClassLoader 按指定条件查找并得到当前 Hook APP Dex 中的 Class

    Pay Attention

    此方法在 Class 数量过多及查找条件复杂时会非常耗时。

    建议启用 async 或设置 name 参数,name 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。

    此功能尚在试验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。

    String+VariousClass.clazz - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转移到 toClass(...) 方法

    String.hasClass - i-ext-field

    Change Records

    v1.0 first

    v1.1.0 deprecated

    请转移到 hasClass(...) 方法

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +
    fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    Function Illustrate

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    Function Example

    你可以轻松地将 String 类型的 Class 包名转为 Class 实例。

    The following example

    "com.example.demo.DemoClass".toClass()
     

    你还可以向 loader 参数传入你自定义的 ClassLoader

    The following example

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    你还可以创建一个 VariousClass,并转换为实体类。

    VariousClass 会枚举所有设置的 Class 并最终获得第一个存在的 Class

    The following example

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
    +

    你还可以指定 Class 的目标类型。

    The following example

    // 指定的 DemoClass 必须存在或为可访问的 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    你还可以设置在获取到这个 Class 时是否自动执行其默认的静态方法块,默认情况下不会执行。

    The following example

    // 获取并执行 DemoClass 默认的静态方法块
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    默认的静态方法块在 Java 中使用如下方式定义。

    The following example

    public class DemoClass {
    +
    +    static {
    +        // 这里是静态方法块的内容
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    你还可以创建一个 VariousClass,并转换为实体类。

    VariousClass 会枚举所有设置的 Class 并最终获得第一个存在的 Class

    The following example

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
     

    同样地,你还可以向 loader 参数传入你自定义的 ClassLoader

    The following example

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass(customClassLoader)
    -

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -
    fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    Change Records

    v1.1.0 added

    Function Illustrate

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    找不到 Class 会返回 null,不会抛出异常。

    Function Example

    用法请参考 String+VariousClass.toClass 方法。

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
    +

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +
    fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +

    Change Records

    v1.1.0 added

    v1.1.5 modified

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    Function Illustrate

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    找不到 Class 会返回 null,不会抛出异常。

    Function Example

    用法请参考 String+VariousClass.toClass 方法。

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
     

    Change Records

    v1.1.0 added

    Function Illustrate

    通过字符串类名查找是否存在。

    默认使用当前 appClassLoader 装载目标 Class

    Function Example

    你可以轻松的使用此方法判断字符串中的类是否存在。

    The following example

    if("com.example.demo.DemoClass".hasClass()) {
         // Your code here.
     }
    @@ -134,8 +159,8 @@
     

    Change Records

    v1.0.80 added

    Function Illustrate

    Hook APP 的 Resources。

    Pay Attention

    请注意你需要确保当前 Hook Framework 支持且 InjectYukiHookWithXposed.isUsingResourcesHook 已启用。

    Function Example

    Resources Hook 为固定用法,获取 resources 对象,然后调用 hook 方法开始 Hook。

    The following example

    resources().hook {
         // Your code here.
     }
    -

    Pay Attention

    这是固定用法,为了防止发生问题,你不可手动实现任何 HookResources 实例执行 hook 调用。

    将 Resources 的 Hook 设置为这样是为了与 findClass(...).hook 做到统一,使得调用起来逻辑不会混乱。

    AppLifecycle - class

    inner class AppLifecycle internal constructor()
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    当前 Hook APP 的生命周期实例处理类。

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
    +

    Pay Attention

    这是固定用法,为了防止发生问题,你不可手动实现任何 HookResources 实例执行 hook 调用。

    将 Resources 的 Hook 设置为这样是为了与 findClass(...).hook 做到统一,使得调用起来逻辑不会混乱。

    AppLifecycle - class

    inner class AppLifecycle internal constructor(private val isOnFailureThrowToApp: Boolean)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    新增 isOnFailureThrowToApp 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主

    Function Illustrate

    当前 Hook APP 的生命周期实例处理类。

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 装载 Application.attachBaseContext

    onCreate - method

    fun onCreate(initiate: Application.() -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 装载 Application.onCreate

    onTerminate - method

    fun onTerminate(initiate: Application.() -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 装载 Application.onTerminate

    onLowMemory - method

    fun onLowMemory(initiate: Application.() -> Unit)
    @@ -143,6 +168,6 @@
     

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 装载 Application.onTrimMemory

    onConfigurationChanged - method

    fun onConfigurationChanged(result: (self: Application, config: Configuration) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    监听当前 Hook APP 装载 Application.onConfigurationChanged

    registerReceiver - method

    fun registerReceiver(vararg action: String, result: (context: Context, intent: Intent) -> Unit)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    注册系统广播监听。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html index 8c95772b7..e3420f78a 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ComponentTypeFactory - kt | Yuki Hook API - + ComponentTypeFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ComponentTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关组件的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ComponentTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关组件的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html index 47f8d2b4e..2afee8f4a 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - GraphicsTypeFactory - kt | Yuki Hook API - + GraphicsTypeFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    GraphicsTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 GraphicsClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    GraphicsTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 GraphicsClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html index 34f961cf2..a4daebfdd 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ViewTypeFactory - kt | Yuki Hook API - + ViewTypeFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ViewTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 WidgetClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ViewTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 WidgetClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html index e21ae1d3f..f3b893f72 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - DefinedTypeFactory - kt | Yuki Hook API - + DefinedTypeFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    DefinedTypeFactory - kt

    Change Records

    v1.1.0 added

    Function Illustrate

    这是一个内部类型的定义常量类,主要用于反射 API 相关用法的延伸。

    VagueType - field

    val VagueType: Class<*>
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    DefinedTypeFactory - kt

    Change Records

    v1.1.0 added

    Function Illustrate

    这是一个内部类型的定义常量类,主要用于反射 API 相关用法的延伸。

    VagueType - field

    val VagueType: Class<*>
     

    Change Records

    v1.1.0 added

    Function Illustrate

    得到模糊类型。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html index 52cc24dd1..6c18d0e5f 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - VariableTypeFactory - kt | Yuki Hook API - + VariableTypeFactory - kt | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariableTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Java 相关基本变量类型的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    - +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    VariableTypeFactory - kt

    Change Records

    v1.0 first

    Function Illustrate

    这是一个预置 Hook 类型的常量类,主要为 Java 相关基本变量类型的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里open in new window 进行查看。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html index 54f6a9068..28ec8c1f6 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModuleApplication - class | Yuki Hook API - + ModuleApplication - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleApplication - class

    open class ModuleApplication: Application()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleApplication - class

    open class ModuleApplication: Application()
     

    Change Records

    v1.0.77 added

    Function Illustrate

    这是对使用 YukiHookAPI Xposed 模块实现中的一个扩展功能。

    在你的 Xposed 模块的 Application 中继承此类。

    或在 AndroidManifest.xmlapplication 标签中指定此类。

    目前可实现功能如下

    • 全局共享模块中静态的 appContext

    • 在模块与宿主中装载 YukiHookAPI.Config 以确保 YukiHookAPI.Configs.debugTag 不需要重复定义

    • 在模块与宿主中使用 YukiHookDataChannel 进行通讯

    • 在模块中使用系统隐藏 API,核心技术引用了开源项目 FreeReflectionopen in new window

    • 在模块中使用 YukiHookAPI.Status.isTaiChiModuleActive 判断太极、无极激活状态

    Function Example

    将此类继承到你的自定义 Application 上。

    The following example

    package com.demo
     
     class MyApplication: ModuleApplication() {
    @@ -43,7 +43,7 @@
         android:name="com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication"
         ...>
     

    appContext - field

    val appContext: ModuleApplication
    -

    Change Records

    v1.0.77 added

    Function Illustrate

    获取全局静态 Application 实例。

    - +

    Change Records

    v1.0.77 added

    Function Illustrate

    获取全局静态 Application 实例。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html index 5773c3bea..5919ec939 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - YukiModuleResources - class | Yuki Hook API - + YukiModuleResources - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    对接 XModuleResources 的中间层实例。

    fwd - method

    fun fwd(resId: Int): YukiResForwarder
     

    Change Records

    v1.0.80 added

    Function Illustrate

    对接 XModuleResources.fwd 方法。

    创建 YukiResForwarderXResForwarder 实例。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html index b72cd7872..ae9aba60c 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - YukiResForwarder - class | Yuki Hook API - + YukiResForwarder - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    对接 XResForwarder 的中间层实例。

    instance - field

    Change Records

    v1.0.80 added

    v1.1.0 deprecated

    不再对外公开 instance 参数

    id - field

    val id: Int
     

    Change Records

    v1.0.80 added

    Function Illustrate

    获得当前 APP 的 Resources Id。

    resources - field

    val resources: Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    获得当前 APP 的 Resources。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html index 93af5bc30..b300b248b 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html @@ -22,18 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - YukiResources - class | Yuki Hook API - + YukiResources - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
     

    Change Records

    v1.0.80 added

    Function Illustrate

    对接 XResources 的中间层实例。

    LayoutInflatedParam - class

    class LayoutInflatedParam(internal val baseParam: XC_LayoutInflated.LayoutInflatedParam)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    装载 Hook APP 的目标布局 Resources 实现类。

    variantName - field

    val variantName: String
     

    Change Records

    v1.0.80 added

    Function Illustrate

    获取当前被 Hook 的布局装载目录名称。

    例如:layoutlayout-landlayout-sw600dp

    currentView - field

    val currentView: View
     

    Change Records

    v1.0.80 added

    Function Illustrate

    获取当前被 Hook 的布局实例。

    findViewByIdentifier - method

    inline fun <reified T : View> View.findViewByIdentifier(name: String): T?
     
    inline fun <reified T : View> findViewByIdentifier(name: String): T?
     

    Change Records

    v1.0.80 added

    Function Illustrate

    使用 Identifier 查找 Hook APP 指定 Id 的 View

    扩展方法可以使用 Identifier 查找 Hook APP 当前装载布局中指定 Id 的 View

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html index 06a01bb7a..7b9f0f128 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - YukiXposedEvent - object | Yuki Hook API - + YukiXposedEvent - object | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiXposedEvent - object

    object YukiXposedEvent
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiXposedEvent - object

    object YukiXposedEvent
     

    Change Records

    v1.0.80 first

    Function Illustrate

    实现对原生 Xposed API 的装载事件监听。

    events - method

    inline fun events(initiate: YukiXposedEvent.() -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    YukiXposedEvent 创建一个方法体。

    onInitZygote - method

    fun onInitZygote(result: (StartupParam) -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    设置 initZygote 事件监听。

    onHandleLoadPackage - method

    fun onHandleLoadPackage(result: (LoadPackageParam) -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    设置 handleLoadPackage 事件监听。

    onHandleInitPackageResources - method

    fun onHandleInitPackageResources(result: (InitPackageResourcesParam) -> Unit)
     

    Change Records

    v1.0.80 added

    Function Illustrate

    设置 handleInitPackageResources 事件监听。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html index 96b4a5cf3..22cd1f6a1 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html @@ -22,24 +22,25 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookDataChannel - class | Yuki Hook API - + YukiHookDataChannel - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
     

    Change Records

    v1.0.88 added

    Function Illustrate

    实现 Xposed 模块的数据通讯桥。

    通过模块与宿主相互注册 BroadcastReceiver 来实现数据的交互。

    模块需要将 Application 继承于 ModuleApplication 来实现此功能。

    Pay Attention

    模块与宿主需要保持存活状态,否则无法建立通讯。

    NameSpace - class

    inner class NameSpace internal constructor(private val context: Context?, private val packageName: String, private val isSecure: Boolean)
     

    Change Records

    v1.0.88 added

    v1.0.90 modified

    新增 isSecure 参数

    Function Illustrate

    YukiHookDataChannel 命名空间。

    with - method

    inline fun with(initiate: NameSpace.() -> Unit): NameSpace
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    创建一个调用空间。

    put - method

    fun <T> put(key: String, value: T)
    +

    Change Records

    v1.0.88 added

    Function Illustrate

    创建一个调用空间。

    allowSendTooLargeData - method

    fun allowSendTooLargeData(): NameSpace
    +

    变更记录

    v1.1.5 added

    功能描述

    解除发送数据的大小限制并禁止开启分段发送功能。

    仅会在每次调用时生效,下一次没有调用此方法则此功能将被自动关闭。

    你还需要在整个调用域中声明注解 CauseProblemsApi 以消除警告。

    Pay Attention

    若你不知道允许此功能会带来何种后果,请勿使用。

    put - method

    fun <T> put(key: String, value: T)
     
    fun <T> put(data: ChannelData<T>, value: T?)
     
    fun put(vararg data: ChannelData<*>)
     

    Change Records

    v1.0.88 added

    Function Illustrate

    发送键值数据。

    put - method

    fun put(key: String)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    仅发送键值监听,使用默认值 VALUE_WAIT_FOR_LISTENER 发送键值数据。

    wait - method

    fun <T> wait(key: String, result: (value: T) -> Unit)
    -
    fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
    -

    Change Records

    v1.0.88 added

    v1.0.90 modified

    移除默认值 value

    Function Illustrate

    获取键值数据。

    wait - method

    fun wait(key: String, callback: () -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    仅获取监听结果,不获取键值数据。

    Pay Attention

    仅限使用 VALUE_WAIT_FOR_LISTENER 发送的监听才能被接收。

    checkingVersionEquals - method

    fun checkingVersionEquals(result: (Boolean) -> Unit)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    获取模块与宿主的版本是否匹配。

    通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
    -

    Change Records

    v1.1.4 added

    Function Illustrate

    获取模块与宿主之间的 ArrayList<YukiLoggerData> 数据。

    由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。

    Pay Attention

    模块与宿主必须启用 YukiHookLogger.Configs.isRecord 才能获取到调试日志数据。

    由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 TransactionTooLargeException 异常。

    - +

    Change Records

    v1.0.88 added

    Function Illustrate

    仅发送键值监听,使用默认值 VALUE_WAIT_FOR_LISTENER 发送键值数据。

    wait - method

    fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
    +
    fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.0.90 modified

    移除默认值 value

    v1.1.5 modified

    新增 priority 参数

    Function Illustrate

    获取键值数据。

    wait - method

    fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    新增 priority 参数

    Function Illustrate

    仅获取监听结果,不获取键值数据。

    Pay Attention

    仅限使用 VALUE_WAIT_FOR_LISTENER 发送的监听才能被接收。

    checkingVersionEquals - method

    fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    新增 priority 参数

    Function Illustrate

    获取模块与宿主的版本是否匹配。

    通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
    +

    Change Records

    v1.1.4 added

    v1.1.5 modified

    新增 priority 参数

    Function Illustrate

    获取模块与宿主之间的 ArrayList<YukiLoggerData> 数据。

    由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。

    Pay Attention

    模块与宿主必须启用 YukiHookLogger.Configs.isRecord 才能获取到调试日志数据。

    由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 TransactionTooLargeException 异常。

    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html index d92b26bd2..668745289 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - ChannelData - class | Yuki Hook API - + ChannelData - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ChannelData - class

    data class ChannelData<T>(var key: String, var value: T?)
    -

    Change Records

    v1.0.88 added

    Function Illustrate

    数据通讯桥键值构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    Function Example

    建立一个模板类定义模块与宿主需要发送的键值数据。

    The following example

    object DataConst {
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ChannelData - class

    data class ChannelData<T>(var key: String, var value: T?) : Serializable
    +

    Change Records

    v1.0.88 added

    v1.1.5 modified

    实现了 Serializable 接口

    Function Illustrate

    数据通讯桥键值构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    Function Example

    建立一个模板类定义模块与宿主需要发送的键值数据。

    The following example

    object DataConst {
     
         val TEST_KV_DATA_1 = ChannelData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = ChannelData("test_data_2", 0)
    @@ -49,7 +49,7 @@
     dataChannel.wait(DataConst.TEST_KV_DATA_2, value = 2) { value ->
         // Your code here.
     }
    -
    - +
    + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html new file mode 100644 index 000000000..b2e315a2b --- /dev/null +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html @@ -0,0 +1,34 @@ + + + + + + + + + ChannelPriority - class | Yuki Hook API + + + + +

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ChannelPriority - class

    class ChannelPriority(private val conditions: () -> Boolean)
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    数据通讯桥响应优先级构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    + + + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html index 5517e0250..2d800e62a 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - ModuleAppActivity - class | Yuki Hook API - + ModuleAppActivity - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleAppActivity - class

    open class ModuleAppActivity : Activity()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleAppActivity - class

    open class ModuleAppActivity : Activity()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    代理 Activity

    继承于此类的 Activity 可以同时在宿主与模块中启动。

    在 (Xposed) 宿主环境需要在宿主启动时调用 Context.registerModuleAppActivities 进行注册。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html index d8becd7dc..591a0df1e 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - ModuleAppCompatActivity - class | Yuki Hook API - + ModuleAppCompatActivity - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleAppCompatActivity - class

    open class ModuleAppCompatActivity : AppCompatActivity()
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleAppCompatActivity - class

    open class ModuleAppCompatActivity : AppCompatActivity()
     

    Change Records

    v1.1.0 added

    Function Illustrate

    代理 AppCompatActivity

    继承于此类的 Activity 可以同时在宿主与模块中启动。

    在 (Xposed) 宿主环境需要在宿主启动时调用 Context.registerModuleAppActivities 进行注册。

    在 (Xposed) 宿主环境需要重写 moduleTheme 设置 AppCompat 主题,否则会无法启动。

    moduleTheme - field

    open val moduleTheme: Int
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前代理的 Activity 主题。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html index bba86df35..b98c085d3 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - ModuleContextThemeWrapper - class | Yuki Hook API - + ModuleContextThemeWrapper - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
     

    Change Records

    v1.1.0 added

    Function Illustrate

    代理 ContextThemeWrapper

    通过包装,你可以轻松在 (Xposed) 宿主环境使用来自模块的主题资源。

    applyConfiguration - method

    fun applyConfiguration(initiate: Configuration.() -> Unit): ModuleContextThemeWrapper
     

    Change Records

    v1.1.0 added

    Function Illustrate

    设置当前 ModuleContextThemeWrapperConfiguration

    设置后会自动调用 Resources.updateConfiguration

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html index 06d4e5183..426638fe7 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - ModuleClassLoader - class | Yuki Hook API - + ModuleClassLoader - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
     

    Change Records

    v1.1.2 added

    Function Illustrate

    自动处理 (Xposed) 宿主环境与模块环境的 ClassLoader

    companion object - object

    Change Records

    v1.1.2 added

    excludeHostClasses - method

    fun excludeHostClasses(vararg name: String)
     

    Change Records

    v1.1.2 added

    Function Illustrate

    添加到 Hook APP (宿主) Class 排除列表。

    排除列表中的 Class 将会使用宿主的 ClassLoader 进行装载。

    Pay Attention

    排除列表仅会在 (Xposed) 宿主环境生效。

    excludeModuleClasses - method

    fun excludeModuleClasses(vararg name: String)
     

    Change Records

    v1.1.2 added

    Function Illustrate

    添加到模块 Class 排除列表。

    排除列表中的 Class 将会使用模块 (当前宿主环境的模块注入进程) 的 ClassLoader 进行装载。

    Pay Attention

    排除列表仅会在 (Xposed) 宿主环境生效。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html index ed11a0554..324e399fe 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html @@ -22,18 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookModulePrefs - class | Yuki Hook API - + YukiHookModulePrefs - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    -

    Change Records

    v1.0 first

    Function Illustrate

    实现 Xposed 模块的数据存取,对接 SharedPreferencesXSharedPreferences

    在不同环境智能选择存取使用的对象。

    Pay Attention

    此功能为实验性功能,仅在 LSPosed 环境测试通过,EdXposed 理论也可以使用但不再推荐。

    使用 LSPosed 环境请在 AndroidManifests.xml 中将 xposedminversion 最低设置为 93

    详见 New XSharedPreferencesopen in new window

    若你在按照规定配置后依然无法使用或出现文件权限错误问题,可以参考 isEnableHookSharedPreferences

    未使用 LSPosed 环境请将你的模块 API 降至 26 以下,YukiHookAPI 将会尝试使用 makeWorldReadable 但仍有可能不成功。

    太极请参阅 文件权限/配置/XSharedPreferenceopen in new window

    Pay Attention

    当你在 Xposed 模块中存取数据的时候 context 必须不能是空的。

    若你正在使用 PreferenceFragmentCompat,请迁移到 ModulePreferenceFragment 以适配上述功能特性。

    可选配置

    若你不想将你的模块的 xposedminversion 最低设置为 93,你可以在 AndroidManifest.xml 中添加 xposedsharedprefs 来实现支持。

    详见 New XSharedPreferencesopen in new window

    The following example

    <meta-data
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    +

    Change Records

    v1.0 first

    Function Illustrate

    实现 Xposed 模块的数据存取,对接 SharedPreferencesXSharedPreferences

    在不同环境智能选择存取使用的对象。

    Pay Attention

    此功能为实验性功能,仅在 LSPosed 环境测试通过,EdXposed 理论也可以使用但不再推荐。

    使用 LSPosed 环境请在 AndroidManifests.xml 中将 xposedminversion 最低设置为 93

    详见 New XSharedPreferencesopen in new window

    若你在按照规定配置后依然无法使用或出现文件权限错误问题,可以参考 isEnableHookSharedPreferences

    未使用 LSPosed 环境请将你的模块 API 降至 26 以下,YukiHookAPI 将会尝试使用 makeWorldReadable 但仍有可能不成功。

    太极请参阅 文件权限/配置/XSharedPreferenceopen in new window

    Pay Attention

    当你在 Xposed 模块中存取数据的时候 context 必须不能是空的。

    若你正在使用 PreferenceFragmentCompat,请迁移到 ModulePreferenceFragment 以适配上述功能特性。

    Optional Configuration

    若你不想将你的模块的 xposedminversion 最低设置为 93,你可以在 AndroidManifest.xml 中添加 xposedsharedprefs 来实现支持。

    详见 New XSharedPreferencesopen in new window

    The following example

    <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
    -

    isXSharePrefsReadable - field

    val isXSharePrefsReadable: Boolean
    -

    Change Records

    v1.0.90 added

    Function Illustrate

    获取 XSharedPreferences 是否可读。

    Pay Attention

    只能在 (Xposed) 宿主环境中使用,模块环境中始终返回 false。

    isRunInNewXShareMode - field

    val isRunInNewXShareMode: Boolean
    -

    Change Records

    v1.0.78 added

    Function Illustrate

    获取 YukiHookModulePrefs 是否正处于 EdXposed/LSPosed 的最高权限运行。

    前提条件为当前 Xposed 模块已被激活。

    Pay Attention

    只能在模块环境中使用,(Xposed) 宿主环境中始终返回 false。

    name - method

    fun name(name: String): YukiHookModulePrefs
    +

    isXSharePrefsReadable - field

    Change Records

    v1.0.90 added

    v1.1.5 deprecated

    请转移到 isPreferencesAvailable

    isRunInNewXShareMode - field

    Change Records

    v1.0.78 added

    v1.1.5 deprecated

    请转移到 isPreferencesAvailable

    isPreferencesAvailable - field

    val isPreferencesAvailable: Boolean
    +

    Change Records

    v1.1.5 added

    Function Illustrate

    获取当前 YukiHookModulePrefs 的可用状态。

    在 (Xposed) 宿主环境中返回 XSharedPreferences 可用状态 (可读)。

    在模块环境中返回当前是否处于 New XSharedPreferences 模式 (可读可写)。

    name - method

    fun name(name: String): YukiHookModulePrefs
     

    Change Records

    v1.0 first

    Function Illustrate

    自定义 Sp 存储名称。

    Function Example

    Activity 中的使用方法。

    The following example

    modulePrefs("custom_name").getString("custom_key")
     

    在 (Xposed) 宿主环境 PackageParam 中的使用方法。

    The following example

    prefs("custom_name").getString("custom_key")
     

    direct - method

    fun direct(): YukiHookModulePrefs
    @@ -57,6 +56,6 @@
     

    Change Records

    v1.0.67 added

    Function Illustrate

    智能获取指定类型的键值。

    put - method

    inline fun <reified T> put(prefs: PrefsData<T>, value: T)
     

    Change Records

    v1.0.67 added

    Function Illustrate

    智能存储指定类型的键值。

    Notice

    在 (Xposed) 宿主环境下只读,无法使用。

    clearCache - method

    fun clearCache()
     

    Change Records

    v1.0.5 added

    Function Illustrate

    清除 XSharedPreferences 中缓存的键值数据。

    无论是否开启 YukiHookAPI.Configs.isEnableModulePrefsCache

    调用此方法将清除当前存储的全部键值缓存。

    下次将从 XSharedPreferences 重新读取。

    在 (Xposed) 宿主环境中使用。

    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html index 32fd9e345..c0b1fbf7f 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - PrefsData - class | Yuki Hook API - + PrefsData - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T)
    -

    Change Records

    v1.0.67 added

    Function Illustrate

    键值对存储构造类。

    这个类是对 YukiHookModulePrefs 的一个扩展用法。

    Function Example

    建立一个模板类定义模块与宿主需要使用的键值数据。

    The following example

    object DataConst {
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T) : Serializable
    +

    Change Records

    v1.0.67 added

    v1.1.5 modified

    实现了 Serializable 接口

    Function Illustrate

    键值对存储构造类。

    这个类是对 YukiHookModulePrefs 的一个扩展用法。

    Function Example

    建立一个模板类定义模块与宿主需要使用的键值数据。

    The following example

    object DataConst {
     
         val TEST_KV_DATA_1 = PrefsData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = PrefsData("test_data_2", false)
    @@ -45,6 +45,6 @@
     

    你依然可以不使用模板定义的默认值,随时修改你的默认值。

    The following example

    // 读取 - 此时 data 取到的默认值将会是 2 - 并不是模板提供的 0
     val data = prefs.get(DataConst.TEST_KV_DATA_3, 2)
     
    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html index 961c42995..7d8c75570 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModulePreferenceFragment - class | Yuki Hook API - + ModulePreferenceFragment - class | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
     

    Change Records

    v1.0.78 added

    Function Illustrate

    这是对使用 YukiHookAPI Xposed 模块实现中的一个扩展功能。

    此类接管了 PreferenceFragmentCompat 并对其实现了 Sp 存储在 Xposed 模块中的全局可读可写。

    在你使用 PreferenceFragmentCompat 的实例中,将继承对象换成此类。

    然后请将重写方法由 onCreatePreferences 替换为 onCreatePreferencesInModuleApp 即可。

    Function Example

    使用 ModulePreferenceFragment 创建一个 PreferenceFragmentCompat 对象。

    The following example

    class SettingsFragment : ModulePreferenceFragment() {
     
         override fun onCreatePreferencesInModuleApp(savedInstanceState: Bundle?, rootKey: String?) {
    @@ -49,6 +49,6 @@
         }
     }
     
    - + diff --git a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html index 0cfbb02c2..e2d014418 100644 --- a/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html +++ b/docs/en/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html @@ -22,16 +22,16 @@ document.documentElement.classList.toggle('dark', true); } - IYukiHookXposedInit - interface | Yuki Hook API - + IYukiHookXposedInit - interface | Yuki Hook API + -

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    IYukiHookXposedInit - interface

    interface IYukiHookXposedInit
    +    

    Notice

    The English translation of this page has not been completed, you are welcome to contribute translations to us.

    You can use the Chrome Translation Plugin to translate entire pages for reference.

    IYukiHookXposedInit - interface

    interface IYukiHookXposedInit
     

    Change Records

    v1.0 first

    v1.0.80 modified deprecated

    作废了 YukiHookXposedInitProxy 名称但保留接口

    转移到 IYukiHookXposedInit 新名称

    Function Illustrate

    YukiHookAPI 的 Xposed 装载 API 调用接口。

    onInit - method

    fun onInit()
     

    Change Records

    v1.0.5 added

    Function Illustrate

    配置 YukiHookAPI.Configs 的初始化方法。

    Pay Attention

    在这里只能进行初始化配置,不能进行 Hook 操作。

    此方法可选,你也可以选择不对 YukiHookAPI.Configs 进行配置。

    onHook - method

    fun onHook()
     

    Change Records

    v1.0 first

    Function Illustrate

    Xposed API 的模块装载调用入口方法。

    onXposedEvent - method

    fun onXposedEvent()
     

    Change Records

    v1.0.80 added

    Function Illustrate

    监听 Xposed 原生装载事件。

    若你的 Hook 事件中存在需要兼容的原生 Xposed 功能,可在这里实现。

    请在这里使用 YukiXposedEvent 创建回调事件监听。

    可监听的事件如下:

    YukiXposedEvent.onInitZygote

    YukiXposedEvent.onHandleLoadPackage

    YukiXposedEvent.onHandleInitPackageResources

    Pay Attention

    此接口仅供监听和实现原生 Xposed API 的功能,请不要在这里操作 YukiHookAPI

    YukiHookXposedInitProxy - interface

    Change Records

    v1.0 first

    v1.0.80 deprecated

    请转移到 IYukiHookXposedInit

    - + diff --git a/docs/en/api/special-features/host-inject.html b/docs/en/api/special-features/host-inject.html index bae514805..dc8430bd9 100644 --- a/docs/en/api/special-features/host-inject.html +++ b/docs/en/api/special-features/host-inject.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Host Resource Injection Extension | Yuki Hook API - + Host Resource Injection Extension | Yuki Hook API + -

    Host Resource Injection Extension

    This is an extension that injects Module App's Resources, Activity components, and Context topics into the Host App.

    Before using the following functions, in order to prevent Resource Id from conflicting with each other, you need to modify the Resource Id in the build.gradle of the current Xposed Module project.

    • Kotlin Gradle DSL
    android {
    +    

    Host Resource Injection Extension

    This is an extension that injects Module App's Resources, Activity components, and Context topics into the Host App.

    Before using the following functions, in order to prevent Resource Id from conflicting with each other, you need to modify the Resource Id in the build.gradle of the current Xposed Module project.

    • Kotlin Gradle DSL
    android {
         androidResources.additionalParameters("--allow-reserved-package-id", "--package-id", "0x64")
     }
     
    • Groovy
    android {
    @@ -165,6 +165,6 @@
         "com.demo.controller.ModuleController"
     )
     

    You need to set it before the method of injecting Module App's resources into the Host App is executed to take effect.

    This function is only to solve the situation that Class with the same name may exist in the Host App and Module App, such as shared SDK and dependencies.

    In most cases, you will not use this function.

    Tips

    For more functions, please refer to ModuleClassLoader.

    - + diff --git a/docs/en/api/special-features/host-lifecycle.html b/docs/en/api/special-features/host-lifecycle.html index 01a31155d..692a67168 100644 --- a/docs/en/api/special-features/host-lifecycle.html +++ b/docs/en/api/special-features/host-lifecycle.html @@ -22,14 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - Host Lifecycle Extension | Yuki Hook API - + Host Lifecycle Extension | Yuki Hook API + -

    Host Lifecycle Extension

    This is an extension of the lifecycle of an automatic hooking Host App.

    Monitor Lifecycle

    Implement the monitoring function by automating the lifecycle method of the Host App.

    We need to listen to the startup and lifecycle methods of the Host App's Application, just use the following methods.

    The following example

    loadApp(name = "com.example.demo") {
    +    

    Host Lifecycle Extension

    This is an extension of the lifecycle of an automatic hooking Host App.

    Listener Lifecycle

    Implement the listening function by automating the lifecycle method of the Host App.

    We need to listen to the startup and lifecycle methods of the Host App's Application, just use the following methods.

    The following example

    loadApp(name = "com.example.demo") {
         // Register lifecycle listeners
    -    onAppLifecycle {
    +    // Optional parameter:
    +    // You can set isOnFailureThrowToApp = false
    +    // So that the exception will not be thrown to the Host App to prevent the Host App from crashing
    +    // The default is true
    +    onAppLifecycle(isOnFailureThrowToApp = true) {
             // You can implement lifecycle method listeners in Application here
             attachBaseContext { baseContext, hasCalledSuper ->
                 // Determine whether
    @@ -60,10 +64,10 @@
             }
         }
     }
    -

    Tips

    For more functions, please refer to AppLifecycle.

    Register System Broadcast

    Register system broadcast through the Application.onCreate method to monitor system broadcast.

    We can also register system broadcast in the Host App's Application.

    The following example

    loadApp(name = "com.example.demo") {
    +

    Tips

    For more functions, please refer to AppLifecycle.

    Register System Broadcast

    Register system broadcast through the Application.onCreate method to listening system broadcast.

    We can also register system broadcast in the Host App's Application.

    The following example

    loadApp(name = "com.example.demo") {
         // Register lifecycle listeners
         onAppLifecycle {
    -        // Broadcast monitoring when the registered user is unlocked
    +        // Broadcast listening when the registered user is unlocked
             registerReceiver(Intent.ACTION_USER_PRESENT) { context, intent ->
                 // ...
             }
    @@ -74,6 +78,6 @@
         }
     }
     

    Tips

    For more functions, please refer to AppLifecycle.

    - + diff --git a/docs/en/api/special-features/logger.html b/docs/en/api/special-features/logger.html index 635ff2526..24c7488c3 100644 --- a/docs/en/api/special-features/logger.html +++ b/docs/en/api/special-features/logger.html @@ -22,16 +22,16 @@ document.documentElement.classList.toggle('dark', true); } - Debug Logs | Yuki Hook API - + Debug Logs | Yuki Hook API + -

    Debug Logs

    Log is the most important part of the debugging process, YukiHookAPI encapsulates a set of stable and efficient debugging log functions for developers.

    Normal Logs

    You can call loggerD, loggerI, loggerW to print normal logs to the console.

    The usage method is as follows.

    The following example

    loggerD(msg = "This is a log")
    -

    At this point, YukiHookAPI will call android.util.Log and XposedBridge.log to print this log at the same time.

    The default TAG of the log is the value you set in YukiHookLogger.Configs.tag.

    You can also customize this value dynamically, but it is not recommended to modify TAG easily to prevent logs from being filtered.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
    +    

    Debug Logs

    Log is the most important part of the debugging process, YukiHookAPI encapsulates a set of stable and efficient debugging log functions for developers.

    Normal Logs

    You can call loggerD, loggerI, loggerW to print normal logs to the console.

    The usage method is as follows.

    The following example

    loggerD(msg = "This is a log")
    +

    At this ponit, YukiHookAPI will call android.util.Log and log function in (Xposed) Host environment to print this log at the same time.

    The default TAG of the log is the value you set in YukiHookLogger.Configs.tag.

    You can also customize this value dynamically, but it is not recommended to modify TAG easily to prevent logs from being filtered.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
     

    The printed result is as shown below.

    The following example

    [YukiHookAPI][D][host package name]--> This is a log
    -

    You can also use LoggerType to customize the type of log printing.

    You can choose to use android.util.Log or XposedBridge.log to print logs.

    The default type is LoggerType.BOTH, which means that both methods are used to print logs.

    For example we only use android.util.Log to print logs.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    -

    Or just use XposedBridge.log to print the log, this method can only be used in the (Xposed) Host environment.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE)
    +

    You can also use LoggerType to customize the type of log printing.

    You can choose to use android.util.Log or the log function in the (Xposed) Host environment to print logs.

    The default type is LoggerType.BOTH, which means that both methods are used to print logs.

    For example we only use android.util.Log to print logs.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    +

    Or just use XposedBridge.log to print the log, this method can only be used in the (Xposed) Host environment.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSED_ENVIRONMENT)
     

    If you want to intelligently distinguish the (Xposed) Host environment from the Module environment, you can write it in the following form.

    The following example

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE)
     

    In this way, the API will intelligently select the specified method type to print this log in different environments.

    Tips

    For more functions, please refer to loggerD, loggerI and loggerW methods.

    Error Logs

    You can call loggerE to print E level logs to the console.

    The usage method is as follows.

    The following example

    loggerE(msg = "This is an error")
     

    The error log is the highest level, regardless of whether you have filtered only E level logs.

    For error-level logging, you can also append an exception stack.

    // Assume this is the exception that was thrown
    @@ -61,14 +61,23 @@
          it.throwable // Get exception
          // ...
     }
    -

    The above features require YukiHookLogger.Configs.isRecord to be enabled.

    Pay Attention

    The obtained log data is isolated from each other in the Host App and the Module App's process.

    You can only get the corresponding log data in the corresponding process.

    If you need to get these log data in real time anywhere, please refer to Xposed Module and Host Channel, Register Module App's Activity.

    If you only want to get log data in real time through Module App or Host App, Please refer to the optional solution YukiHookDataChannel.obtainLoggerInMemoryData method.

    You can also use YukiHookLogger.Configs.elements to customize the elements that debug logs display externally.

    This function requires YukiHookAPI.Configs to be configured in onInit of the Hook entry class.

    The following example

    override fun onInit() = configs {
    +

    If you want to format or save the obtained custom log data to a file, you only need to use the following method.

    The following example

    // Assume this is the custom log data you get
    +val data: ArrayList<YukiLoggerData>
    +// Format log data to String
    +val dataString = YukiHookLogger.contents(data)
    +// Save log data to file
    +// Please note
    +// The saved file path must have read and write permissions
    +// Otherwise an exception will be thrown
    +YukiHookLogger.saveToFile("/sdcard/Documents/debug_log.log", data)
    +

    Pay Attention

    You need to enable YukiHookLogger.Configs.isRecord to get the contents of YukiHookLogger.inMemoryData.

    The obtained log data is isolated from each other in the Host App and the Module App's process.

    You can only get the corresponding log data in the corresponding process.

    If you need to get these log data in real time anywhere, please refer to Xposed Module and Host Channel, Register Module App's Activity.

    If you only want to get log data in real time through Module App or Host App, Please refer to the optional solution YukiHookDataChannel.obtainLoggerInMemoryData method.

    You can also use YukiHookLogger.Configs.elements to customize the elements that debug logs display externally.

    This function requires YukiHookAPI.Configs to be configured in onInit of the Hook entry class.

    The following example

    override fun onInit() = configs {
         debugLog {
             // ...
             elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
         }
         // ...
     }
    -
    - +
    + diff --git a/docs/en/api/special-features/reflection.html b/docs/en/api/special-features/reflection.html index d08842941..430adf0df 100644 --- a/docs/en/api/special-features/reflection.html +++ b/docs/en/api/special-features/reflection.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Reflection Extensions | Yuki Hook API - + Reflection Extensions | Yuki Hook API + -

    Reflection Extensions

    YukiHookAPI encapsulates a set of reflection API with near-zero reflection writing for developers, which can almost completely replace the usage of reflection API in Java.

    Class Extensions

    Here are the extension functions related to the Class object itself.

    Object Conversion

    Suppose we want to get a Class that cannot be called directly.

    Normally, we can use the standard reflection API to find this Class.

    The following example

    // Class in the default ClassLoader environment
    +    

    Reflection Extensions

    YukiHookAPI encapsulates a set of reflection API with near-zero reflection writing for developers, which can almost completely replace the usage of reflection API in Java.

    Class Extensions

    Here are the extension functions related to the Class object itself.

    Object Conversion

    Suppose we want to get a Class that cannot be called directly.

    Normally, we can use the standard reflection API to find this Class.

    The following example

    // Class in the default ClassLoader environment
     var instance = Class.forName("com.demo.Test")
     // Specify the Class in the ClassLoader environment
     val customClassLoader: ClassLoader? = ... // Assume this is your ClassLoader
    @@ -129,10 +129,10 @@
         implements("java.io.Serializable")
         // Specify the type and style of the constructor
         // And the number count that exists in the current class
    -    constructor { param(StringType) }.count(num = 1)
    +    constructor { param(StringClass) }.count(num = 1)
         // Specify the type and style of the variable
         // And the number that exists in the current class count
    -    field { type = StringType }.count(num = 2)
    +    field { type = StringClass }.count(num = 2)
         // Specify the type and style of the variable
         // And the number that exists in the current class count
         field { type = BooleanType }.count(num = 1)
    @@ -152,15 +152,15 @@
         // Specify the modifier, and the number count in the current class
         method {
             modifiers { isStatic && isPrivate }
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }.count(num = 1)
         // Specify the type and style of the method
         // Specify the modifier, and the number count in the current class
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, StringType)
    -        returnType = StringType
    +        param(BooleanType, StringClass)
    +        returnType = StringClass
         }.count(num = 1)
         // Specify the type and style of the method
         // Specify the modifier, and the number count in the current class
    @@ -174,7 +174,7 @@
         // And the number count that exists in the current class
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, VagueType, VagueType, StringType)
    +        param(BooleanType, VagueType, VagueType, StringClass)
             returnType = UnitType
         }.count(num = 1)
         // Directly specify the number of all methods that exist in the current class count
    @@ -326,7 +326,7 @@
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doTask"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    Tips

    For more features, please refer to MethodFinder.

    Similarly, we need to get the isTaskRunning field can also be written as follows.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -345,7 +345,7 @@
     Test::class.java.method {
         name = "getName"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get(instance).string() // Get the result of the method
     

    Through observation, it is found that there is only one method named getName in this Class, so can we make it simpler?

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -370,14 +370,23 @@
         name = "release"
         // Use VagueType to fill in the type you don't want to fill in
         // While ensuring that other types can match
    -    param(StringType, VagueType, BooleanType)
    +    param(StringClass, VagueType, BooleanType)
     }.get(instance) // Get this method
    -

    Find in Super Class

    You will notice that Test extends BaseTest, now we want to get the doBaseTask method of BaseTest, how do we do it without knowing the name of the super class?

    Referring to the above find conditions, we only need to add a superClass to the find conditions to achieve this function.

    The following example

    // Assume this is an instance of this Class
    +

    If you are not sure about the type of each parameter, you can create a conditional method body with the param { ... } method.

    The following example

    // Assume this is an instance of this Class
    +val instance = Test()
    +// Call and execute using YukiHookAPI
    +Test::class.java.method {
    +     name = "release"
    +     // Get the it (Class) method parameter type array instance
    +     // To only determine the known type and its position
    +     param { it[0] == StringClass && it[2] == BooleanType }
    +}.get(instance) // Get this method
    +

    Tips

    Use param { ... } to create a conditional method body, where the variable it is the Class type array instance of the current method parameter, and you can freely use Class all objects and their methods in.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.type, MethodFinder.param, MethodFinder.returnType, ConstructorFinder.param method.

    Find in Super Class

    You will notice that Test extends BaseTest, now we want to get the doBaseTask method of BaseTest, how do we do it without knowing the name of the super class?

    Referring to the above find conditions, we only need to add a superClass to the find conditions to achieve this function.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // Just add this condition
         superClass()
     }.get(instance).call("task_name")
    @@ -386,7 +395,7 @@
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // Add a find condition
         superClass(isOnlySuperClass = true)
     }.get(instance).call("task_name")
    @@ -398,7 +407,7 @@
             // Set name is case insensitive
             it.equals("dotask", isIgnoreCase = true)
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    Knowing that there is currently only one doTask method in Class, we can also judge that the method name contains only the characters specified in it.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -408,7 +417,7 @@
             // Only contains oTas
             it.contains("oTas")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    We can also judge based on the first and last strings.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -418,7 +427,7 @@
             // Contains do at the beginning and Task at the end
             it.startsWith("do") && it.endsWith("Task")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    By observing that this method name contains only letters, we can add a precise search condition.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -428,9 +437,9 @@
             // Start with do, end with Task, just letters
             it.startsWith("do") && it.endsWith("Task") && it.isOnlyLetters()
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
    -

    Tips

    Use name { ... } to create a conditional method body, where the variable it is the string of the current name, and you can freely use it in the extension method of NameRules function.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to NameRules.

    Multiple Find

    Sometimes, we may need to find a set of methods, constructors, and fields with the same characteristics in a Class.

    At this time, we can use relative condition matching to complete.

    Based on the result of the find condition, we only need to replace get with all to get all the bytecodes that match the condition.

    Suppose this time we want to get all methods in Class with the number of method parameters in the range 1..3, you can use the following implementation.

    The following example

    // Assume this is an instance of this Class
    +

    Tips

    Use name { ... } to create a conditional method body, where the variable it is the string of the current name, and you can freely use it in the extension method of NameRules function.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.name, MethodFinder.name methods and NameRules.

    Multiple Find

    Sometimes, we may need to find a set of methods, constructors, and fields with the same characteristics in a Class.

    At this time, we can use relative condition matching to complete.

    Based on the result of the find condition, we only need to replace get with all to get all the bytecodes that match the condition.

    Suppose this time we want to get all methods in Class with the number of method parameters in the range 1..3, you can use the following implementation.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
    @@ -457,13 +466,13 @@
         // Call and execute each method
         instance.call(...)
     }
    -

    The above example can be perfectly matched to the following 2 methods.

    private void b()

    private void b(String a)

    Tips

    Use paramCount { ... } to create a conditional method body, where the variable it is the integer of the current number of parameters, and you can use it freely in the extension method of CountRules function in it.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to CountRules.

    Static Bytecode

    Some methods and fields are statically implemented in Class, at this time, we can call them without passing in an instance.

    Suppose we want to get the contents of the static field TAG this time.

    The following example

    Test::class.java.field {
    +

    The above example can be perfectly matched to the following 2 methods.

    private void b()

    private void b(String a)

    Tips

    Use paramCount { ... } to create a conditional method body, where the variable it is the integer of the current number of parameters, and you can use it freely in the extension method of CountRules function in it.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to MethodFinder.paramCount, ConstructorFinder.paramCount methods and CountRules.

    Static Bytecode

    Some methods and fields are statically implemented in Class, at this time, we can call them without passing in an instance.

    Suppose we want to get the contents of the static field TAG this time.

    The following example

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
     }.get().string() // The type of Field is string and can be cast directly
     

    Assuming that there is a non-static TAG field with the same name in Class, what should I do at this time?

    Just add a filter.

    The following example

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
         // This field to identify the lookup needs to be static
         modifiers { isStatic }
     }.get().string() // The type of Field is string and can be cast directly
    @@ -477,7 +486,7 @@
         // This method of identity find needs to be static
         modifiers { isStatic }
     }.get().call()
    -

    Tips

    Use modifiers { ... } to create a conditional method body, at which point you can freely use its functionality in ModifierRules.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more features, please refer to ModifierRules.

    Obfuscated Bytecode

    You may have noticed that the example Class given here has two obfuscated field names, both of which are a, how do we get them at this time?

    There are two options.

    The first option is to determine the name and type of the field.

    The following example

    // Assume this is an instance of this Class
    +

    Tips

    Use modifiers { ... } to create a conditional method body, at which point you can freely use its functionality in ModifierRules.

    The condition at the end of the method body needs to return a Boolean, which is the final condition judgment result.

    For more functions, please refer to FieldFinder.modifiers, MethodFinder.modifiers, ConstructorFinder.modifiers methods and ModifierRules.

    Obfuscated Bytecode

    You may have noticed that the example Class given here has two obfuscated field names, both of which are a, how do we get them at this time?

    There are two options.

    The first option is to determine the name and type of the field.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.field {
    @@ -495,13 +504,13 @@
     // Call and execute using YukiHookAPI
     Test::class.java.method {
         name = "b"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("test_string") // Get the method whose name is b and whose parameter is [String]
     

    The second option is to determine where the parameters of the method are located.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
     // Call and execute using YukiHookAPI
     Test::class.java.method {
    -    param(StringType).index().first()
    +    param(StringClass).index().first()
     }.get(instance).call("test_string") // Get the method whose first method parameter is [String]
     

    Since it is observed that this method is last in Class, then we have an alternative.

    The following example

    // Assume this is an instance of this Class
     val instance = Test()
    @@ -516,7 +525,7 @@
         // Execute the doTask method
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
         // Execute the stop method
         method {
    @@ -533,7 +542,7 @@
         // Execute the doBaseTask method of the parent class
         superClass().method {
             name = "doBaseTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    If you don't like to use a lambda to create the namespace of the current instance, you can use the current() method directly.

    The following example

    // Assuming this is an instance of this Class, this Class cannot be obtained directly
    @@ -543,7 +552,7 @@
         .current()
         .method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     // Execute the stop method
     instance
    @@ -560,7 +569,7 @@
     instance.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }.current()
         .method {
    @@ -580,7 +589,7 @@
         }.current {
             method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }.call("task_name")
         }
         // <Plan 2>
    @@ -589,7 +598,7 @@
         }.current()
             ?.method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }?.call("task_name")
     }
     

    Notice

    The above current method is equivalent to calling the field { ... }.any()?.current() method in CurrentClass for you.

    If there is no CurrentClass calling field, you need to use field { ... }.get(instance).current() to call it.

    The problem comes again, I want to use reflection to create the following instance and call the method in it, how to do it?

    The following example

    Test(true).doTask("task_name")
    @@ -606,7 +615,7 @@
     

    But I feel that this approach is very troublesome.

    Is there a more concise way to call it?

    At this time, we can also use the buildOf method to create an instance.

    The following example

    "com.demo.Test".toClass().buildOf(true) { param(BooleanType) }?.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    If you want the buildOf method to return the type of the current instance, you can include a type-generic declaration in it instead of using as to cast the target type.

    In this case, the constructor of the instance itself is private, but the method inside is public, so we only need to create its constructor by reflection.

    The following example

    // Assume this Class can be obtained directly
    @@ -623,7 +632,7 @@
             method {
                 name = "getString"
                 emptyParam()
    -            returnType = StringType
    +            returnType = StringClass
             }
             replaceTo("Hooked")
         }
    @@ -632,13 +641,13 @@
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().string()
     

    If we want to get the original method and result of this method without hooking, we just need to add original to the result.

    The following example

    // Result will be "Original"
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().original().string()
     

    Tips

    For more functions, please refer to the MethodFinder.Result.original method.

    Find Again

    Suppose there are three different versions of Class, all of which are the same Class for different versions of this Host App.

    There is also a method doTask in it, assuming they function the same.

    The following example of version A

    public class Test {
     
    @@ -667,13 +676,13 @@
     }.remedys {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.onFind {
             // Found logic can be implemented here
         }
         method {
             name = "doTask"
    -        param(StringType, IntType)
    +        param(StringClass, IntType)
         }.onFind {
             // Found logic can be implemented here
         }
    @@ -811,7 +820,7 @@
         name = "test"
         param(BooleanType).index(num = 2)
         // ❗ Wrong usage, please keep only one index method
    -    returnType(StringType).index(num = 1)
    +    returnType(StringClass).index(num = 1)
     }
     

    The following find conditions can be used without any problems.

    The following example

    method {
         name = "test"
    @@ -854,17 +863,17 @@
     }.get().boolean().toString() // ✅ The correct way to use, get the type and then convert
     

    Common Type Extensions

    When find methods and fields, we usually need to specify the type in find conditions.

    The following example

    field {
         name = "test"
    -    type = Boolean::class.java
    +    type = Boolean::class.javaPrimitiveType
     }
    -

    Expressing the type Boolean::class.java in Kotlin is very long and not convenient.

    Therefore, YukiHookAPI encapsulates common type calls for developers, including Android's basic types and Java's basic types.

    At this time, the above type can be written in the following form.

    The following example

    field {
    +

    Expressing the type of Boolean::class.javaPrimitiveType in Kotlin is very long and inconvenient.

    Therefore, YukiHookAPI encapsulates common type calls for developers, including Android related types and Java common types and primitive type keywords.

    At this time, the above type can be written in the following form.

    The following example

    field {
         name = "test"
         type = BooleanType
     }
    -

    Common basic types in Java have been encapsulated as Name + Type, such as IntType, FloatType.

    Correspondingly, array types also have convenient usage methods, assuming we want to get an array of type String[].

    You need to write java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass to get this type.

    Does it feel very troublesome? At this time, we can use the extension method ArrayClass(StringType) to get this type.

    At the same time, since String is a common type, you can also directly use StringArrayClass to get this type.

    Some common methods found in Hook have their corresponding encapsulation types for use, in the format Name + Class.

    For example, the Hook onCreate method needs to find the Bundle::class.java type.

    The following example

    method {
    +

    The primitive type keywords in common Java types have been encapsulated as Type(Class Name) + Type, such as IntType, FloatType (their bytecode types are int, float).

    Correspondingly, array types also have convenient usage methods, assuming we want to get an array of type String[].

    You need to write java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass to get this type.

    Does it feel very troublesome, at this time we can use the method ArrayClass(StringClass) to get this type.

    At the same time, since String is a common type, you can also directly use StringArrayClass to get this type.

    Some common methods found in Hook have their corresponding encapsulation types for use, in the format Type(Class Name) + Class.

    For example, the Hook onCreate method needs to look up the Bundle::class.java type.

    The following example

    method {
         name = "onCreate"
         param(BundleClass)
     }
    -

    At the same time, you are welcome to contribute more commonly used types.

    - +

    The following are wrapper names for some special case types in Java represented in YukiHookAPI.

    • voidUnitType

    • java.lang.VoidUnitClass

    • java.lang.ObjectAnyClass

    • java.lang.IntegerIntClass

    • java.lang.CharacterCharClass

    Notice

    Encapsulating types with Type(Class Name) + Type will and only be represented as Java primitive type keywords.

    Since the concept of primitive types does not exist in Kotlin, they will all be defined as KClass.

    There are 9 primitive type keywords in Java, of which 8 are primitive type, namely boolean, char, byte, short , int, float, long, double, of which the void type is a special case.

    At the same time, they all have their own corresponding package types in Java, such as java.lang.Boolean, java.lang.Integer, these types are unequal, Please note the distinction.

    Similarly, arrays also have corresponding wrapper types, which also need to be distinguished from Java primitive type keywords.

    For example, the encapsulation type of byte[] is ByteArrayType or ArrayClass(ByteType), and the encapsulation type of Byte[] is ByteArrayClass or ArrayClass(ByteClass ), these types are also unequal.

    At the same time, you are welcome to contribute more commonly used types.

    + diff --git a/docs/en/api/special-features/xposed-channel.html b/docs/en/api/special-features/xposed-channel.html index 031458cf2..440ccf3e1 100644 --- a/docs/en/api/special-features/xposed-channel.html +++ b/docs/en/api/special-features/xposed-channel.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Xposed Module and Host Channel | Yuki Hook API - + Xposed Module and Host Channel | Yuki Hook API + -

    Xposed Module and Host Channel

    This is a solution that uses system out-of-order broadcasting to send and receive data between the Module App and the Host App.

    Condition that needs to be met

    The Module App and the Host App need to remain alive, otherwise communication cannot be established.

    Basic Usage

    The basic usage of the wait and put methods is described here.

    By using dataChannel to realize the communication bridge between the Module App and the Host App, the principle is to send and receive system out-of-order broadcasts.

    The Module App example is as follows

    // Get from the Host App of the specified package name
    +    

    Xposed Module and Host Channel

    This is a solution that uses system out-of-order broadcasting to send and receive data between the Module App and the Host App.

    Condition that needs to be met

    The Module App and the Host App need to remain alive, otherwise communication cannot be established.

    Basic Usage

    The basic usage of the wait and put methods is described here.

    By using dataChannel to realize the communication bridge between the Module App and the Host App, the principle is to send and receive system out-of-order broadcasts.

    The Module App example is as follows

    // Get from the Host App of the specified package name
     dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
         // Your code here.
     }
    @@ -59,20 +59,24 @@
     dataChannel.checkingVersionEquals { isEquals ->
         // Your code here.
     }
    -

    Condition of method callback

    The Host App and Module App must be stay alive, and after activating the Module App restart the Hook target Host App object in scope.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Rules for Callback Event Response

    Only examples used in Module App are listed here, the same key in the Host App is always not allowed to be created repeatedly.

    Pay Attention

    In the Module App and Host App, each key callback event corresponding to dataChannel is not allowed to be repeatedly created, if repeated, the previous callback event will be replaced by the newly added callback event.

    When used in the Module App, it cannot be repeated in the same Activity, and the same key in different Activity is allowed to be repeated.

    The following example

    class MainActivity : AppCompatActivity() {
    +

    Condition of method callback

    The Host App and Module App must be stay alive, and after activating the Module App restart the Hook target Host App object in scope.

    Tips

    For more functions, please refer to YukiHookDataChannel.

    Rules for Callback Event Response

    Only the examples used in Module App are listed here.

    The same key in same Host App is always not allowed to be created repeatedly, but the same key is allowed in different Host Apps.

    Pay Attention

    In the Module App and Host App, each key callback event corresponding to dataChannel is not allowed to be repeatedly created, if repeated, the previous callback event will be replaced by the newly added callback event.

    When used in the Module App, it cannot be repeated in the same Activity, and the same key in different Activity is allowed to be repeated.

    The following example

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             // Callback event A
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
                 // Your code here.
             }
             // Callback event B
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
                 // Your code here.
             }
             // Callback event C
    -        dataChannel(packageName = "com.example.demo").wait(key = "other_test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +        // Callback event D
    +        dataChannel(packageName = "com.example.demo2").wait(key = "other_test_key") {
                 // Your code here.
             }
         }
    @@ -82,13 +86,67 @@
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    -        // Callback event D
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        // Callback event E
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // Callback event F
    +        dataChannel(packageName = "com.example.demo2").wait(key = "test_key") {
                 // Your code here.
             }
         }
     }
    -

    In the above example, the callback event A will be replaced by the callback event B, the key of the callback event C is not repeated with others, and the callback event D is in another Activity, So the final callback events B, C, and D can all be created successfully.

    Pay Attention

    A callback event with the same key will only call back the callback event registered in the Activity that the current Module App is displaying, such as test_key in the above, if OtherActivity is being displayed, then test_key in MainActivity will not be called back.

    The same key registers dataChannel in the same Activity but different Fragment, they will still be called back in the current Activity at the same time.

    In a Module App, you can only use Context of Activity to register dataChannel, you cannot use dataChannel in Application and Service.

    If you want to use dataChannel in Fragment, use activity?.dataChannel(...).

    Security Instructions

    In the Module environment, you can only receive communication data sent by the Host App with the specified package name and only send it to the Host App with the specified package name.

    Pay Attention

    In order to further prevent broadcast abuse, the API in the communication data will automatically specify the package name of the Host App and Module App to prevent other apps from monitoring and using broadcast to make overrun behaviors.

    - +

    In the above example, although callback events A and B are callback events in the same Host App, their key is the same, so callback event A will be replaced by callback event B.

    The key of callback event C is not duplicated with others.

    Although the key of callback event D is the same as that of callback event C, their Host Apps are different, so they can exist at the same time.

    Callback event E is in another Activity, although the key of callback event F and callback event E is the same, but they are not the same Host App, so they can exist at the same time.

    In summary, the final callback events B, C, D, E, and F can all be created successfully.

    Compatibility Notes

    Setting the same key on different Host Apps in previous historical versions of the API would result in only the last event callback, but the latest version has corrected this problem, please make sure you are using the latest API version.

    Pay Attention

    A callback event with the same key will only call back the callback event registered in the Activity that the current Module App is displaying, such as test_key in the above, if OtherActivity is being displayed, then test_key in MainActivity will not be called back.

    The same key registers dataChannel in the same Activity but different Fragment, they will still be called back in the current Activity at the same time.

    In a Module App, you can only use Context of Activity to register dataChannel, you cannot use dataChannel in Application and Service.

    If you want to use dataChannel in Fragment, use activity?.dataChannel(...).

    If you want to manually set the response priority (condition) of each callback event in the same Activity, you can use ChannelPriority.

    For example, if you are using one Activity binding multiple Fragment cases, this will be able to solve this problem.

    The following example

    open class BaseFragment : Fragment() {
    +
    +    /** Identify that the current Fragment is in the onResume lifecycle */
    +    var isResume = false
    +
    +    override fun onResume() {
    +        super. onResume()
    +        isResume = true
    +    }
    +
    +    override fun onPause() {
    +        super. onPause()
    +        isResume = false
    +    }
    +
    +    override fun onStop() {
    +        super. onStop()
    +        isResume = false
    +    }
    +}
    +
    +class FragmentA : BaseFragment() {
    +
    +    // Omit part of initialization code
    +    //...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // Use the custom isResume combined with the isVisible condition
    +        // To judge that the current Fragment is in the displayed state
    +        activity?.dataChannel(packageName = "com.example.demo1")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +
    +class FragmentB : BaseFragment() {
    +
    +    // Omit part of initialization code
    +    //...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // Use the custom isResume combined with the isVisible condition
    +        // To judge that the current Fragment is in the displayed state
    +        activity?.dataChannel(packageName = "com.example.demo2")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +

    Security Instructions

    In the Module environment, you can only receive the communication data sent by the Host App of the specified package name and can only send to the Host App of the specified package name, except for System Framework.

    Pay Attention

    In order to further prevent broadcast abuse, the API in the communication data will automatically specify the package name of the Host App and Module App to prevent other apps from monitoring and using broadcast to make overrun behaviors.

    + diff --git a/docs/en/api/special-features/xposed-storage.html b/docs/en/api/special-features/xposed-storage.html index e81a550cc..de65c8ffe 100644 --- a/docs/en/api/special-features/xposed-storage.html +++ b/docs/en/api/special-features/xposed-storage.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Xposed Module Data Storage | Yuki Hook API - + Xposed Module Data Storage | Yuki Hook API + -

    Xposed Module Data Storage

    This is an efficient Module App data storage solution that automatically connects SharedPreferences and XSharedPreferences.

    We need to store the data of the Module App for the Host App to call.

    At this time, we will encounter the data exchange obstacle of the native Sp storage.

    The native Xposed provides us with a XSharedPreferences for reading the Sp data of the Module App.

    Use in Activity

    Loading YukiHookModulePrefs in Activity is described here.

    Usually we can initialize it in Host App like this.

    The following example

    XSharedPreferences(BuildConfig.APPLICATION_ID)
    +    

    Xposed Module Data Storage

    This is an efficient Module App data storage solution that automatically connects SharedPreferences and XSharedPreferences.

    We need to store the data of the Module App for the Host App to call.

    At this time, we will encounter the data exchange obstacle of the native Sp storage.

    The native Xposed provides us with a XSharedPreferences for reading the Sp data of the Module App.

    Use in Activity

    Loading YukiHookModulePrefs in Activity is described here.

    Usually we can initialize it in Host App like this.

    The following example

    XSharedPreferences(BuildConfig.APPLICATION_ID)
     

    Is there a convenient and quick solution?

    At this point, you can use the extension capability of YukiHookAPI to quickly implement this function.

    When you store data in a Module App, you can use the following methods if you are currently in an Activity.

    The following example

    modulePrefs.putString("test_name", "saved_value")
     

    When you read data in a Host App, you can use the following methods.

    The following example

    val testName = prefs.getString("test_name", "default_value")
     

    You don't need to consider the module package name and a series of complicated permission configurations, everything is handled by YukiHookModulePrefs.

    To achieve localization of storage, you can specify the name of each prefs file.

    This is used in the Activity of the Module App.

    The following example

    // Recommended usage
    @@ -39,6 +39,6 @@
     // Can also be used like this
     val testName = prefs.name("specify_file_name").getString("test_name", "default_value")
     

    If your project has a lot of fixed data that needs to be stored and read, it is recommended to use PrefsData to create templates.

    Tips

    For more functions, please refer to YukiHookModulePrefs, PrefsData.

    Use in PreferenceFragment

    Loading YukiHookModulePrefs in PreferenceFragment is described here.

    If your Module App uses PreferenceFragmentCompat, you can now start migrating its extends ModulePreferenceFragment.

    Pay Attention

    You must extends ModulePreferenceFragment to implement the module storage function of YukiHookModulePrefs.

    Tips

    For more functions, please refer to ModulePreferenceFragment.

    - + diff --git a/docs/en/config/api-example.html b/docs/en/config/api-example.html index aed177b9a..22314899a 100644 --- a/docs/en/config/api-example.html +++ b/docs/en/config/api-example.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - API Basic Configs | Yuki Hook API - + API Basic Configs | Yuki Hook API + -

    API Basic Configs

    The basic configuration method of YukiHookAPI is introduced here.

    Function Configs

    Either Use as Xposed Module Configs or Use as Hook API Configs, you can specify YukiHookAPI for configuration.

    configs Method

    fun configs(initiate: Configs.() -> Unit)
    +    

    API Basic Configs

    The basic configuration method of YukiHookAPI is introduced here.

    Function Configs

    Either Use as Xposed Module Configs or Use as Hook API Configs, you can specify YukiHookAPI for configuration.

    configs Method

    fun configs(initiate: Configs.() -> Unit)
     

    The configs method implements a lambda method body on the Configs class, which you can easily call for configuration.

    Tips

    For more functions, please refer to the YukiHookAPI.configs method.

    Hooker Configs

    The most important part of an Xposed Module or Hook API is the creation and use of Hooker. YukiHookAPI provides two ways to use it.

    Created by lambda

    This solution is the simplest. If your module has few functions and a small amount of code, and does not need to be classified, it is recommended to create it in this way.

    encase Method

    fun encase(initiate: PackageParam.() -> Unit)
     

    The encase method is the beginning of all Hook life. In a Module App or a Hook process, the encase method can only be used once to create a Hooker.

    PackageParam is an important instance object of the Host App, and PackageParam is used to implement all Hook operations on the current Hook object.

    Tips

    For more functions, please refer to PackageParam.

    The encase method can be created in the onHook method using two schemes.

    Sample Code 1

    YukiHookAPI.encase {
         loadApp(name = "com.example.demo") {
    @@ -209,6 +209,6 @@
     

    Precautions when using as Hook API

    If you are using it as a Hook API, then you only need to differentiate the encase method at the entry point.

    Notice

    The encase method provides two identical methods for use as a Hook API, but with only one more parameter baseContext than the previous two.

    Method 1

    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     

    Method 2

    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
     

    The baseContext here only needs to fill in the Context you got at attachBaseContext, and other usages are exactly the same as the above.

    Pay Attention

    Never use the encase method in an Xposed way without omitting the baseContext parameter, this will lead to your Hook not work at all.

    The Resources Hook feature is not supported as Hook API.

    - + diff --git a/docs/en/config/api-exception.html b/docs/en/config/api-exception.html index 75c583fd2..954063732 100644 --- a/docs/en/config/api-exception.html +++ b/docs/en/config/api-exception.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - API Exception Handling | Yuki Hook API - + API Exception Handling | Yuki Hook API + -

    API Exception Handling

    Exceptions are the main problems often encountered in the development process. Here are some common exceptions that may be encountered during the use of YukiHookAPI and how to deal with them.

    The exception description here will only synchronize the latest API version, and the exception of the older API version will not be described again, please always keep the API version up-to-date.

    Non-Blocking Exceptions

    These exceptions will not cause the app to stop running (FC), but will print E level logs on the console, and may also stop continuing to execute related functions.

    exception

    loggerE

    Could not found XposedBridge in current space! Aborted

    Abnormal

    Your Hook Framework is not working or XposedBridge has not been successfully loaded.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    Abnormal

    You try to load the encase method in the onInit or onXposedEvent method of the Hook entry class that implements IYukiHookXposedInit.

    The following example

    class HookEntry : IYukiHookXposedInit {
    +    

    API Exception Handling

    Exceptions are the main problems often encountered in the development process. Here are some common exceptions that may be encountered during the use of YukiHookAPI and how to deal with them.

    The exception description here will only synchronize the latest API version, and the exception of the older API version will not be described again, please always keep the API version up-to-date.

    Non-Blocking Exceptions

    These exceptions will not cause the app to stop running (FC), but will print E level logs on the console, and may also stop continuing to execute related functions.

    exception

    loggerE

    Could not found any available Hook APIs in current environment! Aborted

    Abnormal

    Your Hook Framework is not working or did not successfully load the current Hook API.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    Abnormal

    You try to load the encase method in the onInit or onXposedEvent method of the Hook entry class that implements IYukiHookXposedInit.

    The following example

    class HookEntry : IYukiHookXposedInit {
     
         override fun onInit() {
             // ❗ Wrong usage
    @@ -63,7 +63,7 @@
             }
         }
     }
    -
    exception

    loggerE

    Hooking Process exception occurred

    Abnormal

    YukiHookAPI throws an exception during its own initialization hook.

    Solution

    Usually, this kind of error does not happen easily. If this error occurs, you can directly submit the log for feedback.

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    Abnormal

    YukiHookAPI encountered an unhandled exception or the entry class could not be found when trying to load the hook entry class onInit or onHook method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    YukiHookAPI bind initZygote failed

    Abnormal

    YukiHookAPI encountered an unhandled exception when trying to load the Xposed native interface initZygote method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    Abnormal

    YukiHookAPI An error occurred while trying to do a Resources Hook.

    Solution

    Please double check the error log for details.

    If a Resources$NotFoundException occurs, you may be looking for an incorrect Resources Id.

    If ClassNotFound or NoClassDefFoundError occurs, it may be that Hook Framework does not support Resources Hook.

    exception

    loggerE

    HookClass [NAME] not found

    Abnormal

    The Class currently being hooked was not found.

    Solution

    Please check if the target Class exists, to ignore this error use the ignoredHookClassNotFoundFailure method.

    exception

    loggerE

    Hook Member [NAME] failed

    Abnormal

    An error occurred while hooking the target method, constructor.

    Solution

    This problem is usually caused by Hook Framework.

    Please check the corresponding log content.

    If the problem persists, please bring detailed logs for feedback.

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class have been set.

    Solution

    Please check the previous error log before this error occurs, maybe there is an error that the method and constructor cannot be found when searching for methods and constructors.

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class are not set.

    The following example

    injectMember {
    +
    exception

    loggerE

    An exception occurred in the Hooking Process of YukiHookAPI

    Abnormal

    YukiHookAPI exception occurred while loading Xposed entry method.

    Solution

    This is an exception summary.

    If any exception occurs in your current Hook Process (Hook Process crashes), it will be printed to the console using this method.

    Please trace the stack where the exception occurred to locate your code problem.

    exception

    loggerE

    An exception occurred when hooking internal function

    Abnormal

    YukiHookAPI throws an exception during its own initialization hook.

    Solution

    Usually, this kind of error does not happen easily. If this error occurs, you can directly submit the log for feedback.

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    Abnormal

    YukiHookAPI encountered an unhandled exception or the entry class could not be found when trying to load the hook entry class onInit or onHook method.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    An exception occurred when YukiHookAPI loading Xposed Module

    Abnormal

    YukiHookAPI encountered an unhandled exception when trying to load a Xposed Module using the Xposed native interface.

    Solution

    Usually, this kind of error does not occur easily.

    If this error occurs, please check the log printed on the console to locate the problem.

    After confirming that the problem is not caused by your own code, you can submit the log for feedback.

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    Abnormal

    YukiHookAPI An error occurred while trying to do a Resources Hook.

    Solution

    Please double check the error log for details.

    If a Resources$NotFoundException occurs, you may be looking for an incorrect Resources Id.

    If ClassNotFound or NoClassDefFoundError occurs, it may be that Hook Framework does not support Resources Hook.

    exception

    loggerE

    HookClass [NAME] not found

    Abnormal

    The Class currently being hooked was not found.

    Solution

    Please check if the target Class exists, to ignore this error use the ignoredHookClassNotFoundFailure method.

    exception

    loggerE

    Hook Member [NAME] failed

    Abnormal

    An error occurred while hooking the target method, constructor.

    Solution

    This problem is usually caused by Hook Framework.

    Please check the corresponding log content.

    If the problem persists, please bring detailed logs for feedback.

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class have been set.

    Solution

    Please check the previous error log before this error occurs, maybe there is an error that the method and constructor cannot be found when searching for methods and constructors.

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    Abnormal

    After the Hook is executed, the member of the Hook is null and the target Hook method and constructed class are not set.

    The following example

    injectMember {
         // There are no search conditions for methods and constructors that require hooks
         afterHook {
             // ...
    @@ -78,7 +78,7 @@
             // ...
         }
     }
    -
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    Abnormal

    HookParam.result is set in the Hook callback method body or replaceHook is used but the return value type of the hooked method does not match the original return value type.

    The following example

    Suppose this is the method being Hooked.

    private boolean test()
    +
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    Abnormal

    HookParam.result is set in the Hook callback method body or replaceHook is used but the return value type of the hooked method does not match the original return value type.

    The following example

    Suppose this is the method being Hooked.

    private boolean test()
     

    Below is an error case.

    injectMember {
         method {
             name = "test"
    @@ -95,7 +95,7 @@
         // <Scenario 3> Use the wrong type directly, the original type is Boolean
         replaceTo(any = 0)
     }
    -

    Notice

    If the above scenario occurs in beforeHook or afterHook, it will cause the Host App to throw an exception from XposedBridge (which will expose the fact of being Hooked).

    Solution

    Please confirm the correct return value type of the current Hook method, modify it and try again.

    exception

    loggerE

    Hook initialization failed because got an Exception

    Abnormal

    An arbitrary exception occurred while preparing the Hook.

    Solution

    This is a reminder that an exception occurred during the Hook preparation stage, please carefully check what the specific exception is to re-determine the problem.

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    Abnormal

    An arbitrary exception occurred at the start of the Hook.

    Solution

    This is a reminder that an exception occurred at the beginning of the Hook, please check carefully what the specific exception is to re-determine the problem.

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    Abnormal

    A disallowed parameter type was set when looking up methods, constructors, and variables.

    The following example

    // Find a method
    +

    Notice

    If the above scenario occurs in beforeHook or afterHook, it will cause the Host App to throw an exception from XposedBridge (which will expose the fact of being Hooked).

    Solution

    Please confirm the correct return value type of the current Hook method, modify it and try again.

    exception

    loggerE

    Hook initialization failed because got an Exception

    Abnormal

    An arbitrary exception occurred while preparing the Hook.

    Solution

    This is a reminder that an exception occurred during the Hook preparation stage, please carefully check what the specific exception is to re-determine the problem.

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    Abnormal

    An arbitrary exception occurred at the start of the Hook.

    Solution

    This is a reminder that an exception occurred at the beginning of the Hook, please check carefully what the specific exception is to re-determine the problem.

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    Abnormal

    A disallowed parameter type was set when looking up methods, constructors, and variables.

    The following example

    // Find a method
     method {
         // ❗ Invalid type example is set
         param(false, 1, 0)
    @@ -123,40 +123,40 @@
         // ✅ Examples of correct usage
         type = BooleanType
     }
    -
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    Abnormal

    The target method, constructor, and variable were not found when looking for methods, constructors, and variables.

    Solution

    Please confirm that your search criteria can correctly match the specified methods, constructors and variables in the target Class.

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    Abnormal

    When using RemedyPlan to search for methods, constructors, and variables, the methods, constructors, and variables are still not found.

    Solution

    Please confirm the RemedyPlan parameter you set and the Class that exists in the Host App, and try again.

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    Abnormal

    No conditions are set when looking for methods, constructors, and variables.

    The following example

    method {
    +
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    Abnormal

    The target method, constructor, and variable were not found when looking for methods, constructors, and variables.

    Solution

    Please confirm that your search criteria can correctly match the specified methods, constructors and variables in the target Class.

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    Abnormal

    When using RemedyPlan to search for methods, constructors, and variables, the methods, constructors, and variables are still not found.

    Solution

    Please confirm the RemedyPlan parameter you set and the Class that exists in the Host App, and try again.

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    Abnormal

    No conditions are set when looking for methods, constructors, and variables.

    The following example

    method {
         // No conditions are set here
     }
    -

    Solution

    Please complete your search criteria and try again.

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object to be searched for was not found via ClassLoader.searchClass or PackageParam.searchClass.

    The following example

    customClassLoader?.searchClass {
    +

    Solution

    Please complete your search criteria and try again.

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object to be searched for was not found via ClassLoader.searchClass or PackageParam.searchClass.

    The following example

    customClassLoader?.searchClass {
         from(...)
         // ...
     }.get()
    -

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the Class and bytecode object characteristics in the Dex and try again.

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The methods, constructors, and variables that need to be found cannot be found by specifying conditions.

    The following example

    TargetClass.method {
    +

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the Class and bytecode object characteristics in the Dex and try again.

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The methods, constructors, and variables that need to be found cannot be found by specifying conditions.

    The following example

    TargetClass.method {
         name = "test"
         param(BooleanType)
     }
    -

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the bytecode object characteristics in the Class, and try again.

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    Abnormal

    Incorrect use of VagueType in Method, Constructor lookup conditions.

    The following example

    TargetClass.method {
    +

    Solution

    This is a security exception, please check the conditions you set, use the relevant tools to view the bytecode object characteristics in the Class, and try again.

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    Abnormal

    Incorrect use of VagueType in Method, Constructor lookup conditions.

    The following example

    TargetClass.method {
         name = "test"
         // <Scenario 1>
         param(VagueType)
         // <Scenario 2>
         param(VagueType, VagueType ...)
     }
    -

    Solution

    VagueType cannot be completely filled in method and constructor parameters. If there is such a requirement, please use paramCount.

    exception

    loggerE

    Field match type class is not found

    Abnormal

    An instance of Class for type was not found in the lookup criteria set when looking up the variable.

    The following example

    field {
    +

    Solution

    VagueType cannot be completely filled in method and constructor parameters. If there is such a requirement, please use paramCount.

    exception

    loggerE

    Field match type class is not found

    Abnormal

    An instance of Class for type was not found in the lookup criteria set when looking up the variable.

    The following example

    field {
         name = "test"
         // Assume that the Class of the type set here does not exist
         type = "com.example.TestClass"
     }
    -

    Solution

    Please check if Class of type in the lookup condition exists and try again.

    exception

    loggerE

    Method match returnType class is not found

    Abnormal

    An instance of Class of returnType was not found in the search criteria set when looking up the method.

    The following example

    method {
    +

    Solution

    Please check if Class of type in the lookup condition exists and try again.

    exception

    loggerE

    Method match returnType class is not found

    Abnormal

    An instance of Class of returnType was not found in the search criteria set when looking up the method.

    The following example

    method {
         name = "test"
         // Assume that the Class of returnType set here does not exist
         returnType = "com.example.TestClass"
     }
    -

    Solution

    Please check if Class of returnType in the lookup condition exists and try again.

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    Abnormal

    The Class instance subscripted by the index number of param was not found in the search conditions set when searching for methods and constructors.

    method {
    +

    Solution

    Please check if Class of returnType in the lookup condition exists and try again.

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    Abnormal

    The Class instance subscripted by the index number of param was not found in the search conditions set when searching for methods and constructors.

    method {
         name = "test"
         // Assume that the Class with subscript "No.1" set here does not exist
    -    param(StringType, "com.example.TestClass", BooleanType)
    +    param(StringClass, "com.example.TestClass", BooleanType)
     }
    -

    Solution

    Please check if the Class subscripted by the index number of param in the lookup condition exists and try again.

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    Abnormal

    No conditions were set when looking for Resources.

    The following example

    // Case 1
    +

    Solution

    Please check if the Class subscripted by the index number of param in the lookup condition exists and try again.

    exception

    loggerE

    Invoke original Member [MEMBER] failed

    Abnormal

    An error occurred when using HookParam.callOriginal, HookParam.invokeOriginal, method { ... }.get(...).original() to call the original method without Hook.

    Solution

    Under normal circumstances, this error will basically not occur.

    If this error occurs, it may be a problem with the currently used Hook Framework.

    After troubleshooting your own code problems, please provide detailed logs for feedback.

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    Abnormal

    No conditions were set when looking for Resources.

    The following example

    // Case 1
     conditions {
         // No conditions are set here
     }
    @@ -165,13 +165,13 @@
         name = "test"
         // The type condition is missing here
     }
    -

    Solution

    The Hook of Resources is not a Hook similar to a method.

    It must have a complete name and type description in order to find it successfully.

    Please complete the search conditions and try again.

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    Abnormal

    An exception of the wrong type occurred while Hooking Resources.

    Solution

    YukiHookAPI will try to load Resources Hook in initZygote and handleInitPackageResources.

    If all loading fails, this exception may occur.

    The current Hook Framework needs to support and enable the Resources Hook function, please check and try again.

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    Abnormal

    An arbitrary exception occurred while Hooking Resources.

    Solution

    This is a summary of exceptions, please check down the log for the specific exception, such as the problem that the Resources Id cannot be found.

    exception

    loggerE

    Received action "ACTION" failed

    Abnormal

    Callback broadcast event exception when using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error basically does not occur.

    Once an error occurs, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    Abnormal

    Sending a broadcast when using YukiHookDataChannel got an empty context instance.

    Solution

    Under normal circumstances, this error basically does not occur.

    In the latest version, the problems that may occur when the host is used have been fixed.

    If the latest version still has errors, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    Abnormal

    An exception occurred when injecting Module App's Resources using injectModuleAppResources in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur. After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Please check the next error log after this error occurs.

    Maybe some problems may have occurred in the configuration parameters.

    If you cannot find the description of the relevant error log, after eliminating the problem of your own code, please bring the detailed log for feedback.

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur, but according to the difference of the system version, no detailed testing has been done.

    After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    Abnormal

    Invalid parameters were filled in when injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    The following example

    // ❗ The content filled in here is just an example
    +

    Solution

    The Hook of Resources is not a Hook similar to a method.

    It must have a complete name and type description in order to find it successfully.

    Please complete the search conditions and try again.

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    Abnormal

    An exception of the wrong type occurred while Hooking Resources.

    Solution

    YukiHookAPI will try to load Resources Hook in initZygote and handleInitPackageResources.

    If all loading fails, this exception may occur.

    The current Hook Framework needs to support and enable the Resources Hook function, please check and try again.

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    Abnormal

    An arbitrary exception occurred while Hooking Resources.

    Solution

    This is a summary of exceptions, please check down the log for the specific exception, such as the problem that the Resources Id cannot be found.

    exception

    loggerE

    Received action "ACTION" failed

    Abnormal

    Callback broadcast event exception when using YukiHookDataChannel.

    Solution

    This exception is mostly caused by some related exceptions.

    Please check whether there is any problem in your own code.

    After troubleshooting your own code, please bring detailed logs to give feedback.

    exception

    loggerE

    Received data type TYPE is not a vailed YukiHookDataChannel's data

    Abnormal

    When using YukiHookDataChannel, the callback broadcast received data that does not belong to YukiHookDataChannel.

    Solution

    In order to ensure data security, YukiHookDataChannel will wrap the sent data, any third-party broadcast events cannot be received by YukiHookDataChannel, please check whether your code is correct.

    exception

    loggerE

    Unsupported segments data key of "KEY"'s type

    Abnormal

    Callback broadcast received unsupported segments data type when using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error cannot occur, because the segments data type supported by YukiHookDataChannel is fixed and will not change dynamically.

    If this happens, please check whether the API-related code has been changed.

    exception

    loggerE

    YukiHookDataChannel cannot merge this segments data key of "KEY"

    Abnormal

    When using YukiHookDataChannel, the callback broadcast received segments data that could not be processed, so the segments data could not be merged.

    Solution

    Under normal circumstances, this error will basically not occur, unless you receive broadcasts that are continuously sent or repeatedly sent (timing exceptions) or you set the wrong generic type when receiving data, after troubleshooting your own code problems, please bring detailed logs give feedback.

    exception

    loggerE

    YukiHookDataChannel cannot calculate the byte size of the data key of "KEY" to be sent, so this data cannot be sent

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    Abnormal

    Failed to calculate data size when sending broadcast data using YukiHookDataChannel.

    Solution

    Under normal circumstances, this error will basically not occur.

    After troubleshooting your own code problems, please bring detailed logs for feedback.

    exception

    loggerE

    YukiHookDataChannel cannot send this data key of "KEY" type TYPE, because it is too large (total TOTAL KB, limit LIMIT KB) and cannot be segmented

    SUGGESTION_MESSAGE

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    Abnormal

    When using YukiHookDataChannel to send broadcast data, the data is too large, but this data type does not support being sent in segments.

    Solution

    When the data you send exceeds the upper limit of the system broadcast, YukiHookDataChannel will send the data in segments by default, but only supports processing List, Map, Set, String automatic segmentation function for common types.

    Tips

    If you still want to use this feature, please refer to YukiHookDataChannel.NameSpace.allowSendTooLargeData method.

    But it is strongly recommended not to do this, this may cause the system to not allow too large data to be sent and cause the app crash.

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    Abnormal

    Sending a broadcast when using YukiHookDataChannel got an empty context instance.

    Solution

    Under normal circumstances, this error basically does not occur.

    In the latest version, the problems that may occur when the host is used have been fixed.

    If the latest version still has errors, after eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    Abnormal

    An exception occurred when injecting Module App's Resources using injectModuleAppResources in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur. After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    You cannot inject module resources into yourself

    Abnormal

    Use injectModuleAppResources in the (Xposed) Host environment (the Module App's own Xposed Environment) to inject the Module App's own resources into itself.

    Solution

    Since the Module App itself can also be Hooked by itself, you cannot inject yourself into the Module App itself (you cannot recurse its own resources).

    If you must obtain the resources of the Module App itself, please use it directly without any other operations.

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Please check the next error log after this error occurs.

    Maybe some problems may have occurred in the configuration parameters.

    If you cannot find the description of the relevant error log, after eliminating the problem of your own code, please bring the detailed log for feedback.

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    Abnormal

    An exception occurred when injecting a Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    Solution

    Under normal circumstances, this error basically does not occur, but according to the difference of the system version, no detailed testing has been done.

    After eliminating the problem of your own code, please bring detailed logs for feedback.

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    Abnormal

    Invalid parameters were filled in when injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment.

    The following example

    // ❗ The content filled in here is just an example
     // And the proxy is filled with invalid parameters that cannot be understood
     registerModuleAppActivities(proxy = false)
    -

    Solution

    The proxy parameter in the method only accepts String, CharSequence, Class types, please refer to the related usage method to fill in the method parameters correctly.

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    Abnormal

    When injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment, the Host App's launching Activity cannot be found.

    The following example

    // Register directly with default parameters
    +

    Solution

    The proxy parameter in the method only accepts String, CharSequence, Class types, please refer to the related usage method to fill in the method parameters correctly.

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    Abnormal

    When injecting Module App's Activity using registerModuleAppActivities in a (Xposed) Host environment, the Host App's launching Activity cannot be found.

    The following example

    // Register directly with default parameters
     registerModuleAppActivities()
    -

    Solution

    The default parameter (no parameter) can only be used for the app that can be launched.

    If the app does not declare the startup entry Activity, you need to manually specify the proxy parameter of the method.

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    Abnormal

    When injecting Module App's Activity with registerModuleAppActivities in a (Xposed) Host environment, the Activity filled with the parameter proxy cannot be found.

    The following example

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    -

    Solution

    Please make sure that the Activity name you fill in really and effectively exists in the Host App, and the target Class extends Activity.

    Blocking Exceptions

    These exceptions will directly cause the app to stop running (FC), at the same time print E level logs on the console, and also cause the Hook process to "die".

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    Abnormal

    You have invoked the Class object of the API itself using YukiHookAPI related reflection or Hook function.

    The following example

    // <Scenario 1>
    +

    Solution

    The default parameter (no parameter) can only be used for the app that can be launched.

    If the app does not declare the startup entry Activity, you need to manually specify the proxy parameter of the method.

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    Abnormal

    When injecting Module App's Activity with registerModuleAppActivities in a (Xposed) Host environment, the Activity filled with the parameter proxy cannot be found.

    The following example

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    +

    Solution

    Please make sure that the Activity name you fill in really and effectively exists in the Host App, and the target Class extends Activity.

    exception

    loggerE

    You cannot register Activity Proxy into yourself

    Abnormal

    Use registerModuleAppActivities to inject the Module App's own Activity into itself in the (Xposed) Host environment (the Module App's own Xposed Environment).

    Solution

    Since the Module App itself can also be Hooked by itself, you cannot inject yourself into the Module App itself (you cannot recurse its own resources).

    If you must obtain the resources of the Module App itself, please use it directly without any other operations.

    exception

    loggerE

    Activity Proxy only support for Android 7.0 (API 24) or higher

    Abnormal

    Use registerModuleAppActivities in the (Xposed) Host environment but the current system version does not meet the minimum requirements of Android 7.0 (API 24).

    Solution

    Activity Proxy only supports systems higher than or equal to Android 7.0 (API 24).

    Please try to upgrade your system or make requirements for the minimum api version compatibility of the Module App, for example, set the minimum api to 24.

    exception

    loggerE

    An exception occurred during AppLifecycle event

    Abnormal

    Use onAppLifecycle in the (Xposed) Host environment to listen for exceptions during the Host App's lifecycle.

    Solution

    This exception is thrown in onAppLifecycle.

    Since you set the parameter isOnFailureThrowToApp = false, the exception is not thrown in the Host App but printed in the (Xposed) Host environment.

    This is not an API exception, please be careful check your own code for problems.

    Blocking Exceptions

    These exceptions will directly cause the app to stop running (FC), at the same time print E level logs on the console, and also cause the Hook process to "die".

    exception

    IllegalStateException

    YukiHookAPI cannot support current Hook API or cannot find any available Hook APIs in current environment

    Abnormal

    YukiHookAPI does not support the Hook API used by the current environment or there is no Hook API that can be called.

    Solution

    Please make sure you have loaded the encase method of YukiHookAPI in the correct place. For details, please refer to Use as Xposed Module Configs and Use as Hook API Configs.

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    Abnormal

    You have invoked the Class object of the API itself using YukiHookAPI related reflection or Hook function.

    The following example

    // <Scenario 1>
     YukiHookAPI.current()
     // <Scenario 2>
     PackageParam::class.java.hook {
    @@ -180,7 +180,7 @@
     // <Scenario 3>
     MethodFinder::class.java.method {
         name = "name"
    -    param(StringType)
    +    param(StringClass)
     }.get().call("name")
     // ...
     

    Solution

    Please check the code section for errors, such as the case below.

    The following example

    YourClass.method {
    @@ -192,7 +192,7 @@
         // ...
         // ✅ The correct way to use it, assuming this method has no parameters
     }.get(instance).call().current()
    -

    Inlining, reflection, Hook YukiHookAPI's own Class and internal functions are not allowed to prevent errors.

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    Abnormal

    You tried to hook a Class object in the list of dangerous behaviors, such as Class, ClassLoader, Method.

    The following example

    // <Scenario 1>
    +

    Inlining, reflection, Hook YukiHookAPI's own Class and internal functions are not allowed to prevent errors.

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    Abnormal

    You tried to hook a Class object in the list of dangerous behaviors, such as Class, ClassLoader, Method.

    The following example

    // <Scenario 1>
     JavaClassLoader.hook {
         // ...
     }
    @@ -205,18 +205,18 @@
         // ...
     }
     // ...
    -

    Solution

    These functions are internal to the system, they should not be hooked, may not be supported on some Hook Frameworks, and may cause other errors, please try to replace the hook point.

    Tips

    If you still want to use this feature, please refer to YukiMemberHookCreator.useDangerousOperation.

    But It is strongly recommended not to do this, please do not report any problems, all the consequences will be borne by yourself.

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object you were looking for was not found via String.toClass(...) or classOf<...>().

    The following example

    "com.demo.Test".toClass()
    -

    Solution

    Please check if the Class matched by the current string or entity exists in the current ClassLoader and try again.

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    Abnormal

    Use ClassLoader.searchClass or PackageParam.searchClass to find Class but currently ClassLoader does not extends BaseDexClassLoader.

    Solution

    This situation basically does not exist, unless the current app references a Non-ART platform executable (which not realistic) or the current ClassLoader is null.

    exception

    IllegalStateException

    Failed to got SystemContext

    Abnormal

    systemContext was called in the Host App but the instance object was not successfully obtained.

    The following example

    encase {
    +

    Solution

    These functions are internal to the system, they should not be hooked, may not be supported on some Hook Frameworks, and may cause other errors, please try to replace the hook point.

    Tips

    If you still want to use this feature, please refer to YukiMemberHookCreator.useDangerousOperation method.

    But It is strongly recommended not to do this, please do not report any problems, all the consequences will be borne by yourself.

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    Abnormal

    The Class object you were looking for was not found via String.toClass(...) or classOf<...>().

    The following example

    "com.demo.Test".toClass()
    +

    Solution

    Please check if the Class matched by the current string or entity exists in the current ClassLoader and try again.

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    Abnormal

    Use ClassLoader.searchClass or PackageParam.searchClass to find Class but currently ClassLoader does not extends BaseDexClassLoader.

    Solution

    This situation basically does not exist, unless the current app references a Non-ART platform executable (which not realistic) or the current ClassLoader is null.

    exception

    IllegalStateException

    Failed to got SystemContext

    Abnormal

    systemContext was called in the Host App but the instance object was not successfully obtained.

    The following example

    encase {
         // This variable is called
         systemContext...
     }
    -

    Solution

    This situation should not exist, since systemContext is obtained from ActivityThread through reflection, unless the system process fails, the obtained object will not be null.

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    Abnormal

    The first case

    The appContext of the ModuleApplication is called within the Hook App.

    The following example

    encase {
    +

    Solution

    This situation should not exist, since systemContext is obtained from ActivityThread through reflection, unless the system process fails, the obtained object will not be null.

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    Abnormal

    The first case

    The appContext of the ModuleApplication is called within the Hook App.

    The following example

    encase {
         // This variable is called
         ModuleApplication.appContext...
     }
     

    The second case

    appContext was called when using ModuleApplication but the app may have been destroyed or not started correctly.

    The following example

    // This variable is called but the app may have been destroyed or not started correctly
     ModuleApplication.appContext...
    -

    Solution

    The first case

    You can only use the appContext of ModuleApplication in the Module App, please use the appContext in the PackageParam in the Host App, please make sure you use it correctly.

    The second case

    This situation basically does not exist, because appContext is assigned in onCreate, unless the onCreate method of the parent class is called by reflection before multi-process concurrent startup or app is not started and completed.

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    Abnormal

    YukiHookModulePrefs is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
    +

    Solution

    The first case

    You can only use the appContext of ModuleApplication in the Module App, please use the appContext in the PackageParam in the Host App, please make sure you use it correctly.

    The second case

    This situation basically does not exist, because appContext is assigned in onCreate, unless the onCreate method of the parent class is called by reflection before multi-process concurrent startup or app is not started and completed.

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    Abnormal

    YukiHookModulePrefs is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -226,11 +226,11 @@
             super.attachBaseContext(base)
         }
     }
    -

    Solution

    You can only use YukiHookModulePrefs when Use as Xposed Module Configs, please use the native Sp storage in the Hook's own app.

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    Abnormal

    Using YukiHookModulePrefs in (Xposed) Host environment but unable to get XSharedPreferences object.

    The following example

    encase {
    +

    Solution

    You can only use YukiHookModulePrefs when Use as Xposed Module Configs, please use the native Sp storage in the Hook's own app.

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    Abnormal

    Using YukiHookModulePrefs in (Xposed) Host environment but unable to get XSharedPreferences object.

    The following example

    encase {
         // This variable is called
         prefs...
     }
    -

    Solution

    Under normal circumstances, this problem does not occur.

    If you continue to fail to obtain the XSharedPreferences object, it may be that the Hook Framework you are using does not support this function or has an error.

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    Abnormal

    YukiHookDataChannel is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
    +

    Solution

    Under normal circumstances, this problem does not occur.

    If you continue to fail to obtain the XSharedPreferences object, it may be that the Hook Framework you are using does not support this function or has an error.

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    Abnormal

    YukiHookDataChannel is used in Hook's own app (not Xposed Module).

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -242,7 +242,7 @@
             super.attachBaseContext(base)
         }
     }
    -

    Solution

    You can only use YukiHookDataChannel when Use as Xposed Module Configs.

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    Abnormal

    YukiHookDataChannel is used in a non-Activity context of a Module App.

    Solution

    You can only use YukiHookDataChannel in Activity or Fragment.

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    Abnormal

    When using YukiHookModulePrefs or YukiHookDataChannel in the Hook process, the modulePackageName at load time cannot be read, resulting in the package name of the own Module App cannot be determined.

    Solution

    Please read the help document here carefully, and configure the Module App's Hook entry class package name correctly.

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    Abnormal

    YukiHookModulePrefs is used in the Module App to store data but no Context instance is passed in.

    The following example

    class MainActivity : AppCompatActivity() {
    +

    Solution

    You can only use YukiHookDataChannel when Use as Xposed Module Configs.

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    Abnormal

    YukiHookDataChannel is used in a non-Activity context of a Module App.

    Solution

    You can only use YukiHookDataChannel in Activity or Fragment.

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    Abnormal

    When using YukiHookModulePrefs or YukiHookDataChannel in the Hook process, the modulePackageName at load time cannot be read, resulting in the package name of the own Module App cannot be determined.

    Solution

    Please read the help document here carefully, and configure the Module App's Hook entry class package name correctly.

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    Abnormal

    YukiHookModulePrefs is used in the Module App to store data but no Context instance is passed in.

    The following example

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    @@ -259,7 +259,7 @@
             modulePrefs.getBoolean("test_data")
         }
     }
    -
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    Abnormal

    An unsupported storage type was passed in when using the get or put methods of YukiHookModulePrefs or the wait or put methods of YukiHookDataChannel.

    Solution

    The supported types of YukiHookModulePrefs are only String, Set<String>, Int, Float, Long, Boolean, please pass in the supported types.

    The supported types of YukiHookDataChannel are the types restricted by Intent.putExtra, please pass in the supported types.

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    Abnormal

    The variable array variable parameter that needs to be filled is missing in loadApp, loadZygote, loadSystem, withProcess.

    The following example

    // <Scenario 1>
    +
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    Abnormal

    An unsupported storage type was passed in when using the get or put methods of YukiHookModulePrefs or the wait or put methods of YukiHookDataChannel.

    Solution

    The supported types of YukiHookModulePrefs are only String, Set<String>, Int, Float, Long, Boolean, please pass in the supported types.

    The supported types of YukiHookDataChannel are the types restricted by Intent.putExtra, please pass in the supported types.

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    Abnormal

    The variable array variable parameter that needs to be filled is missing in loadApp, loadZygote, loadSystem, withProcess.

    The following example

    // <Scenario 1>
     loadApp()
     // <Scenario 2>
     loadZygote()
    @@ -267,18 +267,18 @@
     loadSystem()
     // <Scenario 4>
     withProcess()
    -

    Solution

    Please see the usage in PackageParam to use this function correctly.

    exception

    IllegalStateException

    YukiHookDataChannel cannot be used in zygote

    Abnormal

    YukiHookDataChannel is used in loadZygote.

    The following example

    loadZygote {
    +

    Solution

    Please see the usage in PackageParam to use this function correctly.

    exception

    IllegalStateException

    YukiHookDataChannel cannot be used in zygote

    Abnormal

    YukiHookDataChannel is used in loadZygote.

    The following example

    loadZygote {
         // This variable is called
         dataChannel...
     }
    -

    Solution

    YukiHookDataChannel can only be used in loadSystem, loadApp.

    exception

    IllegalStateException

    Custom Hooking Members is empty

    Abnormal

    members() is called in MemberHookCreator but the Member instance that requires the Hook is not set.

    The following example

    injectMember {
    +

    Solution

    YukiHookDataChannel can only be used in loadSystem, loadApp.

    exception

    IllegalStateException

    Custom Hooking Members is empty

    Abnormal

    members() is called in MemberHookCreator but the Member instance that requires the Hook is not set.

    The following example

    injectMember {
         // Method parameters in parentheses are left blank
         members()
         afterHook {
             // ...
         }
     }
    -

    Solution

    To use members() to set a custom Hook method, you must ensure that the Member array object in its method parameter cannot be empty.

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    Abnormal

    args().last() is called in HookParam but the target param is empty or the index in args is set to a value less than 0.

    The following example

    injectMember {
    +

    Solution

    To use members() to set a custom Hook method, you must ensure that the Member array object in its method parameter cannot be empty.

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    Abnormal

    args().last() is called in HookParam but the target param is empty or the index in args is set to a value less than 0.

    The following example

    injectMember {
         // ...
         afterHook {
             // Assume param is empty
    @@ -287,7 +287,7 @@
             args(index = -5)...
         }
     }
    -

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, and the subscript of args cannot be set to a value less than 0.

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    Abnormal

    An object that calls an instance variable or instance method in a HookParam but cannot get the current instance.

    The following example

    injectMember {
    +

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, and the subscript of args cannot be set to a value less than 0.

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    Abnormal

    An object that calls an instance variable or instance method in a HookParam but cannot get the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
    @@ -296,35 +296,35 @@
             instance<Any>()...
         }
     }
    -

    Solution

    Please confirm whether the method of your Hook is a static type.

    The static type method has no instance and cannot use this function.

    If it is not a static method, please check whether the instance has been destroyed.

    exception

    IllegalStateException

    Current hooked Member args is null

    Abnormal

    The args variable is called in HookParam, but the parameter array of the current instance method and constructor cannot be obtained.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a static type.

    The static type method has no instance and cannot use this function.

    If it is not a static method, please check whether the instance has been destroyed.

    exception

    IllegalStateException

    Current hooked Member args is null

    Abnormal

    The args variable is called in HookParam, but the parameter array of the current instance method and constructor cannot be obtained.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             args...
         }
     }
    -

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is null

    Abnormal

    Call the member variable in HookParam but cannot get the method and constructor instance of the current instance.

    The following example

    injectMember {
    +

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is null

    Abnormal

    Call the member variable in HookParam but cannot get the method and constructor instance of the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             member...
         }
     }
    -

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is not a Method

    Abnormal

    Calling the method variable in HookParam but not getting the method instance of the current instance.

    The following example

    injectMember {
    +

    Solution

    This kind of problem generally does not occur.

    If this problem does occur, please bring detailed logs for feedback.

    exception

    IllegalStateException

    Current hooked Member is not a Method

    Abnormal

    Calling the method variable in HookParam but not getting the method instance of the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             method...
         }
     }
    -

    Solution

    Please confirm whether the method of your Hook is a constructor or a common method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    Abnormal

    A method instance for calling a constructor variable in a HookParam but not getting the current instance.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a constructor or a common method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    Abnormal

    A method instance for calling a constructor variable in a HookParam but not getting the current instance.

    The following example

    injectMember {
         // ...
         afterHook {
             // This variable is called
             constructor...
         }
     }
    -

    Solution

    Please confirm whether the method of your Hook is a common method or a constructor method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    Abnormal

    Invoking the instance method in a HookParam specifies the wrong type.

    The following example

    injectMember {
    +

    Solution

    Please confirm whether the method of your Hook is a common method or a constructor method and use the method of the corresponding type to obtain the specified instance.

    If you do not know the type of the bytecode, you can directly use member to obtain it.

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    Abnormal

    Invoking the instance method in a HookParam specifies the wrong type.

    The following example

    injectMember {
         // ...
         afterHook {
             // The type is cast to Activity
    @@ -332,14 +332,14 @@
             instance<Activity>()...
         }
     }
    -

    Solution

    Please confirm the correct type of the current Hook instance and refill the type in the generic.

    If you are not sure, please use Any or directly use the instance variable.

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    Abnormal

    The ArgsModifyer.set method is called in HookParam but the method parameter array for the current instance is empty.

    The following example

    injectMember {
    +

    Solution

    Please confirm the correct type of the current Hook instance and refill the type in the generic.

    If you are not sure, please use Any or directly use the instance variable.

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    Abnormal

    The ArgsModifyer.set method is called in HookParam but the method parameter array for the current instance is empty.

    The following example

    injectMember {
         // ...
         afterHook {
             // This method is called
             args(...).set(...)
         }
     }
    -

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, otherwise you cannot use this function.

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    Abnormal

    Calling the ArgsModifyer.set method in HookParam specifies an array number beyond the subscript of the method parameter.

    The following example

    injectMember {
    +

    Solution

    Please make sure that the number of method parameters of the target method and constructor of your Hook is not empty, otherwise you cannot use this function.

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    Abnormal

    Calling the ArgsModifyer.set method in HookParam specifies an array number beyond the subscript of the method parameter.

    The following example

    injectMember {
         // ...
         afterHook {
             // The subscript starts from 0
    @@ -347,20 +347,16 @@
             args(index = 6).set(...)
         }
     }
    -

    Solution

    Please confirm the target method of your Hook, the number of method parameters of the constructor, and reset the array subscript.

    exception

    IllegalStateException

    PackageParam got null ClassLoader

    Abnormal

    The appClassLoader variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
    -    // This variable is called
    -    appClassLoader...
    -}
    -

    Solution

    This situation hardly exists, unless there is a problem with the Host App where the Module App is loaded or the target Hook Framework itself.

    If this problem does occur, please provide feedback with detailed logs.

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    Abnormal

    The moduleAppResources variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
    +

    Solution

    Please confirm the target method of your Hook, the number of method parameters of the constructor, and reset the array subscript.

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    Abnormal

    The moduleAppResources variable was called in PackageParam but the instance object could not be obtained.

    The following example

    encase {
         // This variable is called
         moduleAppResources...
     }
    -

    Solution

    moduleAppResources requires the current Hook Framework to support the initZygote function, please check and try again.

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    Abnormal

    All Class were not found when creating indeterminate Class objects using VariousClass.

    Solution

    After checking whether there is a matching Class in the Host App of the current Hook, try again.

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    Abnormal

    The instanceClass variable is called in the hook method body other than the onPrepareHook method and the Class of the current Hook does not exist.

    The following example

    TargetClass.hook {
    +

    Solution

    This situation hardly exists, unless there is a problem with the target Hook Framework itself.

    If this problem does occur, please provide feedback with detailed logs.

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    Abnormal

    All Class were not found when creating indeterminate Class objects using VariousClass.

    Solution

    After checking whether there is a matching Class in the Host App of the current Hook, try again.

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    Abnormal

    The instanceClass variable is called in the hook method body other than the onPrepareHook method and the Class of the current Hook does not exist.

    The following example

    TargetClass.hook {
         // The possible case is that the instanceClass variable
         // Who is called in the body of the non-onPrepareHook method to print the log
         loggerD(msg = "$instanceClass hook start")
     }
    -

    Solution

    Using instanceClass directly in hook is very dangerous, if the Class does not exist, it will directly cause the Hook process to "die".

    For details, please refer to Status Monitor.

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    Abnormal

    currentView was called in the layout hook callback but no instance object was obtained.

    The following example

    injectResource {
    +

    Solution

    Using instanceClass directly in hook is very dangerous, if the Class does not exist, it will directly cause the Hook process to "die".

    For details, please refer to Status Monitor.

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    Abnormal

    currentView was called in the layout hook callback but no instance object was obtained.

    The following example

    injectResource {
         conditions {
             name = "activity_main"
             layout()
    @@ -370,9 +366,9 @@
             currentView...
         }
     }
    -

    Solution

    This situation basically does not exist, unless the current Activity of the Host App has been destroyed or there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    XResForwarder is invalid

    Abnormal

    resources was called in YukiResForwarder but no instance object was obtained.

    The following example

    // This variable is called
    +

    Solution

    This situation basically does not exist, unless the current Activity of the Host App has been destroyed or there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    XResForwarder is invalid

    Abnormal

    resources was called in YukiResForwarder but no instance object was obtained.

    The following example

    // This variable is called
     moduleAppResources.fwd(...).resources
    -

    Solution

    This basically doesn't exist unless there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    Abnormal

    The empty param method is preserved when looking up methods, constructors.

    The following example

    method {
    +

    Solution

    This basically doesn't exist unless there is a problem with the Hook Framework itself.

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    Abnormal

    The empty param method is preserved when looking up methods, constructors.

    The following example

    method {
         name = "test"
         // No parameters are filled in parentheses
         param()
    @@ -385,15 +381,21 @@
         name = "test"
         paramCount = 0
     }
    -
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    Abnormal

    The core Hook functionality of YukiHookAPI is broken.

    Solution

    This situation basically does not exist.

    If the above problem occurs, after confirming that the problem is not in your own code, you can submit a log for feedback.

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    Abnormal

    Called repeatedly when using the applyModuleTheme method in the Context.

    The following example

    // Assume this is the current Context object
    +
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    Abnormal

    The core Hook functionality of YukiHookAPI is broken.

    Solution

    This situation basically does not exist.

    If the above problem occurs, after confirming that the problem is not in your own code, you can submit a log for feedback.

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    Abnormal

    Called repeatedly when using the applyModuleTheme method in the Context.

    The following example

    // Assume this is the current Context object
     context.applyModuleTheme(R.style.Theme_AppCompat).applyModuleTheme(R.style.Theme_AppCompat)
    -

    Solution

    The ModuleContextThemeWrapper can only be created once in the Context, please check the code for loop call problems.

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    Abnormal

    The DexClassFinder cache function searchClass(name = ...) is used in the System Framework ("android") Host App.

    The following example

    loadSystem {
    +

    Solution

    The ModuleContextThemeWrapper can only be created once in the Context, please check the code for loop call problems.

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    Abnormal

    The DexClassFinder cache function searchClass(name = ...) is used in the System Framework ("android") Host App.

    The following example

    loadSystem {
         searchClass(name = "test") {
             from(...)
             // ...
         }.get()
     }
    -

    Solution

    Since the cache will store the found Class name in SharedPreferences, but the data directory does not exist in the System Framework, so please do not use this function in the System Framework.

    - +

    Solution

    Since the cache will store the found Class name in SharedPreferences, but the data directory does not exist in the System Framework, so please do not use this function in the System Framework.

    exception

    IllegalStateException

    Target Class type cannot cast to TYPE

    Abnormal

    Wrong type declared when converting string class name to target Class using Class.toClass, Class.toClassOrNull, GenericClass.argument methods.

    The following uses the Class.toClass method as an example.

    The following example

    // Assume the target type is Activity but it was wrongly cast to WrongClass type
    +val clazz = "android.app.Activity".toClass<WrongClass>()
    +

    Solution

    The following example

    // <Solution 1> Fill in the correct type
    +val clazz1 = "android.app.Activity".toClass<Activity>()
    +// <Solution 2> Do not fill in the generic declaration
    +val clazz2 = "android.app.Activity".toClass()
    +

    Please ensure that the generic type declared after executing the method is the specified target Class type, and you do not need to fill in the generic declaration if the target type is not sure.

    + diff --git a/docs/en/config/api-using.html b/docs/en/config/api-using.html index 6251a7eb7..0fe5841ad 100644 --- a/docs/en/config/api-using.html +++ b/docs/en/config/api-using.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Use as Hook API Configs | Yuki Hook API - + Use as Hook API Configs | Yuki Hook API + -

    Use as Hook API Configs

    As a Hook API, it is usually used for Hook operations for hot updates or functional needs of its own app and product testing.

    Dependency Configs

    You just need to integrate the com.highcapable.yukihookapi:api dependency.

    Then please integrate the Hook Framework dependencies used by your target.

    Entry Configs

    Create your custom Application.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    class MyApplication : Application() {
    +    

    Use as Hook API Configs

    As a Hook API, it is usually used for Hook operations for hot updates or functional needs of its own app and product testing.

    Dependency Configs

    You just need to integrate the com.highcapable.yukihookapi:api dependency.

    Then please integrate the Hook Framework dependencies used by your target.

    Entry Configs

    Create your custom Application.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             // Load Hook Framework
    @@ -77,6 +77,6 @@
         super.attachBaseContext(base)
     }
     
    - + diff --git a/docs/en/config/r8-proguard.html b/docs/en/config/r8-proguard.html index efaad345c..ca7eb0bd4 100644 --- a/docs/en/config/r8-proguard.html +++ b/docs/en/config/r8-proguard.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - R8 & Proguard Obfuscate | Yuki Hook API - + R8 & Proguard Obfuscate | Yuki Hook API + -

    R8 & Proguard Obfuscate

    In most scenarios, the Xposed Module can be compressed by native obfuscation.

    Here is the configuration method of obfuscation.

    R8

    If you are using R8 then you don't need any special configuration for YukiHookAPI.

    Proguard

    If you are still using Proguard, you need to do some rule configuration.

    Pay Attention

    Proguard rules have been deprecated, please don't use them anymore.

    Since Android Gradle Plugin 4.2, the obfuscator with the latest version of the Android Jetpack default is R8, and you no longer need to consider obfuscation.

    To enable R8 in any version, please add the following rules to the gradle.properties file, no configuration is required for Android Gradle Plugin 7.0 and above.

    android.enableR8=true
    +    

    R8 & Proguard Obfuscate

    In most scenarios, the Xposed Module can be compressed by native obfuscation.

    Here is the configuration method of obfuscation.

    R8

    If you are using R8 then you don't need any special configuration for YukiHookAPI.

    Proguard

    If you are still using Proguard, you need to do some rule configuration.

    Pay Attention

    Proguard rules have been deprecated, please don't use them anymore.

    Since Android Gradle Plugin 4.2, the obfuscator with the latest version of the Android Jetpack default is R8, and you no longer need to consider obfuscation.

    To enable R8 in any version, please add the following rules to the gradle.properties file, no configuration is required for Android Gradle Plugin 7.0 and above.

    android.enableR8=true
     
    - + diff --git a/docs/en/config/xposed-using.html b/docs/en/config/xposed-using.html index e1073d27f..c41926cca 100644 --- a/docs/en/config/xposed-using.html +++ b/docs/en/config/xposed-using.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Use as Xposed Module Configs | Yuki Hook API - + Use as Xposed Module Configs | Yuki Hook API + -

    Use as Xposed Module Configs

    Here are the related configuration methods used by YukiHookAPI as an Xposed Module.

    Dependency Configs

    As an Xposed Module, YukiHookAPI provides an automatic builder.

    You need to integrate the latest version of the com.highcapable.yukihookapi:ksp-xposed dependency in your build.gradle.

    Custom Automatic Builder

    You can configure how YukiHookAPI will generate the xposed_init entry point.

    InjectYukiHookWithXposed Annotation

    annotation class InjectYukiHookWithXposed(
    +    

    Use as Xposed Module Configs

    Here are the related configuration methods used by YukiHookAPI as an Xposed Module.

    Dependency Configs

    As an Xposed Module, YukiHookAPI provides an automatic builder.

    You need to integrate the latest version of the com.highcapable.yukihookapi:ksp-xposed dependency in your build.gradle.

    Custom Automatic Builder

    You can configure how YukiHookAPI will generate the xposed_init entry point.

    InjectYukiHookWithXposed Annotation

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
    @@ -45,18 +45,18 @@
     

    If your module package name is automatically generated by unconventional means, or you think it is necessary to manually define the module package name, then you can directly set the modulePackageName parameter.

    The following example

    @InjectYukiHookWithXposed(modulePackageName = "com.example.demo")
     

    As long as you customize the modulePackageName parameter, you will get a warning at compile time.

    The following example

    You set the customize module package name to "com.example.demo", please check for yourself if it is correct
     

    Notice

    In addition to the format of the manually defined module package name, the automatic builder will no longer check whether the module package name is correct, and you need to confirm its validity by yourself.

    entryClassName Parameter

    entryClassName determines how the automatic builder generates the entry class name in xposed_init.

    By default, it will use your entry class package name to insert the _YukiHookXposedInit suffix for generation.

    Suppose this is your entry class.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit
    -

    The Xposed entry class is handled as follows.

    The following example

    class HookEntry_YukiHookXposedInit: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    The Xposed entry class is handled as follows.

    The following example

    class HookEntry_YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    The compiled class name structure is as follows.

    The following example

    ...hook.HookEntry ← Your entry class
     ...hook.HookEntry_Impl ← Auto-generated Impl class
     ...hook.HookEntry_YukiHookXposedInit ← Automatically generated Xposed entry class
     

    We now define the entry class name as HookXposedEntry.

    The following example

    @InjectYukiHookWithXposed(entryClassName = "HookXposedEntry")
    -class HookEntry: IYukiHookXposedInit
    -

    The Xposed entry class is handled as follows.

    The following example

    class HookXposedEntry: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    The Xposed entry class is handled as follows.

    The following example

    class HookXposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    The compiled class name structure is as follows.

    The following example

    ...hook.HookEntry ← Your entry class
     ...hook.HookEntry_Impl ← Auto-generated Impl class
     ...hook.HookXposedEntry ← Automatically generated Xposed entry class
    -

    Pay Attention

    The entryClassName you define must not be the same as the class name in xposed_init, otherwise the automatic builder throws an exception at compile time.

    isUsingResourcesHook Parameter

    isUsingResourcesHook determines whether the automatic builder generates relevant code for the Resources Hook, this feature is enabled by default.

    The generated entry class after enabling it will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
    +

    Tips

    The entry class can be defined using class or object, but it is recommended to use object definition to ensure that each injected process is a single instance.

    Pay Attention

    The entryClassName you define must not be the same as the class name in xposed_init, otherwise the automatic builder throws an exception at compile time.

    isUsingResourcesHook Parameter

    isUsingResourcesHook determines whether the automatic builder generates relevant code for the Resources Hook, this feature is enabled by default.

    The generated entry class after enabling it will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
             // ...
    @@ -70,7 +70,7 @@
             // ...
         }
     }
    -

    If your current project does not need to use Reources Hook, you can set isUsingResourcesHook = false to disable automatic generation.

    The following example

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
    +

    If your current project does not need to use Resources Hook, you can set isUsingResourcesHook = false to disable automatic generation.

    The following example

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
     

    The resulting entry class after closing will look like the following.

    The following example

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
    @@ -82,7 +82,7 @@
         }
     }
     

    IYukiHookXposedInit Interface

    The IYukiHookXposedInit interface that your HookEntryClass must implements it, which is the entry point for your Module App to start hooking.

    Tips

    For more functions, please refer to IYukiHookXposedInit.

    When your Module App is loaded by Xposed, the onHook method will be called back, you need to start using YukiHookAPI in this method.

    The basic calling process is _YukiHookXposedInitIYukiHookXposedInit.onXposedEventIYukiHookXposedInit.onInitIYukiHookXposedInit.onHook

    For details, please refer to API Basic Configs.

    Native Xposed API Events

    If your current Xposed Module uses third-party resources, but may not be able to transfer them in a short time, you can use onXposedEvent to monitor all loading events of the native Xposed API.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() {
             // Your code here.
    @@ -104,6 +104,6 @@
         }
     }
     

    onXposedEvent and onHook methods exist completely independently and do not affect each other. You can continue to use YukiHookAPI in the onHook method.

    Tips

    For more functions, please refer to the IYukiHookXposedInit.onXposedEvent method.

    - + diff --git a/docs/en/guide/example.html b/docs/en/guide/example.html index 45a7e499a..01b3ec194 100644 --- a/docs/en/guide/example.html +++ b/docs/en/guide/example.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Usage Example | Yuki Hook API - + Usage Example | Yuki Hook API + -

    Usage Example

    Here is an introduction to the basic working method of YukiHookAPI and a list of simple Hook examples and common functions.

    Structure Diagram

    The structure below describes the basic working and principle of YukiHookAPI.

    Host Environment
    +    

    Usage Example

    Here is an introduction to the basic working method of YukiHookAPI and a list of simple Hook examples and common functions.

    Structure Diagram

    The structure below describes the basic working and principle of YukiHookAPI.

    Host Environment
     └── YukiMemberHookCreator
         └── Class
             └── MemberHookCreator
    @@ -312,7 +312,13 @@
     

    If you want to use both judgment schemes, YukiHookAPI also encapsulates a convenient way for you.

    At this point, you can use YukiHookAPI.Status.isModuleActive to determine whether you are activated in Xposed or TaiChi and Promise.

    The following example

    if(YukiHookAPI.Status.isModuleActive) {
         // Your code here.
     }
    -

    Tips

    For more functions, please refer to YukiHookAPI.Status.

    Notice

    If the activation state of TaiChi and Wuji is included in the Module App activation judgment, the Application of the Module App must be extends ModuleApplication or ModuleApplication must be used directly;

    The API after 1.0.91 has modified the activation logic judgment method, now you can use this API in the Module App and Host App at the same time;

    Need to make sure YukiHookAPI.Configs.isEnableHookModuleStatus is enabled;

    Except for Hook Frameworks that provide standard APIs, Module Apps may not be able to determine whether they are activated in other cases.

    - +

    Tips

    For more functions, please refer to YukiHookAPI.Status.

    Notice

    If your Module App's API version is higher than 29 and is running on a system whose target API is 29 or higher, you need to add the following permission statement in AndroidManifest.xml to judge the activation status of the Module App in TaiChi and Wuji.

    The following example

    <queries>
    +    <intent>
    +        <action android:name="android.intent.action.MAIN" />
    +    </intent>
    +</queries>
    +

    There is another solution, you can directly declare the android.permission.QUERY_ALL_PACKAGES permission, but it is not recommended and will be warned by code inspection.

    The following example

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    +

    If the activation state of TaiChi and Wuji is included in the Module App activation judgment, the Application of the Module App must be extends ModuleApplication or ModuleApplication must be used directly;

    The API after 1.0.91 has modified the activation logic judgment method, now you can use this API in the Module App and Host App at the same time;

    Need to make sure YukiHookAPI.Configs.isEnableHookModuleStatus is enabled;

    Except for Hook Frameworks that provide standard APIs, Module Apps may not be able to determine whether they are activated in other cases.

    + diff --git a/docs/en/guide/home.html b/docs/en/guide/home.html index 819c9dab1..73853759e 100644 --- a/docs/en/guide/home.html +++ b/docs/en/guide/home.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Introduce | Yuki Hook API - + Introduce | Yuki Hook API + -

    Introduce

    This is a Hook API Framework, it does not provide any Hook function itself, it needs the support of basic Xposed API.

    Background

    This is an efficient Xposed Hook API rebuilt in Kotlin.

    The name is taken from "ももくり" heroine Yuki Kuriharaopen in new window.

    Formerly the Innocent Xposed API used in Development Learning Projectopen in new window, now renamed and open sourced.

    Usage

    YukiHookAPI is built entirely with Kotlin lambda syntax.

    Abandoning the original less friendly XposedHelpers, you can use it to easily create Xposed Modules and easily implement custom Hook API.

    Language Requirement

    Please use Kotlin, the framework part of the code composition is also compatible with Java but the implementation of the basic Hook scene may not work at all.

    All demo code in this document will be described using Kotlin, if you don't know how to use Kotlin then you may not be able to use YukiHookAPI.

    Part of the Java Demo code can be found hereopen in new window, but not recommended.

    Source of Inspiration

    Previously, when we built an Xposed Module, we first needed to create an xposed_init file under assets.

    Then, manually fill in your own entry class name into the file and use XposedHelpers to implement our Hook logic.

    Since Kotlin is the main Android development language, this API is really not very elegant to use.

    Is there any easy to use, light, elegant solution?

    With this idea, YukiHookAPI was born.

    Now, we only need to write a small amount of code, and all the time and expense are handed over to automation.

    With Kotlin's elegant lambda writing and YukiHookAPI, you can make your Hook logic more beautiful and clear.

    The following example

    @InjectYukiHookWithXposed
    +    

    Introduce

    YukiHookAPI is an integrated Hook API Framework, which does not provide any Hook functions, and needs the support of Xposed related basic APIs.

    Background

    This is an efficient Hook API rebuilt based on the Xposed API using Kotlin, and creates rich function extensions for the development of Xposed Modules.

    The name is taken from "ももくり" heroine Yuki Kuriharaopen in new window.

    Formerly the Innocent Xposed API used in Development Learning Projectopen in new window, now renamed and open sourced.

    Usage

    YukiHookAPI is built entirely with Kotlin lambda syntax.

    Abandoning the original less friendly XposedHelpers, you can use it to easily create Xposed Modules and easily implement custom Hook API.

    Language Requirement

    Please use Kotlin, the framework part of the code composition is also compatible with Java but the implementation of the basic Hook scene may not work at all.

    All demo code in this document will be described using Kotlin, if you don't know how to use Kotlin then you may not be able to use YukiHookAPI.

    Part of the Java Demo code can be found hereopen in new window, but not recommended.

    Source of Inspiration

    Previously, when we built an Xposed Module, we first needed to create an xposed_init file under assets.

    Then, manually fill in your own entry class name into the file and use XposedHelpers to implement our Hook logic.

    Since Kotlin is the main Android development language, this API is really not very elegant to use.

    Is there any easy to use, light, elegant solution?

    With this idea, YukiHookAPI was born.

    Now, we only need to write a small amount of code, and all the time and expense are handed over to automation.

    With Kotlin's elegant lambda writing and YukiHookAPI, you can make your Hook logic more beautiful and clear.

    The following example

    @InjectYukiHookWithXposed
     class HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = encase {
    @@ -133,7 +133,7 @@
                 )
         }
     }
    -

    Yes, you read that right, just needing these codes can completely replace the Xposed API to achieve the same function.

    Now, with the help of the efficient and powerful YukiHookAPI, you can implement a very simple Xposed Module.

    Suppored Hook Framework

    The following are the Hook Framework and Xposed framework supported by YukiHookAPI.

    Hook FrameworkSTDescription
    LSPosedopen in new windowStable use in multiple scenarios
    LSPatchopen in new windowWIP after this project is improved
    EdXposedopen in new windowMaintenance has stopped, no longer recommended
    Pineopen in new windowOnly available
    SandHookopen in new windowOnly available
    Whaleopen in new windowNeed xposed-hook-based-on-whaleopen in new window
    YAHFAopen in new windowNeed to implement the Xposed API yourself
    FastHookopen in new windowNeed to implement the Xposed API yourself
    Epicopen in new windowNeed Dexposedopen in new window by yourself
    TaiChiopen in new windowOnly available for Xposed Module
    Xposedopen in new windowNot test, no longer recommended
    - +

    Yes, you read that right, just needing these codes can completely replace the Xposed API to achieve the same function.

    Now, with the help of the efficient and powerful YukiHookAPI, you can implement a very simple Xposed Module.

    Suppored Hook Framework

    The following are the Hook Framework and Xposed framework supported by YukiHookAPI.

    Hook FrameworkSTDescription
    LSPosedopen in new windowStable use in multiple scenarios
    LSPatchopen in new windowWIP after this project is improved
    EdXposedopen in new windowMaintenance has stopped, no longer recommended
    Pineopen in new windowOnly available
    SandHookopen in new windowOnly available
    Whaleopen in new windowNeed xposed-hook-based-on-whaleopen in new window
    YAHFAopen in new windowNeed to implement the Xposed API yourself
    FastHookopen in new windowNeed to implement the Xposed API yourself
    Epicopen in new windowNeed Dexposedopen in new window by yourself
    TaiChiopen in new windowOnly available for Xposed Module
    Xposedopen in new windowRecommended minimum system version is Android 7.0
    + diff --git a/docs/en/guide/knowledge.html b/docs/en/guide/knowledge.html index 0380f39c3..3b0c0b969 100644 --- a/docs/en/guide/knowledge.html +++ b/docs/en/guide/knowledge.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Basic Knowledge | Yuki Hook API - + Basic Knowledge | Yuki Hook API + -

    Basic Knowledge

    Here is a collection of Xposed-related introductions and the key points of knowledge that need to be grasped before start.

    Anyone who already knows can skip it.

    The basic knowledge content not necessarily completely accurate, please read it according to your own opinion.

    If you find any errors in this page, please correct it and help us improve.

    Here's an introduction to Xposed and how Hooks work.

    What is Xposed

    Xposed Framework (Xposed Framework) is a set of open source framework services that run in Android high-privilege mode. It can affect program operation (modify the system) without modifying the APK file. Based on it, many Powerful modules that operate simultaneously without conflicting functions.

    The above content is copied from Baidu Encyclopedia.

    What can Xposed do

    The structure below describes the basic workings and principles of Xposed.

    Xposed Framework
    +    

    Basic Knowledge

    Here is a collection of Xposed-related introductions and the key points of knowledge that need to be grasped before start.

    Anyone who already knows can skip it.

    The basic knowledge content not necessarily completely accurate, please read it according to your own opinion.

    If you find any errors in this page, please correct it and help us improve.

    Here's an introduction to Xposed and how Hooks work.

    What is Xposed

    Xposed Framework is a set of open source framework services that run in Android high-privilege mode. It can affect program operation (modify the system) without modifying the APK file. Based on it, many Powerful modules that operate simultaneously without conflicting functions.

    The above content is copied from Baidu Encyclopedia.

    What can Xposed do

    The structure below describes the basic workings and principles of Xposed.

    Xposed Framework
     └── App's Environment
         └── Hooker (Hooked)
             ...
    @@ -39,7 +39,7 @@
     └── Hook Framework
         └── Hooker (Hooked)
             ...
    -

    Through the operation principle of Xposed, many frameworks of the same type have been derived. As mobile devices in today's era are more and more difficult to obtain Root permissions or even flash, and when they are not just needed, some Root-free frameworks are also produced, such as Tai Chi.

    These Hook Frameworks at the ART level can also complete the Hook process with the same principle as Xposed without using the Xposed API. The operating principle of Root-free is to modify the APK and inject the Hook process into the Host, and control it through external modules.

    Another product is to use the existing functions of the Android operating environment to virtualize an environment that is completely the same as the current device system, and run App in it. This is the virtual App technology VirtualApp, which was later derived as VirtualXposed .

    The Root-free frameworks mentioned above are Tai Chi/Wuji, VirtualXposed/SandVXposed.

    What YukiHookAPI does

    Since Xposed appeared until now, apart from XposedHelpers, which is well known to developers, there is still no set of syntactic sugar for Kotlin and API with complete usage encapsulation.

    The birth of this API framework is to hope that in the current era of Xposed, more capable Xposed Module developers can avoid detours and complete the entire development process more easily and simply.

    In the future, YukiHookAPI will adapt to more third-party Hook Frameworks based on the goal of using the Xposed API, so as to improve the entire ecosystem and help more developers make Xposed Module development simpler and easier to understand.

    Let's Started

    Before starting, you need to have the following basics to better use YukiHookAPI.

    • Grasp and understand Android development and simple system operation principles

    • To grasp and understand the internal structure of Android APK and simple decompilation knowledge, you can refer to Jadxopen in new window and ApkToolopen in new window

    • Grasp and proficient in using Java reflection, understand simple Smali syntax, understand Dex file structure, and use reverse analysis to locate method locations

    • Grasp the basic native Xposed APIopen in new window usage, understand the operation principle of Xposed, see hereopen in new window (Friend Link)

    • Grasp Kotlin language and learn to use Kotlin lambda

    • Grasp and understand Kotlin and Java mixing, calling each other, and Java bytecode generated by Kotlin

    - +

    Through the operation principle of Xposed, many frameworks of the same type have been derived. As mobile devices in today's era are more and more difficult to obtain Root permissions or even flash, and when they are not just needed, some Root-free frameworks are also produced, such as LSPatchTaiChi.

    These Hook Frameworks at the ART level can also complete the Hook process with the same principle as Xposed without using the Xposed API. The operating principle of Root-free is to modify the APK and inject the Hook process into the Host, and control it through external modules.

    Another product is to use the existing functions of the Android operating environment to virtualize an environment that is completely the same as the current device system, and run App in it. This is the virtual App technology VirtualApp, which was later derived as VirtualXposed .

    The Root-free frameworks mentioned above are LSPatchopen in new windowTaiChiopen in new windowVirtualAppopen in new windowSandVXposedopen in new window.

    What YukiHookAPI does

    Since Xposed appeared until now, apart from XposedHelpers, which is well known to developers, there is still no set of syntactic sugar for Kotlin and API with complete usage encapsulation.

    The birth of this API framework is to hope that in the current era of Xposed, more capable Xposed Module developers can avoid detours and complete the entire development process more easily and simply.

    In the future, YukiHookAPI will adapt to more third-party Hook Frameworks based on the goal of using the Xposed API, so as to improve the entire ecosystem and help more developers make Xposed Module development simpler and easier to understand.

    Let's Started

    Before starting, you need to have the following basics to better use YukiHookAPI.

    • Grasp and understand Android development and simple system operation principles

    • To grasp and understand the internal structure of Android APK and simple decompilation knowledge, you can refer to Jadxopen in new window and ApkToolopen in new window

    • Grasp and proficient in using Java reflection, understand simple Smali syntax, understand Dex file structure, and use reverse analysis to locate method locations

    • Grasp the basic native Xposed APIopen in new window usage, understand the operation principle of Xposed, see hereopen in new window (Friend Link)

    • Grasp Kotlin language and learn to use Kotlin lambda

    • Grasp and understand Kotlin and Java mixing, calling each other, and Java bytecode generated by Kotlin

    + diff --git a/docs/en/guide/move-to-new-api.html b/docs/en/guide/move-to-new-api.html index 3ab3bb38a..68bf02468 100644 --- a/docs/en/guide/move-to-new-api.html +++ b/docs/en/guide/move-to-new-api.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Migrate from Xposed API | Yuki Hook API - + Migrate from Xposed API | Yuki Hook API + -

    Migrate from Xposed API

    If you are familiar with Xposed API, you can refer to the same point below to quickly migrate your API to YukiHookAPI.

    Migrate Hook Entry Point

    Migrated from XC_LoadPackage.LoadPackageParam to PackageParam.

    YukiHookAPI implements the lambda method body this usage for PackageParam, and the PackageParam object can be obtained globally in the encase method body.

    The API function differences are compared as follows

    override fun onHook() = encase {
    +    

    Migrate from Xposed API

    If you are familiar with Xposed API, you can refer to the same point below to quickly migrate your API to YukiHookAPI.

    Migrate Hook Entry Point

    Migrated from XC_LoadPackage.LoadPackageParam to PackageParam.

    YukiHookAPI implements the lambda method body this usage for PackageParam, and the PackageParam object can be obtained globally in the encase method body.

    The API function differences are compared as follows

    override fun onHook() = encase {
         // Get the package name of the current Hook
         packageName
         // Get the ApplicationInfo of the current Hook
    @@ -124,6 +124,8 @@
         result = ...
         // Remove the content of the return value
         resultNull()
    +    // Get the data storage instance within the scope of the current callback method body
    +    dataExtra
         // Throw an exception to the Hook app
         Throwable("Fatal").throwToApp()
         // Execute the original method without hook and call with the original method parameters, generics can be omitted
    @@ -131,7 +133,7 @@
         // Execute the original method without Hook and customize the method parameter call, the generic type can be omitted
         invokeOriginal<Any?>(...)
     }
    -
    override fun afterHookedMethod(param: MethodHookParam) {
    +
    override fun afterHookedMethod(param: MethodHookParam) {
         // Get the current Hook instance
         param.thisObject
         // Get the Class instance of the current Hook
    @@ -156,12 +158,14 @@
         param.result = ...
         // Remove the content of the return value
         param.result = null
    +    // Get the data storage instance within the scope of the current callback method body
    +    param.extra
         // Throw an exception to the Hook app
         param.throwable = Throwable("Fatal")
         // Execute the original method without hooking
         XposedBridge.invokeOriginalMethod(param.method, param.thisObject, ...)
     }
    -

    Replace Hook

    The replaceHook method is special, and the YukiHookAPI makes a variety of forms for it to choose from.

    The API function differences are compared as follows

    /// A method with no return value void
    +

    Replace Hook

    The replaceHook method is special, and the YukiHookAPI makes a variety of forms for it to choose from.

    The API function differences are compared as follows

    /// A method with no return value void
     
     replaceUnit {
         // Implement the replaced logic directly here
    @@ -211,6 +215,6 @@
     // Intercept return value
     override fun replaceHookedMethod(param: MethodHookParam) = null
     

    Migrate Other Features

    YukiHookAPI is a complete rewrite of the Xposed API, you can refer to API Document and Special Features to determine some functional Migration and use.

    - + diff --git a/docs/en/guide/quick-start.html b/docs/en/guide/quick-start.html index c35498bf2..2936c6404 100644 --- a/docs/en/guide/quick-start.html +++ b/docs/en/guide/quick-start.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Quick Start | Yuki Hook API - + Quick Start | Yuki Hook API + -

    Quick Start

    Integrate YukiHookAPI into your project.

    Environment Requirements

    • Windows 7 and above / macOS 10.14 and above / Linux distributions (Arch/Debian)

    • Android Studio 2021.1 and above

    • IntelliJ IDEA 2021.1 and above

    • Kotlin 1.7.0 and above

    • Android Gradle Plugin 7.0 and above

    • Gradle 7.0 and above

    • JVM 11 and above (Since API 1.0.80)

    Automatically Build Project

    YukiHookAPI provides an automated build tool that can help you quickly build an Android standard project template with Xposed Module dependencies, and use the built template to start the next step directly.

    You can click here to check it out.

    Manually Configure Project

    If you don't want to use automated build tools, you can still manually configure project dependencies as follows.

    Create Project

    Use Android Studio or IntelliJ IDEA to create a new Android project and select Kotlin in the Language column to automatically add basic dependencies.

    Integration Dependencies

    Add dependencies to your project build.gradle.

    The following example

    repositories {
    +    

    Quick Start

    Integrate YukiHookAPI into your project.

    Environment Requirements

    • Windows 7 and above / macOS 10.14 and above / Linux distributions (Arch/Debian)

    • Android Studio 2021.1 and above

    • IntelliJ IDEA 2021.1 and above

    • Kotlin 1.7.0 and above

    • Android Gradle Plugin 7.0 and above

    • Gradle 7.0 and above

    • JVM 11 and above (Since API 1.0.80)

    Automatically Build Project

    YukiHookAPI provides an automated build tool that can help you quickly build an Android standard project template with Xposed Module dependencies, and use the built template to start the next step directly.

    You can click here to check it out.

    Manually Configure Project

    If you don't want to use automated build tools, you can still manually configure project dependencies as follows.

    Create Project

    Use Android Studio or IntelliJ IDEA to create a new Android project and select Kotlin in the Language column to automatically add basic dependencies.

    Integration Dependencies

    Add dependencies to your project build.gradle.

    The following example

    repositories {
         google()
         mavenCentral()
         // ❗If your Plugin version is too low, be sure to add it as an Xposed Module, other cases are optional
    @@ -74,18 +74,21 @@
         android:name="xposedminversion"
         android:value="93" />
     
    -<!-- Optional: Configure support for New XSharePrefs without adjusting xposedminversion to 93 -->
    +<!-- Optional: Configure support for New XSharedPreferences without adjusting xposedminversion to 93 -->
     <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
     

    Create a Hook entry class in your project, implements IYukiHookXposedInit and add the annotation @InjectYukiHookWithXposed.

    The following example

    @InjectYukiHookWithXposed
    -class HookEntry : IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = YukiHookAPI.encase {
             // Your code here.
         }
     }
    -

    Suggestion

    You can extends Application of your Module App from ModuleApplication to achieve a complete user experience.

    For more functions, please refer to ModuleApplication.

    Then, you can start writing Hook code.

    For configuration details related to use as an Xposed Module, you can click here to continue reading.

    If you are currently using Xposed API, you can refer to Migrate from Xposed API.

    Use as Hook API

    Integration

    Create your custom Application.

    Pay Attention

    Regardless of the Hook Framework you use, you need to add its docking Xposed dependency support.

    If the target Hook Framework does not integrate Xposed API, you need to implement and connect XposedBridge by yourself.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    override fun attachBaseContext(base: Context?) {
    +

    Suggestion

    Please configure YukiHookAPI in the onInit method and set the isDebug mode to the following form.

    The following example

    override fun onInit() = configs {
    +    isDebug = BuildConfig.DEBUG
    +}
    +

    YukiHookAPI will print all logs for debugging by default.

    For a release build, be sure to turn off debugging to prevent a lot of log stuffing on the user's device.

    You can also extends Application of your Module App from ModuleApplication to achieve a complete user experience.

    For more functions, please refer to ModuleApplication.

    Then, you can start writing Hook code.

    For configuration details related to use as an Xposed Module, you can click here to continue reading.

    If you are currently using Xposed API, you can refer to Migrate from Xposed API.

    Use as Hook API

    Integration

    Create your custom Application.

    Pay Attention

    Regardless of the Hook Framework you use, you need to add its docking Xposed dependency support.

    If the target Hook Framework does not integrate Xposed API, you need to implement and connect XposedBridge by yourself.

    Add YukiHookAPI.encase method to attachBaseContext.

    The following example

    override fun attachBaseContext(base: Context?) {
         // Load Hook Framework
         //
         // Your code here.
    @@ -97,6 +100,6 @@
         super.attachBaseContext(base)
     }
     

    Then, you can start writing Hook code in much the same way you would use it as an Xposed Module.

    For configuration details related to use as a Hook API, you can click here to continue reading.

    Notice

    YukiHookModuleStatus, YukiHookModulePrefs, YukiHookDataChannel and Resources Hook functionality will not work when using a custom Hook Framework instead of the full Xposed Module.

    - + diff --git a/docs/en/index.html b/docs/en/index.html index 2864b4b90..ae7e5356c 100644 --- a/docs/en/index.html +++ b/docs/en/index.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Home | Yuki Hook API - + Home | Yuki Hook API + -
    Yuki Hook API

    Yuki Hook API

    An efficient Kotlin version of the Xposed Hook API

    Get Started Changelog

    Xposed Module Develop

    The automatic builder can help you quickly create an Xposed Module, automatic configure the entry class and xposed_init file.

    Light and Elegant

    A powerful, elegant, beautiful API built with Kotlin lambda can help you quickly implement members search and methods hooks.

    Debugging Efficient

    A rich debug log function, detailing the name of each hooked method, time-consuming to find the class can quickly debug and find errors.

    Easy to transplant

    Native support for Xposed API usage, in any case, the supported Hook Framework with Xposed API can be quickly spliced with it.

    Obfuscate Support

    The built Xposed Module simply supports R8, obfuscate will not destroy the hook entry point, and no other configuration is required under R8.

    Quickly Started

    Simple and easy to use it now! Do not need complex configuration and full development experience, Integrate dependencies and enjoy yourself.

    All Hook process in one step, everything is simplified

    loadApp(name = "com.android.browser") {
    +    
    Yuki Hook API

    Yuki Hook API

    An efficient Hook API and Xposed Module solution built in Kotlin

    Get Started Changelog

    Xposed Module Develop

    The automatic builder can help you quickly create an Xposed Module, automatic configure the entry class and xposed_init file.

    Light and Elegant

    A powerful, elegant, beautiful API built with Kotlin lambda can help you quickly implement members search and methods hooks.

    Debugging Efficient

    A rich debug log function, detailing the name of each hooked method, time-consuming to find the class can quickly debug and find errors.

    Easy to transplant

    Native support for Xposed API usage, in any case, the supported Hook Framework with Xposed API can be quickly spliced with it.

    Obfuscate Support

    The built Xposed Module simply supports R8, obfuscate will not destroy the hook entry point, and no other configuration is required under R8.

    Quickly Started

    Simple and easy to use it now! Do not need complex configuration and full development experience, Integrate dependencies and enjoy yourself.

    All Hook process in one step, everything is simplified

    loadApp(name = "com.android.browser") {
         ActivityClass.hook {
             injectMember {
                 method {
    @@ -52,7 +52,7 @@
             }
         }
     }
    -
    - +
    + diff --git a/docs/en/tools/yukihookapi-projectbuilder.html b/docs/en/tools/yukihookapi-projectbuilder.html index d1cc8e936..958d6e42e 100644 --- a/docs/en/tools/yukihookapi-projectbuilder.html +++ b/docs/en/tools/yukihookapi-projectbuilder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookAPI Project Builder | Yuki Hook API - + YukiHookAPI Project Builder | Yuki Hook API + -

    YukiHookAPI Project Builder

    This is an automatic building tool for Xposed Modules using YukiHookAPI as the core.

    Implementing automated search relies on quickly building an Android project template that includes a Xposed Module environment.

    Get Project

    This project is open source and free, and will be maintained continuously according to your usage.

    The original version may have imperfections or bugs. We welcome to your feedback.

    Project Address YukiHookAPI-ProjectBuilderopen in new window

    If you want to download directly, you can click hereopen in new window to go to the Release address.

    Usage

    Here contains the basic usage and function explanation.

    Basic Usage

    • The software use process requires your device connected to the Internet.

    • After starting the software, simply configure the project you want to create, click the button in the lower right corner or select Project > Run Build from the menu bar to start the task.

    • After waiting for the automatic dependency search to complete, you can configure the project dependencies. It is recommended to use the latest dependencies to ensure the stability of the project, and the build tools only support the latest dependencies.

    • Select the folder where you need to create the project. After starting, the project will be created in the location you selected, and wait for the whole process to complete and the project will be created.

    Config Template

    Config template is an extension function, you can select menu bar Project > Config Template > New Template.

    And then, you can create a template with the current config, and you can re-create it from Saved Template next time Load the template to restore the current config.

    Multilingual Support

    The software language follows the current system, and you can manually select the software interface language in the Language column of the menu bar.

    - +

    YukiHookAPI Project Builder

    This is an automatic building tool for Xposed Modules using YukiHookAPI as the core.

    Implementing automated search relies on quickly building an Android project template that includes a Xposed Module environment.

    Get Project

    This project is open source and free, and will be maintained continuously according to your usage.

    The original version may have imperfections or bugs. We welcome to your feedback.

    Project Address YukiHookAPI-ProjectBuilderopen in new window

    If you want to download directly, you can click hereopen in new window to go to the Release address.

    Usage

    Here contains the basic usage and function explanation.

    Basic Usage

    • The software use process requires your device connected to the Internet.

    • After starting the software, simply configure the project you want to create, click the button in the lower right corner or select Project > Run Build from the menu bar to start the task.

    • After waiting for the automatic dependency search to complete, you can configure the project dependencies. It is recommended to use the latest dependencies to ensure the stability of the project, and the build tools only support the latest dependencies.

    • Select the folder where you need to create the project. After starting, the project will be created in the location you selected, and wait for the whole process to complete and the project will be created.

    Config Template

    Config template is an extension function, you can select menu bar Project > Config Template > New Template.

    And then, you can create a template with the current config, and you can re-create it from Saved Template next time Load the template to restore the current config.

    Multilingual Support

    The software language follows the current system, and you can manually select the software interface language in the Language column of the menu bar.

    + diff --git a/docs/index.html b/docs/index.html index ff58b0aeb..6103e8991 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Yuki Hook API - + Yuki Hook API + -

    Select a language

    English 简体中文

    - +

    Select a language

    English 简体中文

    + diff --git a/docs/zh-cn/about/about.html b/docs/zh-cn/about/about.html index ab86961a0..de21af48a 100644 --- a/docs/zh-cn/about/about.html +++ b/docs/zh-cn/about/about.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - 关于此文档 | Yuki Hook API - + 关于此文档 | Yuki Hook API + -

    关于此文档

    此文档由 VuePress在新窗口中打开 强力驱动。

    License

    The MIT License (MIT)在新窗口中打开

    MIT License
    +    

    关于此文档

    此文档由 VuePress在新窗口中打开 强力驱动。

    License

    The MIT License (MIT)在新窗口中打开

    MIT License
     
    -Copyright (C) 2019-2022 HighCapable
    +Copyright (C) 2019-2023 HighCapable
     
     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
    @@ -48,7 +48,7 @@
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     SOFTWARE.
    -

    版权所有 © 2019-2022 HighCapable

    - +

    版权所有 © 2019-2023 HighCapable

    + diff --git a/docs/zh-cn/about/changelog.html b/docs/zh-cn/about/changelog.html index e7653cef6..7cda585d9 100644 --- a/docs/zh-cn/about/changelog.html +++ b/docs/zh-cn/about/changelog.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 更新日志 | Yuki Hook API - + 更新日志 | Yuki Hook API + -

    更新日志

    这里记录了 YukiHookAPI 的版本更新历史。

    特别注意

    我们只会对最新的 API 版本进行维护,若你正在使用过时的 API 版本则代表你自愿放弃一切维护的可能性。

    1.1.4 | 2022.10.04  最新

    • 修复 YukiHookDataChannel 可能不能响应系统框架中响应广播事件的问题,在 Android 13 中复现
    • 修复 YukiHookDataChannel 长达多个版本在 (Xposed) 宿主环境无法与模块通讯的问题
    • YukiHookDataChannel 中新增 obtainLoggerInMemoryData 方法,可在模块与宿主之间共享调试日志数据
    • 修改 YukiHookLogger.inMemoryData 的类型为 ArrayList 并修改 YukiLoggerDatadata class
    • 修复 YukiLoggerData 在模块中包名为空打印空白的问题
    • PackageParam 中新增 loadApploadZygoteloadSystemwithProcess 的同名多参数方法
    • 修复了一些可能存在的 BUG

    1.1.3 | 2022.09.30  过旧

    • 修复一个无法自定义 Hook 入口类名的致命错误
    • 添加 LoggerFactory 中的部分代码注释文案并更新特色功能文档

    1.1.2 | 2022.09.30  过旧

    • 文档 基础知识 页面新增 English 版本友情链接
    • 修复 YukiBaseHooker 注释中的 English 文档链接错误问题
    • 修复 ModuleClassLoader 中的 ClassCastException 问题
    • 修正并规范部分代码注释
    • 新增 ModuleClassLoader 排除列表功能,可使用 excludeHostClassesexcludeModuleClasses 方法来自定义排除列表
    • 新增 YukiLoggerData 实时日志数据类,可实时通过 YukiHookLogger.inMemoryData 获取日志数组
    • 新增 ClassLoader.listOfClasses 方法,可直接获取当前 Dex 中的全部 Class

    1.1.1 | 2022.09.28  过旧

    • 修复了文档 基础知识 页面友情链接错误的问题
    • 修复了文档 favicon 不显示的问题
    • 修复 DexClassFinder 查找条件中的 BUG

    1.1.0 | 2022.09.28  过旧

    • 这是一次大版本更新,有关更新日志中提到的变化及用法请参考 API 文档 以及 特色功能
    • 更换帮助文档框架到 VuePress在新窗口中打开
    • 统一并规范文档中的术语名词,例如“查询”一律更改为了“查找”,XposedHelper 拼写错误修改为了 XposedHelpers
    • 文档 基础知识 页面加入友情链接,仅限简体中文
    • 将 Hook App Demo 的 ClassMethod 转为 Java 以提供更好的演示效果
    • 修正了 Hook Module Demo 中的代码注释命名
    • 重构了大量底层 Hook 逻辑及 Xposed API 的对接方式
    • 移除了 HookParamWrapper,现已将其直接与 YukiBridgeFactory 对接
    • 移动部分 YukiHookBridge 中的方法到 AppParasitics
    • 移除了 HookParam.args 与底层的直接对接方法 setArgs,直接获取并设置当前数组的对象
    • 优化自动处理程序,将引用的 jar 合并到 stub 项目
    • 修复多项目打包时模块包名无法正确匹配的问题以及修改自动处理程序的模块包名匹配逻辑,感谢 5ec1cff在新窗口中打开 的反馈及提供的解决方案
    • 对 API 私有工具类的方法进行了 internal 闭包处理,避免污染顶级命名空间
    • 修正了所有反射和 Hook 类的 Creater 命名到 Creator
    • 新增 YukiHookAPI.Status.compiledTimestamp 功能,可以在作为 Xposed 模块使用时获取编译完成的时间戳
    • 新增 YukiHookAPI.Status.isXposedEnvironment 功能,可以判断当前为 (Xposed) 宿主环境还是模块环境
    • 调试日志功能进行了大改版,现已将 YukiHookAPI.Configs.debugTag 等功能合并到 YukiHookLogger.Configs
    • 调试日志新增可指定打印使用的方法为 XposedBridge.logLogd
    • 调试日志中默认加入当前宿主的包名以及当前用户 ID,以供调试,你可以在 debugLog 配置中自行更改
    • 新增 generic 功能,可对泛型进行反射和调用,你可以在 ClassCurrentClass 中使用它
    • 作废 buildOfAny 方法,现在请直接使用 buildOf 方法 (不带泛型) 来使用构造方法创建新对象并得到结果 Any
    • 修复 hasExtends 使用过程发生空指针异常的问题
    • CurrentClass 新增非 lambda 方式的调用方法
    • CurrentClass 新增 namesimpleName 功能
    • 完全重写 ReflectionTool 的核心方法,将不同的查找条件进行了整理分类
    • 修复 ReflectionTool 中可能的直接调用 declared 获取的 Member 抛出异常的问题
    • 修复 ReflectionToolUndefinedType 未在 MethodConstructor 条件中正确判断的问题
    • 新增反射查找结果发生异常时的友好提示方式,可具体定位到指定条件找不到 Member 的问题
    • 反射查找 MethodConstructor 中新增 VagueType 条件,可使用在 param 条件中用于忽略你不想填写的参数
    • 反射查找 MethodConstructor 中新增 paramCount { ... } 条件,现在你可以直接拿到其中的 it 来自定义你的判断条件
    • FieldFinder 结果中新增 current 方法,可直接对结果实例创建调用空间
    • 修改了反射查找功能中的 modifiers 条件以及 name 条件,现在你需要对此方法体结尾返回一个 Boolean 以使条件成立
    • ModifierRules 中的 as* 功能改名为 is*,感谢 Kitsune在新窗口中打开 的建议
    • FieldFinder 中新增 RemedyPlan 功能
    • 新增 Dex 中的 Class 模糊查找功能 (Beta),你现在可以直接使用 searchClass 功能来使用指定条件模糊查找 Class
    • 新增反射查找中的多重查找功能,可使用相对查找条件同时获取多个查找结果,感谢 AA 以及 Kitsune在新窗口中打开 的建议
    • 修复 appClassLoader 获取到的对象在某些系统中的系统应用中不正确的问题,感谢 Luckyzyx在新窗口中打开 的反馈
    • 修改了 XposedBridge.invokeOriginalMethod 的调用方式并在 MethodFinder.Result.Instance 中增加 original 功能
    • 修复 YukiHookModulePrefsgetStringSet 方法取值错误的问题并优化代码风格,感谢 Teddy_Zhu在新窗口中打开PR在新窗口中打开
    • 修改 YukiHookModulePrefs,拦截 XSharePreference 可能不存在的异常
    • 修复 YukiHookDataChannel 在某些第三方 ROM 系统框架中无法注册成功的问题
    • 安全化 YukiHookDataChannel,现在它只能在来自指定包名的模块与宿主之间通信
    • 新增自动 Hook SharedPreferences 以修复部分系统中文件权限不是 0664 的问题,感谢 5ec1cff在新窗口中打开 的反馈及提供的实现代码
    • 新增 YukiHookAPI.Configs.isEnableHookSharedPreferences 功能,默认关闭,若 SharedPreferences 的权限错误可进行启用
    • 修复查找 Constructor 时无参构造方法在不填写查找条件时无法找到的 BUG,感谢 B5 KAKA 的反馈
    • 分离位于 injectMembermethodconstructorResult 实例到 Process
    • 在 Hook 过程中新增 useDangerousOperation 方法,未进行声明时在 Hook 危险列表中的功能后会自动停止 Hook 并打印错误
    • 新增模块资源注入与 Activity 代理功能,你可以调用 injectModuleAppResourcesregisterModuleAppActivities 来使用
    • 新增 ModuleContextThemeWrapper 功能,你可以调用 applyModuleTheme 在任意 Activity 中创建模块的 Context
    • 新增 ClassLoader.onLoadClass 功能,可用于监听 ClassLoaderloadClass 方法被调用的事件
    • 作废了 classOfclazz 扩展方法,新增 toClass 以及 toClassOrNull 用法,请现在转移到新的方法
    • VariousClass 新增 getOrNull 方法,可在匹配不到 Class 的时候不抛出异常而是返回 null
    • PackageParam.hook 中移除了 isUseAppClassLoader 参数,修改为 isForceUseAbsolute 并自动匹配目标 Class
    • PackageParam 新增 systemContext 功能,你可以在任意时间调用此功能获取一个持久化的 Context
    • 不再对外开放 HookClass 中的任何方法
    • HookParam 中新增 throwToApp 功能,可将异常直接抛给宿主
    • Hook 回调中新增 onFailureThrowToApp 功能,可在发生异常时直接抛给宿主
    • 修改了调试日志的打印逻辑,反射查找功能中的耗时记录仅会在 Hook 过程中进行打印
    • Hook 过程中新增解除 Hook 功能,可使用 removeremoveSelf 方法解除 Hook
    • 修复在 ReplaceHook 失败的时候导致宿主抛出异常的问题,现修改为调用原始方法保证宿主功能正常运行
    • 新增 Hook 过程中对方法返回值的检查功能,在返回值不匹配的情况下会根据情景自动抛出异常或打印错误
    • Resources Hook 中新增 array 类型,感谢 GSWXXN在新窗口中打开PR在新窗口中打开
    • 移动 me.weishu.reflectionthirdparty 防止同时引入的同名依赖冲突
    • 移除 Hook 方法体为空时抛出的异常,修改为打印警告日志
    • 修改 AppLifecycle 的异常处理逻辑,当其发生异常时直接抛给宿主
    • 更新 Demo 的 API 版本到 33

    1.0.92 | 2022.05.31  过期

    • 修正了大量方法中 callback 的命名方法
    • 更换方案再次修复 YukiHookDataChannel 在低于 Android 12 的设备上不能回调当前 Activity 广播的问题
    • InjectYukiHookWithXposed 注解新增 isUsingResourcesHook 功能,现在你可以选择性关闭自动生成 IXposedHookInitPackageResources 的依赖接口了

    1.0.91 | 2022.05.29  过期

    • 修复部分设备的定制系统在 LSPosed 环境下开机启动获取的 ClassLoader 错误的问题,感谢 Luckyzyx在新窗口中打开 的反馈
    • 修复 YukiHookDataChannelZUI 以及低于 Android 12 的系统上不能回调当前 Activity 广播的问题
    • 整合 YukiHookModuleStatus 功能到 YukiHookAPI.Status,重写了大量方法,现在你可以在模块与宿主中双向判断模块激活等状态信息

    1.0.90 | 2022.05.27  过期

    • 修复 YukiHookDataChannel 在模块设置监听回调时闪退的问题
    • 修复 YukiHookDataChannel 在非当前 Activity 情况下依然会回调的问题
    • 移除 YukiHookDataChannel 回调事件的默认值,没有即不回调
    • 移除 YukiHookModulePrefs 在 XShare 不可读的情况下打印的警告
    • 新增 YukiHookModulePrefs 中的 isXSharePrefsReadable 方法,可判断当前的 XShare 是否可用

    1.0.89 | 2022.05.26  过期

    • 修复 YukiHookDataChannel 不能重复设置监听的问题,并加入在模块不同 Activity 中重复响应和自动跟随 Activity 销毁监听功能
    • 新增 YukiHookDataChannel 重复监听用例说明文档
    • 加入 onAlreadyHooked 方法,可判断当前方法是否被重复 Hook
    • 修改部分重复添加 HashMap 的逻辑,移除 putIfAbsent 方法,允许覆盖添加
    • 修复了几处可能的 BUG

    1.0.88 | 2022.05.25  过期

    • 对 Xposed API 完全解耦合
    • 增加了 type 中的 android 类型
    • YukiHookModuleStatus 从自动生成代码中分离,并加入 isEnableHookModuleStatus 的开关,由你决定是否启用
    • 对 API 大量类的构造方法进行了 internal 闭包处理
    • YukiHookModulePrefs 设置为单例运行,防止重复创建浪费系统资源
    • 修复自 1.0.80 版本后无法嵌套 Hook 的 BUG,并优化嵌套 Hook 相关功能
    • 修改 Hooker 存储方案由 HashSet 到 HashMap,防止重复添加 Hooker 的问题
    • 修改 Hook 核心实现方法,加入查重,避免重复 Hook 多次回调 HookParam 方法
    • MethodFinderFieldFinder 加入查找模糊方法、变量名称功能,可调用 name { ... } 来设置查找条件,支持正则
    • 优化并修改 appContext 的获取方式,降低会取到空的问题的可能性
    • 修改自动生成的代码中 logger 的打印 TAG 默认为你自定义的名称,方便进行调试
    • 优化 YukiHookBridgeHooker 实现方式,提升 Hook 性能
    • PackageParam 增加 onAppLifecycle 方法,可原生监听宿主的生命周期以及实现注册系统广播功能
    • 新增 YukiHookDataChannel 功能,可在模块与宿主保持存活的情况下使用系统无序广播进行通讯
    • YukiHookDataChannel 增加 checkingVersionEquals 方法,可通过监听来验证模块更新后宿主并未更新版本不匹配问题
    • demo-module 的示例代码中新增 Java 版本的示例,仅供参考

    1.0.87 | 2022.05.10  过期

    • 新增 refreshModuleAppResources 功能,以适配语言区域、字体大小、分辨率改变等情况下的 Resources 刷新
    • 新增 isEnableModuleAppResourcesCache 功能,可自行设置是否自动缓存当前模块的 Resources

    1.0.86 | 2022.05.06  过期

    • 修复不支持 Resources Hook(资源钩子) 的情况下在 initZygote 时持续报错的问题,复现在 ZUI/LSPosed CI(1.8.3-6550)
    • 优化并对 Resources Hook 进行异常处理,只有被使用后不支持才会打印错误和警告

    1.0.85 | 2022.05.04  过期

    • 修复无法 Hook 系统框架的严重问题,从 1.0.80 开始出现
    • 调试日志中新增区分 initZygote 装载的包名为 android-zygotepackageName 保持 android 不变

    1.0.83 | 2022.05.04  过期

    • 修复 YukiHookModuleStatusloadSystem 后大量报错的问题
    • 新增 type 中的 android 类型
    • 更新帮助文档的示例说明

    1.0.82 | 2022.05.04  过期

    • 修复了一处概念混淆错误,区分 initZygote 与系统框架的关系,之前的注释和文档有问题,非常抱歉
    • PackageParam 新增 loadSystem 方法,不需要再写 loadApp(name = "android") 即可 Hook 系统框架

    1.0.81 | 2022.05.04  过期

    • 修复使用 by 方法设置条件后 Hook 方法体内查找不到的方法、构造方法依然输出错误日志的问题
    • 在执行 Hook 过程中加入全局日志显示当前 Hook APP 的包名,并修复一处错误日志打印样式的问题

    1.0.80 | 2022.05.01  过期

    • InjectYukiHookWithXposed 注解新增 entryClassName 功能,可自定义生成的 xposed_init 入口类名
    • YukiHookXposedInitProxy 更名为 IYukiHookXposedInit,原接口名称已作废,将在后续版本中直接被删除
    • 新增 initZygote 与 Resources Hook 功能,支持 Hook Layout
    • 新增 onXposedEvent 方法,可监听原生 Xposed API 的全部事件
    • 对 Hook 功能的 lambda 进行 inline 处理,避免生成过碎的匿名类,提升编译后的运行性能
    • 修复 PrefsData 编译后的方法体复制过大的问题
    • 增加 XSharePreference 可读性测试,失败后会自动打印警告日志
    • PackageParam 新增 appResourcesmoduleAppResourcesmoduleAppFilePath 功能
    • PackageParamloadApp 新增不写 name 功能,默认筛选全部 APP
    • PackageParam 新增 loadZygote 方法,可直接 Hook 系统框架
    • PackageParam 新增 resources().hook 功能
    • 优化方法、构造方法、变量查找功能,找不到的错误日志将优先显示已设置的查找条件
    • 增加 hasExtends 扩展方法,可判断当前 Class 是否有继承关系
    • 增加 isSupportResourcesHook 功能,判断当前是否支持资源钩子(Resources Hook)
    • current 功能新增 superClass 方法调用父类
    • 查找方法、构造方法、变量新增 superClass 查找条件,可继续在父类中查找
    • YukiHookAPI 大量方法与 Xposed API 解耦合
    • 新增 Xposed API 的原生 Hook 优先级功能
    • 修复 isFirstApplication 可能判断不准确的问题
    • 屏蔽 MIUI 系统上 MiuiCatcherPatch 重复调用 Hook 入口方法的问题
    • 优化 Hook 入口调用方法,避免因为 Hook Framework 问题导致多次调用
    • 修复 Hook ClassLoader 导致 Hook 卡死的问题,感谢 WankkoRee在新窗口中打开 的反馈
    • 提升 XC_Callback 接口对接后的性能
    • Java type 新增 ClassLoader 类型
    • 优化 API 帮助文档,修复可能持续缓存页面的问题

    1.0.78 | 2022.04.18  过期

    • YukiHookModulePrefs 新增 isRunInNewXShareMode 方法,可用于判断模块当前是否处于 New XSharePreference 模式
    • 修复 YukiHookModulePrefsNew XSharePreference 模式下工作的部分问题
    • 新增 ModulePreferenceFragment,现在,你可以完全替换掉 PreferenceFragmentCompat 并开始使用新的功能
    • 适配 PreferenceFragmentCompat 的 Sp 数据存储解决方案,感谢 mahoshojoHCG在新窗口中打开 的反馈
    • 更新自动处理程序以及 Kotlin 依赖到最新版本
    • 修正部分文档和代码注释中的错误

    1.0.77 | 2022.04.15  过期

    • YukiHookModulePrefs 新增 clear 方法,感谢 WankkoRee在新窗口中打开 的建议
    • YukiHookModulePrefs 新增 getStringSetputStringSetall 方法
    • HookParamargs 增加 any 方法
    • 新增 ModuleApplication,可在模块中继承此类实现更多功能
    • 对接全部的 findClass 功能到 Xposed API,在非宿主环境继续使用原生 ClassLoader
    • 修复了一些可能存在的 BUG

    1.0.75 | 2022.04.13  过期

    • 更正了自动处理程序的逻辑识别部分,感谢 ApeaSuperz在新窗口中打开 的贡献
    • 修正一处文档注释的引用未更改的问题
    • HookParam 中删除了 firstArgslastArgs 方法,现在你可以使用 args().first()args().last() 来取代它
    • HookParam 中删除了 args() 中的默认参数 index = 0,现在你可以使用 args().first()args(index = 0) 来取代它
    • HookParamresult 功能增加了泛型匹配,现在你可以使用 result<T> 来匹配你的目标方法已知返回值类型了
    • 方法、构造方法查找功能新增 emptyParam 条件,并完善了文档相关需要注意的查找条件误区
    • 增加了 type 中的 android 类型

    1.0.73 | 2022.04.10

    1.0.72 | 2022.04.09  过期

    • 更新 API 文档到新的地址
    • PackageParam 中加入 appContext 功能
    • 修复一些已知的 BUG,提升 Hook 稳定性

    1.0.71 | 2022.04.04  过期

    • 修复 VariousClass 无法匹配时会停止 Hook 抛出异常的严重问题

    1.0.70 | 2022.04.04  过期

    • 修复 instanceClass 在静态实例中调用后报错问题
    • 在 Hook 过程中加入 isUseAppClassLoader 功能,感谢 WankkoRee在新窗口中打开 的反馈
    • 加入 withProcess 功能,可根据 APP 当前指定进程进行 Hook
    • 修复查找方法、构造类和变量的严重逻辑错误问题
    • 修复 Hook 目标类不存在的时候无法忽略异常输出的问题
    • 修复部分情况下 APP 启动方法装载过快导致 Hook 不能生效的问题
    • 修复 allMethods 未 Hook 到方法时不会抛出异常的问题,感谢 WankkoRee在新窗口中打开 的反馈
    • 加入 Hook 状态监听功能,感谢 WankkoRee在新窗口中打开 的建议
    • 修改 Xposed 入口注入类的方式,重新声明 API 的定义域
    • 加入混淆的方法以及变量的查找功能,可使用不同类型筛选 index 定位指定的方法和变量,感谢 WankkoRee在新窗口中打开 提供的思路
    • 查找方法、变量时允许传入多种类型,例如 String 声明的类名和 VariousClass
    • 加入全新的 current 功能,可对任意的类构建一个反射方法操作空间,方便地调用和修改其中的方法和变量
    • 修复了 Hook 过程中的大量 BUG,感谢 WankkoRee在新窗口中打开 对此项目所做出的贡献

    1.0.69 | 2022.03.30  过期

    • 添加并改进一些方法功能的注释
    • 增加 Demo 中的更多示例 Hook 内容
    • 修复在一个 Hook 实例中,allMethods 多次使用时只有最后一个生效的问题,感谢 WankkoRee在新窗口中打开 的反馈

    1.0.68 | 2022.03.29  过期

    • 增加 Demo 中的新用例和 LSPosed 作用域
    • 增加 Member 查找缓存和查找缓存配置开关
    • 移除和修改 MethodFinderFieldFinder 以及 HookParam 相关方法的调用
    • 增加更多 Finder 中的 cast 类型并支持 cast 为数组
    • 整体的性能和稳定性提升
    • 修复上一个版本可能存在的 BUG

    1.0.67 | 2022.03.27  过期

    • 增加三个 Finder 中的 modifiers 功能,可筛选 staticnativepublicabstract 等诸多描述类型
    • 增加方法和构造方法查找时可模糊方法参数类型为指定个数进行查找
    • 增加 MemberhasModifiers 扩展功能
    • 增加 MethodFinderConstructorFinder 中的 give 方法,可获得原始类型
    • 增加 YukiHookModulePrefs 中的 PrefsData 模板功能
    • 彻底对方法、构造方法及变量的查找方案进行重构
    • 优化代码注释,修复了可能产生的 BUG

    1.0.66 | 2022.03.25  过期

    • 修复 MethodFinder 中的一个严重问题
    • 增加 hookParam 中的 args 调用方法
    • 修复其它可能存在的问题以及修复部分类的注释问题

    1.0.65 | 2022.03.25  过期

    • 重新发布版本修复 Maven 仓库因为缓存问题新版本不正确的情况
    • 增加 MethodFinderFieldFinder 新的返回值调用方法
    • 修复可能存在的问题,并修复太极使用过程中可能存在的问题
    • 修复自动生成 Xposed 入口类可能发生的问题
    • 增加了 type 中的 android 类型以及 java 类型

    1.0.6 | 2022.03.20  过期

    • 修复 YukiHookModulePrefs 在使用一次 direct 忽略缓存后每次都忽略的 BUG
    • 增加新的 API,作废了 isActive 判断模块激活的传统用法
    • 修复非 Xposed 环境使用 API 时打印调试日志的问题
    • 修复查找 Field 时的日志输出问题和未拦截的异常问题
    • 解耦合 ReflectionUtils 中的 Xposed API
    • 增加 YukiHookModuleStatus 方法名称的混淆,以精简模块生成的体积
    • 装载模块自身 Hook 时将不再打印欢迎信息
    • 修复上一个版本仍然存在的某些 BUG

    1.0.55 | 2022.03.18  过期

    • 修正一处注释错误
    • 临时修复一个 BUG
    • 增加了 type 中的大量 android 类型以及少量 java 类型
    • 修复新版与旧版 Kotlin APIs 的兼容性问题

    1.0.5 | 2022.03.18  过期

    • 修复旧版本 LSPosed 框架情况下欢迎信息多次打印的问题
    • 添加 onInit 方法来配置 YukiHookAPI
    • 新增 executorNameexecutorVersion 来获取当前 Hook 框架的名称和版本号
    • 新增 by 方法来设置 Hook 的时机和条件
    • YukiHookModulePrefs 新增可控制的键值缓存,可在宿主运行时模块动态更新数据
    • 修复了一些可能存在的 BUG

    1.0.4 | 2022.03.06  过期

    • 修复 LSPosed 在最新版本中启用“只有模块classloader可以使用Xposed API”选项后找不到 XposedBridge 的问题
    • 添加 YukiHookAPI 的常量版本名称和版本号
    • 新增 hasField 方法以及 isAllowPrintingLogs 配置参数
    • 新增 isDebug 开启的情况下 API 将自动打印欢迎信息测试模块是否生效

    1.0.3 | 2022.03.02  过期

    • 修复一个潜在性的异常未拦截 BUG
    • 增加 ignoredError 功能
    • 增加了 type 中的 android 类型
    • 增加监听 hook 后的 ClassNotFound 功能

    1.0.2 | 2022.02.18  过期

    • 修复 Windows 下无法找到项目路径的问题
    • 移除部分反射 API,合并至 BaseFinder 进行整合
    • 增加直接使用字符串创建 Hook 的方法

    1.0.1 | 2022.02.15  过期

    • RemedyPlan 增加 onFind 功能
    • 整合并修改了部分反射 API 代码
    • 增加了 type 中的 java 类型
    • 修复忽略错误在控制台仍然输出的问题

    1.0 | 2022.02.14  过期

    • 首个版本提交至 Maven
    - +

    更新日志

    这里记录了 YukiHookAPI 的版本更新历史。

    特别注意

    我们只会对最新的 API 版本进行维护,若你正在使用过时的 API 版本则代表你自愿放弃一切维护的可能性。

    1.1.5 | 2023.01.13  最新

    • 规范并优化整体代码风格
    • 对部分内部调用的 API 进行了私有化处理
    • 底层 API 接口整体解耦合,为兼容更多 Hook Framework 做准备
    • 将部分集成于 API 中的功能移动到 ksp-xposed 依赖 (解耦合),单独引入 api 依赖将不再包含第三方库等功能的引用
    • 文档 快速开始 页面加入 YukiHookAPI.Configs.isDebug 何时需要关闭的说明
    • 规范类型定义中的 Java 原始类型 (Primitive Type) 并同步更新到文档
    • Java type 新增 NumberClass 类型
    • 改进了 (Xposed) 宿主环境的识别能力
    • 接管了 Xposed 模块装载后的全部异常,若发生异常将会自动拦截并打印错误日志
    • 修改类型定义中较低 Android 系统版本 (Android 5.0) 中不存在的 Class 为空安全类型
    • 适配并支持原生 Xposed,最低推荐版本为 Android 7.0
    • Hook 入口类新增支持声明为 object 类型 (单例)
    • 修复 Android 8 以下系统不支持 Executable 类型导致 Hook 失效的问题
    • 修复 Android 9 以下系统在使用 Activity 代理功能时报错问题并限制此功能最低支持版本为 Android 7.0
    • 新增禁止资源注入与 Activity 代理功能注入当前模块自身实例进程,防止发生问题
    • 修复一个 Hook 过程中方法返回值的对象是目标的继承类和接口时被识别为返回值不符的严重错误
    • 修复在当前 Hook 的实例对象是静态的情况下调用 HookParam.callOriginalHookParam.invokeOriginal 出现对象为空问题
    • 优化对太极激活方法相关判断功能以及同步更新文档相关说明
    • 作废了 YukiHookAPI.Status.executorNameYukiHookAPI.Status.executorVersion,请转移到 YukiHookAPI.Status.Executor
    • 适配了一些第三方 Hook Framework 的 YukiHookAPI.Status.Executor.name 名称显示功能
    • 新增 Class.extendsClass.implements 等方法,可更加方便地判断当前 Class 的继承与接口关系
    • 新增 Class.toClassClass.toClassOrNull 等相关方法的同名泛型方法,可使用泛型来约束已知 Class 的实例对象类型
    • 修改 classOf<T> 方法的返回值为泛型 T,以约束已知 Class 的实例对象类型
    • 新增 Class 相关扩展方法的 initialize 参数,可控制在得到 Class 对象时是否同时初始化其静态方法块
    • 变量、方法、构造方法查找功能中新增 param { ... }type { ... } 等用法,可对查找的对象增加更加具体的条件判断
    • PackageParamloadApp 方法新增 isExcludeSelf 参数,可用于排除 Hook 相关功能注入模块自身实例进程
    • PackageParamonAppLifecycle 方法新增 isOnFailureThrowToApp 参数,可将生命周期方法体内发生的异常直接抛给宿主
    • 修改 PackageParam 中的 appClassLoader 为可修改变量,可在 Hook 过程中动态设置宿主使用的 ClassLoader
    • HookParam 中新增 dataExtra 功能,可用于临时存储 Hook 方法体中的数据
    • 作废 YukiHookModulePrefs 中的 isRunInNewXShareModeisXSharePrefsReadable,统一合并到 isPreferencesAvailable
    • Class.allFieldsClass.allMethods 等相关方法新增 isAccessible 参数,可控制成员对象何时可被设置为可访问类型
    • 修复 YukiHookDataChannel 存在多个宿主时在一个 Activity 中接收相同键值数据时仅会回调最后一个方法体的问题
    • YukiHookDataChannelwait 等相关方法中新增 priority 参数,可传入 ChannelPriority 来自定义回调数据结果的条件
    • YukiHookDataChannel 新增发送数据时自动使用 ChannelDataWrapper 类型包装功能,提升使用体验并增强数据保护
    • YukiHookDataChannel 新增限制一次性发送数据的最大字节大小功能,防止数据过大造成 APP 崩溃
    • YukiHookDataChannel 新增发送数据过大时自动分段发送功能,仅支持 ListMapSetString 类型
    • YukiHookLogger 新增 contents 方法与 saveToFiledata 参数,可传入自定义的调试日志数据进行格式化或保存到文件
    • 修复 YukiHookLogger 处理后的调试日志数据包名可能在 (Xposed) 宿主环境不正确的问题
    • 修复 Xposed 模块装载资源钩子 (Resources Hook) 事件时在部分系统上 (部分系统 APP 中) 包名可能不正确的问题

    1.1.4 | 2022.10.04  过旧

    • 修复 YukiHookDataChannel 可能不能响应系统框架中响应广播事件的问题,在 Android 13 中复现
    • 修复 YukiHookDataChannel 长达多个版本在 (Xposed) 宿主环境无法与模块通讯的问题
    • YukiHookDataChannel 中新增 obtainLoggerInMemoryData 方法,可在模块与宿主之间共享调试日志数据
    • 修改 YukiHookLogger.inMemoryData 的类型为 ArrayList 并修改 YukiLoggerDatadata class
    • 修复 YukiLoggerData 在模块中包名为空打印空白的问题
    • PackageParam 中新增 loadApploadZygoteloadSystemwithProcess 的同名多参数方法
    • 修复了一些可能存在的 BUG

    1.1.3 | 2022.09.30  过旧

    • 修复一个无法自定义 Hook 入口类名的致命错误
    • 添加 LoggerFactory 中的部分代码注释文案并更新特色功能文档

    1.1.2 | 2022.09.30  过期

    • 文档 基础知识 页面新增 English 版本友情链接
    • 修复 YukiBaseHooker 注释中的 English 文档链接错误问题
    • 修复 ModuleClassLoader 中的 ClassCastException 问题
    • 修正并规范部分代码注释
    • 新增 ModuleClassLoader 排除列表功能,可使用 excludeHostClassesexcludeModuleClasses 方法来自定义排除列表
    • 新增 YukiLoggerData 实时日志数据类,可实时通过 YukiHookLogger.inMemoryData 获取日志数组
    • 新增 ClassLoader.listOfClasses 方法,可直接获取当前 Dex 中的全部 Class

    1.1.1 | 2022.09.28  过期

    • 修复了文档 基础知识 页面友情链接错误的问题
    • 修复了文档 favicon 不显示的问题
    • 修复 DexClassFinder 查找条件中的 BUG

    1.1.0 | 2022.09.28  过期

    • 这是一次大版本更新,有关更新日志中提到的变化及用法请参考 API 文档 以及 特色功能
    • 更换帮助文档框架到 VuePress在新窗口中打开
    • 统一并规范文档中的术语名词,例如“查询”一律更改为了“查找”,XposedHelper 拼写错误修改为了 XposedHelpers
    • 文档 基础知识 页面加入友情链接,仅限简体中文
    • 将 Hook App Demo 的 ClassMethod 转为 Java 以提供更好的演示效果
    • 修正了 Hook Module Demo 中的代码注释命名
    • 重构了大量底层 Hook 逻辑及 Xposed API 的对接方式
    • 移除了 HookParamWrapper,现已将其直接与 YukiBridgeFactory 对接
    • 移动部分 YukiHookBridge 中的方法到 AppParasitics
    • 移除了 HookParam.args 与底层的直接对接方法 setArgs,直接获取并设置当前数组的对象
    • 优化自动处理程序,将引用的 jar 合并到 stub 项目
    • 修复多项目打包时模块包名无法正确匹配的问题以及修改自动处理程序的模块包名匹配逻辑,感谢 5ec1cff在新窗口中打开 的反馈及提供的解决方案
    • 对 API 私有工具类的方法进行了 internal 闭包处理,避免污染顶级命名空间
    • 修正了所有反射和 Hook 类的 Creater 命名到 Creator
    • 新增 YukiHookAPI.Status.compiledTimestamp 功能,可以在作为 Xposed 模块使用时获取编译完成的时间戳
    • 新增 YukiHookAPI.Status.isXposedEnvironment 功能,可以判断当前为 (Xposed) 宿主环境还是模块环境
    • 调试日志功能进行了大改版,现已将 YukiHookAPI.Configs.debugTag 等功能合并到 YukiHookLogger.Configs
    • 调试日志新增可指定打印使用的方法为 XposedBridge.logLogd
    • 调试日志中默认加入当前宿主的包名以及当前用户 ID,以供调试,你可以在 debugLog 配置中自行更改
    • 新增 generic 功能,可对泛型进行反射和调用,你可以在 ClassCurrentClass 中使用它
    • 作废 buildOfAny 方法,现在请直接使用 buildOf 方法 (不带泛型) 来使用构造方法创建新对象并得到结果 Any
    • 修复 hasExtends 使用过程发生空指针异常的问题
    • CurrentClass 新增非 lambda 方式的调用方法
    • CurrentClass 新增 namesimpleName 功能
    • 完全重写 ReflectionTool 的核心方法,将不同的查找条件进行了整理分类
    • 修复 ReflectionTool 中可能的直接调用 declared 获取的 Member 抛出异常的问题
    • 修复 ReflectionToolUndefinedType 未在 MethodConstructor 条件中正确判断的问题
    • 新增反射查找结果发生异常时的友好提示方式,可具体定位到指定条件找不到 Member 的问题
    • 反射查找 MethodConstructor 中新增 VagueType 条件,可使用在 param 条件中用于忽略你不想填写的参数
    • 反射查找 MethodConstructor 中新增 paramCount { ... } 条件,现在你可以直接拿到其中的 it 来自定义你的判断条件
    • FieldFinder 结果中新增 current 方法,可直接对结果实例创建调用空间
    • 修改了反射查找功能中的 modifiers 条件以及 name 条件,现在你需要对此方法体结尾返回一个 Boolean 以使条件成立
    • ModifierRules 中的 as* 功能改名为 is*,感谢 Kitsune在新窗口中打开 的建议
    • FieldFinder 中新增 RemedyPlan 功能
    • 新增 Dex 中的 Class 模糊查找功能 (Beta),你现在可以直接使用 searchClass 功能来使用指定条件模糊查找 Class
    • 新增反射查找中的多重查找功能,可使用相对查找条件同时获取多个查找结果,感谢 AA 以及 Kitsune在新窗口中打开 的建议
    • 修复 appClassLoader 获取到的对象在某些系统中的系统应用中不正确的问题,感谢 Luckyzyx在新窗口中打开 的反馈
    • 修改了 XposedBridge.invokeOriginalMethod 的调用方式并在 MethodFinder.Result.Instance 中增加 original 功能
    • 修复 YukiHookModulePrefsgetStringSet 方法取值错误的问题并优化代码风格,感谢 Teddy_Zhu在新窗口中打开PR在新窗口中打开
    • 修改 YukiHookModulePrefs,拦截 XSharePreference 可能不存在的异常
    • 修复 YukiHookDataChannel 在某些第三方 ROM 系统框架中无法注册成功的问题
    • 安全化 YukiHookDataChannel,现在它只能在来自指定包名的模块与宿主之间通信
    • 新增自动 Hook SharedPreferences 以修复部分系统中文件权限不是 0664 的问题,感谢 5ec1cff在新窗口中打开 的反馈及提供的实现代码
    • 新增 YukiHookAPI.Configs.isEnableHookSharedPreferences 功能,默认关闭,若 SharedPreferences 的权限错误可进行启用
    • 修复查找 Constructor 时无参构造方法在不填写查找条件时无法找到的 BUG,感谢 B5 KAKA 的反馈
    • 分离位于 injectMembermethodconstructorResult 实例到 Process
    • 在 Hook 过程中新增 useDangerousOperation 方法,未进行声明时在 Hook 危险列表中的功能后会自动停止 Hook 并打印错误
    • 新增模块资源注入与 Activity 代理功能,你可以调用 injectModuleAppResourcesregisterModuleAppActivities 来使用
    • 新增 ModuleContextThemeWrapper 功能,你可以调用 applyModuleTheme 在任意 Activity 中创建模块的 Context
    • 新增 ClassLoader.onLoadClass 功能,可用于监听 ClassLoaderloadClass 方法被调用的事件
    • 作废了 classOfclazz 扩展方法,新增 toClass 以及 toClassOrNull 用法,请现在转移到新的方法
    • VariousClass 新增 getOrNull 方法,可在匹配不到 Class 的时候不抛出异常而是返回 null
    • PackageParam.hook 中移除了 isUseAppClassLoader 参数,修改为 isForceUseAbsolute 并自动匹配目标 Class
    • PackageParam 新增 systemContext 功能,你可以在任意时间调用此功能获取一个持久化的 Context
    • 不再对外开放 HookClass 中的任何方法
    • HookParam 中新增 throwToApp 功能,可将异常直接抛给宿主
    • Hook 回调中新增 onFailureThrowToApp 功能,可在发生异常时直接抛给宿主
    • 修改了调试日志的打印逻辑,反射查找功能中的耗时记录仅会在 Hook 过程中进行打印
    • Hook 过程中新增解除 Hook 功能,可使用 removeremoveSelf 方法解除 Hook
    • 修复在 ReplaceHook 失败的时候导致宿主抛出异常的问题,现修改为调用原始方法保证宿主功能正常运行
    • 新增 Hook 过程中对方法返回值的检查功能,在返回值不匹配的情况下会根据情景自动抛出异常或打印错误
    • Resources Hook 中新增 array 类型,感谢 GSWXXN在新窗口中打开PR在新窗口中打开
    • 移动 me.weishu.reflectionthirdparty 防止同时引入的同名依赖冲突
    • 移除 Hook 方法体为空时抛出的异常,修改为打印警告日志
    • 修改 AppLifecycle 的异常处理逻辑,当其发生异常时直接抛给宿主
    • 更新 Demo 的 API 版本到 33

    1.0.92 | 2022.05.31  过期

    • 修正了大量方法中 callback 的命名方法
    • 更换方案再次修复 YukiHookDataChannel 在低于 Android 12 的设备上不能回调当前 Activity 广播的问题
    • InjectYukiHookWithXposed 注解新增 isUsingResourcesHook 功能,现在你可以选择性关闭自动生成 IXposedHookInitPackageResources 的依赖接口了

    1.0.91 | 2022.05.29  过期

    • 修复部分设备的定制系统在 LSPosed 环境下开机启动获取的 ClassLoader 错误的问题,感谢 Luckyzyx在新窗口中打开 的反馈
    • 修复 YukiHookDataChannelZUI 以及低于 Android 12 的系统上不能回调当前 Activity 广播的问题
    • 整合 YukiHookModuleStatus 功能到 YukiHookAPI.Status,重写了大量方法,现在你可以在模块与宿主中双向判断模块激活等状态信息

    1.0.90 | 2022.05.27  过期

    • 修复 YukiHookDataChannel 在模块设置监听回调时闪退的问题
    • 修复 YukiHookDataChannel 在非当前 Activity 情况下依然会回调的问题
    • 移除 YukiHookDataChannel 回调事件的默认值,没有即不回调
    • 移除 YukiHookModulePrefs 在 XShare 不可读的情况下打印的警告
    • 新增 YukiHookModulePrefs 中的 isXSharePrefsReadable 方法,可判断当前的 XShare 是否可用

    1.0.89 | 2022.05.26  过期

    • 修复 YukiHookDataChannel 不能重复设置监听的问题,并加入在模块不同 Activity 中重复响应和自动跟随 Activity 销毁监听功能
    • 新增 YukiHookDataChannel 重复监听用例说明文档
    • 加入 onAlreadyHooked 方法,可判断当前方法是否被重复 Hook
    • 修改部分重复添加 HashMap 的逻辑,移除 putIfAbsent 方法,允许覆盖添加
    • 修复了几处可能的 BUG

    1.0.88 | 2022.05.25  过期

    • 对 Xposed API 完全解耦合
    • 增加了 type 中的 android 类型
    • YukiHookModuleStatus 从自动生成代码中分离,并加入 isEnableHookModuleStatus 的开关,由你决定是否启用
    • 对 API 大量类的构造方法进行了 internal 闭包处理
    • YukiHookModulePrefs 设置为单例运行,防止重复创建浪费系统资源
    • 修复自 1.0.80 版本后无法嵌套 Hook 的 BUG,并优化嵌套 Hook 相关功能
    • 修改 Hooker 存储方案由 HashSet 到 HashMap,防止重复添加 Hooker 的问题
    • 修改 Hook 核心实现方法,加入查重,避免重复 Hook 多次回调 HookParam 方法
    • MethodFinderFieldFinder 加入查找模糊方法、变量名称功能,可调用 name { ... } 来设置查找条件,支持正则
    • 优化并修改 appContext 的获取方式,降低会取到空的问题的可能性
    • 修改自动生成的代码中 logger 的打印 TAG 默认为你自定义的名称,方便进行调试
    • 优化 YukiHookBridgeHooker 实现方式,提升 Hook 性能
    • PackageParam 增加 onAppLifecycle 方法,可原生监听宿主的生命周期以及实现注册系统广播功能
    • 新增 YukiHookDataChannel 功能,可在模块与宿主保持存活的情况下使用系统无序广播进行通讯
    • YukiHookDataChannel 增加 checkingVersionEquals 方法,可通过监听来验证模块更新后宿主并未更新版本不匹配问题
    • demo-module 的示例代码中新增 Java 版本的示例,仅供参考

    1.0.87 | 2022.05.10  过期

    • 新增 refreshModuleAppResources 功能,以适配语言区域、字体大小、分辨率改变等情况下的 Resources 刷新
    • 新增 isEnableModuleAppResourcesCache 功能,可自行设置是否自动缓存当前模块的 Resources

    1.0.86 | 2022.05.06  过期

    • 修复不支持 Resources Hook(资源钩子) 的情况下在 initZygote 时持续报错的问题,复现在 ZUI/LSPosed CI(1.8.3-6550)
    • 优化并对 Resources Hook 进行异常处理,只有被使用后不支持才会打印错误和警告

    1.0.85 | 2022.05.04  过期

    • 修复无法 Hook 系统框架的严重问题,从 1.0.80 开始出现
    • 调试日志中新增区分 initZygote 装载的包名为 android-zygotepackageName 保持 android 不变

    1.0.83 | 2022.05.04  过期

    • 修复 YukiHookModuleStatusloadSystem 后大量报错的问题
    • 新增 type 中的 android 类型
    • 更新帮助文档的示例说明

    1.0.82 | 2022.05.04  过期

    • 修复了一处概念混淆错误,区分 initZygote 与系统框架的关系,之前的注释和文档有问题,非常抱歉
    • PackageParam 新增 loadSystem 方法,不需要再写 loadApp(name = "android") 即可 Hook 系统框架

    1.0.81 | 2022.05.04  过期

    • 修复使用 by 方法设置条件后 Hook 方法体内查找不到的方法、构造方法依然输出错误日志的问题
    • 在执行 Hook 过程中加入全局日志显示当前 Hook APP 的包名,并修复一处错误日志打印样式的问题

    1.0.80 | 2022.05.01  过期

    • InjectYukiHookWithXposed 注解新增 entryClassName 功能,可自定义生成的 xposed_init 入口类名
    • YukiHookXposedInitProxy 更名为 IYukiHookXposedInit,原接口名称已作废,将在后续版本中直接被删除
    • 新增 initZygote 与 Resources Hook 功能,支持 Hook Layout
    • 新增 onXposedEvent 方法,可监听原生 Xposed API 的全部事件
    • 对 Hook 功能的 lambda 进行 inline 处理,避免生成过碎的匿名类,提升编译后的运行性能
    • 修复 PrefsData 编译后的方法体复制过大的问题
    • 增加 XSharePreference 可读性测试,失败后会自动打印警告日志
    • PackageParam 新增 appResourcesmoduleAppResourcesmoduleAppFilePath 功能
    • PackageParamloadApp 新增不写 name 功能,默认筛选全部 APP
    • PackageParam 新增 loadZygote 方法,可直接 Hook 系统框架
    • PackageParam 新增 resources().hook 功能
    • 优化方法、构造方法、变量查找功能,找不到的错误日志将优先显示已设置的查找条件
    • 增加 hasExtends 扩展方法,可判断当前 Class 是否有继承关系
    • 增加 isSupportResourcesHook 功能,判断当前是否支持资源钩子(Resources Hook)
    • current 功能新增 superClass 方法调用父类
    • 查找方法、构造方法、变量新增 superClass 查找条件,可继续在父类中查找
    • YukiHookAPI 大量方法与 Xposed API 解耦合
    • 新增 Xposed API 的原生 Hook 优先级功能
    • 修复 isFirstApplication 可能判断不准确的问题
    • 屏蔽 MIUI 系统上 MiuiCatcherPatch 重复调用 Hook 入口方法的问题
    • 优化 Hook 入口调用方法,避免因为 Hook Framework 问题导致多次调用
    • 修复 Hook ClassLoader 导致 Hook 卡死的问题,感谢 WankkoRee在新窗口中打开 的反馈
    • 提升 XC_Callback 接口对接后的性能
    • Java type 新增 ClassLoader 类型
    • 优化 API 帮助文档,修复可能持续缓存页面的问题

    1.0.78 | 2022.04.18  过期

    • YukiHookModulePrefs 新增 isRunInNewXShareMode 方法,可用于判断模块当前是否处于 New XSharePreference 模式
    • 修复 YukiHookModulePrefsNew XSharePreference 模式下工作的部分问题
    • 新增 ModulePreferenceFragment,现在,你可以完全替换掉 PreferenceFragmentCompat 并开始使用新的功能
    • 适配 PreferenceFragmentCompat 的 Sp 数据存储解决方案,感谢 mahoshojoHCG在新窗口中打开 的反馈
    • 更新自动处理程序以及 Kotlin 依赖到最新版本
    • 修正部分文档和代码注释中的错误

    1.0.77 | 2022.04.15  过期

    • YukiHookModulePrefs 新增 clear 方法,感谢 WankkoRee在新窗口中打开 的建议
    • YukiHookModulePrefs 新增 getStringSetputStringSetall 方法
    • HookParamargs 增加 any 方法
    • 新增 ModuleApplication,可在模块中继承此类实现更多功能
    • 对接全部的 findClass 功能到 Xposed API,在非宿主环境继续使用原生 ClassLoader
    • 修复了一些可能存在的 BUG

    1.0.75 | 2022.04.13  过期

    • 更正了自动处理程序的逻辑识别部分,感谢 ApeaSuperz在新窗口中打开 的贡献
    • 修正一处文档注释的引用未更改的问题
    • HookParam 中删除了 firstArgslastArgs 方法,现在你可以使用 args().first()args().last() 来取代它
    • HookParam 中删除了 args() 中的默认参数 index = 0,现在你可以使用 args().first()args(index = 0) 来取代它
    • HookParamresult 功能增加了泛型匹配,现在你可以使用 result<T> 来匹配你的目标方法已知返回值类型了
    • 方法、构造方法查找功能新增 emptyParam 条件,并完善了文档相关需要注意的查找条件误区
    • 增加了 type 中的 android 类型

    1.0.73 | 2022.04.10

    1.0.72 | 2022.04.09  过期

    • 更新 API 文档到新的地址
    • PackageParam 中加入 appContext 功能
    • 修复一些已知的 BUG,提升 Hook 稳定性

    1.0.71 | 2022.04.04  过期

    • 修复 VariousClass 无法匹配时会停止 Hook 抛出异常的严重问题

    1.0.70 | 2022.04.04  过期

    • 修复 instanceClass 在静态实例中调用后报错问题
    • 在 Hook 过程中加入 isUseAppClassLoader 功能,感谢 WankkoRee在新窗口中打开 的反馈
    • 加入 withProcess 功能,可根据 APP 当前指定进程进行 Hook
    • 修复查找方法、构造类和变量的严重逻辑错误问题
    • 修复 Hook 目标类不存在的时候无法忽略异常输出的问题
    • 修复部分情况下 APP 启动方法装载过快导致 Hook 不能生效的问题
    • 修复 allMethods 未 Hook 到方法时不会抛出异常的问题,感谢 WankkoRee在新窗口中打开 的反馈
    • 加入 Hook 状态监听功能,感谢 WankkoRee在新窗口中打开 的建议
    • 修改 Xposed 入口注入类的方式,重新声明 API 的定义域
    • 加入混淆的方法以及变量的查找功能,可使用不同类型筛选 index 定位指定的方法和变量,感谢 WankkoRee在新窗口中打开 提供的思路
    • 查找方法、变量时允许传入多种类型,例如 String 声明的类名和 VariousClass
    • 加入全新的 current 功能,可对任意的类构建一个反射方法操作空间,方便地调用和修改其中的方法和变量
    • 修复了 Hook 过程中的大量 BUG,感谢 WankkoRee在新窗口中打开 对此项目所做出的贡献

    1.0.69 | 2022.03.30  过期

    • 添加并改进一些方法功能的注释
    • 增加 Demo 中的更多示例 Hook 内容
    • 修复在一个 Hook 实例中,allMethods 多次使用时只有最后一个生效的问题,感谢 WankkoRee在新窗口中打开 的反馈

    1.0.68 | 2022.03.29  过期

    • 增加 Demo 中的新用例和 LSPosed 作用域
    • 增加 Member 查找缓存和查找缓存配置开关
    • 移除和修改 MethodFinderFieldFinder 以及 HookParam 相关方法的调用
    • 增加更多 Finder 中的 cast 类型并支持 cast 为数组
    • 整体的性能和稳定性提升
    • 修复上一个版本可能存在的 BUG

    1.0.67 | 2022.03.27  过期

    • 增加三个 Finder 中的 modifiers 功能,可筛选 staticnativepublicabstract 等诸多描述类型
    • 增加方法和构造方法查找时可模糊方法参数类型为指定个数进行查找
    • 增加 MemberhasModifiers 扩展功能
    • 增加 MethodFinderConstructorFinder 中的 give 方法,可获得原始类型
    • 增加 YukiHookModulePrefs 中的 PrefsData 模板功能
    • 彻底对方法、构造方法及变量的查找方案进行重构
    • 优化代码注释,修复了可能产生的 BUG

    1.0.66 | 2022.03.25  过期

    • 修复 MethodFinder 中的一个严重问题
    • 增加 hookParam 中的 args 调用方法
    • 修复其它可能存在的问题以及修复部分类的注释问题

    1.0.65 | 2022.03.25  过期

    • 重新发布版本修复 Maven 仓库因为缓存问题新版本不正确的情况
    • 增加 MethodFinderFieldFinder 新的返回值调用方法
    • 修复可能存在的问题,并修复太极使用过程中可能存在的问题
    • 修复自动生成 Xposed 入口类可能发生的问题
    • 增加了 type 中的 android 类型以及 java 类型

    1.0.6 | 2022.03.20  过期

    • 修复 YukiHookModulePrefs 在使用一次 direct 忽略缓存后每次都忽略的 BUG
    • 增加新的 API,作废了 isActive 判断模块激活的传统用法
    • 修复非 Xposed 环境使用 API 时打印调试日志的问题
    • 修复查找 Field 时的日志输出问题和未拦截的异常问题
    • 解耦合 ReflectionUtils 中的 Xposed API
    • 增加 YukiHookModuleStatus 方法名称的混淆,以精简模块生成的体积
    • 装载模块自身 Hook 时将不再打印欢迎信息
    • 修复上一个版本仍然存在的某些 BUG

    1.0.55 | 2022.03.18  过期

    • 修正一处注释错误
    • 临时修复一个 BUG
    • 增加了 type 中的大量 android 类型以及少量 java 类型
    • 修复新版与旧版 Kotlin APIs 的兼容性问题

    1.0.5 | 2022.03.18  过期

    • 修复旧版本 LSPosed 框架情况下欢迎信息多次打印的问题
    • 添加 onInit 方法来配置 YukiHookAPI
    • 新增 executorNameexecutorVersion 来获取当前 Hook Framework 的名称和版本号
    • 新增 by 方法来设置 Hook 的时机和条件
    • YukiHookModulePrefs 新增可控制的键值缓存,可在宿主运行时模块动态更新数据
    • 修复了一些可能存在的 BUG

    1.0.4 | 2022.03.06  过期

    • 修复 LSPosed 在最新版本中启用“只有模块classloader可以使用Xposed API”选项后找不到 XposedBridge 的问题
    • 添加 YukiHookAPI 的常量版本名称和版本号
    • 新增 hasField 方法以及 isAllowPrintingLogs 配置参数
    • 新增 isDebug 开启的情况下 API 将自动打印欢迎信息测试模块是否生效

    1.0.3 | 2022.03.02  过期

    • 修复一个潜在性的异常未拦截 BUG
    • 增加 ignoredError 功能
    • 增加了 type 中的 android 类型
    • 增加监听 hook 后的 ClassNotFound 功能

    1.0.2 | 2022.02.18  过期

    • 修复 Windows 下无法找到项目路径的问题
    • 移除部分反射 API,合并至 BaseFinder 进行整合
    • 增加直接使用字符串创建 Hook 的方法

    1.0.1 | 2022.02.15  过期

    • RemedyPlan 增加 onFind 功能
    • 整合并修改了部分反射 API 代码
    • 增加了 type 中的 java 类型
    • 修复忽略错误在控制台仍然输出的问题

    1.0 | 2022.02.14  过期

    • 首个版本提交至 Maven
    + diff --git a/docs/zh-cn/about/contacts.html b/docs/zh-cn/about/contacts.html index 96288503b..f431bf584 100644 --- a/docs/zh-cn/about/contacts.html +++ b/docs/zh-cn/about/contacts.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 联系我们 | Yuki Hook API - + 联系我们 | Yuki Hook API + -

    联系我们

    如在使用中有任何问题,或有任何建设性的建议,都可以联系我们。

    加入我们 点击加入 Telegram 群组在新窗口中打开

    酷安 找到我 @星夜不荟在新窗口中打开

    助力维护

    感谢您选择并使用 YukiHookAPI,如有代码相关的建议和请求,可在 Github 提交 Pull Request。

    - +

    联系我们

    如在使用中有任何问题,或有任何建设性的建议,都可以联系我们。

    加入我们 点击加入 Telegram 群组在新窗口中打开

    酷安 找到我 @星夜不荟在新窗口中打开

    助力维护

    感谢您选择并使用 YukiHookAPI,如有代码相关的建议和请求,可在 Github 提交 Pull Request。

    + diff --git a/docs/zh-cn/about/future.html b/docs/zh-cn/about/future.html index 9a800ee17..aed5e15c2 100644 --- a/docs/zh-cn/about/future.html +++ b/docs/zh-cn/about/future.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 展望未来 | Yuki Hook API - + 展望未来 | Yuki Hook API + -

    展望未来

    未来是美好的,也是不确定的,让我们共同期待 YukiHookAPI 在未来的发展空间。

    未解决的问题

    这里收录了 YukiHookAPI 尚未解决的问题。

    YukiHookModulePrefs

    目前仅限完美支持 LSPosed,其它 Xposed 框架需要降级模块 API。

    可能完全不支持太极,太极在高版本系统上需要更低的 API 才能适配。

    部分 Xposed 模块开发者目前选择 Hook 目标 APP 内置 Sp 存储方案解决模块设置共享问题。

    后期 Android 系统的权限将越来越严格,selinux 就是目前面临的一个大问题,有待讨论和研究。

    未来的计划

    这里收录了 YukiHookAPI 可能会在后期添加的功能。

    支持独立使用的 Lite 版本

    待讨论

    目前 API 只支持通过自动处理程序绑定到 xposed_init,若您不喜欢自动处理程序,一定要自己实现模块装载入口,未来会按照需求人数推出仅有 API 功能的 Lite 版本,你可向我们提出 issues

    API 已经提供了 Xposed 原生 API 监听接口,你可以 在这里 找到或查看 Demo 的实现方法。

    支持更多 Hook Framework

    作为 API 来讲,目前仅仅对接 XposedBridge 作为兼容层,还是有一定的局限性。

    大部分 inline hook 没有 Java 兼容层,后期可能会考虑 native hookJava 兼容层适配。

    - +

    展望未来

    未来是美好的,也是不确定的,让我们共同期待 YukiHookAPI 在未来的发展空间。

    未解决的问题

    这里收录了 YukiHookAPI 尚未解决的问题。

    YukiHookModulePrefs

    目前仅限完美支持 LSPosed,其它 Xposed 框架需要降级模块 API。

    可能完全不支持太极,太极在高版本系统上需要更低的 API 才能适配。

    部分 Xposed 模块开发者目前选择 Hook 目标 APP 内置 Sp 存储方案解决模块设置共享问题。

    后期 Android 系统的权限将越来越严格,selinux 就是目前面临的一个大问题,有待讨论和研究。

    未来的计划

    这里收录了 YukiHookAPI 可能会在后期添加的功能。

    支持独立使用的 Lite 版本

    待讨论

    目前 API 只支持通过自动处理程序绑定到 xposed_init,若您不喜欢自动处理程序,一定要自己实现模块装载入口,未来会按照需求人数推出仅有 API 功能的 Lite 版本,你可向我们提出 issues

    API 已经提供了 Xposed 原生 API 监听接口,你可以 在这里 找到或查看 Demo 的实现方法。

    支持更多 Hook Framework

    作为 API 来讲,目前仅仅对接 XposedBridge 作为兼容层,还是有一定的局限性。

    大部分 inline hook 没有 Java 兼容层,后期可能会考虑 native hookJava 兼容层适配。

    + diff --git a/docs/zh-cn/api/home.html b/docs/zh-cn/api/home.html index c28e4fa3b..fd364aafb 100644 --- a/docs/zh-cn/api/home.html +++ b/docs/zh-cn/api/home.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 文档介绍 | Yuki Hook API - + 文档介绍 | Yuki Hook API + -

    文档介绍

    这里的文档将同步最新 API 版本的相关用法,请保持 YukiHookAPI 为最新版本以使用最新版本的功能。

    功能描述说明

    功能描述主要介绍当前 API 的相关用法和用途。

    功能示例说明

    功能示例主要展示了当前 API 的基本用法示例,可供参考。

    变更记录说明

    首个版本的功能将标记为 v<version> 添加

    后期新增加的功能将标记为 v<version> 新增

    后期修改的功能将被追加为 v<version> 修改

    后期被作废的功能将标记为 v<version> 作废 并会标注删除线;

    后期被删除的功能将标记为 v<version> 移除 并会标注删除线。

    相关符号说明

    • kt  Kotlin Static File

    • annotation  注解

    • interface  接口

    • object  类 (单例)

    • class  类

    • field  变量或 getset 方法或只读的 get 方法

    • method  方法

    • enum  Enum 常量

    • ext-field  扩展的变量 (全局)

    • ext-method  扩展的方法 (全局)

    • i-ext-field  扩展的变量 (调用域限制)

    • i-ext-method  扩展的方法 (调用域限制)

    - +

    文档介绍

    这里的文档将同步最新 API 版本的相关用法,请保持 YukiHookAPI 为最新版本以使用最新版本的功能。

    功能描述说明

    功能描述主要介绍当前 API 的相关用法和用途。

    功能示例说明

    功能示例主要展示了当前 API 的基本用法示例,可供参考。

    变更记录说明

    首个版本的功能将标记为 v<version> 添加

    后期新增加的功能将标记为 v<version> 新增

    后期修改的功能将被追加为 v<version> 修改

    后期被作废的功能将标记为 v<version> 作废 并会标注删除线;

    后期被删除的功能将标记为 v<version> 移除 并会标注删除线。

    相关符号说明

    • kt  Kotlin Static File

    • annotation  注解

    • interface  接口

    • object  类 (单例)

    • class  类

    • field  变量或 getset 方法或只读的 get 方法

    • method  方法

    • enum  Enum 常量

    • ext-field  扩展的变量 (全局)

    • ext-method  扩展的方法 (全局)

    • i-ext-field  扩展的变量 (调用域限制)

    • i-ext-method  扩展的方法 (调用域限制)

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html index 26489f7c6..36d793c80 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/YukiHookAPI.html @@ -22,24 +22,27 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookAPI - object | Yuki Hook API - + YukiHookAPI - object | Yuki Hook API + -

    YukiHookAPI - object

    object YukiHookAPI
    +    

    YukiHookAPI - object

    object YukiHookAPI
     

    变更记录

    v1.0 添加

    功能描述

    这是 YukiHookAPI 的 API 调用总类,Hook 相关功能的开始、Hook 相关功能的配置都在这里。

    API_VERSION_NAME - field

    const val API_VERSION_NAME: String
     

    变更记录

    v1.0.4 新增

    功能描述

    获取当前 YukiHookAPI 的版本。

    API_VERSION_CODE - field

    const val API_VERSION_CODE: Int
    -

    变更记录

    v1.0.4 新增

    功能描述

    获取当前 YukiHookAPI 的版本号。

    executorName - field

    变更记录

    v1.0.5 新增

    v1.0.91 移除

    请转移到 Status.executorName

    executorVersion - field

    变更记录

    v1.0.5 新增

    v1.0.91 移除

    请转移到 Status.executorVersion

    Status - object

    object Status
    +

    变更记录

    v1.0.4 新增

    功能描述

    获取当前 YukiHookAPI 的版本号。

    executorName - field

    变更记录

    v1.0.5 新增

    v1.0.91 移除

    请转移到 Status.Executor.name

    executorVersion - field

    变更记录

    v1.0.5 新增

    v1.0.91 移除

    请转移到 Status.Executor.apiLevelStatus.Executor.versionNameStatus.Executor.versionCode

    Status - object

    object Status
     

    变更记录

    v1.0.91 新增

    功能描述

    当前 YukiHookAPI 的状态。

    compiledTimestamp - field

    val compiledTimestamp: Long
     

    变更记录

    v1.1.0 新增

    功能描述

    获取项目编译完成的时间戳 (当前本地时间)。

    isXposedEnvironment - field

    val isXposedEnvironment: Boolean
    -

    变更记录

    v1.1.0 新增

    功能描述

    获取当前是否为 (Xposed) 宿主环境。

    executorName - field

    val executorName: String
    -

    变更记录

    v1.0.91 新增

    功能描述

    获取当前 Hook 框架的名称。

    无法获取会返回 unknownXposedBridge 不存在会返回 invalid

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    executorVersion - field

    val executorVersion: Int
    -

    变更记录

    v1.0.91 新增

    功能描述

    获取当前 Hook 框架的版本。

    无法获取会返回 -1

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    isModuleActive - field

    val isModuleActive: Boolean
    +

    变更记录

    v1.1.0 新增

    功能描述

    获取当前是否为 (Xposed) 宿主环境。

    executorName - field

    变更记录

    v1.0.91 新增

    v1.1.5 作废

    请转移到 Executor.name

    executorVersion - field

    变更记录

    v1.0.91 新增

    v1.1.5 作废

    请转移到 Executor.apiLevelExecutor.versionNameExecutor.versionCode

    isModuleActive - field

    val isModuleActive: Boolean
     

    变更记录

    v1.0.91 新增

    功能描述

    判断模块是否在 Xposed 或太极、无极中激活。

    注意

    在模块环境中你需要将 Application 继承于 ModuleApplication

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中仅返回非 isTaiChiModuleActive 的激活状态。

    isXposedModuleActive - field

    val isXposedModuleActive: Boolean
     

    变更记录

    v1.0.91 新增

    功能描述

    仅判断模块是否在 Xposed 中激活。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中始终返回 true。

    isTaiChiModuleActive - field

    val isTaiChiModuleActive: Boolean
     

    变更记录

    v1.0.91 新增

    功能描述

    仅判断模块是否在太极、无极中激活。

    注意

    在模块环境中你需要将 Application 继承于 ModuleApplication

    在 (Xposed) 宿主环境中始终返回 false。

    isSupportResourcesHook - field

    val isSupportResourcesHook: Boolean
    -

    变更记录

    v1.0.91 新增

    功能描述

    判断当前 Hook Framework 是否支持资源钩子(Resources Hook)。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中可能会延迟等待事件回调后才会返回 true。

    请注意你需要确保 InjectYukiHookWithXposed.isUsingResourcesHook 已启用,否则始终返回 false。

    Configs - object

    object Configs
    +

    变更记录

    v1.0.91 新增

    功能描述

    判断当前 Hook Framework 是否支持资源钩子(Resources Hook)。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    在 (Xposed) 宿主环境中可能会延迟等待事件回调后才会返回 true。

    请注意你需要确保 InjectYukiHookWithXposed.isUsingResourcesHook 已启用,否则始终返回 false。

    Executor - object

    object Executor
    +

    变更记录

    v1.1.5 新增

    功能描述

    当前 YukiHookAPI 使用的 Hook Framework 相关信息。

    name - field

    val name: String
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前 Hook Framework 名称。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    apiLevel - field

    val apiLevel: Int
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前 Hook Framework 的 API 版本。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    versionName - field

    val versionName: String
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前 Hook Framework 版本名称。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    versionCode - field

    val versionCode: Int
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前 Hook Framework 版本号。

    注意

    在模块环境中需要启用 Configs.isEnableHookModuleStatus

    Configs - object

    object Configs
     

    变更记录

    v1.0 添加

    功能描述

    对 API 相关功能的配置类。

    debugLog - method

    inline fun debugLog(initiate: YukiHookLogger.Configs.() -> Unit)
     

    变更记录

    v1.1.0 新增

    功能描述

    配置 YukiHookLogger.Configs 相关参数。

    debugTag - field

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转移到 YukiHookLogger.Configs.tag

    isDebug - field

    var isDebug: Boolean
     

    变更记录

    v1.0 添加

    功能描述

    是否启用 DEBUG 模式。

    默认为开启状态,开启后模块将会向 LogcatXposedBridge.log 打印详细的 Hook 日志,关闭后仅会打印 E 级别的日志。

    isAllowPrintingLogs - field

    变更记录

    v1.0.4 新增

    v1.1.0 作废

    请转移到 YukiHookLogger.Configs.isEnable

    isEnableModulePrefsCache - field

    var isEnableModulePrefsCache: Boolean
    @@ -125,6 +128,6 @@
     
    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     
    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
     

    变更记录

    v1.0 添加

    功能描述

    装载 Hook 入口的核心方法。

    功能示例

    详情请参考

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html index 03b91016d..780a56c06 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.html @@ -22,18 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - InjectYukiHookWithXposed - annotation | Yuki Hook API - + InjectYukiHookWithXposed - annotation | Yuki Hook API + -

    InjectYukiHookWithXposed - annotation

    annotation class InjectYukiHookWithXposed(
    +    

    InjectYukiHookWithXposed - annotation

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
         val isUsingResourcesHook: Boolean
     )
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    新增 entryClassName 参数

    v1.0.92 修改

    新增 isUsingResourcesHook 参数

    功能描述

    标识 YukiHookAPI 注入 Xposed 入口的类注解。

    功能示例

    详情请参考 InjectYukiHookWithXposed 注解

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html index 40b87c50d..87568d19c 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/CurrentClass.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - CurrentClass - class | Yuki Hook API - + CurrentClass - class | Yuki Hook API + -

    CurrentClass - class

    class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
    +    

    CurrentClass - class

    class CurrentClass internal constructor(internal val classSet: Class<*>, internal val instance: Any)
     

    变更记录

    v1.0.70 新增

    v1.1.0 修改

    调整了构造方法的参数名称

    功能描述

    当前实例的类操作对象。

    name - field

    val name: String
     

    变更记录

    v1.1.0 新增

    功能描述

    获得当前 classSetClass.getName

    simpleName - field

    val simpleName: String
     

    变更记录

    v1.1.0 新增

    功能描述

    获得当前 classSetClass.getSimpleName

    generic - method

    fun generic(): GenericClass?
    @@ -43,6 +43,6 @@
     

    变更记录

    v1.1.0 新增

    功能描述

    获得当前实例父类中的泛型父类。

    如果当前实例不存在泛型将返回 null

    field - method

    inline fun field(initiate: FieldConditions): FieldFinder.Result.Instance
     

    变更记录

    v1.0.80 新增

    功能描述

    调用父类实例中的变量。

    method - method

    inline fun method(initiate: MethodConditions): MethodFinder.Result.Instance
     

    变更记录

    v1.0.80 新增

    功能描述

    调用父类实例中的方法。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html index 2c05ba322..3df3e939e 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/GenericClass.html @@ -22,14 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - GenericClass - class | Yuki Hook API - + GenericClass - class | Yuki Hook API + -

    GenericClass - class

    class GenericClass internal constructor(private val type: ParameterizedType)
    +    

    GenericClass - class

    class GenericClass internal constructor(private val type: ParameterizedType)
     

    变更记录

    v1.1.0 新增

    功能描述

    当前 Class 的泛型父类操作对象。

    argument - method

    fun argument(index: Int): Class<*>
    -

    变更记录

    v1.1.0 新增

    功能描述

    获得泛型参数数组下标的 Class 实例。

    - +
    inline fun <reified T> argument(index: Int): Class<T>
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增泛型返回值 Class<T> 方法

    功能描述

    获得泛型参数数组下标的 Class 实例。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html index d0899084c..f72e35492 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookClass.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - HookClass - class | Yuki Hook API - + HookClass - class | Yuki Hook API + -

    HookClass - class

    class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    HookClass 相关功能不再对外开放

    功能描述

    创建一个当前 Hook 的 Class 接管类。

    instance 为实例,name 为实例完整包名,throwable 为找不到实例的时候抛出的异常。

    - +

    HookClass - class

    class HookClass internal constructor(internal var instance: Class<*>?, internal var name: String, internal var throwable: Throwable?)
    +

    变更记录

    v1.0 添加

    v1.1.0 修改

    HookClass 相关功能不再对外开放

    功能描述

    创建一个当前 Hook 的 Class 接管类。

    instance 为实例,name 为实例完整包名,throwable 为找不到实例的时候抛出的异常。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html index 49dd7330c..1c5b7ab37 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/HookResources.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - HookResources - class | Yuki Hook API - + HookResources - class | Yuki Hook API + -

    HookResources - class

    class HookResources internal constructor(var instance: YukiResources?)
    +    

    HookResources - class

    class HookResources internal constructor(var instance: YukiResources?)
     

    变更记录

    v1.0.80 新增

    功能描述

    创建一个当前 Hook 的 YukiResources 接管类。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html index 351f71496..26e265395 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/bean/VariousClass.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - VariousClass - class | Yuki Hook API - + VariousClass - class | Yuki Hook API + -

    VariousClass - class

    class VariousClass(vararg var name: String)
    -

    变更记录

    v1.0 添加

    功能描述

    这是一个不确定性 Class 类名装载器,通过 name 装载 Class 名称数组。

    get - method

    fun get(loader: ClassLoader? = null): Class<*>
    -

    变更记录

    v1.0.70 新增

    功能描述

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null): Class<*>?
    -

    变更记录

    v1.1.0 新增

    功能描述

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    匹配不到 Class 会返回 null,不会抛出异常。

    - +

    VariousClass - class

    class VariousClass(private vararg val name: String)
    +

    变更记录

    v1.0 添加

    v1.1.5 修改

    私有化 name 参数并设置为不可修改

    功能描述

    这是一个不确定性 Class 类名装载器,通过 name 装载 Class 名称数组。

    get - method

    fun get(loader: ClassLoader? = null, initialize: Boolean): Class<*>
    +

    变更记录

    v1.0.70 新增

    v1.1.5 修改

    新增 initialize 参数

    功能描述

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    getOrNull - method

    fun getOrNull(loader: ClassLoader? = null, initialize: Boolean): Class<*>?
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增 initialize 参数

    功能描述

    获取匹配的实体类。

    使用当前 loader 装载目标 Class

    匹配不到 Class 会返回 null,不会抛出异常。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html index f10d593ef..c7dfcebd3 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - YukiMemberHookCreator - class | Yuki Hook API - + YukiMemberHookCreator - class | Yuki Hook API + -

    YukiMemberHookCreator - class

    class YukiMemberHookCreator(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    -

    变更记录

    v1.0 添加

    v1.0.80 修改

    hookClass 进行 inline 处理

    v1.1.0 修改

    修正拼写错误的 Creater 命名到 Creator

    功能描述

    YukiHookAPIMember 核心 Hook 实现类。

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
    +    

    YukiMemberHookCreator - class

    class YukiMemberHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookClass: HookClass)
    +

    变更记录

    v1.0 添加

    v1.0.80 修改

    hookClass 进行 inline 处理

    v1.1.0 修改

    修正拼写错误的 Creater 命名到 Creator

    v1.1.5 修改

    私有化构造方法

    功能描述

    YukiHookAPIMember 核心 Hook 实现类。

    PRIORITY_DEFAULT - field

    val PRIORITY_DEFAULT: Int
     

    变更记录

    v1.0.80 新增

    功能描述

    默认 Hook 回调优先级。

    PRIORITY_LOWEST - field

    val PRIORITY_LOWEST: Int
     

    变更记录

    v1.0.80 新增

    功能描述

    延迟回调 Hook 方法结果。

    PRIORITY_HIGHEST - field

    val PRIORITY_HIGHEST: Int
     

    变更记录

    v1.0.80 新增

    功能描述

    更快回调 Hook 方法结果。

    instanceClass - field

    val instanceClass: Class<*>
    @@ -46,15 +46,15 @@
     

    变更记录

    v1.1.0 新增

    功能描述

    允许 Hook 过程中的所有危险行为。

    请在 option 中键入 Yes do as I say! 代表你同意允许所有危险行为。

    你还需要在整个调用域中声明注解 CauseProblemsApi 以消除警告。

    若你只需要 Hook ClassLoaderloadClass 方法,请参考 ClassLoader.onLoadClass

    特别注意

    若你不知道允许此功能会带来何种后果,请勿使用。

    MemberHookCreator - class

    inner class MemberHookCreator internal constructor(private val priority: Int, internal val tag: String)
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    增加 priority Hook 优先级

    v1.0.81 修改

    增加 packageName 当前 Hook 的 APP 包名

    v1.1.0 修改

    移除 packageName

    修正拼写错误的 Creater 命名到 Creator

    功能描述

    Hook 核心功能实现类,查找和处理需要 Hook 的 MethodConstructor

    member - field

    变更记录

    v1.0 添加

    v1.1.0 移除

    请转移到 members

    members - method

    fun members(vararg member: Member?)
     

    变更记录

    v1.1.0 新增

    功能描述

    手动指定要 Hook 的 MethodConstructor

    注意

    不建议使用此方法设置目标需要 Hook 的 Member 对象,你可以使用 methodconstructor 方法。

    功能示例

    你可以调用 instanceClass 来手动查找要 Hook 的 MethodConstructor

    示例如下

    injectMember {
    -    members(instanceClass.getDeclaredMethod("test", StringType))
    +    members(instanceClass.getDeclaredMethod("test", StringClass))
         beforeHook {}
         afterHook {}
     }
     

    同样地,你也可以传入一组 Member 同时进行 Hook。

    示例如下

    injectMember {
         members(
    -        instanceClass.getDeclaredMethod("test1", StringType),
    -        instanceClass.getDeclaredMethod("test2", StringType),
    -        instanceClass.getDeclaredMethod("test3", StringType)
    +        instanceClass.getDeclaredMethod("test1", StringClass),
    +        instanceClass.getDeclaredMethod("test2", StringClass),
    +        instanceClass.getDeclaredMethod("test3", StringClass)
         )
         beforeHook {}
         afterHook {}
    @@ -64,7 +64,7 @@
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    查找当前 Class 需要 Hook 的 Method

    功能示例

    你可参考 MethodFinder 查看详细用法。

    示例如下

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         beforeHook {}
    @@ -80,7 +80,7 @@
     }
     

    此时 beforeHookafterHook 会在每个查找到的结果中多次回调 Hook 方法体。

    注意

    若没有 all,默认只会 Hook 当前条件查找到的数组下标结果第一位。

    constructor - method

    inline fun constructor(initiate: ConstructorConditions): ConstructorFinder.Result
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    查找当前 Class 需要 Hook 的 Constructor

    功能示例

    你可参考 ConstructorFinder 查看详细用法。

    示例如下

    injectMember {
    -    constructor { param(StringType) }
    +    constructor { param(StringClass) }
         beforeHook {}
         afterHook {}
     }
    @@ -93,7 +93,7 @@
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    使用当前 hookClass 查找并得到 Field

    功能示例

    你可参考 FieldFinder 查看详细用法。

    示例如下

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }
         afterHook {
    @@ -148,6 +148,6 @@
     

    变更记录

    v1.0.70 新增

    功能描述

    监听 hookClass 存在时准备开始 Hook 的操作。

    onHookClassNotFoundFailure - method

    fun onHookClassNotFoundFailure(result: (Throwable) -> Unit): Result
     

    变更记录

    v1.0.3 新增

    功能描述

    监听 hookClass 找不到时发生错误的回调方法。

    ignoredHookClassNotFoundFailure - method

    fun ignoredHookClassNotFoundFailure(): Result
     

    变更记录

    v1.0.3 新增

    功能描述

    忽略 hookClass 找不到时出现的错误。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html index 19231d77d..27a8477ed 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/YukiResourcesHookCreator.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - YukiResourcesHookCreator - class | Yuki Hook API - + YukiResourcesHookCreator - class | Yuki Hook API + -

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    -

    变更记录

    v1.0.80 新增

    v1.1.0 修改

    修正拼写错误的 Creater 命名到 Creator

    功能描述

    YukiHookAPIResources 核心 Hook 实现类。

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
    +    

    YukiResourcesHookCreator - class

    class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources)
    +

    变更记录

    v1.0.80 新增

    v1.1.0 修改

    修正拼写错误的 Creater 命名到 Creator

    v1.1.5 修改

    私有化构造方法

    功能描述

    YukiHookAPIResources 核心 Hook 实现类。

    injectResource - method

    inline fun injectResource(tag: String, initiate: ResourceHookCreator.() -> Unit): ResourceHookCreator.Result
     

    变更记录

    v1.0.80 新增

    功能描述

    注入要 Hook 的 Resources。

    功能示例

    你可以注入任意 Resources,使用 injectResource 即可创建一个 Hook 对象。

    示例如下

    injectResource {
         // Your code here.
     }
    @@ -122,6 +122,6 @@
     

    变更记录

    v1.0.80 新增

    功能描述

    添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。

    onHookingFailure - method

    fun onHookingFailure(result: (Throwable) -> Unit): Result
     

    变更记录

    v1.0.80 新增

    功能描述

    监听 Hook 过程发生错误的回调方法。

    ignoredHookingFailure - method

    fun ignoredHookingFailure(): Result
     

    变更记录

    v1.0.80 新增

    功能描述

    忽略 Hook 过程出现的错误。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html index 92b7a339b..7c5027f16 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - BaseFinder - class | Yuki Hook API - + BaseFinder - class | Yuki Hook API + -

    BaseFinder - class

    abstract class BaseFinder
    +    

    BaseFinder - class

    abstract class BaseFinder
     

    变更记录

    v1.0.70 新增

    v1.1.0 修改

    分离原始命名 BaseFinder 中的部分方法与参数到 MemberBaseFinder

    功能描述

    这是 ClassMember 查找类功能的基本类实现。

    BaseFinder.IndexTypeCondition - class

    inner class IndexTypeCondition internal constructor(private val type: IndexConfigType)
     

    变更记录

    v1.0.70 新增

    功能描述

    字节码下标筛选实现类。

    index - method

    fun index(num: Int)
     

    变更记录

    v1.0.70 新增

    功能描述

    设置下标。

    index 小于零则为倒序,此时可以使用 IndexTypeConditionSort.reverse 方法实现。

    可使用 IndexTypeConditionSort.firstIndexTypeConditionSort.last 设置首位和末位筛选条件。

    index - method

    fun index(): IndexTypeConditionSort
    @@ -36,6 +36,6 @@
     

    变更记录

    v1.0.70 新增

    功能描述

    设置满足条件的第一个。

    last - method

    fun last()
     

    变更记录

    v1.0.70 新增

    功能描述

    设置满足条件的最后一个。

    reverse - method

    fun reverse(num: Int)
     

    变更记录

    v1.0.70 新增

    功能描述

    设置倒序下标。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html index 8eacf91ad..fb67b4f16 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/CountRules.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - CountRules - class | Yuki Hook API - + CountRules - class | Yuki Hook API + -

    CountRules - class

    class CountRules private constructor()
    +    

    CountRules - class

    class CountRules private constructor()
     

    变更记录

    v1.1.0 新增

    功能描述

    这是一个模糊 ClassMember 数组 (下标) 个数条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    Int.isZero - i-ext-method

    fun Int.isZero(): Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    是否为 0。

    Int.moreThan - i-ext-method

    fun Int.moreThan(count: Int): Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    大于 count

    Int.lessThan - i-ext-method

    fun Int.lessThan(count: Int): Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    小于 count

    Int.inInterval - i-ext-method

    fun Int.inInterval(countRange: IntRange): Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    countRange 区间 A ≤ this ≤ B。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html index 66f2a5f6d..8a1a1884b 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ModifierRules.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModifierRules - class | Yuki Hook API - + ModifierRules - class | Yuki Hook API + -

    ModifierRules - class

    class ModifierRules private constructor()
    +    

    ModifierRules - class

    class ModifierRules private constructor()
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    新增 Class 的描述符判断

    作为 lambda 整体判断条件使用

    移动到 base 包名

    私有化构造方法

    功能描述

    这是一个 ClassMember 描述符条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    isPublic - i-ext-field

    val isPublic: Boolean
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    ClassMember 类型是否包含 public

    isPrivate - i-ext-field

    val isPrivate: Boolean
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    ClassMember 类型是否包含 private

    isProtected - i-ext-field

    val isProtected: Boolean
    @@ -41,6 +41,6 @@
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    Class 类型是否包含 interface

    isAbstract - i-ext-field

    val isAbstract: Boolean
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    ClassMember 类型是否包含 abstract

    对于任意的抽象 ClassMember 可添加此描述进行确定。

    isStrict - i-ext-field

    val isStrict: Boolean
     

    变更记录

    v1.0.67 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    ClassMember 类型是否包含 strictfp

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html index 36311b61f..d226c8cc8 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/NameRules.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - NameRules - class | Yuki Hook API - + NameRules - class | Yuki Hook API + -

    NameRules - class

    class NameRules private constructor()
    +    

    NameRules - class

    class NameRules private constructor()
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    NameConditions 更名为 NameRules

    作为 lambda 整体判断条件使用

    移动到 base 包名

    私有化构造方法

    功能描述

    这是一个模糊 ClassMember 名称条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    String.isSynthetic - i-ext-method

    fun String.isSynthetic(index: Int): Boolean
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否为匿名类的主类调用对象。

    String.isOnlySymbols - i-ext-method

    fun String.isOnlySymbols(): Boolean
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有符号。

    String.isOnlyLetters - i-ext-method

    fun String.isOnlyLetters(): Boolean
    @@ -35,7 +35,7 @@
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有数字。

    String.isOnlyLettersNumbers - i-ext-method

    fun String.isOnlyLettersNumbers(): Boolean
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有字母或数字。

    String.isOnlyLowercase - i-ext-method

    fun String.isOnlyLowercase(): Boolean
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有小写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    String.isOnlyUppercase - i-ext-method

    fun String.isOnlyUppercase(): Boolean
    -

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有大写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    - +

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    统一合并到扩展方法并改名

    功能描述

    是否只有大写字母。

    在没有其它条件的情况下设置此条件允许判断对象存在字母以外的字符。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html new file mode 100644 index 000000000..338943ab9 --- /dev/null +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/base/rules/ObjectRules.html @@ -0,0 +1,34 @@ + + + + + + + + + ObjectRules - class | Yuki Hook API + + + + +

    ObjectRules - class

    class ObjectRules private constructor(private val instance: Any)
    +

    变更记录

    v1.1.5 新增

    功能描述

    这是一个任意对象条件实现类。

    可对 R8 混淆后的 ClassMember 进行更加详细的定位。

    + + + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html index 99066b19c..e333cff57 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/DexClassFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - DexClassFinder - class | Yuki Hook API - + DexClassFinder - class | Yuki Hook API + -

    DexClassFinder - class

    class DexClassFinder internal constructor(
    +    

    DexClassFinder - class

    class DexClassFinder internal constructor(
         internal var name: String,
         internal var async: Boolean,
         override val loaderSet: ClassLoader?
    @@ -72,6 +72,6 @@
     

    变更记录

    v1.1.0 新增

    功能描述

    得到 Class 本身数组 (异步)。

    回调全部查找条件匹配的多个 Class 实例。

    在查找条件找不到任何结果的时候将回调空的 HashSet

    你需要设置 async 后此方法才会被回调,否则请使用 all 方法。

    onNoClassDefFoundError - method

    fun onNoClassDefFoundError(result: (Throwable) -> Unit): Result
     

    变更记录

    v1.1.0 新增

    功能描述

    监听找不到 Class 时。

    ignored - method

    fun ignored(): Result
     

    变更记录

    v1.1.0 新增

    功能描述

    忽略异常并停止打印任何错误日志。

    此时若要监听异常结果,你需要手动实现 onNoClassDefFoundError 方法。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html index 183f9459b..eb31b2903 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/ConstructorRules.html @@ -22,19 +22,20 @@ document.documentElement.classList.toggle('dark', true); } - ConstructorRules - class | Yuki Hook API - + ConstructorRules - class | Yuki Hook API + -

    ConstructorRules - class

    class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
    +    

    ConstructorRules - class

    class ConstructorRules internal constructor(internal val rulesData: ConstructorRulesData) : BaseRules
     

    变更记录

    v1.1.0 新增

    功能描述

    Constructor 查找条件实现类。

    paramCount - field

    var paramCount: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 标识符筛选条件。

    可不设置筛选条件。

    emptyParam - method

    fun emptyParam()
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 空参数、无参数。

    param - method

    fun param(vararg paramType: Any)
    -

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    paramCount - method

    fun paramCount(numRange: IntRange)
    +

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    param - method

    fun param(conditions: ObjectsConditions)
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Constructor 参数条件。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    paramCount - method

    fun paramCount(numRange: IntRange)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    paramCount - method

    fun paramCount(conditions: CountConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html index af6f78c13..6b93e1ec1 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/FieldRules.html @@ -22,17 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - FieldRules - class | Yuki Hook API - + FieldRules - class | Yuki Hook API + -

    FieldRules - class

    class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
    +    

    FieldRules - class

    class FieldRules internal constructor(internal val rulesData: FieldRulesData) : BaseRules
     

    变更记录

    v1.1.0 新增

    功能描述

    Field 查找条件实现类。

    name - field

    var name: String
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Field 名称。

    type - field

    var type: Any?
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Field 类型。

    可不填写类型。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Field 标识符筛选条件。

    可不设置筛选条件。

    name - method

    fun name(conditions: NameConditions)
    -

    变更记录

    v1.1.0 新增

    功能描述

    设置 Field 名称条件。

    - +

    变更记录

    v1.1.0 新增

    功能描述

    设置 Field 名称条件。

    type - method

    fun type(conditions: ObjectConditions)
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Field 类型条件。

    可不填写类型。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html index e88b4872f..764aaa766 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MemberRules.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - MemberRules - class | Yuki Hook API - + MemberRules - class | Yuki Hook API + -

    MemberRules - class

    class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
    +    

    MemberRules - class

    class MemberRules internal constructor(internal val rulesData: MemberRulesData) : BaseRules
     

    变更记录

    v1.1.0 新增

    功能描述

    Member 查找条件实现类。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Member 标识符筛选条件。

    可不设置筛选条件。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html index eff8af5d7..5ac3904b8 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/MethodRules.html @@ -22,22 +22,24 @@ document.documentElement.classList.toggle('dark', true); } - MethodRules - class | Yuki Hook API - + MethodRules - class | Yuki Hook API + -

    MethodRules - class

    class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
    +    

    MethodRules - class

    class MethodRules internal constructor(internal val rulesData: MethodRulesData) : BaseRules
     

    变更记录

    v1.1.0 新增

    功能描述

    Method 查找条件实现类。

    name - field

    var name: String
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 名称。

    paramCount - field

    var paramCount: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    returnType - field

    var returnType: Any?
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 返回值。

    可不填写返回值。

    modifiers - method

    fun modifiers(conditions: ModifierConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 标识符筛选条件。

    可不设置筛选条件。

    emptyParam - method

    fun emptyParam()
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 空参数、无参数。

    param - method

    fun param(vararg paramType: Any)
    -

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    name - method

    fun name(conditions: NameConditions)
    +

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    param - method

    fun param(conditions: ObjectsConditions)
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Method 参数条件。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    name - method

    fun name(conditions: NameConditions)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 名称条件。

    paramCount - method

    fun paramCount(numRange: IntRange)
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    paramCount - method

    fun paramCount(conditions: CountConditions)
    -

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    - +

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    returnType - method

    fun returnType(conditions: ObjectConditions)
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Method 返回值条件。

    可不填写返回值。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html index 6c2a57102..f4bf60721 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/classes/rules/result/MemberRulesResult.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - MemberRulesResult - class | Yuki Hook API - + MemberRulesResult - class | Yuki Hook API + -

    MemberRulesResult - class

    class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
    +    

    MemberRulesResult - class

    class MemberRulesResult internal constructor(private val rulesData: MemberRulesData)
     

    变更记录

    v1.1.0 新增

    功能描述

    当前 Member 查找条件结果实现类。

    none - method

    fun none(): MemberRulesResult
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前 Member 在查找条件中个数为 0

    count - method

    fun count(num: Int): MemberRulesResult
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前 Member 在查找条件中需要全部匹配的个数。

    count - method

    fun count(numRange: IntRange): MemberRulesResult
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前 Member 在查找条件中需要全部匹配的个数范围。

    count - method

    fun count(conditions: CountConditions): MemberRulesResult
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前 Member 在查找条件中需要全部匹配的个数条件。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html index 9cdeafef6..58d431b62 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/ConstructorFinder.html @@ -22,17 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - ConstructorFinder - class | Yuki Hook API - + ConstructorFinder - class | Yuki Hook API + -

    ConstructorFinder - class

    class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
    +    

    ConstructorFinder - class

    class ConstructorFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
     

    变更记录

    v1.0 添加

    v1.0.2 修改

    合并到 BaseFinder

    v1.1.0 修改

    合并到 MemberBaseFinder

    功能描述

    Constructor 查找类。

    可通过指定类型查找指定 Constructor 或一组 Constructor

    paramCount - field

    var paramCount: Int
     

    变更记录

    v1.0.67 新增

    功能描述

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
     

    变更记录

    v1.0.67 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.0 修改

    合并到 ModifierConditions

    功能描述

    设置 Constructor 标识符筛选条件。

    可不设置筛选条件,默认模糊查找并取第一个匹配的 Constructor

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    emptyParam - method

    fun emptyParam(): IndexTypeCondition
     

    变更记录

    v1.0.75 新增

    功能描述

    设置 Constructor 空参数、无参数。

    param - method

    fun param(vararg paramType: Any): IndexTypeCondition
    -

    变更记录

    v1.0 添加

    功能描述

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
    +

    变更记录

    v1.0 添加

    功能描述

    设置 Constructor 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Constructor 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    param - method

    fun param(conditions: ObjectsConditions): IndexTypeCondition
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Constructor 参数条件。

    特别注意

    无参 Constructor 请使用 emptyParam 设置查找条件。

    有参 Constructor 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
     

    变更记录

    v1.0.70 新增

    功能描述

    设置 Constructor 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数。

    若参数个数小于零则忽略并使用 param

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(numRange: IntRange): IndexTypeCondition
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(conditions: CountConditions): IndexTypeCondition
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Constructor 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    @@ -114,6 +115,6 @@
     

    变更记录

    v1.0.2 新增

    v1.1.0 修改

    新增 constructor 参数

    功能描述

    Constructor 实例处理类。

    call - method

    fun call(vararg param: Any?): Any?
     

    变更记录

    v1.0.2 新增

    功能描述

    执行 Constructor 创建目标实例,不指定目标实例类型。

    newInstance - method

    fun <T> newInstance(vararg param: Any?): T?
     

    变更记录

    v1.0.2 新增

    功能描述

    执行 Constructor 创建目标实例 ,指定 T 目标实例类型。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html index 45e6ca840..bb00ece1c 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/FieldFinder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - FieldFinder - class | Yuki Hook API - + FieldFinder - class | Yuki Hook API + -

    FieldFinder - class

    class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
    +    

    FieldFinder - class

    class FieldFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>?) : MemberBaseFinder
     

    变更记录

    v1.0 添加

    v1.0.2 修改

    合并到 BaseFinder

    v1.1.0 修改

    合并到 MemberBaseFinder

    功能描述

    Field 查找类。

    可通过指定类型查找指定 Field 或一组 Field

    classSet - field

    变更记录

    v1.0 添加

    v1.0.2 移除

    name - field

    var name: String
     

    变更记录

    v1.0 添加

    v1.0.70 修改

    允许不填写名称

    功能描述

    设置 Field 名称。

    特别注意

    若不填写名称则必须存在一个其它条件。

    type - field

    var type: Any?
     

    变更记录

    v1.0 添加

    功能描述

    设置 Field 类型。

    可不填写类型。

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
    @@ -35,7 +35,8 @@
     

    变更记录

    v1.0.70 新增

    功能描述

    顺序筛选字节码的下标。

    name - method

    fun name(value: String): IndexTypeCondition
     

    变更记录

    v1.0.70 新增

    功能描述

    设置 Field 名称。

    特别注意

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    name - method

    fun name(conditions: NameConditions): IndexTypeCondition
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    合并到 NameConditions

    功能描述

    设置 Field 名称条件。

    特别注意

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    type - method

    fun type(value: Any): IndexTypeCondition
    -

    变更记录

    v1.0.70 新增

    功能描述

    设置 Field 类型。

    特别注意

    可不填写类型。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    +

    变更记录

    v1.0.70 新增

    功能描述

    设置 Field 类型。

    可不填写类型。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    type - method

    fun type(conditions: ObjectConditions): IndexTypeCondition
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Field 类型条件。

    可不填写类型。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
     

    变更记录

    v1.0.80 新增

    功能描述

    设置在 classSet 的所有父类中查找当前 Field

    注意

    若当前 classSet 的父类较多可能会耗时,API 会自动循环到父类继承是 Any 前的最后一个类。

    RemedyPlan - class

    inner class RemedyPlan internal constructor()
     

    变更记录

    v1.1.0 新增

    功能描述

    Field 重查找实现类,可累计失败次数直到查找成功。

    field - method

    inline fun field(initiate: FieldConditions): Result
     

    变更记录

    v1.1.0 新增

    功能描述

    创建需要重新查找的 Field

    你可以添加多个备选 Field,直到成功为止,若最后依然失败,将停止查找并输出错误日志。

    Result - class

    inner class Result internal constructor()
    @@ -110,6 +111,6 @@
     

    变更记录

    v1.0 添加

    功能描述

    设置当前 Field 实例为 true

    特别注意

    请确保实例对象类型为 Boolean

    setFalse - method

    fun setFalse()
     

    变更记录

    v1.0 添加

    功能描述

    设置当前 Field 实例为 false

    特别注意

    请确保实例对象类型为 Boolean

    setNull - method

    fun setNull()
     

    变更记录

    v1.0 添加

    功能描述

    设置当前 Field 实例为 null

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html index 9e7a7cd7d..ca413d487 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/core/finder/members/MethodFinder.html @@ -22,26 +22,28 @@ document.documentElement.classList.toggle('dark', true); } - MethodFinder - class | Yuki Hook API - + MethodFinder - class | Yuki Hook API + -

    MethodFinder - class

    class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
    +    

    MethodFinder - class

    class MethodFinder internal constructor(override val hookInstance: YukiMemberHookCreator.MemberHookCreator?, override val classSet: Class<*>) : MemberBaseFinder
     

    变更记录

    v1.0 添加

    v1.0.2 修改

    合并到 BaseFinder

    v1.1.0 修改

    合并到 MemberBaseFinder

    功能描述

    Method 查找类。

    可通过指定类型查找指定 Method 或一组 Method

    name - field

    var name: String
     

    变更记录

    v1.0 添加

    v1.0.70 修改

    允许不填写名称

    功能描述

    设置 Method 名称。

    特别注意

    若不填写名称则必须存在一个其它条件。

    paramCount - field

    var paramCount: Int
     

    变更记录

    v1.0.67 新增

    功能描述

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此变量指定参数个数。

    若参数个数小于零则忽略并使用 param

    returnType - field

    var returnType: Any?
     

    变更记录

    v1.0 添加

    功能描述

    设置 Method 返回值,可不填写返回值。

    modifiers - method

    fun modifiers(conditions: ModifierConditions): IndexTypeCondition
     

    变更记录

    v1.0.67 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.0 修改

    合并到 ModifierConditions

    功能描述

    设置 Method 标识符筛选条件。

    可不设置筛选条件。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    emptyParam - method

    fun emptyParam(): IndexTypeCondition
     

    变更记录

    v1.0.75 新增

    功能描述

    设置 Method 空参数、无参数。

    param - method

    fun param(vararg paramType: Any): IndexTypeCondition
    -

    变更记录

    v1.0 添加

    功能描述

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    order - method

    fun order(): IndexTypeCondition
    +

    变更记录

    v1.0 添加

    功能描述

    设置 Method 参数。

    如果同时使用了 paramCountparamType 的数量必须与 paramCount 完全匹配。

    如果 Method 中存在一些无意义又很长的类型,你可以使用 VagueType 来替代它。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    param - method

    fun param(conditions: ObjectsConditions): IndexTypeCondition
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Method 参数条件。

    特别注意

    无参 Method 请使用 emptyParam 设置查找条件。

    有参 Method 必须使用此方法设定参数或使用 paramCount 指定个数。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    order - method

    fun order(): IndexTypeCondition
     

    变更记录

    v1.0.70 新增

    功能描述

    顺序筛选字节码的下标。

    name - method

    fun name(value: String): IndexTypeCondition
     

    变更记录

    v1.0.70 新增

    功能描述

    设置 Method 名称。

    特别注意

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    name - method

    fun name(conditions: NameConditions): IndexTypeCondition
     

    变更记录

    v1.0.88 新增

    v1.1.0 修改

    合并到 NameConditions

    功能描述

    设置 Method 名称条件。

    特别注意

    若不填写名称则必须存在一个其它条件。

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(num: Int): IndexTypeCondition
     

    变更记录

    v1.0.70 新增

    功能描述

    设置 Method 参数个数。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数。

    若参数个数小于零则忽略并使用 param

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(numRange: IntRange): IndexTypeCondition
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数范围。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数范围。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    paramCount - method

    fun paramCount(conditions: CountConditions): IndexTypeCondition
     

    变更记录

    v1.1.0 新增

    功能描述

    设置 Method 参数个数条件。

    你可以不使用 param 指定参数类型而是仅使用此方法指定参数个数条件。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    returnType - method

    fun returnType(value: Any): IndexTypeCondition
    -

    变更记录

    v1.0.70 新增

    功能描述

    设置 Method 返回值。

    可不填写返回值。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
    +

    变更记录

    v1.0.70 新增

    功能描述

    设置 Method 返回值。

    可不填写返回值。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    returnType - method

    fun returnType(conditions: ObjectConditions): IndexTypeCondition
    +

    变更记录

    v1.1.5 新增

    功能描述

    设置 Method 返回值条件。

    可不填写返回值。

    特别注意

    存在多个 IndexTypeCondition 时除了 order 只会生效最后一个。

    superClass - method

    fun superClass(isOnlySuperClass: Boolean)
     

    变更记录

    v1.0.80 新增

    功能描述

    设置在 classSet 的所有父类中查找当前 Method

    注意

    若当前 classSet 的父类较多可能会耗时,API 会自动循环到父类继承是 Any 前的最后一个类。

    RemedyPlan - class

    inner class RemedyPlan internal constructor()
     

    变更记录

    v1.0 添加

    功能描述

    Method 重查找实现类,可累计失败次数直到查找成功。

    method - method

    inline fun method(initiate: MethodConditions): Result
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    创建需要重新查找的 Method

    你可以添加多个备选 Method,直到成功为止,若最后依然失败,将停止查找并输出错误日志。

    Result - class

    inner class Result internal constructor()
    @@ -129,6 +131,6 @@
     

    变更记录

    v1.0.65 新增

    v1.0.68 修改

    修改 callBooleanboolean

    功能描述

    执行 Method,指定 Boolean 返回值类型。

    array - method

    inline fun <reified T> array(vararg param: Any?): Array<T>
     

    变更记录

    v1.0.68 新增

    功能描述

    执行 Method,指定 Array 返回值类型。

    list - method

    inline fun <reified T> list(vararg param: Any?): List<T>
     

    变更记录

    v1.0.68 新增

    功能描述

    执行 Method,指定 List 返回值类型。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html index 4923bddd1..7bf23e29a 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/entity/YukiBaseHooker.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - YukiBaseHooker - class | Yuki Hook API - + YukiBaseHooker - class | Yuki Hook API + -

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
    +    

    YukiBaseHooker - class

    abstract class YukiBaseHooker : PackageParam()
     

    变更记录

    v1.0 添加

    功能描述

    YukiHookAPI 的子类 Hooker 实现。

    onHook - method

    fun onHook()
     

    变更记录

    v1.0 添加

    功能描述

    子类 Hook 开始。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html index dd277d0a3..bec98951b 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ReflectionFactory - kt | Yuki Hook API - + ReflectionFactory - kt | Yuki Hook API + -

    ReflectionFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是自定义 MemberClass 相关功能的查找匹配以及 invoke 的封装类。

    MembersType - class

    enum class MembersType
    +    

    ReflectionFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是自定义 MemberClass 相关功能的查找匹配以及 invoke 的封装类。

    MembersType - class

    enum class MembersType
     

    变更记录

    v1.1.0 新增

    功能描述

    定义一个 Class 中的 Member 类型

    ALL - enum

    ALL
     

    变更记录

    v1.1.0 新增

    功能描述

    全部 MethodConstructor

    METHOD - enum

    METHOD
     

    变更记录

    v1.1.0 新增

    功能描述

    全部 Method

    CONSTRUCTOR - enum

    CONSTRUCTOR
    @@ -51,13 +51,62 @@
         }
     }
     

    hookClass - field

    变更记录

    v1.0 添加

    v1.1.0 移除

    HookClass 相关功能不再对外开放

    normalClass - field

    变更记录

    v1.0 添加

    v1.1.0 移除

    HookClass 相关功能不再对外开放

    hasClass - field

    变更记录

    v1.0 添加

    v1.1.0 移除

    请直接使用 hasClass() 无参方法

    Class.hasExtends - ext-field

    val Class<*>.hasExtends: Boolean
    -

    变更记录

    v1.0.80 新增

    功能描述

    当前 Class 是否有继承关系,父类是 Any 将被认为没有继承关系。

    classOf - method

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转到 toClass(...) 方法

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过字符串类名转换为 loader 中的实体类。

    功能示例

    你可以直接填写你要查找的目标 Class,必须在默认 ClassLoader 下存在。

    示例如下

    "com.example.demo.DemoClass".toClass()
    +

    变更记录

    v1.0.80 新增

    功能描述

    当前 Class 是否有继承关系,父类是 Any 将被认为没有继承关系。

    Class?.extends - ext-method

    infix fun Class<*>?.extends(other: Class<*>?): Boolean
    +

    变更记录

    v1.1.5 新增

    功能描述

    当前 Class 是否继承于 other

    如果当前 Class 就是 other 也会返回 true

    如果当前 Classnullothernull 会返回 false

    功能示例

    你可以使用此方法来判断两个 Class 是否存在继承关系。

    示例如下

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否继承于 B
    +if (classA extends classB) {
    +    // Your code here.
    +}
    +

    Class?.notExtends - ext-method

    infix fun Class<*>?.notExtends(other: Class<*>?): Boolean
    +

    变更记录

    v1.1.5 新增

    功能描述

    当前 Class 是否不继承于 other

    此方法相当于 extends 的反向判断。

    功能示例

    你可以使用此方法来判断两个 Class 是否不存在继承关系。

    示例如下

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否不继承于 B
    +if (classA notExtends classB) {
    +    // Your code here.
    +}
    +

    Class?.implements - ext-method

    infix fun Class<*>?.implements(other: Class<*>?): Boolean
    +

    变更记录

    v1.1.5 新增

    功能描述

    当前 Class 是否实现了 other 接口类。

    如果当前 Classnullothernull 会返回 false

    功能示例

    你可以使用此方法来判断两个 Class 是否存在依赖关系。

    示例如下

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否实现了 B 接口类
    +if (classA implements classB) {
    +    // Your code here.
    +}
    +

    Class?.notImplements - ext-method

    infix fun Class<*>?.notImplements(other: Class<*>?): Boolean
    +

    变更记录

    v1.1.5 新增

    功能描述

    当前 Class 是否未实现 other 接口类。

    此方法相当于 implements 的反向判断。

    功能示例

    你可以使用此方法来判断两个 Class 是否不存在依赖关系。

    示例如下

    // 假设下面这两个 Class 就是你需要判断的 Class
    +val classA: Class<*>?
    +val classB: Class<*>?
    +// 判断 A 是否未实现 B 接口类
    +if (classA notImplements classB) {
    +    // Your code here.
    +}
    +

    Class.toJavaPrimitiveType - ext-method

    fun Class<*>.toJavaPrimitiveType(): Class<*>
    +

    变更记录

    v1.1.5 新增

    功能描述

    自动转换当前 Class 为 Java 原始类型 (Primitive Type)。

    如果当前 Class 为 Java 或 Kotlin 基本类型将自动执行类型转换。

    当前能够自动转换的基本类型如下。

    • kotlin.Unit
    • java.lang.Void
    • java.lang.Boolean
    • java.lang.Integer
    • java.lang.Float
    • java.lang.Double
    • java.lang.Long
    • java.lang.Short
    • java.lang.Character
    • java.lang.Byte

    classOf - method

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转到 toClass(...) 方法

    String.toClass - ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    功能描述

    通过字符串类名转换为 loader 中的实体类。

    功能示例

    你可以直接填写你要查找的目标 Class,必须在默认 ClassLoader 下存在。

    示例如下

    "com.example.demo.DemoClass".toClass()
     

    你还可以自定义 Class 所在的 ClassLoader

    示例如下

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过字符串类名转换为 loader 中的实体类。

    找不到 Class 会返回 null,不会抛出异常。

    功能示例

    用法请参考 String.toClass 方法。

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?): Class<*>
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过 T 得到其 Class 实例并转换为实体类。

    功能示例

    我们要获取一个 ClassKotlin 下不通过反射时应该这样做。

    示例如下

    DemoClass::class.java
    +

    你还可以指定 Class 的目标类型。

    示例如下

    // 指定的 DemoClass 必须存在或为可访问的 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    你还可以设置在获取到这个 Class 时是否自动执行其默认的静态方法块,默认情况下不会执行。

    示例如下

    // 获取并执行 DemoClass 默认的静态方法块
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    默认的静态方法块在 Java 中使用如下方式定义。

    示例如下

    public class DemoClass {
    +
    +    static {
    +        // 这里是静态方法块的内容
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    String.toClassOrNull - ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    功能描述

    通过字符串类名转换为 loader 中的实体类。

    找不到 Class 会返回 null,不会抛出异常。

    功能示例

    用法请参考 String.toClass 方法。

    classOf - method

    inline fun <reified T> classOf(loader: ClassLoader?, initialize: Boolean): Class<T>
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    将返回类型由 Class<*> cast 为 Class<T>

    新增 initialize 参数

    功能描述

    通过 T 得到其 Class 实例并转换为实体类。

    功能示例

    我们要获取一个 ClassKotlin 下不通过反射时应该这样做。

    示例如下

    DemoClass::class.java
     

    现在,你可以直接 cast 一个实例并获取它的 Class 对象,必须在当前 ClassLoader 下存在。

    示例如下

    classOf<DemoClass>()
     

    若目标存在的 Classstub,通过这种方式,你还可以自定义 Class 所在的 ClassLoader

    示例如下

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     classOf<DemoClass>(customClassLoader)
    @@ -83,10 +132,10 @@
     
    inline fun <reified T : Any> T.current(ignored: Boolean, initiate: CurrentClass.() -> Unit): T
     

    变更记录

    v1.0.70 新增

    v1.1.0 新增

    新增 ignored 参数,可以忽略在 CurrentClass 中出现的异常

    新增不使用 current { ... } 调用域直接使用 current() 得到实例的类操作对象

    功能描述

    获得当前实例的类操作对象。

    Class.buildOfAny - ext-method

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.0 作废

    请转移到 buildOf 方法

    Class.buildOf - ext-method

    inline fun Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): Any?
     
    inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorConditions): T?
    -

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.0 修改

    加入无泛型方法 buildOf

    功能描述

    通过构造方法创建新实例,指定类型 T 或任意类型 Any

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(result: (index: Int, method: Method) -> Unit)
    -

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    遍历当前类中的所有方法。

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(result: (index: Int, constructor: Constructor<*>) -> Unit)
    -

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    遍历当前类中的所有构造方法。

    Class.allFields - ext-method

    inline fun Class<*>.allFields(result: (index: Int, field: Field) -> Unit)
    -

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    遍历当前类中的所有变量。

    - +

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.0 修改

    加入无泛型方法 buildOf

    功能描述

    通过构造方法创建新实例,指定类型 T 或任意类型 Any

    Class.allMethods - ext-method

    inline fun Class<*>.allMethods(isAccessible: Boolean, result: (index: Int, method: Method) -> Unit)
    +

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.5 修改

    新增 isAccessible 参数

    功能描述

    遍历当前类中的所有方法。

    Class.allConstructors - ext-method

    inline fun Class<*>.allConstructors(isAccessible: Boolean, result: (index: Int, constructor: Constructor<*>) -> Unit)
    +

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.5 修改

    新增 isAccessible 参数

    功能描述

    遍历当前类中的所有构造方法。

    Class.allFields - ext-method

    inline fun Class<*>.allFields(isAccessible: Boolean, result: (index: Int, field: Field) -> Unit)
    +

    变更记录

    v1.0.70 新增

    v1.0.80 修改

    将方法体进行 inline

    v1.1.5 修改

    新增 isAccessible 参数

    功能描述

    遍历当前类中的所有变量。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html index d367a34bb..34f4900fa 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookFactory - kt | Yuki Hook API - + YukiHookFactory - kt | Yuki Hook API + -

    YukiHookFactory - kt

    变更记录

    v1.0 添加

    v1.0.80 修改

    合并到 IYukiHookXposedInit,将方法体进行 inline

    功能描述

    这是 YukiHookAPI 相关 lambda 方法的封装类以及部分 API 用法。

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
    +    

    YukiHookFactory - kt

    变更记录

    v1.0 添加

    v1.0.80 修改

    合并到 IYukiHookXposedInit,将方法体进行 inline

    功能描述

    这是 YukiHookAPI 相关 lambda 方法的封装类以及部分 API 用法。

    IYukiHookXposedInit.configs - ext-method

    inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
     

    变更记录

    v1.0.1 新增

    v1.0.80 修改

    合并到 IYukiHookXposedInit

    功能描述

    IYukiHookXposedInit 中配置 Configs

    IYukiHookXposedInit.encase - ext-method

    fun IYukiHookXposedInit.encase(initiate: PackageParam.() -> Unit)
     
    fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    合并到 IYukiHookXposedInit

    功能描述

    IYukiHookXposedInit 中调用 YukiHookAPI

    Context.modulePrefs - ext-field

    val Context.modulePrefs: YukiHookModulePrefs
    @@ -37,8 +37,8 @@
     

    变更记录

    v1.0 添加

    功能描述

    获取当前进程名称。

    Context+Resources.injectModuleAppResources - ext-method

    fun Context.injectModuleAppResources()
     
    fun Resources.injectModuleAppResources()
     

    变更记录

    v1.1.0 新增

    功能描述

    向 Hook APP (宿主) ContextResources 注入当前 Xposed 模块的资源。

    注入成功后,你就可以直接使用例如 ImageView.setImageResourceResources.getString 装载当前 Xposed 模块的资源 ID。

    注入的资源作用域仅限当前 ContextResources,你需要在每个用到宿主 ContextResources 的地方重复调用此方法进行注入才能使用。

    特别注意

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    Context.registerModuleAppActivities - ext-method

    fun Context.registerModuleAppActivities(proxy: Any?)
    -

    变更记录

    v1.1.0 新增

    功能描述

    向 Hook APP (宿主) 注册当前 Xposed 模块的 Activity

    注册成功后,你就可以直接使用 Context.startActivity 来启动未在宿主中注册的 Activity

    使用此方法会在未注册的 Activity 在 Hook APP (宿主) 中启动时自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    你要将需要在宿主启动的 Activity 继承于 ModuleAppActivityModuleAppCompatActivity

    特别注意

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    加入最低 API 版本限制

    功能描述

    向 Hook APP (宿主) 注册当前 Xposed 模块的 Activity

    注册成功后,你就可以直接使用 Context.startActivity 来启动未在宿主中注册的 Activity

    使用此方法会在未注册的 Activity 在 Hook APP (宿主) 中启动时自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    你要将需要在宿主启动的 Activity 继承于 ModuleAppActivityModuleAppCompatActivity

    特别注意

    只能在 (Xposed) 宿主环境使用此功能,其它环境下使用将不生效且会打印警告信息。

    最低支持 Android 7.0 (API 24)。

    Context.applyModuleTheme - ext-method

    fun Context.applyModuleTheme(theme: Int, configuration: Configuration?): ModuleContextThemeWrapper
     

    变更记录

    v1.1.0 新增

    功能描述

    生成一个 ContextThemeWrapper 代理以应用当前 Xposed 模块的主题资源。

    在 Hook APP (宿主) 中使用此方法会自动调用 injectModuleAppResources 注入当前 Xposed 模块的资源。

    如果在 Hook APP (宿主) 中使用此方法发生 ClassCastException,请手动设置 configuration

    isSupportResourcesHook - field

    变更记录

    v1.0.80 新增

    v1.0.91 移除

    请转移到 YukiHookAPI.Status.isSupportResourcesHook

    isModuleActive - field

    变更记录

    v1.0.6 新增

    v1.0.91 移除

    请转移到 YukiHookAPI.Status.isModuleActive

    isXposedModuleActive - field

    变更记录

    v1.0.6 新增

    v1.0.91 移除

    请转移到 YukiHookAPI.Status.isXposedModuleActive

    isTaiChiModuleActive - field

    变更记录

    v1.0 添加

    v1.0.91 移除

    请转移到 YukiHookAPI.Status.isTaiChiModuleActive

    YukiHookModuleStatus - class

    变更记录

    v1.0 添加

    v1.0.91 作废

    请转移到 YukiHookAPI.Status

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html index 08296412d..09643a4ff 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/log/LoggerFactory.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - LoggerFactory - kt | Yuki Hook API - + LoggerFactory - kt | Yuki Hook API + -

    LoggerFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是 YukiHookAPI 的日志封装类,可实现同时向 LogcatXposedBridge.log 打印日志的功能。

    LoggerType - class

    enum class LoggerType
    +    

    LoggerFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是 YukiHookAPI 的日志封装类,可实现同时向 Logcat 和 (Xposed) 宿主环境打印日志的功能。

    LoggerType - class

    enum class LoggerType
     

    变更记录

    v1.1.0 新增

    功能描述

    需要打印的日志类型。

    决定于模块与 (Xposed) 宿主环境使用的打印方式。

    LOGD - enum

    LOGD
    -

    变更记录

    v1.1.0 新增

    功能描述

    仅使用 android.util.Log

    XPOSEDBRIDGE - enum

    XPOSEDBRIDGE
    -

    变更记录

    v1.1.0 新增

    功能描述

    仅使用 XposedBridge.log

    特别注意

    只能在 (Xposed) 宿主环境中使用,模块环境将不生效。

    SCOPE - enum

    SCOPE
    -

    变更记录

    v1.1.0 新增

    功能描述

    分区使用。

    (Xposed) 宿主环境仅使用 XPOSEDBRIDGE

    模块环境仅使用 LOGD

    BOTH - enum

    BOTH
    -

    变更记录

    v1.1.0 新增

    功能描述

    同时使用。

    (Xposed) 宿主环境使用 LOGDXPOSEDBRIDGE

    模块环境仅使用 LOGD

    YukiLoggerData - class

    data class YukiLoggerData internal constructor(
    +

    变更记录

    v1.1.0 新增

    功能描述

    仅使用 android.util.Log

    XPOSEDBRIDGE - enum

    变更记录

    v1.1.0 新增

    v1.1.5 作废

    请转移到 XPOSED_ENVIRONMENT

    XPOSED_ENVIRONMENT - enum

    XPOSED_ENVIRONMENT
    +

    变更记录

    v1.1.5 新增

    功能描述

    仅在 (Xposed) 宿主环境使用。

    特别注意

    只能在 (Xposed) 宿主环境中使用,模块环境将不生效。

    SCOPE - enum

    SCOPE
    +

    变更记录

    v1.1.0 新增

    功能描述

    分区使用。

    (Xposed) 宿主环境仅使用 XPOSED_ENVIRONMENT

    模块环境仅使用 LOGD

    BOTH - enum

    BOTH
    +

    变更记录

    v1.1.0 新增

    功能描述

    同时使用。

    (Xposed) 宿主环境使用 LOGDXPOSED_ENVIRONMENT

    模块环境仅使用 LOGD

    YukiLoggerData - class

    data class YukiLoggerData internal constructor(
         var timestamp: Long,
         var time: String,
         var tag: String,
    @@ -45,9 +45,10 @@
     

    变更记录

    v1.1.2 新增

    v1.1.4 修改

    实现 Serializable 接口并标识为 data class

    功能描述

    调试日志数据实现类。

    YukiHookLogger - object

    object YukiHookLogger
     

    变更记录

    v1.1.0 新增

    功能描述

    调试日志实现类。

    inMemoryData - field

    val inMemoryData: ArrayList<YukiLoggerData>
     

    变更记录

    v1.1.2 新增

    v1.1.4 修改

    类型由 HashSet 修改为 ArrayList

    功能描述

    当前全部已记录的日志数据。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    contents - field

    val contents: String
    -

    变更记录

    v1.1.0 新增

    功能描述

    获取当前日志文件内容。

    如果当前没有已记录的日志会返回空字符串。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    clear - method

    fun clear()
    -

    变更记录

    v1.1.0 新增

    功能描述

    清除全部已记录的日志。

    你也可以直接获取 inMemoryData 来清除。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    saveToFile - method

    fun saveToFile(fileName: String)
    -

    变更记录

    v1.1.0 新增

    功能描述

    保存当前日志到文件。

    若当前未开启 Configs.isRecord 或记录为空则不会进行任何操作。

    日志文件会追加到 fileName 的文件结尾,若文件不存在会自动创建。

    特别注意

    文件读写权限取决于当前宿主、模块已获取的权限。

    Configs - object

    object Configs
    +

    变更记录

    v1.1.0 新增

    功能描述

    获取当前日志文件内容。

    如果当前没有已记录的日志会返回空字符串。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    contents - method

    fun contents(data: ArrayList<YukiLoggerData>): String
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取、格式化当前日志文件内容。

    如果当前没有已记录的日志 (data 为空) 会返回空字符串。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    clear - method

    fun clear()
    +

    变更记录

    v1.1.0 新增

    功能描述

    清除全部已记录的日志。

    你也可以直接获取 inMemoryData 来清除。

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    saveToFile - method

    fun saveToFile(fileName: String, data: ArrayList<YukiLoggerData>)
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增 data 参数

    功能描述

    保存当前日志到文件。

    若当前未开启 Configs.isRecord 或记录为空则不会进行任何操作。

    日志文件会追加到 fileName 的文件结尾,若文件不存在会自动创建。

    特别注意

    文件读写权限取决于当前宿主、模块已获取的权限。

    Configs - object

    object Configs
     

    变更记录

    v1.1.0 新增

    功能描述

    配置 YukiHookLogger

    TAG - field

    const val TAG: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    标签。

    PRIORITY - field

    const val PRIORITY: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    优先级。

    PACKAGE_NAME - field

    const val PACKAGE_NAME: Int
    @@ -56,15 +57,15 @@
     

    变更记录

    v1.1.0 新增

    功能描述

    是否启用调试日志的输出功能。

    关闭后将会停用 YukiHookAPI 对全部日志的输出。

    但是不影响当你手动调用下面这些方法输出日志。

    loggerDloggerIloggerWloggerE

    isEnable 关闭后 YukiHookAPI.Configs.isDebug 也将同时关闭。

    isRecord - field

    var isRecord: Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    是否启用调试日志的记录功能。

    开启后将会在内存中记录全部可用的日志和异常堆栈。

    需要同时启用 isEnable 才能有效。

    特别注意

    过量的日志可能会导致宿主运行缓慢或造成频繁 GC。

    开启后你可以调用 YukiHookLogger.saveToFile 实时保存日志到文件或使用 YukiHookLogger.contents 获取实时日志文件。

    tag - field

    var tag: String
     

    变更记录

    v1.1.0 新增

    功能描述

    这是一个调试日志的全局标识。

    默认文案为 YukiHookAPI

    你可以修改为你自己的文案。

    elements - method

    fun elements(vararg item: Int)
    -

    变更记录

    v1.1.0 新增

    功能描述

    自定义调试日志对外显示的元素。

    只对日志记录和 XposedBridge.log 生效。

    日志元素的排列将按照你在 item 中设置的顺序进行显示。

    你还可以留空 item 以不显示除日志内容外的全部元素。

    可用的元素有:TAGPRIORITYPACKAGE_NAMEUSER_ID

    功能示例

    打印的日志样式将按照你设置的排列顺序和元素内容进行。

    示例如下

    elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
    +

    变更记录

    v1.1.0 新增

    功能描述

    自定义调试日志对外显示的元素。

    只对日志记录和 (Xposed) 宿主环境的日志生效。

    日志元素的排列将按照你在 item 中设置的顺序进行显示。

    你还可以留空 item 以不显示除日志内容外的全部元素。

    可用的元素有:TAGPRIORITYPACKAGE_NAMEUSER_ID

    功能示例

    打印的日志样式将按照你设置的排列顺序和元素内容进行。

    示例如下

    elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
     

    以上内容定义的日志将显示为如下样式。

    示例如下

    [YukiHookAPI][D][com.demo.test][999]--> This is a log
     

    如果我们调整元素顺序以及减少个数,那么结果又会不一样。

    示例如下

    elements(PACKAGE_NAME, USER_ID, PRIORITY)
     

    以上内容定义的日志将显示为如下样式。

    示例如下

    [com.demo.test][999][D]--> This is a log
     

    loggerD - method

    fun loggerD(tag: String, msg: String, type: LoggerType)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    LogcatXposedBridge 打印日志,级别 D

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerI - method

    fun loggerI(tag: String, msg: String, type: LoggerType)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    LogcatXposedBridge 打印日志,级别 I

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerW - method

    fun loggerW(tag: String, msg: String, type: LoggerType)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    LogcatXposedBridge 打印日志,级别 W

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerE - method

    fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    LogcatXposedBridge 打印日志,级别 E,可携带 e 异常信息,将打印异常堆栈。

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    - +

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    Logcat 和 (Xposed) 宿主环境打印日志,级别 D

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerI - method

    fun loggerI(tag: String, msg: String, type: LoggerType)
    +

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    Logcat 和 (Xposed) 宿主环境打印日志,级别 I

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerW - method

    fun loggerW(tag: String, msg: String, type: LoggerType)
    +

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    Logcat 和 (Xposed) 宿主环境打印日志,级别 W

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    loggerE - method

    fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType)
    +

    变更记录

    v1.0 添加

    v1.1.0 修改

    新增 type 参数

    功能描述

    Logcat 和 (Xposed) 宿主环境打印日志,级别 E,可携带 e 异常信息,将打印异常堆栈。

    tag 的默认参数为 YukiHookAPI.Configs.debugTag,你可以进行自定义。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html index 89444442f..115885ff4 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.html @@ -22,20 +22,25 @@ document.documentElement.classList.toggle('dark', true); } - HookParam - class | Yuki Hook API - + HookParam - class | Yuki Hook API + -

    HookParam - class

    class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?)
    -

    变更记录

    v1.0 添加

    v1.1.0 修改

    移动 HookParamWrapperYukiHookCallback.Param

    修正拼写错误的 creater 命名到 creator

    功能描述

    Hook 方法、构造方法的目标对象实现类。

    args - field

    val args: Array<Any?>
    +    

    HookParam - class

    class HookParam internal constructor(
    +    private val creatorInstance: YukiMemberHookCreator,
    +    private var paramId: String,
    +    private var param: YukiHookCallback.Param?
    +)
    +

    变更记录

    v1.0 添加

    v1.1.0 修改

    移动 HookParamWrapperYukiHookCallback.Param

    修正拼写错误的 creater 命名到 creator

    v1.1.5 修改

    新增 paramId 参数

    功能描述

    Hook 方法、构造方法的目标对象实现类。

    args - field

    val args: Array<Any?>
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook 对象 memberconstructor 的参数对象数组。

    这里的数组每项类型默认为 Any,你可以使用 args 方法来实现 ArgsModifyer.cast 功能。

    firstArgs - field

    变更记录

    v1.0 添加

    v1.0.75 移除

    请使用 args(index = 0)args().first()

    lastArgs - field

    变更记录

    v1.0 添加

    v1.0.75 移除

    请使用 args().last()

    instance - field

    val instance: Any
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook 实例的对象。

    特别注意

    如果你当前 Hook 的对象是一个静态,那么它将不存在实例的对象。

    instanceClass - field

    val instanceClass: Class<*>
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook 实例的类对象。

    member - field

    val member: Member
     

    变更记录

    v1.1.0 新增

    功能描述

    获取当前 Hook 对象的 Member

    在不确定 Member 类型为 MethodConstructor 时可以使用此方法。

    method - field

    val method: Method
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook 对象的方法。

    constructor - field

    val constructor: Constructor
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook 对象的构造方法。

    result - field

    var result: Any?
    -

    变更记录

    v1.0 添加

    功能描述

    获取、设置当前 Hook 对象的 methodconstructor 的返回值。

    hasThrowable - field

    val hasThrowable: Boolean
    +

    变更记录

    v1.0 添加

    功能描述

    获取、设置当前 Hook 对象的 methodconstructor 的返回值。

    dataExtra - field

    val dataExtra: Bundle
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前回调方法体范围内的数据存储实例。

    hasThrowable - field

    val hasThrowable: Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    判断是否存在设置过的方法调用抛出异常。

    throwable - field

    val throwable: Throwable?
     

    变更记录

    v1.1.0 新增

    功能描述

    获取设置的方法调用抛出异常。

    Throwable.throwToApp - i-ext-method

    fun Throwable.throwToApp()
     

    变更记录

    v1.1.0 新增

    功能描述

    向 Hook APP 抛出异常。

    使用 hasThrowable 判断当前是否存在被抛出的异常。

    使用 throwable 获取当前设置的方法调用抛出异常。

    仅会在回调方法的 MemberHookCreator.beforeHookMemberHookCreator.afterHook 中生效。

    特别注意

    设置后会同时执行 resultNull 方法并将异常抛出给当前 Hook APP。

    功能示例

    Hook 过程中的异常仅会作用于 (Xposed) 宿主环境,目标 Hook APP 不会受到影响。

    若想将异常抛给 Hook APP,可以直接使用如下方法。

    示例如下

    injectMember {
    @@ -62,8 +67,8 @@
     

    变更记录

    v1.1.0 新增

    功能描述

    执行原始 Member

    调用自身未进行 Hook 的原始 Member 并调用原始参数执行。

    功能实例

    此方法可以 invoke 原始未经 Hook 的 Member 对象,取决于原始 Member 的参数。

    调用自身原始的方法不会再经过当前 beforeHookafterHook 以及 replaceUnitreplaceAny

    比如我们 Hook 的这个方法被这样调用 test("test value"),使用此方法会调用其中的 "test value" 作为参数。

    示例如下

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    -        returnType = StringType
    +        param(StringClass)
    +        returnType = StringClass
         }
         afterHook {
             // <方案1> 不使用泛型,不获取方法执行结果,调用将使用原方法传入的 args 自动传参
    @@ -78,8 +83,8 @@
     

    变更记录

    v1.0 添加

    v1.1.0 修改

    不再需要使用 member.invokeOriginal 进行调用

    功能描述

    执行原始 Member

    调用自身未进行 Hook 的原始 Member 并自定义 args 执行。

    功能实例

    此方法可以 invoke 原始未经 Hook 的 Member 对象,可自定义需要调用的参数内容。

    调用自身原始的方法不会再经过当前 beforeHookafterHook 以及 replaceUnitreplaceAny

    比如我们 Hook 的这个方法被这样调用 test("test value"),使用此方法可自定义其中的 args 作为参数。

    示例如下

    injectMember {
         method {
             name = "test"
    -        param(StringType)
    -        returnType = StringType
    +        param(StringClass)
    +        returnType = StringClass
         }
         afterHook {
             // <方案1> 不使用泛型,不获取方法执行结果
    @@ -113,6 +118,6 @@
     

    变更记录

    v1.0 添加

    功能描述

    设置方法参数的实例对象为 null

    setTrue - method

    fun setTrue()
     

    变更记录

    v1.0 添加

    功能描述

    设置方法参数的实例对象为 true

    特别注意

    请确保目标对象的类型是 Boolean

    setFalse - method

    fun setFalse()
     

    变更记录

    v1.0 添加

    功能描述

    设置方法参数的实例对象为 false

    特别注意

    请确保目标对象的类型是 Boolean

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html index f99232ce2..f1ae4e05b 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/PackageParam.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - PackageParam - class | Yuki Hook API - + PackageParam - class | Yuki Hook API + -

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    -

    变更记录

    v1.0 添加

    功能描述

    装载 Hook 的目标 APP 入口对象实现类。

    appClassLoader - field

    val appClassLoader:ClassLoader
    -

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook APP 的 ClassLoader

    appInfo - field

    val appInfo: ApplicationInfo
    +    

    PackageParam - class

    open class PackageParam internal constructor(internal var wrapper: PackageParamWrapper?)
    +

    变更记录

    v1.0 添加

    功能描述

    装载 Hook 的目标 APP 入口对象实现类。

    appClassLoader - field

    var appClassLoader:ClassLoader
    +

    变更记录

    v1.0 添加

    v1.1.5 修改

    可以动态修改此变量的值

    功能描述

    获取、设置当前 Hook APP 的 ClassLoader

    你可以在这里手动设置当前 Hook APP 的 ClassLoader,默认情况下会自动获取。

    特别注意

    如果设置了错误或无效的 ClassLoader 会造成功能异常,请谨慎操作。

    appInfo - field

    val appInfo: ApplicationInfo
     

    变更记录

    v1.0 添加

    功能描述

    获取当前 Hook APP 的 ApplicationInfo

    appUserId - field

    val appUserId: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    获取当前 Hook APP 的用户 ID。

    机主为 0,应用双开 (分身) 或工作资料因系统环境不同 ID 也各不相同。

    appContext - field

    val appContext: Application?
     

    变更记录

    v1.0.72 新增

    v1.1.0 修改

    加入可空类型 (空安全)

    功能描述

    获取当前 Hook APP 的 Application

    特别注意

    首次装载可能是空的,请延迟一段时间再获取或使用 onAppLifecycle 监听来完成。

    appResources - field

    val appResources:Resources?
    @@ -45,12 +45,15 @@
     

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    功能描述

    获得当前使用的存取数据对象缓存实例。

    你可以通过 name 来自定义 Sp 存储的名称。

    特别注意

    作为 Hook API 装载时无法使用,会抛出异常。

    dataChannel - field

    val dataChannel: YukiHookDataChannel.NameSpace
     

    变更记录

    v1.0.88 新增

    功能描述

    获得当前使用的数据通讯桥命名空间对象。

    特别注意

    作为 Hook API 装载时无法使用,会抛出异常。

    resources - method

    fun resources(): HookResources
     

    变更记录

    v1.0.80 新增

    功能描述

    获得当前 Hook APP 的 YukiResources 对象。

    请调用 HookResources.hook 方法开始 Hook。

    refreshModuleAppResources - method

    fun refreshModuleAppResources()
    -

    变更记录

    v1.0.87 新增

    功能描述

    刷新当前 Xposed 模块自身 Resources

    onAppLifecycle - method

    inline fun onAppLifecycle(initiate: AppLifecycle.() -> Unit)
    -

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 生命周期装载事件。

    注意

    loadZygote 中不会被装载,仅会在 loadSystemloadApp 中装载。

    作为 Hook API 装载时请使用原生的 Application 实现生命周期监听。

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
    +

    变更记录

    v1.0.87 新增

    功能描述

    刷新当前 Xposed 模块自身 Resources

    onAppLifecycle - method

    inline fun onAppLifecycle(isOnFailureThrowToApp: Boolean, initiate: AppLifecycle.() -> Unit)
    +

    变更记录

    v1.0.88 新增

    v1.1.5 修改

    新增 isOnFailureThrowToApp 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主

    功能描述

    监听当前 Hook APP 生命周期装载事件。

    注意

    loadZygote 中不会被装载,仅会在 loadSystemloadApp 中装载。

    作为 Hook API 装载时请使用原生的 Application 实现生命周期监听。

    loadApp - method

    inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, hooker: YukiBaseHooker)
     
    inline fun loadApp(vararg name: String, initiate: PackageParam.() -> Unit)
     
    fun loadApp(name: String, vararg hooker: YukiBaseHooker)
    -

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    v1.1.4 修改

    新增两个方法,可以同时装载多个 APP 与子 Hooker

    功能描述

    装载并 Hook 指定包名的 APP。

    name 为 APP 的包名,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    装载并 Hook 指定、全部包名的 APP。

    若要装载 APP Zygote 事件,请使用 loadZygote

    若要 Hook 系统框架,请使用 loadSystem

    功能示例

    你可以使用 loadApplambda 方法体形式或直接装载一个 Hooker。

    示例如下

    // 使用 lambda
    +
    inline fun loadApp(isExcludeSelf: Boolean, initiate: PackageParam.() -> Unit)
    +
    fun loadApp(isExcludeSelf: Boolean, hooker: YukiBaseHooker)
    +
    fun loadApp(isExcludeSelf: Boolean, vararg hooker: YukiBaseHooker)
    +

    变更记录

    v1.0 添加

    v1.0.80 修改

    将方法体进行 inline

    v1.1.4 修改

    新增两个方法,可以同时装载多个 APP 与子 Hooker

    v1.1.5 修改

    新增三个方法,可以使用参数 isExcludeSelf 排除模块自身

    功能描述

    装载并 Hook 指定、全部包名的 APP。

    name 为 APP 的包名,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    装载并 Hook 指定、全部包名的 APP。

    若要装载 APP Zygote 事件,请使用 loadZygote

    若要 Hook 系统框架,请使用 loadSystem

    功能示例

    你可以使用 loadApplambda 方法体形式或直接装载一个 Hooker。

    示例如下

    // 使用 lambda
     loadApp(name = "com.example.test") {
         // Your code here.
     }
    @@ -62,6 +65,12 @@
     }
     // 使用 Hooker
     loadApp(hooker = CustomHooker)
    +

    若要在全部可被 Hook 的 APP 中过滤掉模块自身,你只需加入 isExcludeSelf = true

    示例如下

    // 使用 lambda
    +loadApp(isExcludeSelf = true) {
    +    // Your code here.
    +}
    +// 使用 Hooker
    +loadApp(isExcludeSelf = true, hooker = CustomHooker)
     

    若想要同时装载多个需要 Hook 的 APP,可以直接使用如下方式。

    示例如下

    // 同时装载多个需要 Hook 的 APP
     loadApp("com.example.test", "com.example.next") {
         // Your code here.
    @@ -80,17 +89,33 @@
     
    fun withProcess(name: String, vararg hooker: YukiBaseHooker)
     

    变更记录

    v1.0.70 新增

    v1.1.4 修改

    新增两个方法,可以同时装载多个进程与子 Hooker

    功能描述

    装载并 Hook APP 的指定进程。

    name 为 APP 的进程名称,后方的两个参数一个可作为 lambda 方法体使用,一个可以直接装载子 Hooker。

    loadHooker - method

    fun loadHooker(hooker: YukiBaseHooker)
     

    变更记录

    v1.0 添加

    功能描述

    装载 Hook 子类。

    你可以填入 hooker 在 Hooker 中继续装载 Hooker。

    searchClass - method

    inline fun searchClass(name: String, async: Boolean, initiate: ClassConditions): DexClassFinder.Result
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过 appClassLoader 按指定条件查找并得到当前 Hook APP Dex 中的 Class

    特别注意

    此方法在 Class 数量过多及查找条件复杂时会非常耗时。

    建议启用 async 或设置 name 参数,name 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。

    此功能尚在试验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。

    String+VariousClass.clazz - i-ext-field

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转移到 toClass(...) 方法

    String.hasClass - i-ext-field

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转移到 hasClass(...) 方法

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?): Class<*>
    -
    fun VariousClass.toClass(loader: ClassLoader?): Class<*>
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    功能示例

    你可以轻松地将 String 类型的 Class 包名转为 Class 实例。

    示例如下

    "com.example.demo.DemoClass".toClass()
    +

    变更记录

    v1.1.0 新增

    功能描述

    通过 appClassLoader 按指定条件查找并得到当前 Hook APP Dex 中的 Class

    特别注意

    此方法在 Class 数量过多及查找条件复杂时会非常耗时。

    建议启用 async 或设置 name 参数,name 参数将在 Hook APP (宿主) 不同版本中自动进行本地缓存以提升效率。

    此功能尚在试验阶段,性能与稳定性可能仍然存在问题,使用过程遇到问题请向我们报告并帮助我们改进。

    String+VariousClass.clazz - i-ext-field

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转移到 toClass(...) 方法

    String.hasClass - i-ext-field

    变更记录

    v1.0 添加

    v1.1.0 作废

    请转移到 hasClass(...) 方法

    String+VariousClass.toClass - i-ext-method

    fun String.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +
    inline fun <reified T> String.toClass(loader: ClassLoader?, initialize: Boolean): Class<T>
    +
    fun VariousClass.toClass(loader: ClassLoader?, initialize: Boolean): Class<*>
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    功能描述

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    功能示例

    你可以轻松地将 String 类型的 Class 包名转为 Class 实例。

    示例如下

    "com.example.demo.DemoClass".toClass()
     

    你还可以向 loader 参数传入你自定义的 ClassLoader

    示例如下

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     "com.example.demo.DemoClass".toClass(customClassLoader)
    -

    你还可以创建一个 VariousClass,并转换为实体类。

    VariousClass 会枚举所有设置的 Class 并最终获得第一个存在的 Class

    示例如下

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
    +

    你还可以指定 Class 的目标类型。

    示例如下

    // 指定的 DemoClass 必须存在或为可访问的 stub
    +"com.example.demo.DemoClass".toClass<DemoClass>()
    +

    你还可以设置在获取到这个 Class 时是否自动执行其默认的静态方法块,默认情况下不会执行。

    示例如下

    // 获取并执行 DemoClass 默认的静态方法块
    +"com.example.demo.DemoClass".toClass(initialize = true)
    +

    默认的静态方法块在 Java 中使用如下方式定义。

    示例如下

    public class DemoClass {
    +
    +    static {
    +        // 这里是静态方法块的内容
    +    }
    +
    +    public DemoClass() {
    +        // ...
    +    }
    +}
    +

    你还可以创建一个 VariousClass,并转换为实体类。

    VariousClass 会枚举所有设置的 Class 并最终获得第一个存在的 Class

    示例如下

    VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass()
     

    同样地,你还可以向 loader 参数传入你自定义的 ClassLoader

    示例如下

    val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
     VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").toClass(customClassLoader)
    -

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?): Class<*>?
    -
    fun VariousClass.toClassOrNull(loader: ClassLoader?): Class<*>?
    -

    变更记录

    v1.1.0 新增

    功能描述

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    找不到 Class 会返回 null,不会抛出异常。

    功能示例

    用法请参考 String+VariousClass.toClass 方法。

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
    +

    String+VariousClass.toClassOrNull - i-ext-method

    fun String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +
    inline fun <reified T> String.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<T>?
    +
    fun VariousClass.toClassOrNull(loader: ClassLoader?, initialize: Boolean): Class<*>?
    +

    变更记录

    v1.1.0 新增

    v1.1.5 修改

    新增泛型返回值 Class<T> 方法

    新增 initialize 参数

    功能描述

    通过字符串类名、VariousClass 转换为 loader 中的实体类。

    默认使用当前 appClassLoader 装载目标 Class

    找不到 Class 会返回 null,不会抛出异常。

    功能示例

    用法请参考 String+VariousClass.toClass 方法。

    String.hasClass - i-ext-method

    fun String.hasClass(loader: ClassLoader?): Boolean
     

    变更记录

    v1.1.0 新增

    功能描述

    通过字符串类名查找是否存在。

    默认使用当前 appClassLoader 装载目标 Class

    功能示例

    你可以轻松的使用此方法判断字符串中的类是否存在。

    示例如下

    if("com.example.demo.DemoClass".hasClass()) {
         // Your code here.
     }
    @@ -134,8 +159,8 @@
     

    变更记录

    v1.0.80 新增

    功能描述

    Hook APP 的 Resources。

    特别注意

    请注意你需要确保当前 Hook Framework 支持且 InjectYukiHookWithXposed.isUsingResourcesHook 已启用。

    功能示例

    Resources Hook 为固定用法,获取 resources 对象,然后调用 hook 方法开始 Hook。

    示例如下

    resources().hook {
         // Your code here.
     }
    -

    特别注意

    这是固定用法,为了防止发生问题,你不可手动实现任何 HookResources 实例执行 hook 调用。

    将 Resources 的 Hook 设置为这样是为了与 findClass(...).hook 做到统一,使得调用起来逻辑不会混乱。

    AppLifecycle - class

    inner class AppLifecycle internal constructor()
    -

    变更记录

    v1.0.88 新增

    功能描述

    当前 Hook APP 的生命周期实例处理类。

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
    +

    特别注意

    这是固定用法,为了防止发生问题,你不可手动实现任何 HookResources 实例执行 hook 调用。

    将 Resources 的 Hook 设置为这样是为了与 findClass(...).hook 做到统一,使得调用起来逻辑不会混乱。

    AppLifecycle - class

    inner class AppLifecycle internal constructor(private val isOnFailureThrowToApp: Boolean)
    +

    变更记录

    v1.0.88 新增

    v1.1.5 修改

    新增 isOnFailureThrowToApp 参数,可选择将异常在 (Xposed) 宿主环境打印而不是抛出给宿主

    功能描述

    当前 Hook APP 的生命周期实例处理类。

    attachBaseContext - method

    fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
     

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 装载 Application.attachBaseContext

    onCreate - method

    fun onCreate(initiate: Application.() -> Unit)
     

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 装载 Application.onCreate

    onTerminate - method

    fun onTerminate(initiate: Application.() -> Unit)
     

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 装载 Application.onTerminate

    onLowMemory - method

    fun onLowMemory(initiate: Application.() -> Unit)
    @@ -143,6 +168,6 @@
     

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 装载 Application.onTrimMemory

    onConfigurationChanged - method

    fun onConfigurationChanged(result: (self: Application, config: Configuration) -> Unit)
     

    变更记录

    v1.0.88 新增

    功能描述

    监听当前 Hook APP 装载 Application.onConfigurationChanged

    registerReceiver - method

    fun registerReceiver(vararg action: String, result: (context: Context, intent: Intent) -> Unit)
     

    变更记录

    v1.0.88 新增

    功能描述

    注册系统广播监听。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html index 2511724c3..0ecdc2cca 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ComponentTypeFactory - kt | Yuki Hook API - + ComponentTypeFactory - kt | Yuki Hook API + -

    ComponentTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关组件的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    - +

    ComponentTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关组件的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html index b3a730b0a..b56457887 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - GraphicsTypeFactory - kt | Yuki Hook API - + GraphicsTypeFactory - kt | Yuki Hook API + -

    GraphicsTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 GraphicsClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    - +

    GraphicsTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 GraphicsClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html index 3e4d33712..3a197278c 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ViewTypeFactory - kt | Yuki Hook API - + ViewTypeFactory - kt | Yuki Hook API + -

    ViewTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 WidgetClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    - +

    ViewTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Android 相关 WidgetClass 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html index 85a309d5c..557b61194 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/defined/DefinedTypeFactory.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - DefinedTypeFactory - kt | Yuki Hook API - + DefinedTypeFactory - kt | Yuki Hook API + -

    DefinedTypeFactory - kt

    变更记录

    v1.1.0 新增

    功能描述

    这是一个内部类型的定义常量类,主要用于反射 API 相关用法的延伸。

    VagueType - field

    val VagueType: Class<*>
    +    

    DefinedTypeFactory - kt

    变更记录

    v1.1.0 新增

    功能描述

    这是一个内部类型的定义常量类,主要用于反射 API 相关用法的延伸。

    VagueType - field

    val VagueType: Class<*>
     

    变更记录

    v1.1.0 新增

    功能描述

    得到模糊类型。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html index 8d842c9e9..15091dc2f 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - VariableTypeFactory - kt | Yuki Hook API - + VariableTypeFactory - kt | Yuki Hook API + -

    VariableTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Java 相关基本变量类型的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    - +

    VariableTypeFactory - kt

    变更记录

    v1.0 添加

    功能描述

    这是一个预置 Hook 类型的常量类,主要为 Java 相关基本变量类型的 Class 内容,跟随版本更新会逐一进行增加。

    详情可 点击这里在新窗口中打开 进行查看。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html index 8a4dea105..1d65a627b 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/application/ModuleApplication.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModuleApplication - class | Yuki Hook API - + ModuleApplication - class | Yuki Hook API + -

    ModuleApplication - class

    open class ModuleApplication: Application()
    +    

    ModuleApplication - class

    open class ModuleApplication: Application()
     

    变更记录

    v1.0.77 新增

    功能描述

    这是对使用 YukiHookAPI Xposed 模块实现中的一个扩展功能。

    在你的 Xposed 模块的 Application 中继承此类。

    或在 AndroidManifest.xmlapplication 标签中指定此类。

    目前可实现功能如下

    • 全局共享模块中静态的 appContext

    • 在模块与宿主中装载 YukiHookAPI.Config 以确保 YukiHookAPI.Configs.debugTag 不需要重复定义

    • 在模块与宿主中使用 YukiHookDataChannel 进行通讯

    • 在模块中使用系统隐藏 API,核心技术引用了开源项目 FreeReflection在新窗口中打开

    • 在模块中使用 YukiHookAPI.Status.isTaiChiModuleActive 判断太极、无极激活状态

    功能示例

    将此类继承到你的自定义 Application 上。

    示例如下

    package com.demo
     
     class MyApplication: ModuleApplication() {
    @@ -43,7 +43,7 @@
         android:name="com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication"
         ...>
     

    appContext - field

    val appContext: ModuleApplication
    -

    变更记录

    v1.0.77 新增

    功能描述

    获取全局静态 Application 实例。

    - +

    变更记录

    v1.0.77 新增

    功能描述

    获取全局静态 Application 实例。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html index 353e3344e..bb20f9230 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiModuleResources.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - YukiModuleResources - class | Yuki Hook API - + YukiModuleResources - class | Yuki Hook API + -

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
    +    

    YukiModuleResources - class

    class YukiModuleResources private constructor(private val baseInstance: XModuleResources) : Resources
     

    变更记录

    v1.0.80 新增

    功能描述

    对接 XModuleResources 的中间层实例。

    fwd - method

    fun fwd(resId: Int): YukiResForwarder
     

    变更记录

    v1.0.80 新增

    功能描述

    对接 XModuleResources.fwd 方法。

    创建 YukiResForwarderXResForwarder 实例。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html index d0e52ac61..d46747d25 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResForwarder.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - YukiResForwarder - class | Yuki Hook API - + YukiResForwarder - class | Yuki Hook API + -

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
    +    

    YukiResForwarder - class

    class YukiResForwarder private constructor(private val baseInstance: XResForwarder)
     

    变更记录

    v1.0.80 新增

    功能描述

    对接 XResForwarder 的中间层实例。

    instance - field

    变更记录

    v1.0.80 新增

    v1.1.0 作废

    不再对外公开 instance 参数

    id - field

    val id: Int
     

    变更记录

    v1.0.80 新增

    功能描述

    获得当前 APP 的 Resources Id。

    resources - field

    val resources: Resources
     

    变更记录

    v1.0.80 新增

    功能描述

    获得当前 APP 的 Resources。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html index 798fd5288..3e576eb4c 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/dummy/YukiResources.html @@ -22,18 +22,18 @@ document.documentElement.classList.toggle('dark', true); } - YukiResources - class | Yuki Hook API - + YukiResources - class | Yuki Hook API + -

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
    +    

    YukiResources - class

    class YukiResources private constructor(private val baseInstance: XResources) : Resources
     

    变更记录

    v1.0.80 新增

    功能描述

    对接 XResources 的中间层实例。

    LayoutInflatedParam - class

    class LayoutInflatedParam(internal val baseParam: XC_LayoutInflated.LayoutInflatedParam)
     

    变更记录

    v1.0.80 新增

    功能描述

    装载 Hook APP 的目标布局 Resources 实现类。

    variantName - field

    val variantName: String
     

    变更记录

    v1.0.80 新增

    功能描述

    获取当前被 Hook 的布局装载目录名称。

    例如:layoutlayout-landlayout-sw600dp

    currentView - field

    val currentView: View
     

    变更记录

    v1.0.80 新增

    功能描述

    获取当前被 Hook 的布局实例。

    findViewByIdentifier - method

    inline fun <reified T : View> View.findViewByIdentifier(name: String): T?
     
    inline fun <reified T : View> findViewByIdentifier(name: String): T?
     

    变更记录

    v1.0.80 新增

    功能描述

    使用 Identifier 查找 Hook APP 指定 Id 的 View

    扩展方法可以使用 Identifier 查找 Hook APP 当前装载布局中指定 Id 的 View

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html index c4dd6f7ef..8a01cc8b2 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/bridge/event/YukiXposedEvent.html @@ -22,17 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - YukiXposedEvent - object | Yuki Hook API - + YukiXposedEvent - object | Yuki Hook API + -

    YukiXposedEvent - object

    object YukiXposedEvent
    +    

    YukiXposedEvent - object

    object YukiXposedEvent
     

    变更记录

    v1.0.80 添加

    功能描述

    实现对原生 Xposed API 的装载事件监听。

    events - method

    inline fun events(initiate: YukiXposedEvent.() -> Unit)
     

    变更记录

    v1.0.80 新增

    功能描述

    YukiXposedEvent 创建一个方法体。

    onInitZygote - method

    fun onInitZygote(result: (StartupParam) -> Unit)
     

    变更记录

    v1.0.80 新增

    功能描述

    设置 initZygote 事件监听。

    onHandleLoadPackage - method

    fun onHandleLoadPackage(result: (LoadPackageParam) -> Unit)
     

    变更记录

    v1.0.80 新增

    功能描述

    设置 handleLoadPackage 事件监听。

    onHandleInitPackageResources - method

    fun onHandleInitPackageResources(result: (InitPackageResourcesParam) -> Unit)
     

    变更记录

    v1.0.80 新增

    功能描述

    设置 handleInitPackageResources 事件监听。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html index 1e94abed3..82842bd10 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.html @@ -22,24 +22,25 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookDataChannel - class | Yuki Hook API - + YukiHookDataChannel - class | Yuki Hook API + -

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
    +    

    YukiHookDataChannel - class

    class YukiHookDataChannel private constructor()
     

    变更记录

    v1.0.88 新增

    功能描述

    实现 Xposed 模块的数据通讯桥。

    通过模块与宿主相互注册 BroadcastReceiver 来实现数据的交互。

    模块需要将 Application 继承于 ModuleApplication 来实现此功能。

    特别注意

    模块与宿主需要保持存活状态,否则无法建立通讯。

    NameSpace - class

    inner class NameSpace internal constructor(private val context: Context?, private val packageName: String, private val isSecure: Boolean)
     

    变更记录

    v1.0.88 新增

    v1.0.90 修改

    新增 isSecure 参数

    功能描述

    YukiHookDataChannel 命名空间。

    with - method

    inline fun with(initiate: NameSpace.() -> Unit): NameSpace
    -

    变更记录

    v1.0.88 新增

    功能描述

    创建一个调用空间。

    put - method

    fun <T> put(key: String, value: T)
    +

    变更记录

    v1.0.88 新增

    功能描述

    创建一个调用空间。

    allowSendTooLargeData - method

    fun allowSendTooLargeData(): NameSpace
    +

    变更记录

    v1.1.5 新增

    功能描述

    解除发送数据的大小限制并禁止开启分段发送功能。

    仅会在每次调用时生效,下一次没有调用此方法则此功能将被自动关闭。

    你还需要在整个调用域中声明注解 CauseProblemsApi 以消除警告。

    特别注意

    若你不知道允许此功能会带来何种后果,请勿使用。

    put - method

    fun <T> put(key: String, value: T)
     
    fun <T> put(data: ChannelData<T>, value: T?)
     
    fun put(vararg data: ChannelData<*>)
     

    变更记录

    v1.0.88 新增

    功能描述

    发送键值数据。

    put - method

    fun put(key: String)
    -

    变更记录

    v1.0.88 新增

    功能描述

    仅发送键值监听,使用默认值 VALUE_WAIT_FOR_LISTENER 发送键值数据。

    wait - method

    fun <T> wait(key: String, result: (value: T) -> Unit)
    -
    fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
    -

    变更记录

    v1.0.88 新增

    v1.0.90 修改

    移除默认值 value

    功能描述

    获取键值数据。

    wait - method

    fun wait(key: String, callback: () -> Unit)
    -

    变更记录

    v1.0.88 新增

    功能描述

    仅获取监听结果,不获取键值数据。

    特别注意

    仅限使用 VALUE_WAIT_FOR_LISTENER 发送的监听才能被接收。

    checkingVersionEquals - method

    fun checkingVersionEquals(result: (Boolean) -> Unit)
    -

    变更记录

    v1.0.88 新增

    功能描述

    获取模块与宿主的版本是否匹配。

    通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
    -

    变更记录

    v1.1.4 新增

    功能描述

    获取模块与宿主之间的 ArrayList<YukiLoggerData> 数据。

    由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。

    特别注意

    模块与宿主必须启用 YukiHookLogger.Configs.isRecord 才能获取到调试日志数据。

    由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 TransactionTooLargeException 异常。

    - +

    变更记录

    v1.0.88 新增

    功能描述

    仅发送键值监听,使用默认值 VALUE_WAIT_FOR_LISTENER 发送键值数据。

    wait - method

    fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
    +
    fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
    +

    变更记录

    v1.0.88 新增

    v1.0.90 修改

    移除默认值 value

    v1.1.5 修改

    新增 priority 参数

    功能描述

    获取键值数据。

    wait - method

    fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
    +

    变更记录

    v1.0.88 新增

    v1.1.5 修改

    新增 priority 参数

    功能描述

    仅获取监听结果,不获取键值数据。

    特别注意

    仅限使用 VALUE_WAIT_FOR_LISTENER 发送的监听才能被接收。

    checkingVersionEquals - method

    fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
    +

    变更记录

    v1.0.88 新增

    v1.1.5 修改

    新增 priority 参数

    功能描述

    获取模块与宿主的版本是否匹配。

    通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。

    obtainLoggerInMemoryData - method

    fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
    +

    变更记录

    v1.1.4 新增

    v1.1.5 修改

    新增 priority 参数

    功能描述

    获取模块与宿主之间的 ArrayList<YukiLoggerData> 数据。

    由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。

    特别注意

    模块与宿主必须启用 YukiHookLogger.Configs.isRecord 才能获取到调试日志数据。

    由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 TransactionTooLargeException 异常。

    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html index d42de8665..7a407cf49 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/data/ChannelData.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - ChannelData - class | Yuki Hook API - + ChannelData - class | Yuki Hook API + -

    ChannelData - class

    data class ChannelData<T>(var key: String, var value: T?)
    -

    变更记录

    v1.0.88 新增

    功能描述

    数据通讯桥键值构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    功能示例

    建立一个模板类定义模块与宿主需要发送的键值数据。

    示例如下

    object DataConst {
    +    

    ChannelData - class

    data class ChannelData<T>(var key: String, var value: T?) : Serializable
    +

    变更记录

    v1.0.88 新增

    v1.1.5 修改

    实现了 Serializable 接口

    功能描述

    数据通讯桥键值构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    功能示例

    建立一个模板类定义模块与宿主需要发送的键值数据。

    示例如下

    object DataConst {
     
         val TEST_KV_DATA_1 = ChannelData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = ChannelData("test_data_2", 0)
    @@ -49,7 +49,7 @@
     dataChannel.wait(DataConst.TEST_KV_DATA_2, value = 2) { value ->
         // Your code here.
     }
    -
    - +
    + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html new file mode 100644 index 000000000..18ac2292a --- /dev/null +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/priority/ChannelPriority.html @@ -0,0 +1,34 @@ + + + + + + + + + ChannelPriority - class | Yuki Hook API + + + + +

    ChannelPriority - class

    class ChannelPriority(private val conditions: () -> Boolean)
    +

    变更记录

    v1.1.5 新增

    功能描述

    数据通讯桥响应优先级构造类。

    这个类是对 YukiHookDataChannel 的一个扩展用法。

    + + + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html index fe0c5d9ab..56a71d3b0 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - ModuleAppActivity - class | Yuki Hook API - + ModuleAppActivity - class | Yuki Hook API + -

    ModuleAppActivity - class

    open class ModuleAppActivity : Activity()
    +    

    ModuleAppActivity - class

    open class ModuleAppActivity : Activity()
     

    变更记录

    v1.1.0 新增

    功能描述

    代理 Activity

    继承于此类的 Activity 可以同时在宿主与模块中启动。

    在 (Xposed) 宿主环境需要在宿主启动时调用 Context.registerModuleAppActivities 进行注册。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html index fa67c03a4..a06dbd61c 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - ModuleAppCompatActivity - class | Yuki Hook API - + ModuleAppCompatActivity - class | Yuki Hook API + -

    ModuleAppCompatActivity - class

    open class ModuleAppCompatActivity : AppCompatActivity()
    +    

    ModuleAppCompatActivity - class

    open class ModuleAppCompatActivity : AppCompatActivity()
     

    变更记录

    v1.1.0 新增

    功能描述

    代理 AppCompatActivity

    继承于此类的 Activity 可以同时在宿主与模块中启动。

    在 (Xposed) 宿主环境需要在宿主启动时调用 Context.registerModuleAppActivities 进行注册。

    在 (Xposed) 宿主环境需要重写 moduleTheme 设置 AppCompat 主题,否则会无法启动。

    moduleTheme - field

    open val moduleTheme: Int
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前代理的 Activity 主题。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html index 578975fe8..aff80e3be 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper.html @@ -22,14 +22,14 @@ document.documentElement.classList.toggle('dark', true); } - ModuleContextThemeWrapper - class | Yuki Hook API - + ModuleContextThemeWrapper - class | Yuki Hook API + -

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
    +    

    ModuleContextThemeWrapper - class

    class ModuleContextThemeWrapper private constructor(baseContext: Context, theme: Int, configuration: Configuration?) : ContextThemeWrapper
     

    变更记录

    v1.1.0 新增

    功能描述

    代理 ContextThemeWrapper

    通过包装,你可以轻松在 (Xposed) 宿主环境使用来自模块的主题资源。

    applyConfiguration - method

    fun applyConfiguration(initiate: Configuration.() -> Unit): ModuleContextThemeWrapper
     

    变更记录

    v1.1.0 新增

    功能描述

    设置当前 ModuleContextThemeWrapperConfiguration

    设置后会自动调用 Resources.updateConfiguration

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html index 078368f7c..ac5b315db 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/reference/ModuleClassLoader.html @@ -22,15 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - ModuleClassLoader - class | Yuki Hook API - + ModuleClassLoader - class | Yuki Hook API + -

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
    +    

    ModuleClassLoader - class

    class ModuleClassLoader private constructor() : ClassLoader
     

    变更记录

    v1.1.2 新增

    功能描述

    自动处理 (Xposed) 宿主环境与模块环境的 ClassLoader

    companion object - object

    变更记录

    v1.1.2 新增

    excludeHostClasses - method

    fun excludeHostClasses(vararg name: String)
     

    变更记录

    v1.1.2 新增

    功能描述

    添加到 Hook APP (宿主) Class 排除列表。

    排除列表中的 Class 将会使用宿主的 ClassLoader 进行装载。

    特别注意

    排除列表仅会在 (Xposed) 宿主环境生效。

    excludeModuleClasses - method

    fun excludeModuleClasses(vararg name: String)
     

    变更记录

    v1.1.2 新增

    功能描述

    添加到模块 Class 排除列表。

    排除列表中的 Class 将会使用模块 (当前宿主环境的模块注入进程) 的 ClassLoader 进行装载。

    特别注意

    排除列表仅会在 (Xposed) 宿主环境生效。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html index 2845c232f..2de1f558b 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.html @@ -22,18 +22,17 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookModulePrefs - class | Yuki Hook API - + YukiHookModulePrefs - class | Yuki Hook API + -

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
    +    

    YukiHookModulePrefs - class

    class YukiHookModulePrefs private constructor(private var context: Context?)
     

    变更记录

    v1.0 添加

    功能描述

    实现 Xposed 模块的数据存取,对接 SharedPreferencesXSharedPreferences

    在不同环境智能选择存取使用的对象。

    特别注意

    此功能为实验性功能,仅在 LSPosed 环境测试通过,EdXposed 理论也可以使用但不再推荐。

    使用 LSPosed 环境请在 AndroidManifests.xml 中将 xposedminversion 最低设置为 93

    详见 New XSharedPreferences在新窗口中打开

    若你在按照规定配置后依然无法使用或出现文件权限错误问题,可以参考 isEnableHookSharedPreferences

    未使用 LSPosed 环境请将你的模块 API 降至 26 以下,YukiHookAPI 将会尝试使用 makeWorldReadable 但仍有可能不成功。

    太极请参阅 文件权限/配置/XSharedPreference在新窗口中打开

    特别注意

    当你在 Xposed 模块中存取数据的时候 context 必须不能是空的。

    若你正在使用 PreferenceFragmentCompat,请迁移到 ModulePreferenceFragment 以适配上述功能特性。

    可选配置

    若你不想将你的模块的 xposedminversion 最低设置为 93,你可以在 AndroidManifest.xml 中添加 xposedsharedprefs 来实现支持。

    详见 New XSharedPreferences在新窗口中打开

    示例如下

    <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
    -

    isXSharePrefsReadable - field

    val isXSharePrefsReadable: Boolean
    -

    变更记录

    v1.0.90 新增

    功能描述

    获取 XSharedPreferences 是否可读。

    特别注意

    只能在 (Xposed) 宿主环境中使用,模块环境中始终返回 false。

    isRunInNewXShareMode - field

    val isRunInNewXShareMode: Boolean
    -

    变更记录

    v1.0.78 新增

    功能描述

    获取 YukiHookModulePrefs 是否正处于 EdXposed/LSPosed 的最高权限运行。

    前提条件为当前 Xposed 模块已被激活。

    特别注意

    只能在模块环境中使用,(Xposed) 宿主环境中始终返回 false。

    name - method

    fun name(name: String): YukiHookModulePrefs
    +

    isXSharePrefsReadable - field

    变更记录

    v1.0.90 新增

    v1.1.5 作废

    请转移到 isPreferencesAvailable

    isRunInNewXShareMode - field

    变更记录

    v1.0.78 新增

    v1.1.5 作废

    请转移到 isPreferencesAvailable

    isPreferencesAvailable - field

    val isPreferencesAvailable: Boolean
    +

    变更记录

    v1.1.5 新增

    功能描述

    获取当前 YukiHookModulePrefs 的可用状态。

    在 (Xposed) 宿主环境中返回 XSharedPreferences 可用状态 (可读)。

    在模块环境中返回当前是否处于 New XSharedPreferences 模式 (可读可写)。

    name - method

    fun name(name: String): YukiHookModulePrefs
     

    变更记录

    v1.0 添加

    功能描述

    自定义 Sp 存储名称。

    功能示例

    Activity 中的使用方法。

    示例如下

    modulePrefs("custom_name").getString("custom_key")
     

    在 (Xposed) 宿主环境 PackageParam 中的使用方法。

    示例如下

    prefs("custom_name").getString("custom_key")
     

    direct - method

    fun direct(): YukiHookModulePrefs
    @@ -57,6 +56,6 @@
     

    变更记录

    v1.0.67 新增

    功能描述

    智能获取指定类型的键值。

    put - method

    inline fun <reified T> put(prefs: PrefsData<T>, value: T)
     

    变更记录

    v1.0.67 新增

    功能描述

    智能存储指定类型的键值。

    注意

    在 (Xposed) 宿主环境下只读,无法使用。

    clearCache - method

    fun clearCache()
     

    变更记录

    v1.0.5 新增

    功能描述

    清除 XSharedPreferences 中缓存的键值数据。

    无论是否开启 YukiHookAPI.Configs.isEnableModulePrefsCache

    调用此方法将清除当前存储的全部键值缓存。

    下次将从 XSharedPreferences 重新读取。

    在 (Xposed) 宿主环境中使用。

    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html index a7582204e..986406770 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/data/PrefsData.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - PrefsData - class | Yuki Hook API - + PrefsData - class | Yuki Hook API + -

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T)
    -

    变更记录

    v1.0.67 新增

    功能描述

    键值对存储构造类。

    这个类是对 YukiHookModulePrefs 的一个扩展用法。

    功能示例

    建立一个模板类定义模块与宿主需要使用的键值数据。

    示例如下

    object DataConst {
    +    

    PrefsData - class

    data class PrefsData<T>(var key: String, var value: T) : Serializable
    +

    变更记录

    v1.0.67 新增

    v1.1.5 修改

    实现了 Serializable 接口

    功能描述

    键值对存储构造类。

    这个类是对 YukiHookModulePrefs 的一个扩展用法。

    功能示例

    建立一个模板类定义模块与宿主需要使用的键值数据。

    示例如下

    object DataConst {
     
         val TEST_KV_DATA_1 = PrefsData("test_data_1", "defalut value")
         val TEST_KV_DATA_2 = PrefsData("test_data_2", false)
    @@ -45,6 +45,6 @@
     

    你依然可以不使用模板定义的默认值,随时修改你的默认值。

    示例如下

    // 读取 - 此时 data 取到的默认值将会是 2 - 并不是模板提供的 0
     val data = prefs.get(DataConst.TEST_KV_DATA_3, 2)
     
    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html index 14390978c..d67e4ee89 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/prefs/ui/ModulePreferenceFragment.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - ModulePreferenceFragment - class | Yuki Hook API - + ModulePreferenceFragment - class | Yuki Hook API + -

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
    +    

    ModulePreferenceFragment - class

    abstract class ModulePreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener
     

    变更记录

    v1.0.78 新增

    功能描述

    这是对使用 YukiHookAPI Xposed 模块实现中的一个扩展功能。

    此类接管了 PreferenceFragmentCompat 并对其实现了 Sp 存储在 Xposed 模块中的全局可读可写。

    在你使用 PreferenceFragmentCompat 的实例中,将继承对象换成此类。

    然后请将重写方法由 onCreatePreferences 替换为 onCreatePreferencesInModuleApp 即可。

    功能示例

    使用 ModulePreferenceFragment 创建一个 PreferenceFragmentCompat 对象。

    示例如下

    class SettingsFragment : ModulePreferenceFragment() {
     
         override fun onCreatePreferencesInModuleApp(savedInstanceState: Bundle?, rootKey: String?) {
    @@ -49,6 +49,6 @@
         }
     }
     
    - + diff --git a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html index d7abde623..2cb650c89 100644 --- a/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html +++ b/docs/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/proxy/IYukiHookXposedInit.html @@ -22,16 +22,16 @@ document.documentElement.classList.toggle('dark', true); } - IYukiHookXposedInit - interface | Yuki Hook API - + IYukiHookXposedInit - interface | Yuki Hook API + -

    IYukiHookXposedInit - interface

    interface IYukiHookXposedInit
    +    

    IYukiHookXposedInit - interface

    interface IYukiHookXposedInit
     

    变更记录

    v1.0 添加

    v1.0.80 修改 作废

    作废了 YukiHookXposedInitProxy 名称但保留接口

    转移到 IYukiHookXposedInit 新名称

    功能描述

    YukiHookAPI 的 Xposed 装载 API 调用接口。

    onInit - method

    fun onInit()
     

    变更记录

    v1.0.5 新增

    功能描述

    配置 YukiHookAPI.Configs 的初始化方法。

    特别注意

    在这里只能进行初始化配置,不能进行 Hook 操作。

    此方法可选,你也可以选择不对 YukiHookAPI.Configs 进行配置。

    onHook - method

    fun onHook()
     

    变更记录

    v1.0 添加

    功能描述

    Xposed API 的模块装载调用入口方法。

    onXposedEvent - method

    fun onXposedEvent()
     

    变更记录

    v1.0.80 新增

    功能描述

    监听 Xposed 原生装载事件。

    若你的 Hook 事件中存在需要兼容的原生 Xposed 功能,可在这里实现。

    请在这里使用 YukiXposedEvent 创建回调事件监听。

    可监听的事件如下:

    YukiXposedEvent.onInitZygote

    YukiXposedEvent.onHandleLoadPackage

    YukiXposedEvent.onHandleInitPackageResources

    特别注意

    此接口仅供监听和实现原生 Xposed API 的功能,请不要在这里操作 YukiHookAPI

    YukiHookXposedInitProxy - interface

    变更记录

    v1.0 添加

    v1.0.80 作废

    请转移到 IYukiHookXposedInit

    - + diff --git a/docs/zh-cn/api/special-features/host-inject.html b/docs/zh-cn/api/special-features/host-inject.html index baf1bb677..7b101d671 100644 --- a/docs/zh-cn/api/special-features/host-inject.html +++ b/docs/zh-cn/api/special-features/host-inject.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 宿主资源注入扩展 | Yuki Hook API - + 宿主资源注入扩展 | Yuki Hook API + -

    宿主资源注入扩展

    这是一个将模块资源、Activity 组件以及 Context 主题注入到宿主的扩展功能。

    在使用以下功能之前,为防止资源 ID 互相冲突,你需要在当前 Xposed 模块项目的 build.gradle 中修改资源 ID。

    • Kotlin Gradle DSL
    android {
    +    

    宿主资源注入扩展

    这是一个将模块资源、Activity 组件以及 Context 主题注入到宿主的扩展功能。

    在使用以下功能之前,为防止资源 ID 互相冲突,你需要在当前 Xposed 模块项目的 build.gradle 中修改资源 ID。

    • Kotlin Gradle DSL
    android {
         androidResources.additionalParameters("--allow-reserved-package-id", "--package-id", "0x64")
     }
     
    • Groovy
    android {
    @@ -159,6 +159,6 @@
         "com.demo.controller.ModuleController"
     )
     

    你需要在向宿主注入模块资源的方法执行之前进行设置才能生效。

    此功能仅为解决宿主与模块中可能存在同名的 Class 情况,例如共用的 SDK 以及依赖,在大部分情况下你不会用到此功能。

    小提示

    更多功能请参考 ModuleClassLoader

    - + diff --git a/docs/zh-cn/api/special-features/host-lifecycle.html b/docs/zh-cn/api/special-features/host-lifecycle.html index 74b910211..14d20da08 100644 --- a/docs/zh-cn/api/special-features/host-lifecycle.html +++ b/docs/zh-cn/api/special-features/host-lifecycle.html @@ -22,14 +22,15 @@ document.documentElement.classList.toggle('dark', true); } - 宿主生命周期扩展 | Yuki Hook API - + 宿主生命周期扩展 | Yuki Hook API + -

    宿主生命周期扩展

    这是一个自动 Hook 宿主 APP 生命周期的扩展功能。

    监听生命周期

    通过自动化 Hook 宿主 APP 的生命周期方法,来实现监听功能。

    我们需要监听宿主 Application 的启动和生命周期方法,只需要使用以下方式实现。

    示例如下

    loadApp(name = "com.example.demo") {
    +    

    宿主生命周期扩展

    这是一个自动 Hook 宿主 APP 生命周期的扩展功能。

    监听生命周期

    通过自动化 Hook 宿主 APP 的生命周期方法,来实现监听功能。

    我们需要监听宿主 Application 的启动和生命周期方法,只需要使用以下方式实现。

    示例如下

    loadApp(name = "com.example.demo") {
         // 注册生命周期监听
    -    onAppLifecycle {
    +    // 可选参数:你可以设置 isOnFailureThrowToApp = false 使得其中的异常不会抛出给宿主防止宿主崩溃,默认为 true
    +    onAppLifecycle(isOnFailureThrowToApp = true) {
             // 你可以在这里实现 Application 中的生命周期方法监听
             attachBaseContext { baseContext, hasCalledSuper ->
                 // 通过判断 hasCalledSuper 来确定是否已执行 super.attachBaseContext(base) 方法
    @@ -59,7 +60,7 @@
             }
         }
     }
    -

    小提示

    更多功能请参考 AppLifecycle

    注册系统广播

    通过 Application.onCreate 方法注册系统广播,来实现对系统广播的监听。

    我们还可以在宿主 Application 中注册系统广播。

    示例如下

    loadApp(name = "com.example.demo") {
    +

    小提示

    更多功能请参考 AppLifecycle

    注册系统广播

    通过 Application.onCreate 方法注册系统广播,来实现对系统广播的监听。

    我们还可以在宿主 Application 中注册系统广播。

    示例如下

    loadApp(name = "com.example.demo") {
         // 注册生命周期监听
         onAppLifecycle {
             // 注册用户解锁时的广播监听
    @@ -73,6 +74,6 @@
         }
     }
     

    小提示

    更多功能请参考 AppLifecycle

    - + diff --git a/docs/zh-cn/api/special-features/logger.html b/docs/zh-cn/api/special-features/logger.html index f3cd01b0d..267f89fb2 100644 --- a/docs/zh-cn/api/special-features/logger.html +++ b/docs/zh-cn/api/special-features/logger.html @@ -22,16 +22,16 @@ document.documentElement.classList.toggle('dark', true); } - 调试日志 | Yuki Hook API - + 调试日志 | Yuki Hook API + -

    调试日志

    日志是调试过程最重要的一环,YukiHookAPI 为开发者封装了一套稳定高效的调试日志功能。

    普通日志

    你可以调用 loggerDloggerIloggerW 来向控制台打印普通日志。

    使用方法如下所示。

    示例如下

    loggerD(msg = "This is a log")
    -

    此时,YukiHookAPI 会调用 android.util.LogXposedBridge.log 同时打印这条日志。

    日志默认的 TAG 为你在 YukiHookLogger.Configs.tag 中设置的值。

    你也可以动态自定义这个值,但是不建议轻易修改 TAG 防止过滤不到日志。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
    +    

    调试日志

    日志是调试过程最重要的一环,YukiHookAPI 为开发者封装了一套稳定高效的调试日志功能。

    普通日志

    你可以调用 loggerDloggerIloggerW 来向控制台打印普通日志。

    使用方法如下所示。

    示例如下

    loggerD(msg = "This is a log")
    +

    此时,YukiHookAPI 会调用 android.util.Log 与 (Xposed) 宿主环境中的日志功能同时打印这条日志。

    日志默认的 TAG 为你在 YukiHookLogger.Configs.tag 中设置的值。

    你也可以动态自定义这个值,但是不建议轻易修改 TAG 防止过滤不到日志。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log")
     

    打印的结果为如下所示。

    示例如下

    [YukiHookAPI][D][宿主包名]--> This is a log
    -

    你还可以使用 LoggerType 自定义日志打印的类型,可选择使用 android.util.Log 还是 XposedBridge.log 来打印日志。

    默认类型为 LoggerType.BOTH,含义为同时使用这两个方法来打印日志。

    比如我们仅使用 android.util.Log 来打印日志。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    -

    或又仅使用 XposedBridge.log 来打印日志,此方法仅可在 (Xposed) 宿主环境使用。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE)
    +

    你还可以使用 LoggerType 自定义日志打印的类型,可选择使用 android.util.Log 还是 (Xposed) 宿主环境中的日志功能来打印日志。

    默认类型为 LoggerType.BOTH,含义为同时使用这两个方法来打印日志。

    比如我们仅使用 android.util.Log 来打印日志。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
    +

    或又仅使用 XposedBridge.log 来打印日志,此方法仅可在 (Xposed) 宿主环境使用。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSED_ENVIRONMENT)
     

    若你想智能区分 (Xposed) 宿主环境与模块环境,可以写为如下形式。

    示例如下

    loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE)
     

    这样 API 就会在不同环境智能选择指定的方法类型去打印这条日志。

    小提示

    更多功能请参考 loggerDloggerIloggerW 方法。

    错误日志

    你可以调用 loggerE 来向控制台打印 E 级别的日志。

    使用方法如下所示。

    示例如下

    loggerE(msg = "This is an error")
     

    错误日志的级别是最高的,无论你有没有过滤仅为 E 级别的日志。

    对于错误级别的日志,你还可以在后面加上一个异常堆栈。

    // 假设这就是被抛出的异常
    @@ -59,14 +59,21 @@
         it.throwable // 获取异常
         // ...
     }
    -

    以上功能需要启用 YukiHookLogger.Configs.isRecord

    特别注意

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    你只能在对应的进程中获取对应的日志数据,如果你需要在任何地方实时得到这些日志数据,请参考 Xposed 模块与宿主通讯桥注册模块 Activity

    如果你只想通过模块或宿主来实时得到日志数据,请参考可选方案 YukiHookDataChannel.obtainLoggerInMemoryData 方法。

    你还可以使用 YukiHookLogger.Configs.elements 自定义调试日志对外显示的元素。

    此功能需要在 Hook 入口类的 onInit 中对 YukiHookAPI.Configs 进行配置。

    示例如下

    override fun onInit() = configs {
    +

    如果你想对得到的自定义日志数据进行格式化或保存到文件,你只需要使用如下方法即可。

    示例如下

    // 假设这就是你得到的自定义日志数据
    +val data: ArrayList<YukiLoggerData>
    +// 格式化日志数据到字符串
    +val dataString = YukiHookLogger.contents(data)
    +// 保存日志数据到文件
    +// 请注意保存的文件路径必须拥有读写权限,否则会抛出异常
    +YukiHookLogger.saveToFile("/sdcard/Documents/debug_log.log", data)
    +

    特别注意

    你需要启用 YukiHookLogger.Configs.isRecord 才能获取到 YukiHookLogger.inMemoryData 的内容。

    获取到的日志数据在 Hook APP (宿主) 及模块进程中是相互隔离的。

    你只能在对应的进程中获取对应的日志数据,如果你需要在任何地方实时得到这些日志数据,请参考 Xposed 模块与宿主通讯桥注册模块 Activity

    如果你只想通过模块或宿主来实时得到日志数据,请参考可选方案 YukiHookDataChannel.obtainLoggerInMemoryData 方法。

    你还可以使用 YukiHookLogger.Configs.elements 自定义调试日志对外显示的元素。

    此功能需要在 Hook 入口类的 onInit 中对 YukiHookAPI.Configs 进行配置。

    示例如下

    override fun onInit() = configs {
         debugLog {
             // ...
             elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
         }
         // ...
     }
    -
    - +
    + diff --git a/docs/zh-cn/api/special-features/reflection.html b/docs/zh-cn/api/special-features/reflection.html index 886de966c..d71780f9f 100644 --- a/docs/zh-cn/api/special-features/reflection.html +++ b/docs/zh-cn/api/special-features/reflection.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 字节码与反射扩展 | Yuki Hook API - + 字节码与反射扩展 | Yuki Hook API + -

    字节码与反射扩展

    YukiHookAPI 为开发者封装了一套接近零反射写法的反射 API,它几乎可以完全取代原生 Java 的反射 API 相关用法。

    Class 扩展

    这里是 Class 对象自身相关的扩展功能。

    对象转换

    假设我们要得到一个不能直接调用的 Class,通常情况下,我们可以使用标准的反射 API 去查找这个 Class

    示例如下

    // 默认 ClassLoader 环境下的 Class
    +    

    字节码与反射扩展

    YukiHookAPI 为开发者封装了一套接近零反射写法的反射 API,它几乎可以完全取代原生 Java 的反射 API 相关用法。

    Class 扩展

    这里是 Class 对象自身相关的扩展功能。

    对象转换

    假设我们要得到一个不能直接调用的 Class,通常情况下,我们可以使用标准的反射 API 去查找这个 Class

    示例如下

    // 默认 ClassLoader 环境下的 Class
     var instance = Class.forName("com.demo.Test")
     // 指定 ClassLoader 环境下的 Class
     val customClassLoader: ClassLoader? = ... // 假设这个就是你的 ClassLoader
    @@ -121,9 +121,9 @@
         // 指定实现的接口,可以直接写为完整类名,你还可以同时指定多个
         implements("java.io.Serializable")
         // 指定构造方法的类型与样式,以及在当前类中存在的个数 count
    -    constructor { param(StringType) }.count(num = 1)
    +    constructor { param(StringClass) }.count(num = 1)
         // 指定变量的类型与样式,以及在当前类中存在的个数 count
    -    field { type = StringType }.count(num = 2)
    +    field { type = StringClass }.count(num = 2)
         // 指定变量的类型与样式,以及在当前类中存在的个数 count
         field { type = BooleanType }.count(num = 1)
         // 直接指定所有变量在当前类中存在的个数 count
    @@ -139,14 +139,14 @@
         // 指定方法的类型与样式,同时指定修饰符,以及在当前类中存在的个数 count
         method {
             modifiers { isStatic && isPrivate }
    -        param(StringType)
    +        param(StringClass)
             returnType = UnitType
         }.count(num = 1)
         // 指定方法的类型与样式,同时指定修饰符,以及在当前类中存在的个数 count
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, StringType)
    -        returnType = StringType
    +        param(BooleanType, StringClass)
    +        returnType = StringClass
         }.count(num = 1)
         // 指定方法的类型与样式,同时指定修饰符,以及在当前类中存在的个数 count
         method {
    @@ -157,7 +157,7 @@
         // 指定方法的类型与样式,同时指定修饰符和模糊类型 VagueType,以及在当前类中存在的个数 count
         method {
             modifiers { isPrivate && isStatic.not() }
    -        param(BooleanType, VagueType, VagueType, StringType)
    +        param(BooleanType, VagueType, VagueType, StringClass)
             returnType = UnitType
         }.count(num = 1)
         // 直接指定所有方法在当前类中存在的个数 count
    @@ -307,7 +307,7 @@
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
         name = "doTask"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    小提示

    更多功能请参考 MethodFinder

    同样地,我们需要得到 isTaskRunning 变量也可以写作如下形式。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -326,7 +326,7 @@
     Test::class.java.method {
         name = "getName"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get(instance).string() // 得到方法的结果
     

    通过观察发现,这个 Class 中只有一个名为 getName 的方法,那我们可不可以再简单一点呢?

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -349,14 +349,22 @@
     Test::class.java.method {
         name = "release"
         // 使用 VagueType 来填充不想填写的类型,同时保证其它类型能够匹配
    -    param(StringType, VagueType, BooleanType)
    +    param(StringClass, VagueType, BooleanType)
     }.get(instance) // 得到这个方法
    -

    在父类查找

    你会注意到 Test 继承于 BaseTest,现在我们想得到 BaseTestdoBaseTask 方法,在不知道父类名称的情况下,要怎么做呢?

    参照上面的查找条件,我们只需要在查找条件中加入一个 superClass 即可实现这个功能。

    示例如下

    // 假设这就是这个 Class 的实例
    +

    如果你并不确定每一个参数的类型,你可以通过 param { ... } 方法来创建一个条件方法体。

    示例如下

    // 假设这就是这个 Class 的实例
    +val instance = Test()
    +// 使用 YukiHookAPI 调用并执行
    +Test::class.java.method {
    +    name = "release"
    +    // 得到 it (Class) 方法参数类型数组实例来仅判断已知的类型和它的位置
    +    param { it[0] == StringClass && it[2] == BooleanType }
    +}.get(instance) // 得到这个方法
    +

    小提示

    使用 param { ... } 创建一个条件方法体,其中的变量 it 即当前方法参数的 Class 类型数组实例,此时你就可以自由使用 Class 中的所有对象及其方法。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 FieldFinder.typeMethodFinder.paramMethodFinder.returnTypeConstructorFinder.param 方法。

    在父类查找

    你会注意到 Test 继承于 BaseTest,现在我们想得到 BaseTestdoBaseTask 方法,在不知道父类名称的情况下,要怎么做呢?

    参照上面的查找条件,我们只需要在查找条件中加入一个 superClass 即可实现这个功能。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // 只需要添加这个条件
         superClass()
     }.get(instance).call("task_name")
    @@ -365,7 +373,7 @@
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
         name = "doBaseTask"
    -    param(StringType)
    +    param(StringClass)
         // 加入一个查找条件
         superClass(isOnlySuperClass = true)
     }.get(instance).call("task_name")
    @@ -377,7 +385,7 @@
             // 设置名称不区分大小写
             it.equals("dotask", isIgnoreCase = true)
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    已知当前 Class 中仅有一个 doTask 方法,我们还可以判断方法名称仅包含其中指定的字符。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -387,7 +395,7 @@
             // 仅包含 oTas
             it.contains("oTas")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    我们还可以根据首尾字符串进行判断。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -397,7 +405,7 @@
             // 开头包含 do,结尾包含 Task
             it.startsWith("do") && it.endsWith("Task")
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
     

    通过观察发现这个方法名称中只包含字母,我们还可以再增加一个精确的查找条件。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -407,9 +415,9 @@
             // 开头包含 do,结尾包含 Task,仅包含字母
             it.startsWith("do") && it.endsWith("Task") && it.isOnlyLetters()
         }
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("task_name")
    -

    小提示

    使用 name { ... } 创建一个条件方法体,其中的变量 it 即当前名称的字符串,此时你就可以在 NameRules 的扩展方法中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 NameRules

    多重查找

    有些时候,我们可能需要查找一个 Class 中具有相同特征的一组方法、构造方法、变量,此时,我们就可以利用相对条件匹配来完成。

    在查找条件结果的基础上,我们只需要把 get 换为 all 即可得到匹配条件的全部字节码。

    假设这次我们要得到 Class 中方法参数个数范围在 1..3 的全部方法,可以使用如下实现。

    示例如下

    // 假设这就是这个 Class 的实例
    +

    小提示

    使用 name { ... } 创建一个条件方法体,其中的变量 it 即当前名称的字符串,此时你就可以在 NameRules 的扩展方法中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 FieldFinder.nameMethodFinder.name 方法以及 NameRules

    多重查找

    有些时候,我们可能需要查找一个 Class 中具有相同特征的一组方法、构造方法、变量,此时,我们就可以利用相对条件匹配来完成。

    在查找条件结果的基础上,我们只需要把 get 换为 all 即可得到匹配条件的全部字节码。

    假设这次我们要得到 Class 中方法参数个数范围在 1..3 的全部方法,可以使用如下实现。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
    @@ -436,13 +444,13 @@
         // 调用执行每个方法
         instance.call(...)
     }
    -

    上述示例可完美匹配到如下 2 个方法。

    private void b()

    private void b(String a)

    小提示

    使用 paramCount { ... } 创建一个条件方法体,其中的变量 it 即当前参数个数的整数,此时你就可以在 CountRules 的扩展方法中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 CountRules

    静态字节码

    有些方法和变量在 Class 中是静态的实现,这个时候,我们不需要传入实例就可以调用它们。

    假设我们这次要得到静态变量 TAG 的内容。

    示例如下

    Test::class.java.field {
    +

    上述示例可完美匹配到如下 2 个方法。

    private void b()

    private void b(String a)

    小提示

    使用 paramCount { ... } 创建一个条件方法体,其中的变量 it 即当前参数个数的整数,此时你就可以在 CountRules 的扩展方法中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 MethodFinder.paramCountConstructorFinder.paramCount 方法以及 CountRules

    静态字节码

    有些方法和变量在 Class 中是静态的实现,这个时候,我们不需要传入实例就可以调用它们。

    假设我们这次要得到静态变量 TAG 的内容。

    示例如下

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
     }.get().string() // Field 的类型是字符串,可直接进行 cast
     

    假设 Class 中存在同名的非静态 TAG 变量,这个时候怎么办呢?

    加入一个筛选条件即可。

    示例如下

    Test::class.java.field {
         name = "TAG"
    -    type = StringType
    +    type = StringClass
         // 标识查找的这个变量需要是静态
         modifiers { isStatic }
     }.get().string() // Field 的类型是字符串,可直接进行 cast
    @@ -456,7 +464,7 @@
         // 标识查找的这个方法需要是静态
         modifiers { isStatic }
     }.get().call()
    -

    小提示

    使用 modifiers { ... } 创建一个条件方法体,此时你就可以在 ModifierRules 中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 ModifierRules

    混淆的字节码

    你可能已经注意到了,这里给出的示例 Class 中有两个混淆的变量名称,它们都是 a,这个时候我们要怎么得到它们呢?

    有两种方案。

    第一种方案,确定变量的名称和类型。

    示例如下

    // 假设这就是这个 Class 的实例
    +

    小提示

    使用 modifiers { ... } 创建一个条件方法体,此时你就可以在 ModifierRules 中自由使用其中的功能。

    方法体末尾条件需要返回一个 Boolean,即最终的条件判断结果。

    更多功能请参考 FieldFinder.modifiersMethodFinder.modifiersConstructorFinder.modifiers 方法以及 ModifierRules

    混淆的字节码

    你可能已经注意到了,这里给出的示例 Class 中有两个混淆的变量名称,它们都是 a,这个时候我们要怎么得到它们呢?

    有两种方案。

    第一种方案,确定变量的名称和类型。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.field {
    @@ -474,13 +482,13 @@
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
         name = "b"
    -    param(StringType)
    +    param(StringClass)
     }.get(instance).call("test_string") // 得到名称为 b 方法参数为 [String] 的方法
     

    第二种方案,确定方法的参数所在的位置。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
     // 使用 YukiHookAPI 调用并执行
     Test::class.java.method {
    -    param(StringType).index().first()
    +    param(StringClass).index().first()
     }.get(instance).call("test_string") // 得到第一个方法参数为 [String] 的方法
     

    由于观察到这个方法在 Class 的最后一个,那我们还有一个备选方案。

    示例如下

    // 假设这就是这个 Class 的实例
     val instance = Test()
    @@ -495,7 +503,7 @@
         // 执行 doTask 方法
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
         // 执行 stop 方法
         method {
    @@ -512,7 +520,7 @@
         // 执行父类的 doBaseTask 方法
         superClass().method {
             name = "doBaseTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    如果你不喜欢使用一个大括号的调用域来创建当前实例的命名空间,你可以直接使用 current() 方法。

    示例如下

    // 假设这就是这个 Class 的实例,这个 Class 是不能被直接得到的
    @@ -522,7 +530,7 @@
         .current()
         .method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     // 执行 stop 方法
     instance
    @@ -539,7 +547,7 @@
     instance.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }.current()
         .method {
    @@ -558,7 +566,7 @@
         }.current {
             method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }.call("task_name")
         }
         // <方案2>
    @@ -567,7 +575,7 @@
         }.current()
             ?.method {
                 name = "doBaseTask"
    -            param(StringType)
    +            param(StringClass)
             }?.call("task_name")
     }
     

    注意

    上述 current 方法相当于帮你调用了 CurrentClass 中的 field { ... }.any()?.current() 方法。

    若不存在 CurrentClass 调用域,你需要使用 field { ... }.get(instance).current() 来进行调用。

    问题又来了,我想使用反射的方式创建如下的实例并调用其中的方法,该怎么做呢?

    示例如下

    Test(true).doTask("task_name")
    @@ -584,7 +592,7 @@
     

    但是感觉这种做法好麻烦,有没有更简洁的调用方法呢?

    这个时候,我们还可以借助 buildOf 方法来创建一个实例。

    示例如下

    "com.demo.Test".toClass().buildOf(true) { param(BooleanType) }?.current {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.call("task_name")
     }
     

    若你希望 buildOf 方法返回当前实例的类型,你可以在其中加入类型泛型声明,而无需使用 ascast 目标类型。

    这种情况多用于实例本身的构造方法是私有的,但是里面的方法是公有的,这样我们只需要对其构造方法进行反射创建即可。

    示例如下

    // 假设这个 Class 是能够直接被得到的
    @@ -601,7 +609,7 @@
             method {
                 name = "getString"
                 emptyParam()
    -            returnType = StringType
    +            returnType = StringClass
             }
             replaceTo("Hooked")
         }
    @@ -610,13 +618,13 @@
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().string()
     

    如果我们想得到这个方法未经 Hook 的原始方法及结果,只需要在结果中加入 original 即可。

    示例如下

    // result 的结果会是 "Original"
     val result = Test::class.java.method {
         name = "getString"
         emptyParam()
    -    returnType = StringType
    +    returnType = StringClass
     }.get().original().string()
     

    小提示

    更多功能请参考 MethodFinder.Result.original 方法。

    再次查找

    假设有三个不同版本的 Class,它们都是这个宿主不同版本相同的 Class

    这里面同样都有一个方法 doTask,假设它们的功能是一样的。

    版本 A 示例如下

    public class Test {
     
    @@ -645,13 +653,13 @@
     }.remedys {
         method {
             name = "doTask"
    -        param(StringType)
    +        param(StringClass)
         }.onFind {
             // 可在这里实现找到的逻辑
         }
         method {
             name = "doTask"
    -        param(StringType, IntType)
    +        param(StringClass, IntType)
         }.onFind {
             // 可在这里实现找到的逻辑
         }
    @@ -785,7 +793,7 @@
         name = "test"
         param(BooleanType).index(num = 2)
         // ❗错误的使用方法,请仅保留一个 index 方法
    -    returnType(StringType).index(num = 1)
    +    returnType(StringClass).index(num = 1)
     }
     

    以下查找条件的使用是没有任何问题的。

    示例如下

    method {
         name = "test"
    @@ -828,17 +836,17 @@
     }.get().boolean().toString() // ✅ 正确的使用方法,得到类型后再进行转换
     

    常用类型扩展

    在查找方法、变量的时候我们通常需要指定所查找的类型。

    示例如下

    field {
         name = "test"
    -    type = Boolean::class.java
    +    type = Boolean::class.javaPrimitiveType
     }
    -

    Kotlin 中表达出 Boolean::class.java 这个类型的写法很长,感觉并不方便。

    因此,YukiHookAPI 为开发者封装了常见的类型调用,其中包含了 Android 的基本类型和 Java 的基本类型。

    这个时候上面的类型就可以写作如下形式了。

    示例如下

    field {
    +

    Kotlin 中表达出 Boolean::class.javaPrimitiveType 这个类型的写法很长,感觉并不方便。

    因此,YukiHookAPI 为开发者封装了常见的类型调用,其中包含了 Android 的相关类型和 Java 的常见类型与原始类型关键字

    这个时候上面的类型就可以写作如下形式了。

    示例如下

    field {
         name = "test"
         type = BooleanType
     }
    -

    在 Java 中常见的基本类型都已被封装为 类型 + Type 的方式,例如 IntTypeFloatType

    相应地,数组类型也有方便的使用方法,假设我们要获得 String[] 类型的数组。

    需要写做 java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass 才能得到这个类型。

    感觉是不是很麻烦,这个时候我们可以使用扩展方法 ArrayClass(StringType) 来得到这个类型。

    同时由于 String 是常见类型,所以还可以直接使用 StringArrayClass 来得到这个类型。

    一些常见的 Hook 中查找的方法,都有其对应的封装类型以供使用,格式为 类型 + Class

    例如 Hook onCreate 方法需要查找 Bundle::class.java 类型。

    示例如下

    method {
    +

    在 Java 常见类型中的原始类型 (或基本类型) 关键字都已被封装为 类型 + Type 的方式,例如 IntTypeFloatType (它们的字节码类型为 intfloat)。

    相应地,数组类型也有方便的使用方法,假设我们要获得 String[] 类型的数组。

    需要写做 java.lang.reflect.Array.newInstance(String::class.java, 0).javaClass 才能得到这个类型。

    感觉是不是很麻烦,这个时候我们可以使用方法 ArrayClass(StringClass) 来得到这个类型。

    同时由于 String 是常见类型,所以还可以直接使用 StringArrayClass 来得到这个类型。

    一些常见的 Hook 中查找的方法,都有其对应的封装类型以供使用,格式为 类型 + Class

    例如 Hook onCreate 方法需要查找 Bundle::class.java 类型。

    示例如下

    method {
         name = "onCreate"
         param(BundleClass)
     }
    -

    同时,欢迎你能贡献更多的常用类型。

    - +

    以下是 Java 中一些特例类型在 YukiHookAPI 中的封装名称。

    • voidUnitType

    • java.lang.VoidUnitClass

    • java.lang.ObjectAnyClass

    • java.lang.IntegerIntClass

    • java.lang.CharacterCharClass

    注意

    类型 + Type 封装类型会且仅会表示为 Java 原始类型关键字,由于 Kotlin 中不存在原始类型这个概念,所以它们都会被定义为 KClass

    Java 中共有 9 个原始类型关键字,其中 8 个为原始类型,分别为 booleancharbyteshortintfloatlongdouble,其中 void 类型是一个特例。

    同时它们都有 Java 自身对应的封装类型,例如 java.lang.Booleanjava.lang.Integer,这些类型是不相等的,请注意区分。

    同样地,数组也有对应的封装类型,它们也需要与 Java 原始类型关键字 进行区分。

    例如 byte[] 的封装类型为 ByteArrayTypeArrayClass(ByteType),而 Byte[] 的封装类型为 ByteArrayClassArrayClass(ByteClass),这些类型也是不相等的

    同时,欢迎你能贡献更多的常用类型。

    + diff --git a/docs/zh-cn/api/special-features/xposed-channel.html b/docs/zh-cn/api/special-features/xposed-channel.html index d24f67b72..2027a6041 100644 --- a/docs/zh-cn/api/special-features/xposed-channel.html +++ b/docs/zh-cn/api/special-features/xposed-channel.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Xposed 模块与宿主通讯桥 | Yuki Hook API - + Xposed 模块与宿主通讯桥 | Yuki Hook API + -

    Xposed 模块与宿主通讯桥

    这是一个使用系统无序广播在模块与宿主之间发送和接收数据的解决方案。

    需要满足的条件

    模块与宿主需要保持存活状态,否则无法建立通讯。

    基本用法

    这里描述了 waitput 方法的基本使用方法。

    通过使用 dataChannel 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。

    模块示例如下

    // 从指定包名的宿主获取
    +    

    Xposed 模块与宿主通讯桥

    这是一个使用系统无序广播在模块与宿主之间发送和接收数据的解决方案。

    需要满足的条件

    模块与宿主需要保持存活状态,否则无法建立通讯。

    基本用法

    这里描述了 waitput 方法的基本使用方法。

    通过使用 dataChannel 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。

    模块示例如下

    // 从指定包名的宿主获取
     dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
         // Your code here.
     }
    @@ -59,20 +59,24 @@
     dataChannel.checkingVersionEquals { isEquals ->
         // Your code here.
     }
    -

    方法回调的条件

    宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。

    小提示

    更多功能请参考 YukiHookDataChannel

    回调事件响应的规则

    这里只列出了在模块中使用的例子,在宿主中相同的 key 始终不允许重复创建。

    特别注意

    在模块和宿主中,每一个 dataChannel 对应的 key 的回调事件都不允许重复创建,若重复,之前的回调事件会被新增加的回调事件替换,若在模块中使用,在同一个 Activity 中不可以重复,不同的 Activity 中相同的 key 允许重复。

    示例如下

    class MainActivity : AppCompatActivity() {
    +

    方法回调的条件

    宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。

    小提示

    更多功能请参考 YukiHookDataChannel

    回调事件响应的规则

    这里只列出了在模块中使用的例子,在同一个宿主中相同的 key 始终不允许重复创建,但不同的宿主中允许存在相同的 key

    特别注意

    在模块和宿主中,每一个 dataChannel 对应的 key 的回调事件都不允许重复创建,若重复,之前的回调事件会被新增加的回调事件替换,若在模块中使用,在同一个 Activity 中不可以重复,不同的 Activity 中相同的 key 允许重复。

    示例如下

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             // 回调事件 A
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
                 // Your code here.
             }
             // 回调事件 B
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
                 // Your code here.
             }
             // 回调事件 C
    -        dataChannel(packageName = "com.example.demo").wait(key = "other_test_key") {
    +        dataChannel(packageName = "com.example.demo1").wait(key = "other_test_key") {
    +            // Your code here.
    +        }
    +        // 回调事件 D
    +        dataChannel(packageName = "com.example.demo2").wait(key = "other_test_key") {
                 // Your code here.
             }
         }
    @@ -82,13 +86,65 @@
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    -        // 回调事件 D
    -        dataChannel(packageName = "com.example.demo").wait(key = "test_key") {
    +        // 回调事件 E
    +        dataChannel(packageName = "com.example.demo1").wait(key = "test_key") {
    +            // Your code here.
    +        }
    +        // 回调事件 F
    +        dataChannel(packageName = "com.example.demo2").wait(key = "test_key") {
                 // Your code here.
             }
         }
     }
    -

    在上述示例中,回调事件 A 会被回调事件 B 替换掉,回调事件 C 的 key 不与其它重复,回调事件 D 在另一个 Activity 中,所以最终回调事件 B、C、D 都可被创建成功。

    特别注意

    一个相同 key 的回调事件只会回调当前模块正在显示的 Activity 中注册的回调事件,例如上述中的 test_key,如果 OtherActivity 正在显示,那么 MainActivity 中的 test_key 就不会被回调。

    相同的 key 在同一个 Activity 不同的 Fragment 中注册 dataChannel,它们依然会在当前 Activity 中同时被回调。

    在模块中,你只能使用 ActivityContext 注册 dataChannel,你不能在 Application 以及 Service 等地方使用 dataChannel

    若要在 Fragment 中使用 dataChannel,请使用 activity?.dataChannel(...)

    安全性说明

    在模块环境中,你只能接收指定包名的宿主发送的通讯数据且只能发送给指定包名的宿主

    特别注意

    为了进一步防止广播滥用,通讯数据中 API 会自动指定宿主和模块的包名,防止其它 APP 监听并利用广播做出超限行为。

    - +

    在上述示例中,虽然回调事件 A 与 B 是同一个宿主中的回调事件,但是它们的 key 相同,所以回调事件 A 会被回调事件 B 替换掉。

    回调事件 C 的 key 不与其它重复,虽然回调事件 D 的 key 与回调事件 C 相同,但是它们的宿主不同,所以可以同时存在。

    回调事件 E 在另一个 Activity 中,回调事件 F 与回调事件 E 的 key 虽然相同,但它们也不是同一个宿主,所以可以同时存在。

    综上所述,最终回调事件 B、C、D、E、F 都可被创建成功。

    兼容性说明

    在过往历史版本的 API 中不同的宿主设置相同的 key 会造成只有最后一个事件回调,但是最新版本更正了这一问题,请确保你使用的是最新的 API 版本。

    特别注意

    一个相同 key 的回调事件只会回调当前模块正在显示的 Activity 中注册的回调事件,例如上述中的 test_key,如果 OtherActivity 正在显示,那么 MainActivity 中的 test_key 就不会被回调。

    相同的 key 在同一个 Activity 不同的 Fragment 中注册 dataChannel,它们依然会在当前 Activity 中同时被回调。

    在模块中,你只能使用 ActivityContext 注册 dataChannel,你不能在 Application 以及 Service 等地方使用 dataChannel

    若要在 Fragment 中使用 dataChannel,请使用 activity?.dataChannel(...)

    如果你希望在同一个 Activity 中手动设置每个回调事件的响应优先级 (条件),你可以使用 ChannelPriority

    例如,你正在使用一个 Activity 绑定多个 Fragment 的情况,这将能够解决这个问题。

    示例如下

    open class BaseFragment : Fragment() {
    +
    +    /** 标识当前 Fragment 处于 onResume 生命周期 */
    +    var isResume = false
    +
    +    override fun onResume() {
    +        super.onResume()
    +        isResume = true
    +    }
    +
    +    override fun onPause() {
    +        super.onPause()
    +        isResume = false
    +    }
    +
    +    override fun onStop() {
    +        super.onStop()
    +        isResume = false
    +    }
    +}
    +
    +class FragmentA : BaseFragment() {
    +
    +    // 省略部分装载代码
    +    // ...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // 使用自定义的 isResume 结合 isVisible 条件判断当前 Fragment 正处于显示状态
    +        activity?.dataChannel(packageName = "com.example.demo1")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +
    +class FragmentB : BaseFragment() {
    +
    +    // 省略部分装载代码
    +    // ...
    +
    +    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    +        // 使用自定义的 isResume 结合 isVisible 条件判断当前 Fragment 正处于显示状态
    +        activity?.dataChannel(packageName = "com.example.demo2")
    +            ?.wait(key = "test_key", ChannelPriority { isResume && isVisible }) {
    +                // Your code here.
    +            }
    +    }
    +}
    +

    安全性说明

    在模块环境中,你只能接收指定包名的宿主发送的通讯数据且只能发送给指定包名的宿主,系统框架除外。

    特别注意

    为了进一步防止广播滥用,通讯数据中 API 会自动指定宿主和模块的包名,防止其它 APP 监听并利用广播做出超限行为。

    + diff --git a/docs/zh-cn/api/special-features/xposed-storage.html b/docs/zh-cn/api/special-features/xposed-storage.html index d4584e03b..0ef3e1035 100644 --- a/docs/zh-cn/api/special-features/xposed-storage.html +++ b/docs/zh-cn/api/special-features/xposed-storage.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - Xposed 模块数据存储 | Yuki Hook API - + Xposed 模块数据存储 | Yuki Hook API + -

    Xposed 模块数据存储

    这是一个自动对接 SharedPreferencesXSharedPreferences 的高效模块数据存储解决方案。

    我们需要存储模块的数据,以供宿主调用,这个时候会遇到原生 Sp 存储的数据互通阻碍。

    原生的 Xposed 给我们提供了一个 XSharedPreferences 用于读取模块的 Sp 数据。

    在 Activity 中使用

    这里描述了在 Activity 中装载 YukiHookModulePrefs 的场景。

    通常情况下我们可以这样在 Hook APP (宿主) 内对其进行初始化。

    示例如下

    XSharedPreferences(BuildConfig.APPLICATION_ID)
    +    

    Xposed 模块数据存储

    这是一个自动对接 SharedPreferencesXSharedPreferences 的高效模块数据存储解决方案。

    我们需要存储模块的数据,以供宿主调用,这个时候会遇到原生 Sp 存储的数据互通阻碍。

    原生的 Xposed 给我们提供了一个 XSharedPreferences 用于读取模块的 Sp 数据。

    在 Activity 中使用

    这里描述了在 Activity 中装载 YukiHookModulePrefs 的场景。

    通常情况下我们可以这样在 Hook APP (宿主) 内对其进行初始化。

    示例如下

    XSharedPreferences(BuildConfig.APPLICATION_ID)
     

    有没有方便快捷的解决方案呢,此时你就可以使用 YukiHookAPI 的扩展能力快速实现这个功能。

    当你在模块中存储数据的时候,若当前处于 Activity 内,可以使用如下方法。

    示例如下

    modulePrefs.putString("test_name", "saved_value")
     

    当你在 Hook APP (宿主) 中读取数据时,可以使用如下方法。

    示例如下

    val testName = prefs.getString("test_name", "default_value")
     

    你不需要考虑传入模块的包名以及一系列复杂的权限配置,一切都交给 YukiHookModulePrefs 来处理。

    若要实现存储的区域划分,你可以指定每个 prefs 文件的名称。

    在模块的 Activity 中这样使用。

    示例如下

    // 推荐用法
    @@ -39,6 +39,6 @@
     // 也可以这样用
     val testName = prefs.name("specify_file_name").getString("test_name", "default_value")
     

    若你的项目中有大量的固定数据需要存储和读取,推荐使用 PrefsData 来创建模板。

    小提示

    更多功能请参考 YukiHookModulePrefsPrefsData

    在 PreferenceFragment 中使用

    这里描述了在 PreferenceFragment 中装载 YukiHookModulePrefs 的场景。

    若你的模块使用了 PreferenceFragmentCompat,你现在可以将其继承类开始迁移到 ModulePreferenceFragment

    特别注意

    你必须继承 ModulePreferenceFragment 才能实现 YukiHookModulePrefs 的模块存储功能。

    小提示

    更多功能请参考 ModulePreferenceFragment

    - + diff --git a/docs/zh-cn/config/api-example.html b/docs/zh-cn/config/api-example.html index 8f64feb46..f88679b71 100644 --- a/docs/zh-cn/config/api-example.html +++ b/docs/zh-cn/config/api-example.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - API 基本配置 | Yuki Hook API - + API 基本配置 | Yuki Hook API + -

    API 基本配置

    这里介绍了 YukiHookAPI 的基本配置方法。

    功能配置

    无论是 作为 Xposed 模块使用 还是 作为 Hook API 使用,你都可以在 API 装载之前或装载过程中对 YukiHookAPI 进行配置。

    configs 方法

    fun configs(initiate: Configs.() -> Unit)
    +    

    API 基本配置

    这里介绍了 YukiHookAPI 的基本配置方法。

    功能配置

    无论是 作为 Xposed 模块使用 还是 作为 Hook API 使用,你都可以在 API 装载之前或装载过程中对 YukiHookAPI 进行配置。

    configs 方法

    fun configs(initiate: Configs.() -> Unit)
     

    configs 方法对 Configs 类实现了一个 lambda 方法体,你可以轻松地调用它进行配置。

    小提示

    更多功能请参考 YukiHookAPI.configs 方法。

    Hooker 配置

    一个 Xposed 模块或 Hook API 最重要的地方就是 Hooker 的创建与使用,YukiHookAPI 提供了两种使用方法。

    通过 lambda 创建

    这种方案是最简单的,如果你的模块功能不多,代码数量不大,不需要进行分类处理,推荐使用这种方式进行创建。

    encase 方法

    fun encase(initiate: PackageParam.() -> Unit)
     

    encase 方法是 Hook 一切生命的开始,在一个模块或一个 Hook 过程中,encase 方法只能作用一次,用于创建 Hooker。

    PackageParam 为宿主(目标 APP)的重要实例对象,通过 PackageParam 来实现对当前 Hook 作用对象的全部 Hook 操作。

    小提示

    更多功能请参考 PackageParam

    encase 方法可以在 onHook 方法中使用两种方案创建。

    示例代码 1

    YukiHookAPI.encase {
         loadApp(name = "com.example.demo") {
    @@ -207,6 +207,6 @@
     

    作为 Hook API 使用需要注意的地方

    若你作为 Hook API 使用,那么你只需要在入口处对 encase 方法进行区分。

    注意

    encase 方法对作为 Hook API 使用提供了两个完全一样的方法,但是比前两者仅多出一个参数 baseContext

    方法 1

    fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
     

    方法 2

    fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
     

    此处的 baseContext 只需填入你在 attachBaseContext 处得到的 Context 即可,其它用法与上述内容完全一致。

    特别注意

    切勿以 Xposed 方式使用 encase 方法而漏掉 baseContext 参数,否则你的 Hook 将完全不工作。

    Resources Hook 功能不支持作为 Hook API 使用。

    - + diff --git a/docs/zh-cn/config/api-exception.html b/docs/zh-cn/config/api-exception.html index ef10dea42..ce5ddd7ba 100644 --- a/docs/zh-cn/config/api-exception.html +++ b/docs/zh-cn/config/api-exception.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - API 异常处理 | Yuki Hook API - + API 异常处理 | Yuki Hook API + -

    API 异常处理

    异常是在开发过程经常遇到的主要问题,这里介绍了 YukiHookAPI 在使用过程中可能遇到的常见异常以及处理方式。

    这里的异常说明只会同步最新的 API 版本,较旧的 API 版本的异常将不会再进行说明,请始终保持 API 版本为最新。

    非阻断异常

    这些异常不会导致 APP 停止运行(FC),但是会在控制台打印 E 级别的日志,也可能会停止继续执行相关功能。

    exception

    loggerE

    Could not found XposedBridge in current space! Aborted

    异常原因

    你的 Hook Framework 未在工作或并未成功装载 XposedBridge

    解决方案

    请确认你在正确的地方装载了 YukiHookAPIencase 方法,详情请参考 作为 Xposed 模块使用的相关配置 以及 作为 Hook API 使用的相关配置

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    异常原因

    你尝试在继承 IYukiHookXposedInit 的 Hook 入口类的 onInitonXposedEvent 方法中装载了 encase 方法。

    示例如下

    class HookEntry : IYukiHookXposedInit {
    +    

    API 异常处理

    异常是在开发过程经常遇到的主要问题,这里介绍了 YukiHookAPI 在使用过程中可能遇到的常见异常以及处理方式。

    这里的异常说明只会同步最新的 API 版本,较旧的 API 版本的异常将不会再进行说明,请始终保持 API 版本为最新。

    非阻断异常

    这些异常不会导致 APP 停止运行(FC),但是会在控制台打印 E 级别的日志,也可能会停止继续执行相关功能。

    exception

    loggerE

    Could not found any available Hook APIs in current environment! Aborted

    异常原因

    你的 Hook Framework 未在工作或并未成功装载当前 Hook API。

    解决方案

    请确认你在正确的地方装载了 YukiHookAPIencase 方法,详情请参考 作为 Xposed 模块使用的相关配置 以及 作为 Hook API 使用的相关配置

    exception

    loggerE

    You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

    异常原因

    你尝试在继承 IYukiHookXposedInit 的 Hook 入口类的 onInitonXposedEvent 方法中装载了 encase 方法。

    示例如下

    class HookEntry : IYukiHookXposedInit {
     
         override fun onInit() {
             // ❗错误的使用方法
    @@ -63,7 +63,7 @@
             }
         }
     }
    -
    exception

    loggerE

    Hooking Process exception occurred

    异常原因

    YukiHookAPI 在进行自身初始化 Hook 过程中发生异常。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,可直接提交日志进行反馈。

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    异常原因

    YukiHookAPI 在尝试装载 Hook 入口类 onInitonHook 方法时发生了不能处理的异常或找不到入口类。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    loggerE

    YukiHookAPI bind initZygote failed

    异常原因

    YukiHookAPI 在尝试装载 Xposed 原生接口 initZygote 方法时发生了不能处理的异常。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    异常原因

    YukiHookAPI 在尝试进行 Resources Hook 时发生错误。

    解决方案

    请仔细检查错误日志的详细信息。

    若发生 Resources$NotFoundException 则可能为你查找的 Resources Id 不正确。

    若发生 ClassNotFoundNoClassDefFoundError 可能是 Hook Framework 不支持 Resources Hook(资源钩子)。

    exception

    loggerE

    HookClass [NAME] not found

    异常原因

    当前被 Hook 的 Class 没有被找到。

    解决方案

    请检查目标 Class 是否存在,若想忽略此错误请使用 ignoredHookClassNotFoundFailure 方法。

    exception

    loggerE

    Hook Member [NAME] failed

    异常原因

    Hook 目标方法、构造方法时发生错误。

    解决方案

    此问题通常由 Hook Framework 产生,请检查对应的日志内容,若问题持续出现请携带详细日志进行反馈。

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    异常原因

    在 Hook 执行后被 Hook 的 membernull 且已经设置目标 Hook 方法、构造类。

    解决方案

    请检查此错误发生前的上一个错误日志,或许在查找方法、构造方法的时候发生了找不到方法、构造方法的错误。

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    异常原因

    在 Hook 执行后被 Hook 的 membernull 且没有设置目标 Hook 方法、构造类。

    示例如下

    injectMember {
    +
    exception

    loggerE

    An exception occurred in the Hooking Process of YukiHookAPI

    异常原因

    YukiHookAPI 在装载 Xposed 入口方法时发生异常。

    解决方案

    这是一个异常汇总,如果你当前的 Hook 进程中发生了任何异常 (Hook 进程崩溃),都会使用此方式打印到控制台,请追溯异常发生的堆栈以定位你的代码问题位置。

    exception

    loggerE

    An exception occurred when hooking internal function

    异常原因

    YukiHookAPI 在进行自身初始化 Hook 过程中发生异常。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,可直接提交日志进行反馈。

    exception

    loggerE

    YukiHookAPI try to load HookEntryClass failed

    异常原因

    YukiHookAPI 在尝试装载 Hook 入口类 onInitonHook 方法时发生了不能处理的异常或找不到入口类。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    loggerE

    An exception occurred when YukiHookAPI loading Xposed Module

    异常原因

    YukiHookAPI 在尝试使用 Xposed 原生接口装载 Xposed 模块时发生了不能处理的异常。

    解决方案

    通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    loggerE

    Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

    异常原因

    YukiHookAPI 在尝试进行 Resources Hook 时发生错误。

    解决方案

    请仔细检查错误日志的详细信息。

    若发生 Resources$NotFoundException 则可能为你查找的 Resources Id 不正确。

    若发生 ClassNotFoundNoClassDefFoundError 可能是 Hook Framework 不支持 Resources Hook(资源钩子)。

    exception

    loggerE

    HookClass [NAME] not found

    异常原因

    当前被 Hook 的 Class 没有被找到。

    解决方案

    请检查目标 Class 是否存在,若想忽略此错误请使用 ignoredHookClassNotFoundFailure 方法。

    exception

    loggerE

    Hook Member [NAME] failed

    异常原因

    Hook 目标方法、构造方法时发生错误。

    解决方案

    此问题通常由 Hook Framework 产生,请检查对应的日志内容,若问题持续出现请携带详细日志进行反馈。

    exception

    loggerE

    Hooked Member with a finding error by CLASS

    异常原因

    在 Hook 执行后被 Hook 的 membernull 且已经设置目标 Hook 方法、构造类。

    解决方案

    请检查此错误发生前的上一个错误日志,或许在查找方法、构造方法的时候发生了找不到方法、构造方法的错误。

    exception

    loggerE

    Hooked Member cannot be non-null by CLASS

    异常原因

    在 Hook 执行后被 Hook 的 membernull 且没有设置目标 Hook 方法、构造类。

    示例如下

    injectMember {
         // 这里并没有设置需要 Hook 的方法、构造方法的查找条件
         afterHook {
             // ...
    @@ -78,7 +78,7 @@
             // ...
         }
     }
    -
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    异常原因

    在 Hook 回调方法体中设置了 HookParam.result 或使用了 replaceHook 但是被 Hook 的方法返回值类型与原返回值类型不匹配。

    示例如下

    假设这个是被 Hook 的方法。

    private boolean test()
    +
    exception

    loggerE

    Hooked method return type match failed, required [TYPE] but got [TYPE]

    异常原因

    在 Hook 回调方法体中设置了 HookParam.result 或使用了 replaceHook 但是被 Hook 的方法返回值类型与原返回值类型不匹配。

    示例如下

    假设这个是被 Hook 的方法。

    private boolean test()
     

    下面是一个错误的案列。

    injectMember {
         method {
             name = "test"
    @@ -95,7 +95,7 @@
         // <情景3> 直接使用了错误的类型,原类型为 Boolean
         replaceTo(any = 0)
     }
    -

    注意

    若上述场景在 beforeHookafterHook 中发生,则会造成被 Hook 的 APP (宿主) 由 XposedBridge 抛出异常 (会对其暴露被 Hook 的事实)。

    解决方案

    请确认当前被 Hook 方法的正确返回值类型,修改后再试一次。

    exception

    loggerE

    Hook initialization failed because got an Exception

    异常原因

    在准备 Hook 时发生了任意的异常。

    解决方案

    这是一个准备 Hook 阶段就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    异常原因

    在 Hook 开始时发生了任意的异常。

    解决方案

    这是一个 Hook 开始就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    异常原因

    在查找方法、构造方法以及变量时设置了不允许的参数类型。

    示例如下

    // 查找一个方法
    +

    注意

    若上述场景在 beforeHookafterHook 中发生,则会造成被 Hook 的 APP (宿主) 由 XposedBridge 抛出异常 (会对其暴露被 Hook 的事实)。

    解决方案

    请确认当前被 Hook 方法的正确返回值类型,修改后再试一次。

    exception

    loggerE

    Hook initialization failed because got an Exception

    异常原因

    在准备 Hook 时发生了任意的异常。

    解决方案

    这是一个准备 Hook 阶段就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

    exception

    loggerE

    Try to hook NAME[NAME] got an Exception

    异常原因

    在 Hook 开始时发生了任意的异常。

    解决方案

    这是一个 Hook 开始就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

    exception

    loggerE

    Method/Constructor/Field match type "TYPE" not allowed

    异常原因

    在查找方法、构造方法以及变量时设置了不允许的参数类型。

    示例如下

    // 查找一个方法
     method {
         // ❗设置了无效的类型举例
         param(false, 1, 0)
    @@ -123,40 +123,40 @@
         // ✅ 正确的使用方法举例
         type = BooleanType
     }
    -
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    异常原因

    在查找方法、构造方法以及变量时并未找到目标方法、构造方法以及变量。

    解决方案

    请确认你的查找条件是否能正确匹配到目标 Class 中的指定方法、构造方法以及变量。

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    异常原因

    使用 RemedyPlan 重新查找方法、构造方法、变量时依然没有找到方法、构造方法、变量。

    解决方案

    请确认你设置的 RemedyPlan 参数以及宿主内存在的 Class,再试一次。

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    异常原因

    在查找方法、构造方法以及变量时并未设置任何条件。

    示例如下

    method {
    +
    exception

    loggerE

    NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

    异常原因

    在查找方法、构造方法以及变量时并未找到目标方法、构造方法以及变量。

    解决方案

    请确认你的查找条件是否能正确匹配到目标 Class 中的指定方法、构造方法以及变量。

    exception

    loggerE

    Trying COUNT times and all failure by RemedyPlan

    异常原因

    使用 RemedyPlan 重新查找方法、构造方法、变量时依然没有找到方法、构造方法、变量。

    解决方案

    请确认你设置的 RemedyPlan 参数以及宿主内存在的 Class,再试一次。

    exception

    loggerE

    You must set a condition when finding a Method/Constructor/Field

    异常原因

    在查找方法、构造方法以及变量时并未设置任何条件。

    示例如下

    method {
         // 这里没有设置任何条件
     }
    -

    解决方案

    请将查找条件补充完整并再试一次。

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过 ClassLoader.searchClassPackageParam.searchClass 找不到需要查找的 Class 对象。

    示例如下

    customClassLoader?.searchClass {
    +

    解决方案

    请将查找条件补充完整并再试一次。

    exception

    loggerE

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过 ClassLoader.searchClassPackageParam.searchClass 找不到需要查找的 Class 对象。

    示例如下

    customClassLoader?.searchClass {
         from(...)
         // ...
     }.get()
    -

    解决方案

    这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Dex 中的 Class 以及字节码对象特征,并再试一次。

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过指定条件找不到需要查找的方法、构造方法以及变量。

    示例如下

    TargetClass.method {
    +

    解决方案

    这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Dex 中的 Class 以及字节码对象特征,并再试一次。

    exception

    loggerE

    Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过指定条件找不到需要查找的方法、构造方法以及变量。

    示例如下

    TargetClass.method {
         name = "test"
         param(BooleanType)
     }
    -

    解决方案

    这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Class 中的字节码对象特征,并再试一次。

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    异常原因

    MethodConstructor 查找条件中错误地使用了 VagueType

    示例如下

    TargetClass.method {
    +

    解决方案

    这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Class 中的字节码对象特征,并再试一次。

    exception

    loggerE

    The number of VagueType must be at least less than the count of paramTypes

    异常原因

    MethodConstructor 查找条件中错误地使用了 VagueType

    示例如下

    TargetClass.method {
         name = "test"
         // <情景1>
         param(VagueType)
         // <情景2>
         param(VagueType, VagueType ...)
     }
    -

    解决方案

    VagueType 不能在方法、构造方法参数中完全填充,若存在这样的需求请使用 paramCount

    exception

    loggerE

    Field match type class is not found

    异常原因

    在查找变量时所设置的查找条件中 typeClass 实例未被找到。

    示例如下

    field {
    +

    解决方案

    VagueType 不能在方法、构造方法参数中完全填充,若存在这样的需求请使用 paramCount

    exception

    loggerE

    Field match type class is not found

    异常原因

    在查找变量时所设置的查找条件中 typeClass 实例未被找到。

    示例如下

    field {
         name = "test"
         // 假设这里设置的 type 的 Class 并不存在
         type = "com.example.TestClass"
     }
    -

    解决方案

    请检查查找条件中 typeClass 是否存在,然后再试一次。

    exception

    loggerE

    Method match returnType class is not found

    异常原因

    在查找方法时所设置的查找条件中 returnTypeClass 实例未被找到。

    示例如下

    method {
    +

    解决方案

    请检查查找条件中 typeClass 是否存在,然后再试一次。

    exception

    loggerE

    Method match returnType class is not found

    异常原因

    在查找方法时所设置的查找条件中 returnTypeClass 实例未被找到。

    示例如下

    method {
         name = "test"
         // 假设这里设置的 returnType 的 Class 并不存在
         returnType = "com.example.TestClass"
     }
    -

    解决方案

    请检查查找条件中 returnTypeClass 是否存在,然后再试一次。

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    异常原因

    在查找方法、构造方法时所设置的查找条件中 paramindex 号下标的 Class 实例未被找到。

    method {
    +

    解决方案

    请检查查找条件中 returnTypeClass 是否存在,然后再试一次。

    exception

    loggerE

    Method/Constructor match paramType[INDEX] class is not found

    异常原因

    在查找方法、构造方法时所设置的查找条件中 paramindex 号下标的 Class 实例未被找到。

    method {
         name = "test"
         // 假设这里设置的 1 号下标的 Class 并不存在
    -    param(StringType, "com.example.TestClass", BooleanType)
    +    param(StringClass, "com.example.TestClass", BooleanType)
     }
    -

    解决方案

    请检查查找条件中 paramindex 号下标的 Class 是否存在,然后再试一次。

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    异常原因

    在查找 Resources 时并未设置任何条件。

    示例如下

    // 情况 1
    +

    解决方案

    请检查查找条件中 paramindex 号下标的 Class 是否存在,然后再试一次。

    exception

    loggerE

    Invoke original Member [MEMBER] failed

    异常原因

    在使用 HookParam.callOriginalHookParam.invokeOriginalmethod { ... }.get(...).original() 调用未经 Hook 的原始方法时发生错误。

    解决方案

    一般情况下,此错误基本上不会发生,若发生此错误,可能为当前使用的 Hook Framework 问题,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Resources Hook condition name/type cannot be empty [TAG]

    异常原因

    在查找 Resources 时并未设置任何条件。

    示例如下

    // 情况 1
     conditions {
         // 这里没有设置任何条件
     }
    @@ -165,12 +165,12 @@
         name = "test"
         // 这里缺少了 type 条件
     }
    -

    解决方案

    Resources 的 Hook 并非类似方法的 Hook,其必须拥有完整的名称和类型描述才能查找成功,请将查找条件补充完整并再试一次。

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    异常原因

    在 Hook Resources 时发生了类型错误的异常。

    解决方案

    YukiHookAPI 会尝试在 initZygotehandleInitPackageResources 中装载 Resources Hook,若全部装载失败可能会发生此异常,当前 Hook Framework 需要支持并启用资源钩子(Resources Hook)功能,请检查后再试一次。

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    异常原因

    在 Hook Resources 时发生了任意的异常。

    解决方案

    这是一个异常汇总,请自行向下查看日志具体的异常是什么,例如找不到 Resources Id 的问题。

    exception

    loggerE

    Received action "ACTION" failed

    异常原因

    使用 YukiHookDataChannel 时回调广播事件异常。

    解决方案

    一般情况下,此错误基本上不会发生,一旦发生错误,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    异常原因

    使用 YukiHookDataChannel 时发送广播取到了空的上下文实例。

    解决方案

    一般情况下,此错误基本上不会发生,在最新版本中已经修复宿主使用时可能发生的问题,若最新版本依然发生错误,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    异常原因

    在 (Xposed) 宿主环境中使用 injectModuleAppResources 注入模块资源时发生异常。

    解决方案

    一般情况下,此错误基本上不会发生,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

    解决方案

    请检查此错误发生后的下一个错误日志,或许在配置参数上可能发生了一些问题,若找不到相关错误日志的说明,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

    解决方案

    一般情况下,此错误基本上不会发生,但根据系统版本差异性并未做详细测试,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时填入了无效的参数。

    示例如下

    // ❗ 这里填入的内容仅为举例,其中 proxy 填入了不能理解的无效参数
    +

    解决方案

    Resources 的 Hook 并非类似方法的 Hook,其必须拥有完整的名称和类型描述才能查找成功,请将查找条件补充完整并再试一次。

    exception

    loggerE

    Resources Hook type is invalid [TAG]

    异常原因

    在 Hook Resources 时发生了类型错误的异常。

    解决方案

    YukiHookAPI 会尝试在 initZygotehandleInitPackageResources 中装载 Resources Hook,若全部装载失败可能会发生此异常,当前 Hook Framework 需要支持并启用资源钩子 (Resources Hook) 功能,请检查后再试一次。

    exception

    loggerE

    Resources Hook got an Exception [TAG]

    异常原因

    在 Hook Resources 时发生了任意的异常。

    解决方案

    这是一个异常汇总,请自行向下查看日志具体的异常是什么,例如找不到 Resources Id 的问题。

    exception

    loggerE

    Received action "ACTION" failed

    异常原因

    使用 YukiHookDataChannel 时回调广播事件异常。

    解决方案

    此异常多为一些关联性异常引发,请检查自身代码是否存在问题,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Received data type TYPE is not a vailed YukiHookDataChannel's data

    异常原因

    使用 YukiHookDataChannel 时回调广播收到了不属于 YukiHookDataChannel 的数据。

    解决方案

    为了确保数据安全性,YukiHookDataChannel 会对发送的数据进行包装,任何第三方广播事件均不能被 YukiHookDataChannel 接收,请检查你的代码是否正确。

    exception

    loggerE

    Unsupported segments data key of "KEY"'s type

    异常原因

    使用 YukiHookDataChannel 时回调广播收到了不支持的分段数据类型。

    解决方案

    一般情况下,此错误不可能发生,因为 YukiHookDataChannel 所支持的分段数据类型是固定的,不会动态改变,若发生这种情况,请检查是否改动了 API 相关代码。

    exception

    loggerE

    YukiHookDataChannel cannot merge this segments data key of "KEY"

    异常原因

    使用 YukiHookDataChannel 时回调广播收到了无法处理的分段数据导致无法合并分段数据。

    解决方案

    一般情况下,此错误基本上不会发生,除非收到连续发送或重复发送的广播 (时序异常) 或在接收数据时设置了错误的泛型类型,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    YukiHookDataChannel cannot calculate the byte size of the data key of "KEY" to be sent, so this data cannot be sent

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    异常原因

    使用 YukiHookDataChannel 发送广播数据时计算数据大小失败。

    解决方案

    一般情况下,此错误基本上不会发生,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    YukiHookDataChannel cannot send this data key of "KEY" type TYPE, because it is too large (total TOTAL KB, limit LIMIT KB) and cannot be segmented

    SUGGESTION_MESSAGE

    If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

    异常原因

    使用 YukiHookDataChannel 发送广播数据时数据过大,但是此数据类型并不支持被分段发送。

    解决方案

    当你发送的数据超出系统广播的上限时,YukiHookDataChannel 默认情况下会将此数据分段后依次发送,但仅支持处理 ListMapSetString 常见类型的自动分段功能。

    小提示

    若你仍要使用此功能,请参考 YukiHookDataChannel.NameSpace.allowSendTooLargeData 方法。

    但是强烈建议不要这样做这有可能会导致系统不允许过大的数据发送而造成应用崩溃

    exception

    loggerE

    Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

    异常原因

    使用 YukiHookDataChannel 时发送广播取到了空的上下文实例。

    解决方案

    一般情况下,此错误基本上不会发生,在最新版本中已经修复宿主使用时可能发生的问题,若最新版本依然发生错误,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Failed to inject module resources into [RESOURCES]

    异常原因

    在 (Xposed) 宿主环境中使用 injectModuleAppResources 注入模块资源时发生异常。

    解决方案

    一般情况下,此错误基本上不会发生,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    You cannot inject module resources into yourself

    异常原因

    在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 injectModuleAppResources 将模块自身的资源注入自身。

    解决方案

    由于模块自身也可以被自身 Hook,但你并不可以在模块自身注入自己 (不能递归自身的资源),若你一定要获取模块自身的资源,请直接使用即可,无需任何其它操作。

    exception

    loggerE

    Activity Proxy initialization failed because got an Exception

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

    解决方案

    请检查此错误发生后的下一个错误日志,或许在配置参数上可能发生了一些问题,若找不到相关错误日志的说明,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    Activity Proxy got an Exception in msg.what [WHAT]

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

    解决方案

    一般情况下,此错误基本上不会发生,但根据系统版本差异性并未做详细测试,排除自身代码的问题后,请携带详细日志进行反馈。

    exception

    loggerE

    This proxy [TYPE] type is not allowed

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时填入了无效的参数。

    示例如下

    // ❗ 这里填入的内容仅为举例,其中 proxy 填入了不能理解的无效参数
     registerModuleAppActivities(proxy = false)
    -

    解决方案

    方法中的 proxy 参数只接受 StringCharSequenceClass 类型,请查看相关使用方法正确填入方法参数。

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时找不到宿主的启动 Activity

    示例如下

    // 使用了默认参数直接进行注册
    +

    解决方案

    方法中的 proxy 参数只接受 StringCharSequenceClass 类型,请查看相关使用方法正确填入方法参数。

    exception

    loggerE

    Cound not got launch intent for package "NAME"

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时找不到宿主的启动 Activity

    示例如下

    // 使用了默认参数直接进行注册
     registerModuleAppActivities()
    -

    解决方案

    默认参数 (无参) 只能用于可被启动的 APP,若 APP 并未声明启动入口 Activity,你就需要手动指定方法的 proxy 参数。

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时无法找到被填入参数 proxyActivity

    示例如下

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    -

    解决方案

    请确认你填入的 Activity 名称真实有效地存在于宿主中,且目标 Class 继承于 Activity

    阻断异常

    这些异常会直接导致 APP 停止运行(FC),同时会在控制台打印 E 级别的日志,还会造成 Hook 进程“死掉”。

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    异常原因

    你使用 YukiHookAPI 的相关反射或 Hook 功能调用了 API 自身的 Class 对象。

    示例如下

    // <情景1>
    +

    解决方案

    默认参数 (无参) 只能用于可被启动的 APP,若 APP 并未声明启动入口 Activity,你就需要手动指定方法的 proxy 参数。

    exception

    loggerE

    Could not found "NAME" or Class is not a type of Activity

    异常原因

    在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时无法找到被填入参数 proxyActivity

    示例如下

    registerModuleAppActivities(proxy = "com.demo.test.TestActivity")
    +

    解决方案

    请确认你填入的 Activity 名称真实有效地存在于宿主中,且目标 Class 继承于 Activity

    exception

    loggerE

    You cannot register Activity Proxy into yourself

    异常原因

    在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 registerModuleAppActivities 将模块自身 Activity 注入自身。

    解决方案

    由于模块自身也可以被自身 Hook,但你并不可以在模块自身注入自己 (不能递归自身的资源),若你一定要获取模块自身的资源,请直接使用即可,无需任何其它操作。

    exception

    loggerE

    Activity Proxy only support for Android 7.0 (API 24) or higher

    异常原因

    在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 registerModuleAppActivities 但是当前系统版本不满足 Android 7.0 (API 24) 最低要求。

    解决方案

    Activity Proxy 仅支持高于或等于 Android 7.0 (API 24) 的系统,请尝试升级你的系统或对模块 APP 最低系统版本兼容性做出要求,例如设置 Min API 为 24。

    exception

    loggerE

    An exception occurred during AppLifecycle event

    异常原因

    在 (Xposed) 宿主环境中使用 onAppLifecycle 监听宿主生命周期期间发生异常。

    解决方案

    此异常为 onAppLifecycle 中抛出,由于你设置了参数 isOnFailureThrowToApp = false,异常没有在宿主中被抛出而是在 (Xposed) 宿主环境中进行打印,这不属于 API 的异常,请仔细检查自身代码的问题。

    阻断异常

    这些异常会直接导致 APP 停止运行(FC),同时会在控制台打印 E 级别的日志,还会造成 Hook 进程“死掉”。

    exception

    IllegalStateException

    YukiHookAPI cannot support current Hook API or cannot found any available Hook APIs in current environment

    异常原因

    YukiHookAPI 不支持当前环境使用的 Hook API 或不存在 Hook API 可被调用。

    解决方案

    请确认你在正确的地方装载了 YukiHookAPIencase 方法,详情请参考 作为 Xposed 模块使用的相关配置 以及 作为 Hook API 使用的相关配置

    exception

    RuntimeException

    !!!DO NOT ALLOWED!!! You cannot hook or reflection to call the internal class of the YukiHookAPI itself, The called class is [CLASS]

    异常原因

    你使用 YukiHookAPI 的相关反射或 Hook 功能调用了 API 自身的 Class 对象。

    示例如下

    // <情景1>
     YukiHookAPI.current()
     // <情景2>
     PackageParam::class.java.hook {
    @@ -179,7 +179,7 @@
     // <情景3>
     MethodFinder::class.java.method {
         name = "name"
    -    param(StringType)
    +    param(StringClass)
     }.get().call("name")
     // ...
     

    解决方案

    请检查代码部分是否有错误,例如下面的情况。

    示例如下

    YourClass.method {
    @@ -190,7 +190,7 @@
         // ...
         // ✅ 正确的使用方法,假设此方法无参
     }.get(instance).call().current()
    -

    不允许内联、反射、Hook YukiHookAPI 自身的 Class 以及内部功能,防止发生错误。

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    异常原因

    你尝试 Hook 了处于危险行为列表中的 Class 对象,例如 ClassClassLoaderMethod

    示例如下

    // <情景1>
    +

    不允许内联、反射、Hook YukiHookAPI 自身的 Class 以及内部功能,防止发生错误。

    exception

    UnsupportedOperationException

    !!!DANGEROUS!!! Hook [CLASS] Class is a dangerous behavior! [CONTENT] [SOLVE]

    异常原因

    你尝试 Hook 了处于危险行为列表中的 Class 对象,例如 ClassClassLoaderMethod

    示例如下

    // <情景1>
     JavaClassLoader.hook {
         // ...
     }
    @@ -203,18 +203,18 @@
         // ...
     }
     // ...
    -

    解决方案

    这些功能是系统内部的,它们不应该被 Hook,在部分 Hook Framework 上可能不被支持,还会引发其它错误,请尝试更换 Hook 点。

    小提示

    若你仍要使用此功能,请参考 YukiMemberHookCreator.useDangerousOperation

    但是强烈建议不要这样做,发生问题请不要反馈,自行承担一切后果

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过 String.toClass(...)classOf<...>() 找不到需要查找的 Class 对象。

    示例如下

    "com.demo.Test".toClass()
    -

    解决方案

    请检查当前字符串或实体匹配到的 Class 是否存在于当前 ClassLoader,并再试一次。

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    异常原因

    使用 ClassLoader.searchClassPackageParam.searchClass 查找 Class 但是当前 ClassLoader 并不继承于 BaseDexClassLoader

    解决方案

    这种情况基本不存在,除非当前 APP 引用了非 ART 平台的可执行文件 (但是这种情况还是不会存在) 或当前 ClassLoader 为空。

    exception

    IllegalStateException

    Failed to got SystemContext

    异常原因

    在被 Hook 的宿主内调用了 systemContext 但并未成功获取到实例对象。

    示例如下

    encase {
    +

    解决方案

    这些功能是系统内部的,它们不应该被 Hook,在部分 Hook Framework 上可能不被支持,还会引发其它错误,请尝试更换 Hook 点。

    小提示

    若你仍要使用此功能,请参考 YukiMemberHookCreator.useDangerousOperation 方法。

    但是强烈建议不要这样做,发生问题请不要反馈,自行承担一切后果

    exception

    NoClassDefFoundError

    Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

    异常原因

    通过 String.toClass(...)classOf<...>() 找不到需要查找的 Class 对象。

    示例如下

    "com.demo.Test".toClass()
    +

    解决方案

    请检查当前字符串或实体匹配到的 Class 是否存在于当前 ClassLoader,并再试一次。

    exception

    IllegalStateException

    ClassLoader [CLASSLOADER] is not a DexClassLoader

    异常原因

    使用 ClassLoader.searchClassPackageParam.searchClass 查找 Class 但是当前 ClassLoader 并不继承于 BaseDexClassLoader

    解决方案

    这种情况基本不存在,除非当前 APP 引用了非 ART 平台的可执行文件 (但是这种情况还是不会存在) 或当前 ClassLoader 为空。

    exception

    IllegalStateException

    Failed to got SystemContext

    异常原因

    在被 Hook 的宿主内调用了 systemContext 但并未成功获取到实例对象。

    示例如下

    encase {
         // 调用了此变量
         systemContext...
     }
    -

    解决方案

    这种情况不应该存在,由于 systemContext 通过反射从 ActivityThread 中得到,除非系统进程发生异常,否则获取到的对象不会为空。

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    异常原因

    第一种情况

    在被 Hook 的宿主内调用了 ModuleApplicationappContext

    示例如下

    encase {
    +

    解决方案

    这种情况不应该存在,由于 systemContext 通过反射从 ActivityThread 中得到,除非系统进程发生异常,否则获取到的对象不会为空。

    exception

    IllegalStateException

    App is dead, You cannot call to appContext

    异常原因

    第一种情况

    在被 Hook 的宿主内调用了 ModuleApplicationappContext

    示例如下

    encase {
         // 调用了此变量
         ModuleApplication.appContext...
     }
     

    第二种情况

    使用 ModuleApplication 时调用了 appContext 但是 APP 可能已经被销毁或没有正确启动。

    示例如下

    // 调用了此变量但是 APP 可能已被销毁或没有正确启动
     ModuleApplication.appContext...
    -

    解决方案

    第一种情况

    你只能在模块内使用 ModuleApplicationappContext,在宿主内请使用 PackageParam 中的 appContext,请确认你使用的是否正确。

    第二种情况

    这种情况基本不存在,由于 appContext 是在 onCreate 中被赋值的,除非遇到多进程并发启动或 APP 没有启动完成前被反射调用了父类的 onCreate 方法。

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    异常原因

    在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookModulePrefs

    示例如下

    class MyApplication : Application() {
    +

    解决方案

    第一种情况

    你只能在模块内使用 ModuleApplicationappContext,在宿主内请使用 PackageParam 中的 appContext,请确认你使用的是否正确。

    第二种情况

    这种情况基本不存在,由于 appContext 是在 onCreate 中被赋值的,除非遇到多进程并发启动或 APP 没有启动完成前被反射调用了父类的 onCreate 方法。

    exception

    IllegalStateException

    YukiHookModulePrefs not allowed in Custom Hook API

    异常原因

    在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookModulePrefs

    示例如下

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -224,11 +224,11 @@
             super.attachBaseContext(base)
         }
     }
    -

    解决方案

    你只能在 作为 Xposed 模块使用 时使用 YukiHookModulePrefs,在 Hook 自身 APP 中请使用原生的 Sp 存储。

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    异常原因

    在 (Xposed) 宿主环境使用了 YukiHookModulePrefs 但是无法得到 XSharedPreferences 对象。

    示例如下

    encase {
    +

    解决方案

    你只能在 作为 Xposed 模块使用 时使用 YukiHookModulePrefs,在 Hook 自身 APP 中请使用原生的 Sp 存储。

    exception

    IllegalStateException

    Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

    异常原因

    在 (Xposed) 宿主环境使用了 YukiHookModulePrefs 但是无法得到 XSharedPreferences 对象。

    示例如下

    encase {
         // 调用了此变量
         prefs...
     }
    -

    解决方案

    一般情况下不会发生此问题,若持续无法获取 XSharedPreferences 对象则可能是你使用的 Hook Framework 不支持此功能或自身存在错误。

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    异常原因

    在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookDataChannel

    示例如下

    class MyApplication : Application() {
    +

    解决方案

    一般情况下不会发生此问题,若持续无法获取 XSharedPreferences 对象则可能是你使用的 Hook Framework 不支持此功能或自身存在错误。

    exception

    IllegalStateException

    YukiHookDataChannel not allowed in Custom Hook API

    异常原因

    在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookDataChannel

    示例如下

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             YukiHookAPI.encase(base) {
    @@ -240,7 +240,7 @@
             super.attachBaseContext(base)
         }
     }
    -

    解决方案

    你只能在 作为 Xposed 模块使用 时使用 YukiHookDataChannel

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    异常原因

    在模块的非 Activity 环境中使用了 YukiHookDataChannel

    解决方案

    你只能在 ActivityFragment 中使用 YukiHookDataChannel

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    异常原因

    在 Hook 过程中使用 YukiHookModulePrefsYukiHookDataChannel 时无法读取装载时的 modulePackageName 导致不能确定自身模块的包名。

    解决方案

    请仔细阅读 这里 的帮助文档,正确配置模块的 Hook 入口类包名。

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    异常原因

    在模块中使用了 YukiHookModulePrefs 存储数据但并未传入 Context 实例。

    示例如下

    class MainActivity : AppCompatActivity() {
    +

    解决方案

    你只能在 作为 Xposed 模块使用 时使用 YukiHookDataChannel

    exception

    IllegalStateException

    YukiHookDataChannel only support used on an Activity, but this current context is "CLASSNAME"

    异常原因

    在模块的非 Activity 环境中使用了 YukiHookDataChannel

    解决方案

    你只能在 ActivityFragment 中使用 YukiHookDataChannel

    exception

    IllegalStateException

    Xposed modulePackageName load failed, please reset and rebuild it

    异常原因

    在 Hook 过程中使用 YukiHookModulePrefsYukiHookDataChannel 时无法读取装载时的 modulePackageName 导致不能确定自身模块的包名。

    解决方案

    请仔细阅读 这里 的帮助文档,正确配置模块的 Hook 入口类包名。

    exception

    IllegalStateException

    YukiHookModulePrefs missing Context instance

    异常原因

    在模块中使用了 YukiHookModulePrefs 存储数据但并未传入 Context 实例。

    示例如下

    class MainActivity : AppCompatActivity() {
     
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
    @@ -257,7 +257,7 @@
             modulePrefs.getBoolean("test_data")
         }
     }
    -
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    异常原因

    在使用 YukiHookModulePrefsgetput 方法或 YukiHookDataChannelwaitput 方法时传入了不支持的存储类型。

    解决方案

    YukiHookModulePrefs 支持的类型只有 StringSet<String>IntFloatLongBoolean,请传入支持的类型。

    YukiHookDataChannel 支持的类型为 Intent.putExtra 限制的类型,请传入支持的类型。

    exception

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    异常原因

    loadApploadZygoteloadSystemwithProcess 中缺少了需要填写的可变数组变量参数。

    示例如下

    // <情景 1>
    +
    exception

    IllegalStateException

    Key-Value type TYPE is not allowed

    异常原因

    在使用 YukiHookModulePrefsgetput 方法或 YukiHookDataChannelwaitput 方法时传入了不支持的存储类型。

    解决方案

    YukiHookModulePrefs 支持的类型只有 StringSet<String>IntFloatLongBoolean,请传入支持的类型。

    YukiHookDataChannel 支持的类型为 Intent.putExtra 限制的类型,请传入支持的类型。

    exception

    IllegalStateException

    loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

    异常原因

    loadApploadZygoteloadSystemwithProcess 中缺少了需要填写的可变数组变量参数。

    示例如下

    // <情景 1>
     loadApp()
     // <情景 2> 
     loadZygote()
    @@ -265,18 +265,18 @@
     loadSystem()
     // <情景 4>
     withProcess()
    -

    解决方案

    请查看 PackageParam 中的用法正确地使用此功能。

    exception

    IllegalStateException

    YukiHookDataChannel cannot used in zygote

    异常原因

    loadZygote 中使用了 YukiHookDataChannel

    示例如下

    loadZygote {
    +

    解决方案

    请查看 PackageParam 中的用法正确地使用此功能。

    exception

    IllegalStateException

    YukiHookDataChannel cannot used in zygote

    异常原因

    loadZygote 中使用了 YukiHookDataChannel

    示例如下

    loadZygote {
         // 调用了此变量
         dataChannel...
     }
    -

    解决方案

    YukiHookDataChannel 只能在 loadSystemloadApp 中使用。

    exception

    IllegalStateException

    Custom Hooking Members is empty

    异常原因

    MemberHookCreator 中调用 members() 但是未设置需要 Hook 的 Member 实例。

    示例如下

    injectMember {
    +

    解决方案

    YukiHookDataChannel 只能在 loadSystemloadApp 中使用。

    exception

    IllegalStateException

    Custom Hooking Members is empty

    异常原因

    MemberHookCreator 中调用 members() 但是未设置需要 Hook 的 Member 实例。

    示例如下

    injectMember {
         // 括号里的方法参数被留空了
         members()
         afterHook {
             // ...
         }
     }
    -

    解决方案

    若要使用 members() 设置自定义 Hook 方法,你必须保证其方法参数里的 Member 数组对象不能为空。

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    异常原因

    HookParam 中调用 args().last() 但是目标 param 为空或 args 中的 index 设置了小于 0 的数值。

    示例如下

    injectMember {
    +

    解决方案

    若要使用 members() 设置自定义 Hook 方法,你必须保证其方法参数里的 Member 数组对象不能为空。

    exception

    IllegalStateException

    HookParam Method args index must be >= 0

    异常原因

    HookParam 中调用 args().last() 但是目标 param 为空或 args 中的 index 设置了小于 0 的数值。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 假设 param 是空的
    @@ -285,7 +285,7 @@
             args(index = -5)...
         }
     }
    -

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,且不能对 args 的下标设置小于 0 的数值。

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    异常原因

    HookParam 中调用 instance 变量或 instance 方法但获取不到当前实例的对象。

    示例如下

    injectMember {
    +

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,且不能对 args 的下标设置小于 0 的数值。

    exception

    IllegalStateException

    HookParam instance got null! Is this a static member?

    异常原因

    HookParam 中调用 instance 变量或 instance 方法但获取不到当前实例的对象。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此变量
    @@ -294,68 +294,64 @@
             instance<Any>()...
         }
     }
    -

    解决方案

    请确认你 Hook 的方法是否为静态类型,静态类型的方法没有实例,不能使用此功能,若非静态方法,请检查实例是否已经销毁。

    exception

    IllegalStateException

    Current hooked Member args is null

    异常原因

    HookParam 中调用 args 变量但获取不到当前实例方法、构造方法的参数数组。

    示例如下

    injectMember {
    +

    解决方案

    请确认你 Hook 的方法是否为静态类型,静态类型的方法没有实例,不能使用此功能,若非静态方法,请检查实例是否已经销毁。

    exception

    IllegalStateException

    Current hooked Member args is null

    异常原因

    HookParam 中调用 args 变量但获取不到当前实例方法、构造方法的参数数组。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此变量
             args...
         }
     }
    -

    解决方案

    这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    Current hooked Member is null

    异常原因

    HookParam 中调用 member 变量但获取不到当前实例的方法、构造方法实例。

    示例如下

    injectMember {
    +

    解决方案

    这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    Current hooked Member is null

    异常原因

    HookParam 中调用 member 变量但获取不到当前实例的方法、构造方法实例。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此变量
             member...
         }
     }
    -

    解决方案

    这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    Current hooked Member is not a Method

    异常原因

    HookParam 中调用 method 变量但获取不到当前实例的方法实例。

    示例如下

    injectMember {
    +

    解决方案

    这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    Current hooked Member is not a Method

    异常原因

    HookParam 中调用 method 变量但获取不到当前实例的方法实例。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此变量
             method...
         }
     }
    -

    解决方案

    请确认你 Hook 的方法是构造方法还是普通方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    异常原因

    HookParam 中调用 constructor 变量但获取不到当前实例的方法实例。

    示例如下

    injectMember {
    +

    解决方案

    请确认你 Hook 的方法是构造方法还是普通方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

    exception

    IllegalStateException

    Current hooked Member is not a Constructor

    异常原因

    HookParam 中调用 constructor 变量但获取不到当前实例的方法实例。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此变量
             constructor...
         }
     }
    -

    解决方案

    请确认你 Hook 的方法是普通方法还是构造方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    异常原因

    HookParam 中调用 instance 方法指定了错误的类型。

    示例如下

    injectMember {
    +

    解决方案

    请确认你 Hook 的方法是普通方法还是构造方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

    exception

    IllegalStateException

    HookParam instance cannot cast to TYPE

    异常原因

    HookParam 中调用 instance 方法指定了错误的类型。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 类型被 cast 为 Activity 但假设当前实例的类型并非此类型
             instance<Activity>()...
         }
     }
    -

    解决方案

    请确认当前 Hook 实例的正确类型并重新填写泛型中的类型,若不能确定请使用 Any 或直接使用 instance 变量。

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    异常原因

    HookParam 中调用 ArgsModifyer.set 方法但是当前实例的方法参数数组为空。

    示例如下

    injectMember {
    +

    解决方案

    请确认当前 Hook 实例的正确类型并重新填写泛型中的类型,若不能确定请使用 Any 或直接使用 instance 变量。

    exception

    IllegalStateException

    HookParam Method args is empty, mabe not has args

    异常原因

    HookParam 中调用 ArgsModifyer.set 方法但是当前实例的方法参数数组为空。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 调用了此方法
             args(...).set(...)
         }
     }
    -

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,否则你无法使用此功能。

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    异常原因

    HookParam 中调用 ArgsModifyer.set 方法指定了超出方法参数下标的数组序号。

    示例如下

    injectMember {
    +

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,否则你无法使用此功能。

    exception

    IllegalStateException

    HookParam Method args index out of bounds, max is NUMBER

    异常原因

    HookParam 中调用 ArgsModifyer.set 方法指定了超出方法参数下标的数组序号。

    示例如下

    injectMember {
         // ...
         afterHook {
             // 下标从 0 开始,假设原始的参数下标是 5 个,但是这里填写了 6
             args(index = 6).set(...)
         }
     }
    -

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数个数,并重新设置数组下标。

    exception

    IllegalStateException

    PackageParam got null ClassLoader

    异常原因

    PackageParam 中调用了 appClassLoader 变量但是无法获取到实例对象。

    示例如下

    encase {
    -    // 调用了此变量
    -    appClassLoader...
    -}
    -

    解决方案

    这种情况几乎不存在,除非模块被装载的宿主或目标 Hook Framework 自身存在问题,若真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    异常原因

    PackageParam 中调用了 moduleAppResources 变量但是无法获取到实例对象。

    示例如下

    encase {
    +

    解决方案

    请确认你 Hook 的目标方法、构造方法的方法参数个数,并重新设置数组下标。

    exception

    IllegalStateException

    Current Hook Framework not support moduleAppResources

    异常原因

    PackageParam 中调用了 moduleAppResources 变量但是无法获取到实例对象。

    示例如下

    encase {
         // 调用了此变量
         moduleAppResources...
     }
    -

    解决方案

    moduleAppResources 需要当前 Hook Framework 支持 initZygote 功能,请检查后再试一次。

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    异常原因

    在使用 VariousClass 创建不确定的 Class 对象时全部的 Class 都没有被找到。

    解决方案

    检查当前 Hook 的宿主内是否存在其中能够匹配的 Class 后,再试一次。

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    异常原因

    hook 方法体非 onPrepareHook 方法内调用了 instanceClass 变量且当前 Hook 的 Class 不存在。

    示例如下

    TargetClass.hook {
    +

    解决方案

    这种情况几乎不存在,除非目标 Hook Framework 自身存在问题,若真的发生了此问题,请携带详细日志进行反馈。

    exception

    IllegalStateException

    VariousClass match failed of those CLASSES

    异常原因

    在使用 VariousClass 创建不确定的 Class 对象时全部的 Class 都没有被找到。

    解决方案

    检查当前 Hook 的宿主内是否存在其中能够匹配的 Class 后,再试一次。

    exception

    IllegalStateException

    Cannot get hook class "NAME" cause THROWABLE

    异常原因

    hook 方法体非 onPrepareHook 方法内调用了 instanceClass 变量且当前 Hook 的 Class 不存在。

    示例如下

    TargetClass.hook {
         // 可能的情况为在非 onPrepareHook 方法体内调用了 instanceClass 变量用于打印日志
         loggerD(msg = "$instanceClass hook start")
     }
    -

    解决方案

    hook 内直接使用 instanceClass 是很危险的,若 Class 不存在则会直接导致 Hook 进程“死掉”。

    详情请参考 状态监听

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    异常原因

    在布局 Hook 回调中调用了 currentView 但没取到实例对象。

    示例如下

    injectResource {
    +

    解决方案

    hook 内直接使用 instanceClass 是很危险的,若 Class 不存在则会直接导致 Hook 进程“死掉”。

    详情请参考 状态监听

    exception

    IllegalStateException

    LayoutInflatedParam View instance got null

    异常原因

    在布局 Hook 回调中调用了 currentView 但没取到实例对象。

    示例如下

    injectResource {
         conditions {
             name = "activity_main"
             layout()
    @@ -365,9 +361,9 @@
             currentView...
         }
     }
    -

    解决方案

    这种情况基本上不存在,除非被 Hook 的宿主当前 Activity 已经销毁或 Hook Framework 自身存在问题。

    exception

    IllegalStateException

    XResForwarder is invalid

    异常原因

    YukiResForwarder 中调用了 resources 但没取到实例对象。

    示例如下

    // 调用了此变量
    +

    解决方案

    这种情况基本上不存在,除非被 Hook 的宿主当前 Activity 已经销毁或 Hook Framework 自身存在问题。

    exception

    IllegalStateException

    XResForwarder is invalid

    异常原因

    YukiResForwarder 中调用了 resources 但没取到实例对象。

    示例如下

    // 调用了此变量
     moduleAppResources.fwd(...).resources
    -

    解决方案

    这种情况基本上不存在,除非 Hook Framework 自身存在问题。

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    异常原因

    在查找方法、构造方法时保留了空的 param 方法。

    示例如下

    method {
    +

    解决方案

    这种情况基本上不存在,除非 Hook Framework 自身存在问题。

    exception

    IllegalStateException

    paramTypes is empty, please use emptyParam() instead

    异常原因

    在查找方法、构造方法时保留了空的 param 方法。

    示例如下

    method {
         name = "test"
         // 括号内没有填写任何参数
         param()
    @@ -380,15 +376,21 @@
         name = "test"
         paramCount = 0
     }
    -
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    异常原因

    YukiHookAPI 的核心 Hook 功能发生故障。

    解决方案

    这种情况基本上不存在,若发生上述问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    异常原因

    Context 中使用 applyModuleTheme 方法时重复进行调用。

    示例如下

    // 假设这就是当前的 Context 对象
    +
    exception

    IllegalStateException

    Invalid YukiHookCallback type

    异常原因

    YukiHookAPI 的核心 Hook 功能发生故障。

    解决方案

    这种情况基本上不存在,若发生上述问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

    exception

    IllegalStateException

    ModuleContextThemeWrapper already loaded

    异常原因

    Context 中使用 applyModuleTheme 方法时重复进行调用。

    示例如下

    // 假设这就是当前的 Context 对象
     context.applyModuleTheme(R.style.Theme_AppCompat).applyModuleTheme(R.style.Theme_AppCompat)
    -

    解决方案

    Context 中只能创建一次 ModuleContextThemeWrapper,请检查代码是否有循环调用问题。

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    异常原因

    在系统框架 (android) 宿主使用了 DexClassFinder 的缓存功能 searchClass(name = ...)

    示例如下

    loadSystem {
    +

    解决方案

    Context 中只能创建一次 ModuleContextThemeWrapper,请检查代码是否有循环调用问题。

    exception

    IllegalStateException

    Cannot create classes cache for "android", please remove "name" param

    异常原因

    在系统框架 (android) 宿主使用了 DexClassFinder 的缓存功能 searchClass(name = ...)

    示例如下

    loadSystem {
         searchClass(name = "test") {
             from(...)
             // ...
         }.get()
     }
    -

    解决方案

    由于缓存会将找到的 Class 名称存入 SharedPreferences,但是系统框架不存在 data 目录,所以请不要在系统框架中使用此功能。

    - +

    解决方案

    由于缓存会将找到的 Class 名称存入 SharedPreferences,但是系统框架不存在 data 目录,所以请不要在系统框架中使用此功能。

    exception

    IllegalStateException

    Target Class type cannot cast to TYPE

    异常原因

    使用 Class.toClassClass.toClassOrNullGenericClass.argument 方法将字符串类名转换为目标 Class 时声明了错误的类型。

    以下使用 Class.toClass 方法来进行示例。

    示例如下

    // 假设目标类型是 Activity 但是被错误地转换为了 WrongClass 类型
    +val clazz = "android.app.Activity".toClass<WrongClass>()
    +

    解决方案

    示例如下

    // <解决方案 1> 填写正确的类型
    +val clazz1 = "android.app.Activity".toClass<Activity>()
    +// <解决方案 2> 不填写泛型声明
    +val clazz2 = "android.app.Activity".toClass()
    +

    请确保执行方法后声明的泛型是指定的目标 Class 类型,在不确定目标类型的情况下你可以不需要填写泛型声明。

    + diff --git a/docs/zh-cn/config/api-using.html b/docs/zh-cn/config/api-using.html index cb9959016..605b29f81 100644 --- a/docs/zh-cn/config/api-using.html +++ b/docs/zh-cn/config/api-using.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 作为 Hook API 使用的相关配置 | Yuki Hook API - + 作为 Hook API 使用的相关配置 | Yuki Hook API + -

    作为 Hook API 使用的相关配置

    作为 Hook API 通常为做自身 APP 热更新或功能需要以及产品测试的 Hook 操作。

    依赖配置

    你只需要集成 com.highcapable.yukihookapi:api 依赖即可。

    然后请集成你目标使用的 Hook Framework 依赖。

    入口配置

    创建你的自定义 Application

    attachBaseContext 中添加 YukiHookAPI.encase 方法。

    示例如下

    class MyApplication : Application() {
    +    

    作为 Hook API 使用的相关配置

    作为 Hook API 通常为做自身 APP 热更新或功能需要以及产品测试的 Hook 操作。

    依赖配置

    你只需要集成 com.highcapable.yukihookapi:api 依赖即可。

    然后请集成你目标使用的 Hook Framework 依赖。

    入口配置

    创建你的自定义 Application

    attachBaseContext 中添加 YukiHookAPI.encase 方法。

    示例如下

    class MyApplication : Application() {
     
         override fun attachBaseContext(base: Context?) {
             // 装载 Hook Framework
    @@ -77,6 +77,6 @@
         super.attachBaseContext(base)
     }
     
    - + diff --git a/docs/zh-cn/config/r8-proguard.html b/docs/zh-cn/config/r8-proguard.html index 6f4b80581..22e809909 100644 --- a/docs/zh-cn/config/r8-proguard.html +++ b/docs/zh-cn/config/r8-proguard.html @@ -22,13 +22,13 @@ document.documentElement.classList.toggle('dark', true); } - R8 与 Proguard 混淆 | Yuki Hook API - + R8 与 Proguard 混淆 | Yuki Hook API + -

    R8 与 Proguard 混淆

    大部分场景下 Xposed 模块可通过原生混淆压缩体积,这里介绍了混淆的配置方法。

    R8

    如果你使用的是 R8,那么你无需对 YukiHookAPI 进行任何特殊配置。

    Proguard

    如果你仍然在使用 Proguard,你需要做一些规则配置。

    特别注意

    Proguard 规则已被弃用,请不要再使用,自从 Android Gradle Plugin 4.2 后,拥有 Android Jetpack 套件最新版本的混淆处理程序默认均为 R8,不再需要考虑混淆的问题。

    若要在任何版本下启用 R8,请在 gradle.properties 文件中加入如下规则,Android Gradle Plugin 7.0 及以上版本无需任何配置。

    android.enableR8=true
    +    

    R8 与 Proguard 混淆

    大部分场景下 Xposed 模块可通过原生混淆压缩体积,这里介绍了混淆的配置方法。

    R8

    如果你使用的是 R8,那么你无需对 YukiHookAPI 进行任何特殊配置。

    Proguard

    如果你仍然在使用 Proguard,你需要做一些规则配置。

    特别注意

    Proguard 规则已被弃用,请不要再使用,自从 Android Gradle Plugin 4.2 后,拥有 Android Jetpack 套件最新版本的混淆处理程序默认均为 R8,不再需要考虑混淆的问题。

    若要在任何版本下启用 R8,请在 gradle.properties 文件中加入如下规则,Android Gradle Plugin 7.0 及以上版本无需任何配置。

    android.enableR8=true
     
    - + diff --git a/docs/zh-cn/config/xposed-using.html b/docs/zh-cn/config/xposed-using.html index 0543ff72b..4dd329ad4 100644 --- a/docs/zh-cn/config/xposed-using.html +++ b/docs/zh-cn/config/xposed-using.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 作为 Xposed 模块使用的相关配置 | Yuki Hook API - + 作为 Xposed 模块使用的相关配置 | Yuki Hook API + -

    作为 Xposed 模块使用的相关配置

    这里介绍了 YukiHookAPI 作为 Xposed 模块使用的相关配置方法。

    依赖配置

    作为 Xposed 模块,YukiHookAPI 提供了一个自动处理程序。

    你需要在你的 build.gradle 中集成 com.highcapable.yukihookapi:ksp-xposed 依赖的最新版本。

    自定义处理程序

    你可以对 YukiHookAPI 将如何生成 xposed_init 入口进行相关配置。

    InjectYukiHookWithXposed 注解

    annotation class InjectYukiHookWithXposed(
    +    

    作为 Xposed 模块使用的相关配置

    这里介绍了 YukiHookAPI 作为 Xposed 模块使用的相关配置方法。

    依赖配置

    作为 Xposed 模块,YukiHookAPI 提供了一个自动处理程序。

    你需要在你的 build.gradle 中集成 com.highcapable.yukihookapi:ksp-xposed 依赖的最新版本。

    自定义处理程序

    你可以对 YukiHookAPI 将如何生成 xposed_init 入口进行相关配置。

    InjectYukiHookWithXposed 注解

    annotation class InjectYukiHookWithXposed(
         val sourcePath: String,
         val modulePackageName: String,
         val entryClassName: String,
    @@ -45,18 +45,18 @@
     

    若你的模块包名是非常规手段进行自动生成的,或你认为有必要手动定义模块包名,那么你可以直接设置 modulePackageName 的参数。

    示例如下

    @InjectYukiHookWithXposed(modulePackageName = "com.example.demo")
     

    只要你自定义了 modulePackageName 的参数,你就会在编译时收到警告。

    示例如下

    You set the customize module package name to "com.example.demo", please check for yourself if it is correct
     

    注意

    手动定义的模块包名除了格式之外,自动处理程序将不会再检查模块包名是否正确,需要你自行确认其有效性。

    entryClassName 参数

    entryClassName 决定了自动处理程序如何生成 xposed_init 中的入口类名,默认会使用你的入口类包名插入 _YukiHookXposedInit 后缀进行生成。

    假设这是你的入口类。

    示例如下

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit
    -

    Xposed 入口类处理如下。

    示例如下

    class HookEntry_YukiHookXposedInit: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    Xposed 入口类处理如下。

    示例如下

    class HookEntry_YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    编译后的类名结构如下。

    示例如下

    ...hook.HookEntry ← 你的入口类
     ...hook.HookEntry_Impl ← 自动生成的 Impl 类
     ...hook.HookEntry_YukiHookXposedInit ← 自动生成的 Xposed 入口类
     

    我们现在定义入口类名称为 HookXposedEntry

    示例如下

    @InjectYukiHookWithXposed(entryClassName = "HookXposedEntry")
    -class HookEntry: IYukiHookXposedInit
    -

    Xposed 入口类处理如下。

    示例如下

    class HookXposedEntry: IXposedHookZygoteInit, IXposedHookLoadPackage, ...
    +object HookEntry : IYukiHookXposedInit
    +

    Xposed 入口类处理如下。

    示例如下

    class HookXposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage, ...
     

    编译后的类名结构如下。

    示例如下

    ...hook.HookEntry ← 你的入口类
     ...hook.HookEntry_Impl ← 自动生成的 Impl 类
     ...hook.HookXposedEntry ← 自动生成的 Xposed 入口类
    -

    特别注意

    你定义的 entryClassName 不可与 xposed_init 中的类名相同,否则自动处理程序会在编译时抛出异常

    isUsingResourcesHook 参数

    isUsingResourcesHook 决定了自动处理程序是否生成针对 Resources Hook 的相关代码,此功能默认是启用的。

    启用后生成的入口类将为如下所示。

    示例如下

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
    +

    小提示

    入口类可以使用 classobject 定义,但是建议使用 object 定义来保证每一个注入的进程都是单例运行。

    特别注意

    你定义的 entryClassName 不可与 xposed_init 中的类名相同,否则自动处理程序会在编译时抛出异常

    isUsingResourcesHook 参数

    isUsingResourcesHook 决定了自动处理程序是否生成针对 Resources Hook 的相关代码,此功能默认是启用的。

    启用后生成的入口类将为如下所示。

    示例如下

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage, IXposedHookInitPackageResources {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
             // ...
    @@ -70,7 +70,7 @@
             // ...
         }
     }
    -

    若你当前的项目并不需要用到 Reources Hook,可以设置 isUsingResourcesHook = false 来关闭自动生成。

    示例如下

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
    +

    若你当前的项目并不需要用到 Resources Hook,可以设置 isUsingResourcesHook = false 来关闭自动生成。

    示例如下

    @InjectYukiHookWithXposed(isUsingResourcesHook = false)
     

    关闭后生成的入口类将为如下所示。

    示例如下

    class _YukiHookXposedInit : IXposedHookZygoteInit, IXposedHookLoadPackage {
     
         override fun initZygote(sparam: IXposedHookZygoteInit.StartupParam?) {
    @@ -82,7 +82,7 @@
         }
     }
     

    IYukiHookXposedInit 接口

    IYukiHookXposedInit 接口为你的 HookEntryClass 必须实现的接口,这是你的模块开始 Hook 的起点。

    小提示

    更多功能请参考 IYukiHookXposedInit

    当你的模块被 Xposed 装载后,onHook 方法将会被回调,你需要在此方法中开始使用 YukiHookAPI

    基本的调用流程为 _YukiHookXposedInitIYukiHookXposedInit.onXposedEventIYukiHookXposedInit.onInitIYukiHookXposedInit.onHook

    详情请参考 API 基本配置

    原生 Xposed API 事件

    若你当前的 Xposed 模块使用了第三方的资源,但是短时间内可能无法转移它们,此时,你可以使用 onXposedEvent 实现监听原生 Xposed API 的全部装载事件。

    示例如下

    @InjectYukiHookWithXposed
    -class HookEntry: IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() {
             // Your code here.
    @@ -104,6 +104,6 @@
         }
     }
     

    onXposedEventonHook 方法完全独立存在,互不影响,你可以继续在 onHook 方法中使用 YukiHookAPI

    小提示

    更多功能请参考 IYukiHookXposedInit.onXposedEvent 方法。

    - + diff --git a/docs/zh-cn/guide/example.html b/docs/zh-cn/guide/example.html index ff29993d6..d596f33e0 100644 --- a/docs/zh-cn/guide/example.html +++ b/docs/zh-cn/guide/example.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 用法示例 | Yuki Hook API - + 用法示例 | Yuki Hook API + -

    用法示例

    这里介绍了 YukiHookAPI 的基本工作方式以及列举了简单的 Hook 例子和常用功能。

    结构图解

    下方的结构描述了 YukiHookAPI 的基本工作方式和原理。

    Host Environment
    +    

    用法示例

    这里介绍了 YukiHookAPI 的基本工作方式以及列举了简单的 Hook 例子和常用功能。

    结构图解

    下方的结构描述了 YukiHookAPI 的基本工作方式和原理。

    Host Environment
     └── YukiMemberHookCreator
         └── Class
             └── MemberHookCreator
    @@ -312,7 +312,13 @@
     

    若你想使用两者得兼的判断方案,YukiHookAPI 同样为你封装了便捷的方式。

    此时你可以使用 YukiHookAPI.Status.isModuleActive 判断自身是否在 Xposed 或太极、无极中被激活。

    示例如下

    if(YukiHookAPI.Status.isModuleActive) {
         // Your code here.
     }
    -

    小提示

    更多功能请参考 YukiHookAPI.Status

    注意

    若模块激活判断中包含太极、无极中的激活状态,就必须将模块的 Application 继承于 ModuleApplication 或直接使用 ModuleApplication

    1.0.91 版本后的 API 修改了激活逻辑判断方式,现在你可以在模块与 Hook APP (宿主) 中同时使用此 API;

    需要确保 YukiHookAPI.Configs.isEnableHookModuleStatus 是启用状态;

    除了提供标准 API 的 Hook 框架之外,其它情况下模块可能都将无法判断自己是否被激活。

    - +

    小提示

    更多功能请参考 YukiHookAPI.Status

    注意

    如果你的模块 API 版本高于 29 且正在目标 API 为 29 以上的系统中运行,你需要在 AndroidManifest.xml 中添加如下权限声明才能正常判断模块在太极、无极中的激活状态。

    示例如下

    <queries>
    +    <intent>
    +        <action android:name="android.intent.action.MAIN" />
    +    </intent>
    +</queries>
    +

    还有一种方案,你可以直接声明 android.permission.QUERY_ALL_PACKAGES 权限,但是不推荐且会被代码检查警告。

    示例如下

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    +

    若模块激活判断中包含太极、无极中的激活状态,就必须将模块的 Application 继承于 ModuleApplication 或直接使用 ModuleApplication

    1.0.91 版本后的 API 修改了激活逻辑判断方式,现在你可以在模块与 Hook APP (宿主) 中同时使用此 API;

    需要确保 YukiHookAPI.Configs.isEnableHookModuleStatus 是启用状态;

    除了提供标准 API 的 Hook Framework 之外,其它情况下模块可能都将无法判断自己是否被激活。

    + diff --git a/docs/zh-cn/guide/home.html b/docs/zh-cn/guide/home.html index 9731ef054..80cddca59 100644 --- a/docs/zh-cn/guide/home.html +++ b/docs/zh-cn/guide/home.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 介绍 | Yuki Hook API - + 介绍 | Yuki Hook API + -

    介绍

    这是一个 Hook API 框架,本身不提供任何 Hook 功能,需要 Xposed 基础 API 的支持。

    背景

    这是一个使用 Kotlin 重新构建的高效 Xposed Hook API。

    名称取自 《ももくり》女主 栗原 雪(Yuki)在新窗口中打开

    前身为 开发学习项目在新窗口中打开 中使用的 Innocent Xposed API,现在重新命名并开源。

    用途

    YukiHookAPI 完全采用 Kotlin lambda 语法构建。

    抛弃原始不太友好的 XposedHelpers,你可以使用它来轻松创建 Xposed 模块以及轻松实现自定义 Hook API。

    语言要求

    请使用 Kotlin,框架部分代码构成同样兼容 Java 但基础 Hook 场景的实现可能完全无法使用

    文档全部的 Demo 示例代码都将使用 Kotlin 进行描述,如果你完全不会使用 Kotlin 那你将有可能无法使用 YukiHookAPI

    部分 Java Demo 代码可在 这里在新窗口中打开 找到,但不推荐使用。

    灵感来源

    以前,我们在构建 Xposed 模块的时候,首先需要在 assets 下创建 xposed_init 文件。

    然后,将自己的入口类名手动填入文件中,使用 XposedHelpers 去实现我们的 Hook 逻辑。

    Kotlin 作为 Android 主要开发语言以来,这套 API 用起来确实已经不是很优雅了。

    有没有什么 好用、轻量、优雅 的解决办法呢?

    本着这样的想法,YukiHookAPI 诞生了。

    现在,我们只需要编写少量的代码,一切时间开销和花费交给自动化处理。

    借助 Kotlin 优雅的 lambda 写法以及 YukiHookAPI,可以让你的 Hook 逻辑更加美观清晰。

    示例如下

    @InjectYukiHookWithXposed
    +    

    介绍

    YukiHookAPI 是一个集成化的 Hook API 框架,本身不提供任何 Hook 功能,需要 Xposed 相关基础 API 的支持。

    背景

    这是一个使用 Kotlin 基于 Xposed API 重新构建的高效 Hook API,同时为 Xposed 模块的开发打造了丰富的功能扩展。

    名称取自 《ももくり》女主 栗原 雪(Yuki)在新窗口中打开

    前身为 开发学习项目在新窗口中打开 中使用的 Innocent Xposed API,现在重新命名并开源。

    用途

    YukiHookAPI 完全采用 Kotlin lambda 语法构建。

    抛弃原始不太友好的 XposedHelpers,你可以使用它来轻松创建 Xposed 模块以及轻松实现自定义 Hook API。

    语言要求

    请使用 Kotlin,框架部分代码构成同样兼容 Java 但基础 Hook 场景的实现可能完全无法使用

    文档全部的 Demo 示例代码都将使用 Kotlin 进行描述,如果你完全不会使用 Kotlin 那你将有可能无法使用 YukiHookAPI

    部分 Java Demo 代码可在 这里在新窗口中打开 找到,但不推荐使用。

    灵感来源

    以前,我们在构建 Xposed 模块的时候,首先需要在 assets 下创建 xposed_init 文件。

    然后,将自己的入口类名手动填入文件中,使用 XposedHelpers 去实现我们的 Hook 逻辑。

    Kotlin 作为 Android 主要开发语言以来,这套 API 用起来确实已经不是很优雅了。

    有没有什么 好用、轻量、优雅 的解决办法呢?

    本着这样的想法,YukiHookAPI 诞生了。

    现在,我们只需要编写少量的代码,一切时间开销和花费交给自动化处理。

    借助 Kotlin 优雅的 lambda 写法以及 YukiHookAPI,可以让你的 Hook 逻辑更加美观清晰。

    示例如下

    @InjectYukiHookWithXposed
     class HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = encase {
    @@ -133,7 +133,7 @@
                 )
         }
     }
    -

    是的,你没有看错,仅仅就需要这些代码,就能完全取代 Xposed API 实现同样的功能。

    现在,借助高效强大的 YukiHookAPI,你就可以实现一个非常简单的 Xposed 模块。

    支持的 Hook 框架

    以下是 YukiHookAPI 支持的 Hook Framework 以及 Xposed 框架。

    Hook FrameworkSTDescription
    LSPosed在新窗口中打开多场景下稳定使用
    LSPatch在新窗口中打开将在此项目完善后逐渐加入 API 支持
    EdXposed在新窗口中打开已停止维护,不再推荐使用
    Pine在新窗口中打开可以使用
    SandHook在新窗口中打开可以使用
    Whale在新窗口中打开需要 xposed-hook-based-on-whale在新窗口中打开
    YAHFA在新窗口中打开需要自行实现 Xposed API
    FastHook在新窗口中打开需要自行实现 Xposed API
    Epic在新窗口中打开需要自行对接 Dexposed在新窗口中打开
    TaiChi在新窗口中打开可以作为模块使用
    Xposed在新窗口中打开未测试,不再推荐使用
    - +

    是的,你没有看错,仅仅就需要这些代码,就能完全取代 Xposed API 实现同样的功能。

    现在,借助高效强大的 YukiHookAPI,你就可以实现一个非常简单的 Xposed 模块。

    支持的 Hook Framework

    以下是 YukiHookAPI 支持的 Hook Framework 以及 Xposed 框架。

    Hook FrameworkSTDescription
    LSPosed在新窗口中打开多场景下稳定使用
    LSPatch在新窗口中打开将在此项目完善后逐渐加入 API 支持
    EdXposed在新窗口中打开已停止维护,不再推荐使用
    Pine在新窗口中打开可以使用
    SandHook在新窗口中打开可以使用
    Whale在新窗口中打开需要 xposed-hook-based-on-whale在新窗口中打开
    YAHFA在新窗口中打开需要自行实现 Xposed API
    FastHook在新窗口中打开需要自行实现 Xposed API
    Epic在新窗口中打开需要自行对接 Dexposed在新窗口中打开
    TaiChi在新窗口中打开可以作为模块使用
    Xposed在新窗口中打开建议最低系统版本为 Android 7.0
    + diff --git a/docs/zh-cn/guide/knowledge.html b/docs/zh-cn/guide/knowledge.html index 5e4e7c9fe..129c478db 100644 --- a/docs/zh-cn/guide/knowledge.html +++ b/docs/zh-cn/guide/knowledge.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 基础知识 | Yuki Hook API - + 基础知识 | Yuki Hook API + -

    基础知识

    这里收集了 Xposed 相关的介绍以及开启前需要掌握的知识要点,已经了解的同学可以略过。

    基础知识内容并不一定完全准确,请根据自己的见解酌情阅读,若发现内容有错误欢迎指正并帮助我们完善和改进

    相关介绍

    这里介绍了 Xposed 以及 Hook 的工作原理。

    Xposed 是什么

    Xposed 框架(Xposed Framework)是一套开源的、在 Android 高权限模式下运行的框架服务,可以在不修改 APK 文件的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。

    上述内容复制自百度百科。

    Xposed 能做什么

    下方的结构描述了 Xposed 的基本工作方式和原理。

    Xposed Framework
    +    

    基础知识

    这里收集了 Xposed 相关的介绍以及开启前需要掌握的知识要点,已经了解的同学可以略过。

    基础知识内容并不一定完全准确,请根据自己的见解酌情阅读,若发现内容有错误欢迎指正并帮助我们完善和改进

    相关介绍

    这里介绍了 Xposed 以及 Hook 的工作原理。

    Xposed 是什么

    Xposed 框架 (Xposed Framework) 是一套开源的、在 Android 高权限模式下运行的框架服务,可以在不修改 APK 文件的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。

    上述内容复制自百度百科。

    Xposed 能做什么

    下方的结构描述了 Xposed 的基本工作方式和原理。

    Xposed Framework
     └── App's Environment
         └── Hooker (Hooked)
             ...
    @@ -39,7 +39,7 @@
     └── Hook Framework
         └── Hooker (Hooked)
             ...
    -

    通过 Xposed 的运行原理,从而衍生了很多同类型框架,随着当今时代的移动设备获取 Root 权限甚至刷机越来越困难且不是刚需的时候,一些免 Root 框架也随之产生,例如太极

    这些在 ART 层面上的 Hook 框架同样也可不借助 Xposed API 完成其和 Xposed 原理一样的 Hook 流程,免 Root 的运行原理为修改 APK 并将 Hook 进程注入宿主,通过外部模块对其进行控制。

    另外一种产品就是利用 Android 运行环境现有的功能虚拟出一个完全与当前设备系统一样的环境,并在其中运行 APP,这个就是虚拟 APP 技术 VirtualApp,后来衍生为 VirtualXposed

    上述提到的免 Root 框架分别为太极/无极VirtualXposed/SandVXposed

    YukiHookAPI 做了什么

    自从 Xposed 出现到现在为止,除了开发者人人皆知的 XposedHelpers,依然没有一套针对 Kotlin 打造的语法糖以及用法封装十分完善的 API。

    本 API 框架的诞生就是希望在 Xposed 的如今时代,能让更多有动手能力的 Xposed 模块开发者少走弯路,更容易、更简单地完成整个开发流程。

    未来,YukiHookAPI 将在使用 Xposed API 的目标基础上适配更多第三方 Hook 框架,使得整个生态得到完善,并帮助更多开发者让 Xposed 模块开发变得更加简单和易懂。

    让我们开始吧

    在开始之前,你需要拥有以下基础才能更好地使用 YukiHookAPI

    - +

    通过 Xposed 的运行原理,从而衍生了很多同类型框架,随着当今时代的移动设备获取 Root 权限甚至刷机越来越困难且不是刚需的时候,一些免 Root 框架也随之产生,例如 LSPatch太极

    这些在 ART 层面上的 Hook Framework 同样也可不借助 Xposed API 完成其和 Xposed 原理一样的 Hook 流程,免 Root 的运行原理为修改 APK 并将 Hook 进程注入宿主,通过外部模块对其进行控制。

    另外一种产品就是利用 Android 运行环境现有的功能虚拟出一个完全与当前设备系统一样的环境,并在其中运行 APP,这个就是虚拟 APP 技术 VirtualApp,后来衍生为 VirtualXposed

    上述提到的免 Root 框架分别为 LSPatch在新窗口中打开太极在新窗口中打开VirtualApp在新窗口中打开SandVXposed在新窗口中打开

    YukiHookAPI 做了什么

    自从 Xposed 出现到现在为止,除了开发者人人皆知的 XposedHelpers,依然没有一套针对 Kotlin 打造的语法糖以及用法封装十分完善的 API。

    本 API 框架的诞生就是希望在 Xposed 的如今时代,能让更多有动手能力的 Xposed 模块开发者少走弯路,更容易、更简单地完成整个开发流程。

    未来,YukiHookAPI 将在使用 Xposed API 的目标基础上适配更多第三方 Hook Framework,使得整个生态得到完善,并帮助更多开发者让 Xposed 模块开发变得更加简单和易懂。

    让我们开始吧

    在开始之前,你需要拥有以下基础才能更好地使用 YukiHookAPI

    + diff --git a/docs/zh-cn/guide/move-to-new-api.html b/docs/zh-cn/guide/move-to-new-api.html index d10d5d252..6770283a1 100644 --- a/docs/zh-cn/guide/move-to-new-api.html +++ b/docs/zh-cn/guide/move-to-new-api.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 从 Xposed API 迁移 | Yuki Hook API - + 从 Xposed API 迁移 | Yuki Hook API + -

    从 Xposed API 迁移

    若你熟悉 Xposed API,你可以参考下方的相同点将自己的 API 快速迁移到 YukiHookAPI

    迁移 Hook 入口点

    XC_LoadPackage.LoadPackageParam 迁移至 PackageParam

    YukiHookAPIPackageParam 实现了 lambda 方法体 this 用法,在 encase 方法体内即可全局得到 PackageParam 对象。

    API 功能差异对比如下

    override fun onHook() = encase {
    +    

    从 Xposed API 迁移

    若你熟悉 Xposed API,你可以参考下方的相同点将自己的 API 快速迁移到 YukiHookAPI

    迁移 Hook 入口点

    XC_LoadPackage.LoadPackageParam 迁移至 PackageParam

    YukiHookAPIPackageParam 实现了 lambda 方法体 this 用法,在 encase 方法体内即可全局得到 PackageParam 对象。

    API 功能差异对比如下

    override fun onHook() = encase {
         // 得到当前 Hook 的包名
         packageName
         // 得到当前 Hook 的 ApplicationInfo
    @@ -124,6 +124,8 @@
         result = ...
         // 删除返回值内容
         resultNull()
    +    // 获取当前回调方法体范围内的数据存储实例
    +    dataExtra
         // 向 Hook APP 抛出异常
         Throwable("Fatal").throwToApp()
         // 执行未经 Hook 的原始方法并使用原始方法参数调用,泛型可略
    @@ -131,7 +133,7 @@
         // 执行未经 Hook 的原始方法并自定义方法参数调用,泛型可略
         invokeOriginal<Any?>(...)
     }
    -
    override fun afterHookedMethod(param: MethodHookParam) {
    +
    override fun afterHookedMethod(param: MethodHookParam) {
         // 得到当前 Hook 的实例
         param.thisObject
         // 得到当前 Hook 的 Class 实例
    @@ -156,12 +158,14 @@
         param.result = ...
         // 删除返回值内容
         param.result = null
    +    // 获取当前回调方法体范围内的数据存储实例
    +    param.extra
         // 向 Hook APP 抛出异常
         param.throwable = Throwable("Fatal")
         // 执行未经 Hook 的原始方法
         XposedBridge.invokeOriginalMethod(param.method, param.thisObject, ...)
     }
    -

    Replace Hook

    replaceHook 方法比较特殊,YukiHookAPI 为它做出了多种形式以供选择。

    API 功能差异对比如下

    /// 无返回值的方法 void
    +

    Replace Hook

    replaceHook 方法比较特殊,YukiHookAPI 为它做出了多种形式以供选择。

    API 功能差异对比如下

    /// 无返回值的方法 void
     
     replaceUnit {
         // 直接在这里实现被替换的逻辑
    @@ -211,6 +215,6 @@
     // 拦截返回值
     override fun replaceHookedMethod(param: MethodHookParam) = null
     

    迁移其它功能

    YukiHookAPI 对 Xposed API 进行了完全重写,你可以参考 API 文档 以及 特色功能 来决定一些功能性的迁移和使用。

    - + diff --git a/docs/zh-cn/guide/quick-start.html b/docs/zh-cn/guide/quick-start.html index edd99065a..f4f05f109 100644 --- a/docs/zh-cn/guide/quick-start.html +++ b/docs/zh-cn/guide/quick-start.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 快速开始 | Yuki Hook API - + 快速开始 | Yuki Hook API + -

    快速开始

    集成 YukiHookAPI 到你的项目中。

    环境要求

    • Windows 7 及以上/macOS 10.14 及以上/Linux 发行版(Arch/Debian)

    • Android Studio 2021.1 及以上

    • IntelliJ IDEA 2021.1 及以上

    • Kotlin 1.7.0 及以上

    • Android Gradle Plugin 7.0 及以上

    • Gradle 7.0 及以上

    • Jvm 11 及以上 (Since API 1.0.80)

    自动构建项目

    YukiHookAPI 提供了一个自动化构建工具,它可以帮助你快速构建一个拥有 Xposed 模块依赖的 Android 标准项目模板,使用构建好的模板即可直接开始下一步工作。

    你可以 点击这里 进行查看。

    手动配置项目

    若你不想使用自动化构建工具,你依然可以按照以下方式手动配置项目依赖。

    创建项目

    使用 Android StudioIntelliJ IDEA 创建新的 Android 项目,并在 Language 一栏选择 Kotlin 以自动添加基础依赖。

    集成依赖

    在你的项目 build.gradle 中添加依赖。

    示例如下

    repositories {
    +    

    快速开始

    集成 YukiHookAPI 到你的项目中。

    环境要求

    • Windows 7 及以上/macOS 10.14 及以上/Linux 发行版(Arch/Debian)

    • Android Studio 2021.1 及以上

    • IntelliJ IDEA 2021.1 及以上

    • Kotlin 1.7.0 及以上

    • Android Gradle Plugin 7.0 及以上

    • Gradle 7.0 及以上

    • Jvm 11 及以上 (Since API 1.0.80)

    自动构建项目

    YukiHookAPI 提供了一个自动化构建工具,它可以帮助你快速构建一个拥有 Xposed 模块依赖的 Android 标准项目模板,使用构建好的模板即可直接开始下一步工作。

    你可以 点击这里 进行查看。

    手动配置项目

    若你不想使用自动化构建工具,你依然可以按照以下方式手动配置项目依赖。

    创建项目

    使用 Android StudioIntelliJ IDEA 创建新的 Android 项目,并在 Language 一栏选择 Kotlin 以自动添加基础依赖。

    集成依赖

    在你的项目 build.gradle 中添加依赖。

    示例如下

    repositories {
         google()
         mavenCentral()
         // ❗若你的 Plugin 版本过低,作为 Xposed 模块使用务必添加,其它情况可选
    @@ -73,18 +73,21 @@
         android:name="xposedminversion"
         android:value="93" />
     
    -<!-- 可选:配置支持 New XSharePrefs 可无需调整 xposedminversion 为 93 -->
    +<!-- 可选:配置支持 New XSharedPreferences 可无需调整 xposedminversion 为 93 -->
     <meta-data
         android:name="xposedsharedprefs"
         android:value="true"/>
     

    在你的项目中创建一个 Hook 入口类,继承于 IYukiHookXposedInit 并加入注解 @InjectYukiHookWithXposed

    示例如下

    @InjectYukiHookWithXposed
    -class HookEntry : IYukiHookXposedInit {
    +object HookEntry : IYukiHookXposedInit {
     
         override fun onHook() = YukiHookAPI.encase {
             // Your code here.
         }
     }
    -

    建议

    你可以将你的模块 APP 的 Application 继承于 ModuleApplication 以实现完整使用体验。

    更多功能请参考 ModuleApplication

    然后,你就可以开始编写 Hook 代码了。

    有关作为 Xposed 模块使用的相关配置详细内容,你可以 点击这里 继续阅读。

    若你目前正在使用 Xposed API,你可以参考 从 Xposed API 迁移

    作为 Hook API 使用

    集成方式

    创建你的自定义 Application

    特别注意

    无论使用任何 Hook Framework,你都需要加入其对接的 Xposed 依赖支持。

    若目标 Hook Framework 没有集成 Xposed API 你需要自行实现并对接 XposedBridge

    attachBaseContext 中添加 YukiHookAPI.encase 方法。

    示例如下

    override fun attachBaseContext(base: Context?) {
    +

    建议

    请在 onInit 方法中配置 YukiHookAPI 并将 isDebug 模式设置为如下形式。

    示例如下

    override fun onInit() = configs {
    +    isDebug = BuildConfig.DEBUG
    +}
    +

    YukiHookAPI 默认会打印所有用于调试的日志,若作为发布版本请务必关闭调试功能防止对用户设备造成大量日志填充。

    你还可以将你的模块 APP 的 Application 继承于 ModuleApplication 以实现完整使用体验。

    更多功能请参考 ModuleApplication

    然后,你就可以开始编写 Hook 代码了。

    有关作为 Xposed 模块使用的相关配置详细内容,你可以 点击这里 继续阅读。

    若你目前正在使用 Xposed API,你可以参考 从 Xposed API 迁移

    作为 Hook API 使用

    集成方式

    创建你的自定义 Application

    特别注意

    无论使用任何 Hook Framework,你都需要加入其对接的 Xposed 依赖支持。

    若目标 Hook Framework 没有集成 Xposed API 你需要自行实现并对接 XposedBridge

    attachBaseContext 中添加 YukiHookAPI.encase 方法。

    示例如下

    override fun attachBaseContext(base: Context?) {
         // 装载 Hook Framework
         //
         // Your code here.
    @@ -95,7 +98,7 @@
         }
         super.attachBaseContext(base)
     }
    -

    然后,你就可以开始编写 Hook 代码了,方式与作为 Xposed 模块使用基本一致。

    有关作为 Hook API 使用的相关配置详细内容,你可以 点击这里 继续阅读。

    注意

    使用自定义的 Hook 框架而并非完整的 Xposed 模块时,YukiHookModuleStatusYukiHookModulePrefsYukiHookDataChannel 以及 Resources Hook 功能将失效。

    - +

    然后,你就可以开始编写 Hook 代码了,方式与作为 Xposed 模块使用基本一致。

    有关作为 Hook API 使用的相关配置详细内容,你可以 点击这里 继续阅读。

    注意

    使用自定义的 Hook Framework 而并非完整的 Xposed 模块时,YukiHookModuleStatusYukiHookModulePrefsYukiHookDataChannel 以及 Resources Hook 功能将失效。

    + diff --git a/docs/zh-cn/index.html b/docs/zh-cn/index.html index 593c19947..77db24b72 100644 --- a/docs/zh-cn/index.html +++ b/docs/zh-cn/index.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - 首页 | Yuki Hook API - + 首页 | Yuki Hook API + -
    Yuki Hook API

    Yuki Hook API

    一个使用 Kotlin 重构的轻量、高效、稳定的 Xposed Hook API

    快速上手 更新日志

    Xposed 模块开发

    自动构建程序可以帮你快速创建一个 Xposed 模块,完全省去配置入口类和 xposed_init 文件。

    轻量优雅

    拥有一套强大、优雅、人性化、完全使用 Kotlin lambda 打造的 API,可以帮你快速实现字节码的查找以及方法 Hook。

    高效调试

    拥有丰富的调试日志功能,细到每个 Hook 方法的名称、所在类以及查找耗时,可进行快速调试和排错。

    方便移植

    原生支持 Xposed API 用法,并原生对接 Xposed API,拥有 Xposed API 的 Hook 框架都能进行快速对接。

    支持混淆

    构建的 Xposed 模块原生支持 R8 压缩优化混淆,混淆不会破坏 Hook 入口点,R8 下无需任何其它配置。

    快速上手

    简单易用,不需要繁琐的配置,不需要十足的开发经验,搭建环境集成依赖即可立即开始使用。

    所有 Hook 流程一步到位,拒绝繁琐

    loadApp(name = "com.android.browser") {
    +    
    Yuki Hook API

    Yuki Hook API

    一个使用 Kotlin 构建的高效 Hook API 与 Xposed 模块解决方案

    快速上手 更新日志

    Xposed 模块开发

    自动构建程序可以帮你快速创建一个 Xposed 模块,完全省去配置入口类和 xposed_init 文件。

    轻量优雅

    拥有一套强大、优雅、人性化、完全使用 Kotlin lambda 打造的 API,可以帮你快速实现字节码的查找以及方法 Hook。

    高效调试

    拥有丰富的调试日志功能,细到每个 Hook 方法的名称、所在类以及查找耗时,可进行快速调试和排错。

    方便移植

    原生支持 Xposed API 用法,并原生对接 Xposed API,拥有 Xposed API 的 Hook Framework 都能进行快速对接。

    支持混淆

    构建的 Xposed 模块原生支持 R8 压缩优化混淆,混淆不会破坏 Hook 入口点,R8 下无需任何其它配置。

    快速上手

    简单易用,不需要繁琐的配置,不需要十足的开发经验,搭建环境集成依赖即可立即开始使用。

    所有 Hook 流程一步到位,拒绝繁琐

    loadApp(name = "com.android.browser") {
         ActivityClass.hook {
             injectMember {
                 method {
    @@ -52,7 +52,7 @@
             }
         }
     }
    -
    - +
    + diff --git a/docs/zh-cn/tools/yukihookapi-projectbuilder.html b/docs/zh-cn/tools/yukihookapi-projectbuilder.html index 2788d152e..8d46f4799 100644 --- a/docs/zh-cn/tools/yukihookapi-projectbuilder.html +++ b/docs/zh-cn/tools/yukihookapi-projectbuilder.html @@ -22,12 +22,12 @@ document.documentElement.classList.toggle('dark', true); } - YukiHookAPI 构建工具 | Yuki Hook API - + YukiHookAPI 构建工具 | Yuki Hook API + -

    YukiHookAPI 构建工具

    这是一个使用 YukiHookAPI 作为核心的 Xposed 模块自动构建工具。

    实现自动化搜索依赖快速搭建一个包含 Xposed 模块环境的 Android 项目模板。

    获取项目

    本项目完全开源免费,且会根据大家的使用情况持续维护,初代版本可能存在不完善或 BUG,欢迎反馈。

    项目地址 YukiHookAPI-ProjectBuilder在新窗口中打开

    若你想直接下载可以 点击这里在新窗口中打开 前往 Release 发布地址。

    使用方法

    这里包含了基本的使用方法和功能讲解。

    基本用法

    • 软件使用过程需要当前设备已连接互联网,若项目依赖无法搜索请尝试 科学上网

    • 启动软件后,对你期望创建的项目进行简单配置,点击右下角的 按钮 或菜单栏选择 项目 > 开始创建 即可开始任务。

    • 等待依赖自动搜索完成后,你可以对项目依赖进行配置,建议使用最新依赖保证项目的稳定性,构建工具也仅对最新依赖进行支持。

    • 选择你需要创建项目的目录,开始后项目会在你选择的位置中创建,并等待整个过程完成,项目就创建好了。

    配置模板

    配置模板是一个扩展功能,你可以选择菜单栏 项目 > 配置模板 > 新建模板,即可使用当前填写的配置创建一份模板,下次可以从 已保存的模板 中重新载入模板,即可还原当前配置。

    多语言支持

    软件语言跟随当前系统,你可以在菜单栏 语言 (Language) 一栏手动选择软件的界面语言。

    - +

    YukiHookAPI 构建工具

    这是一个使用 YukiHookAPI 作为核心的 Xposed 模块自动构建工具。

    实现自动化搜索依赖快速搭建一个包含 Xposed 模块环境的 Android 项目模板。

    获取项目

    本项目完全开源免费,且会根据大家的使用情况持续维护,初代版本可能存在不完善或 BUG,欢迎反馈。

    项目地址 YukiHookAPI-ProjectBuilder在新窗口中打开

    若你想直接下载可以 点击这里在新窗口中打开 前往 Release 发布地址。

    使用方法

    这里包含了基本的使用方法和功能讲解。

    基本用法

    • 软件使用过程需要当前设备已连接互联网,若项目依赖无法搜索请尝试 科学上网

    • 启动软件后,对你期望创建的项目进行简单配置,点击右下角的 按钮 或菜单栏选择 项目 > 开始创建 即可开始任务。

    • 等待依赖自动搜索完成后,你可以对项目依赖进行配置,建议使用最新依赖保证项目的稳定性,构建工具也仅对最新依赖进行支持。

    • 选择你需要创建项目的目录,开始后项目会在你选择的位置中创建,并等待整个过程完成,项目就创建好了。

    配置模板

    配置模板是一个扩展功能,你可以选择菜单栏 项目 > 配置模板 > 新建模板,即可使用当前填写的配置创建一份模板,下次可以从 已保存的模板 中重新载入模板,即可还原当前配置。

    多语言支持

    软件语言跟随当前系统,你可以在菜单栏 语言 (Language) 一栏手动选择软件的界面语言。

    +