mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Added HookCallback when catch the throwable make it throw to app function
This commit is contained in:
@@ -429,13 +429,17 @@ inline fun HookParam.injectMember(priority: Int, tag: String, initiate: MemberHo
|
||||
#### beforeHook [method]
|
||||
|
||||
```kotlin
|
||||
fun beforeHook(initiate: HookParam.() -> Unit)
|
||||
fun beforeHook(initiate: HookParam.() -> Unit): HookCallback
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0` `添加`
|
||||
|
||||
`v1.0.93` `修改`
|
||||
|
||||
新增 `HookCallback` 返回类型
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 在方法执行完成前 Hook。
|
||||
@@ -443,13 +447,17 @@ fun beforeHook(initiate: HookParam.() -> Unit)
|
||||
#### afterHook [method]
|
||||
|
||||
```kotlin
|
||||
fun afterHook(initiate: HookParam.() -> Unit)
|
||||
fun afterHook(initiate: HookParam.() -> Unit): HookCallback
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0` `添加`
|
||||
|
||||
`v1.0.93` `修改`
|
||||
|
||||
新增 `HookCallback` 返回类型
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 在方法执行完成后 Hook。
|
||||
@@ -562,6 +570,34 @@ fun removeSelf(result: (Boolean) -> Unit)
|
||||
|
||||
!> 你只能在 Hook 回调方法中使用此功能。
|
||||
|
||||
#### HookCallback [class]
|
||||
|
||||
```kotlin
|
||||
inner class HookCallback internal constructor()
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.93` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> Hook 方法体回调实现类。
|
||||
|
||||
##### onFailureThrowToApp [method]
|
||||
|
||||
```kotlin
|
||||
fun onFailureThrowToApp()
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.93` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 当回调方法体内发生异常时将异常抛出给当前 Hook APP。
|
||||
|
||||
#### Result [class]
|
||||
|
||||
```kotlin
|
||||
|
@@ -348,6 +348,8 @@ injectMember {
|
||||
|
||||
> `YukiHookAPI` 重新设计了对异常的监听,任何异常都不会在 Hook 过程中抛出,避免打断下一个 Hook 流程导致 Hook 进程“死掉”。
|
||||
|
||||
### 监听异常
|
||||
|
||||
你可以处理 Hook 方法过程发生的异常。
|
||||
|
||||
> 示例如下
|
||||
@@ -408,6 +410,78 @@ method {
|
||||
|
||||
这里介绍了可能发生的常见异常,若要了解更多请参考 [API 异常处理](config/api-exception.md)。
|
||||
|
||||
### 抛出异常
|
||||
|
||||
在某些情况下,你可以**手动抛出异常**来达到提醒某些功能存在问题的目的。
|
||||
|
||||
上面已经介绍过,在 `hook` 方法体内抛出的异常会被 `YukiHookAPI` 接管,避免打断下一个 Hook 流程导致 Hook 进程“死掉”。
|
||||
|
||||
以下是 `YukiHookAPI` 接管时这些异常的运作方式。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
// <情景1>
|
||||
injectMember {
|
||||
throw RuntimeException("Exception Test")
|
||||
}.result {
|
||||
// 能够捕获到 RuntimeException
|
||||
onHookingFailure {}
|
||||
}
|
||||
// <情景2>
|
||||
injectMember {
|
||||
method {
|
||||
// ...
|
||||
}
|
||||
afterHook {
|
||||
throw RuntimeException("Exception Test")
|
||||
}
|
||||
}.result {
|
||||
// 能够捕获到 RuntimeException
|
||||
onConductFailure { param, throwable -> }
|
||||
}
|
||||
```
|
||||
|
||||
以上情景只会在 (Xposed) 宿主环境被处理,不会对宿主自身造成任何影响。
|
||||
|
||||
若我们想将这些异常直接抛给宿主,原生的 Xposed 为我们提供了 `param.throwable` 方法,`YukiHookAPI` 同样可以实现此功能。
|
||||
|
||||
若想在 Hook 回调方法中将一个异常直接抛给宿主,可以有如下实现方法。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
injectMember {
|
||||
method {
|
||||
// ...
|
||||
}
|
||||
afterHook {
|
||||
RuntimeException("Exception Test").throwToApp()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
你也可以直接在 Hook 回调方法中抛出异常,然后标识将异常抛给宿主。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
injectMember {
|
||||
method {
|
||||
// ...
|
||||
}
|
||||
afterHook {
|
||||
throw RuntimeException("Exception Test")
|
||||
}.onFailureThrowToApp()
|
||||
}
|
||||
```
|
||||
|
||||
以上两种方法均可在宿主接收到异常从而使宿主进程崩溃。
|
||||
|
||||
!> 为了保证 Hook 调用域与宿主内调用域相互隔离,异常只有在 `beforeHook` 与 `afterHook` 回调方法体中才能抛给宿主。
|
||||
|
||||
更多功能请参考 [HookCallback](api/document?id=hookcallback-class)。
|
||||
|
||||
## 状态监听
|
||||
|
||||
在使用 `XposedHelper` 的同学往往会在 Hook 后打印 `UnHook` 的方法确定是否 Hook 成功。
|
||||
@@ -532,7 +606,7 @@ if(YukiHookAPI.Status.isModuleActive) {
|
||||
|
||||
若要了解更多可 [点击这里](api/document?id=status-object) 进行查看。
|
||||
|
||||
!> 新版本的 API 修改了激活逻辑判断方式,现在你可以在模块与 Hook APP(宿主)中同时使用此 API。
|
||||
!> 新版本的 API 修改了激活逻辑判断方式,现在你可以在模块与 Hook APP (宿主) 中同时使用此 API。
|
||||
|
||||
!> 需要确保 `YukiHookAPI.Configs.isEnableHookModuleStatus` 是启用状态。
|
||||
|
||||
|
@@ -228,6 +228,9 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
/** 全部错误回调 */
|
||||
private var onAllFailureCallback: ((Throwable) -> Unit)? = null
|
||||
|
||||
/** 发生异常时是否将异常抛出给当前 Hook APP */
|
||||
private var isOnFailureThrowToApp = false
|
||||
|
||||
/** 是否为替换 Hook 模式 */
|
||||
private var isReplaceHookMode = false
|
||||
|
||||
@@ -390,10 +393,12 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
*
|
||||
* - 不可与 [replaceAny]、[replaceUnit]、[replaceTo] 同时使用
|
||||
* @param initiate [HookParam] 方法体
|
||||
* @return [HookCallback]
|
||||
*/
|
||||
fun beforeHook(initiate: HookParam.() -> Unit) {
|
||||
fun beforeHook(initiate: HookParam.() -> Unit): HookCallback {
|
||||
isReplaceHookMode = false
|
||||
beforeHookCallback = initiate
|
||||
return HookCallback()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -401,10 +406,12 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
*
|
||||
* - 不可与 [replaceAny]、[replaceUnit]、[replaceTo] 同时使用
|
||||
* @param initiate [HookParam] 方法体
|
||||
* @return [HookCallback]
|
||||
*/
|
||||
fun afterHook(initiate: HookParam.() -> Unit) {
|
||||
fun afterHook(initiate: HookParam.() -> Unit): HookCallback {
|
||||
isReplaceHookMode = false
|
||||
afterHookCallback = initiate
|
||||
return HookCallback()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -584,6 +591,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
onConductFailureCallback?.invoke(param, it)
|
||||
onAllFailureCallback?.invoke(it)
|
||||
if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(it)
|
||||
if (isOnFailureThrowToApp) wrapper.throwable = it
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -598,6 +606,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
onConductFailureCallback?.invoke(param, it)
|
||||
onAllFailureCallback?.invoke(it)
|
||||
if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(it)
|
||||
if (isOnFailureThrowToApp) wrapper.throwable = it
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -650,6 +659,17 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
|
||||
override fun toString() = "[tag] $tag [priority] $priority [class] $hookClass [members] $members"
|
||||
|
||||
/**
|
||||
* Hook 方法体回调实现类
|
||||
*/
|
||||
inner class HookCallback internal constructor() {
|
||||
|
||||
/** 当回调方法体内发生异常时将异常抛出给当前 Hook APP */
|
||||
fun onFailureThrowToApp() {
|
||||
isOnFailureThrowToApp = true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 监听 Hook 结果实现类
|
||||
*
|
||||
|
Reference in New Issue
Block a user