mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 18:55:35 +08:00
Merge document file
This commit is contained in:
@@ -18,33 +18,33 @@
|
||||
|
||||
## 语言要求
|
||||
|
||||
请使用 `Kotlin`,框架部分代码构成同样兼容 `Java` 但基础 Hook 场景的实现<b>可能完全无法使用</b>。
|
||||
请使用 `Kotlin`,框架部分代码构成同样兼容 `Java` 但基础 Hook 场景的实现**可能完全无法使用**。
|
||||
|
||||
文档全部的 Demo 示例代码都将使用 `Kotlin` 进行描述,如果你完全不会使用 `Kotlin` 那你将有可能无法使用 `YukiHookAPI`。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- <b>Xposed 模块开发</b>
|
||||
- **Xposed 模块开发**
|
||||
|
||||
自动构建程序可以帮你快速创建一个 Xposed 模块,完全省去配置入口类和 `xposed_init` 文件。
|
||||
|
||||
- <b>轻量优雅</b>
|
||||
- **轻量优雅**
|
||||
|
||||
拥有一套强大、优雅和人性化的 `Kotlin Lambda Hook API`,可以帮你快速实现 `Method`、`Constructor`、`Field` 的查找以及 Hook。
|
||||
|
||||
- <b>高效调试</b>
|
||||
- **高效调试**
|
||||
|
||||
拥有丰富的调试日志功能,细到每个 Hook 方法的名称、所在类以及查找耗时,可进行快速调试和排错。
|
||||
|
||||
- <b>方便移植</b>
|
||||
- **方便移植**
|
||||
|
||||
原生支持 Xposed API 用法,并原生对接 Xposed API,拥有 Xposed API 的 Hook 框架都能快速对接 Yuki Hook API。
|
||||
|
||||
- <b>支持混淆</b>
|
||||
- **支持混淆**
|
||||
|
||||
使用 `YukiHookAPI` 构建的 Xposed 模块原生支持 R8 压缩优化混淆,混淆不会破坏 Hook 入口点,R8 下无需任何其它配置。
|
||||
|
||||
- <b>快速上手</b>
|
||||
- **快速上手**
|
||||
|
||||
简单易用,不需要繁琐的配置,不需要十足的开发经验,搭建环境集成依赖即可立即开始使用。
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
自 `Kotlin` 作为 Android 主要开发语言以来,这套 API 用起来确实已经不是很优雅了。
|
||||
|
||||
有没有什么 <b>好用、轻量、优雅</b> 的解决办法呢?
|
||||
有没有什么 **好用、轻量、优雅** 的解决办法呢?
|
||||
|
||||
本着这样的想法,`YukiHookAPI` 诞生了。
|
||||
|
||||
|
@@ -25,15 +25,15 @@ Xposed Framework
|
||||
|
||||
我们可以在宿主(APP)运行时通过注入宿主(APP)来达到控制其行为的最终目的。
|
||||
|
||||
Xposed 的这种运行方式被称为<b>寄生</b>,Xposed 模块跟随宿主的生命周期,在宿主的生命周期内完成自己的生命历程。
|
||||
Xposed 的这种运行方式被称为**寄生**,Xposed 模块跟随宿主的生命周期,在宿主的生命周期内完成自己的生命历程。
|
||||
|
||||
我们可以通过反射的方式调用宿主的方法、变量、构造方法,以及使用 `XposedBridge` 所提供的 Hook 操作动态地在宿主(APP)要执行的方法前后插入自己的代码,或完全替换目标,甚至是拦截。
|
||||
|
||||
## 发展过程
|
||||
|
||||
如今的 Xposed 管理器已完全被其衍生作品替代,而 <b>SuperSU</b> 的时代也已经落幕了,现在,借助 <b>Magisk</b> 使后面的一切又成为了可能。
|
||||
如今的 Xposed 管理器已完全被其衍生作品替代,而 **SuperSU** 的时代也已经落幕了,现在,借助 **Magisk** 使后面的一切又成为了可能。
|
||||
|
||||
> 其发展史大致可分为 <b>Xposed(Dalvik)</b> → <b>Xposed(ART)</b> → <b>Xposed(Magisk)</b> → <b>EdXposed(Riru)</b>/<b>LSPosed(Riru/Zygisk)</b>
|
||||
> 其发展史大致可分为 **Xposed(Dalvik)** → **Xposed(ART)** → **Xposed(Magisk)** → **EdXposed(Riru)**/**LSPosed(Riru/Zygisk)**
|
||||
|
||||
## 衍生产品
|
||||
|
||||
@@ -46,13 +46,13 @@ App's Environment
|
||||
...
|
||||
```
|
||||
|
||||
通过 Xposed 的运行原理,从而衍生了很多同类型框架,随着当今时代的移动设备获取 Root 权限甚至刷机越来越困难且不是刚需的时候,一些免 Root 框架也随之产生,例如<b>太极</b>。
|
||||
通过 Xposed 的运行原理,从而衍生了很多同类型框架,随着当今时代的移动设备获取 Root 权限甚至刷机越来越困难且不是刚需的时候,一些免 Root 框架也随之产生,例如**太极**。
|
||||
|
||||
这些在 ART 层面上的 Hook 框架同样也可不借助 Xposed API 完成其和 Xposed 原理一样的 Hook 流程,免 Root 的运行原理为修改 APK 并将 Hook 进程注入宿主,通过外部模块对其进行控制。
|
||||
|
||||
另外一种产品就是利用 Android 运行环境现有的功能虚拟出一个完全与当前设备系统一样的环境,并在其中运行 APP,这个就是虚拟 APP 技术 <b>VirtualApp</b>,后来衍生为 <b>VirtualXposed</b>。
|
||||
另外一种产品就是利用 Android 运行环境现有的功能虚拟出一个完全与当前设备系统一样的环境,并在其中运行 APP,这个就是虚拟 APP 技术 **VirtualApp**,后来衍生为 **VirtualXposed**。
|
||||
|
||||
上述提到的免 Root 框架分别为<b>太极/无极</b>、<b>VirtualXposed/SandVXposed</b>。
|
||||
上述提到的免 Root 框架分别为**太极/无极**、**VirtualXposed/SandVXposed**。
|
||||
|
||||
## YukiHookAPI 做了什么
|
||||
|
||||
|
@@ -61,7 +61,7 @@ dependencies {
|
||||
}
|
||||
```
|
||||
|
||||
请将 <b><version></b> 修改为 [这里](about/changelog) 的最新版本。
|
||||
请将 **<version>** 修改为 [这里](about/changelog) 的最新版本。
|
||||
|
||||
!> `YukiHookAPI` 的 `api` 与 `ksp-xposed` 依赖的版本必须一一对应,否则将会造成版本不匹配错误。
|
||||
|
||||
|
@@ -157,7 +157,7 @@ Test::class.java.method {
|
||||
}.get(instance).string() // 得到方法的结果
|
||||
```
|
||||
|
||||
是的,对于确切不会变化的方法,你可以精简查询条件,<b>`YukiHookAPI` 会默认按照字节码顺序匹配第一个查询到的结果</b>。
|
||||
是的,对于确切不会变化的方法,你可以精简查询条件,**`YukiHookAPI` 会默认按照字节码顺序匹配第一个查询到的结果**。
|
||||
|
||||
问题又来了,这个 `Class` 中有一个 `release` 方法,但是它的方法参数好长,而且很多的类型都无法直接得到。
|
||||
|
||||
@@ -578,7 +578,7 @@ method {
|
||||
|
||||
#### 必要的查询条件
|
||||
|
||||
!> 在方法、构造方法查询条件中,<u><b>即使是无参的方法也需要设置查询条件</b></u>。
|
||||
!> 在方法、构造方法查询条件中,<u>**即使是无参的方法也需要设置查询条件**</u>。
|
||||
|
||||
假设我们有如下的 `Class`。
|
||||
|
||||
@@ -607,13 +607,13 @@ TestFoo::class.java.method {
|
||||
}
|
||||
```
|
||||
|
||||
但是,上面的例子<u><b>是错误的</b></u>。
|
||||
但是,上面的例子<u>**是错误的**</u>。
|
||||
|
||||
你会发现这个 `Class` 中有两个 `foo` 方法,其中一个带有方法参数。
|
||||
|
||||
由于上述例子没有设置 `param` 的查询条件,得到的结果将会是匹配名称且匹配字节码顺序的第一个方法 `public void foo(String string)`,而不是我们需要的最后一个方法。
|
||||
|
||||
这是一个<b>经常会出现的错误</b>,<b>没有方法参数就会丢失方法参数查询条件</b>的使用问题。
|
||||
这是一个**经常会出现的错误**,**没有方法参数就会丢失方法参数查询条件**的使用问题。
|
||||
|
||||
正确的使用方法如下。
|
||||
|
||||
@@ -687,7 +687,7 @@ field {
|
||||
}
|
||||
```
|
||||
|
||||
在 Java 中常见的基本类型都已被封装为 <b>类型 + Type</b> 的方式,例如 `IntType`、`FloatType`。
|
||||
在 Java 中常见的基本类型都已被封装为 **类型 + Type** 的方式,例如 `IntType`、`FloatType`。
|
||||
|
||||
相应地,数组类型也有方便的使用方法,假设我们要获得 `String[]` 类型的数组。
|
||||
|
||||
@@ -697,7 +697,7 @@ field {
|
||||
|
||||
同时由于 `String` 是常见类型,所以还可以直接使用 `StringArrayClass` 来得到这个类型。
|
||||
|
||||
一些常见的 Hook 中查询的方法,都有其对应的封装类型以供使用,格式为 <b>类型 + Class</b>。
|
||||
一些常见的 Hook 中查询的方法,都有其对应的封装类型以供使用,格式为 **类型 + Class**。
|
||||
|
||||
例如 Hook `onCreate` 方法需要查询 `Bundle::class.java` 类型。
|
||||
|
||||
|
Reference in New Issue
Block a user