mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 17:55:24 +08:00
Added new functions to confirm the feature
This commit is contained in:
@@ -61,6 +61,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
*/
|
*/
|
||||||
enum class HookAllMembers { HOOK_ALL_METHODS, HOOK_ALL_CONSTRUCTORS, HOOK_NONE }
|
enum class HookAllMembers { HOOK_ALL_METHODS, HOOK_ALL_CONSTRUCTORS, HOOK_NONE }
|
||||||
|
|
||||||
|
/** 是否对当前 [YukiHookCreater] 禁止执行 Hook 操作 */
|
||||||
|
private var isDisableCreaterRunHook = false
|
||||||
|
|
||||||
/** 设置要 Hook 的方法、构造类 */
|
/** 设置要 Hook 的方法、构造类 */
|
||||||
private var hookMembers = HashMap<String, MemberHookCreater>()
|
private var hookMembers = HashMap<String, MemberHookCreater>()
|
||||||
|
|
||||||
@@ -99,12 +102,13 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
fun hook(): Result {
|
fun hook(): Result {
|
||||||
if (!YukiHookAPI.hasXposedBridge) return Result()
|
if (!YukiHookAPI.hasXposedBridge) return Result()
|
||||||
if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted")
|
if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted")
|
||||||
if (hookClass.instance != null) hookMembers.forEach { (_, member) -> member.hook() }
|
|
||||||
else Thread {
|
else Thread {
|
||||||
SystemClock.sleep(10)
|
SystemClock.sleep(10)
|
||||||
if (onHookClassNotFoundFailureCallback == null)
|
if (!isDisableCreaterRunHook && hookClass.instance != null) hookMembers.forEach { (_, member) -> member.hook() }
|
||||||
yLoggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable)
|
if (!isDisableCreaterRunHook && hookClass.instance == null)
|
||||||
else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found"))
|
if (onHookClassNotFoundFailureCallback == null)
|
||||||
|
yLoggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable)
|
||||||
|
else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found"))
|
||||||
}.start()
|
}.start()
|
||||||
return Result()
|
return Result()
|
||||||
}
|
}
|
||||||
@@ -126,6 +130,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
/** [replaceAny]、[replaceUnit]、[replaceTo] 等回调 */
|
/** [replaceAny]、[replaceUnit]、[replaceTo] 等回调 */
|
||||||
private var replaceHookCallback: (HookParam.() -> Any?)? = null
|
private var replaceHookCallback: (HookParam.() -> Any?)? = null
|
||||||
|
|
||||||
|
/** 找不到 [member] 出现错误回调 */
|
||||||
|
private var onNoSuchMemberFailureCallback: ((Throwable) -> Unit)? = null
|
||||||
|
|
||||||
/** Hook 过程中出现错误回调 */
|
/** Hook 过程中出现错误回调 */
|
||||||
private var onConductFailureCallback: ((HookParam, Throwable) -> Unit)? = null
|
private var onConductFailureCallback: ((HookParam, Throwable) -> Unit)? = null
|
||||||
|
|
||||||
@@ -144,6 +151,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
/** 标识是否已经设置了要 Hook 的 [member] */
|
/** 标识是否已经设置了要 Hook 的 [member] */
|
||||||
private var isHookMemberSetup = false
|
private var isHookMemberSetup = false
|
||||||
|
|
||||||
|
/** 是否对当前 [MemberHookCreater] 禁止执行 Hook 操作 */
|
||||||
|
private var isDisableMemberRunHook = false
|
||||||
|
|
||||||
/** 是否 Hook 全部方法以及类型 */
|
/** 是否 Hook 全部方法以及类型 */
|
||||||
private var hookAllMembers = HookAllMembers.HOOK_NONE
|
private var hookAllMembers = HookAllMembers.HOOK_NONE
|
||||||
|
|
||||||
@@ -350,7 +360,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
*/
|
*/
|
||||||
@DoNotUseMethod
|
@DoNotUseMethod
|
||||||
fun hook() {
|
fun hook() {
|
||||||
if (!YukiHookAPI.hasXposedBridge) return
|
if (!YukiHookAPI.hasXposedBridge || isDisableMemberRunHook) return
|
||||||
if (hookClass.instance == null) {
|
if (hookClass.instance == null) {
|
||||||
(hookClass.throwable ?: Throwable("HookClass [${hookClass.name}] not found")).also {
|
(hookClass.throwable ?: Throwable("HookClass [${hookClass.name}] not found")).also {
|
||||||
onHookingFailureCallback?.invoke(it)
|
onHookingFailureCallback?.invoke(it)
|
||||||
@@ -424,9 +434,10 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else Throwable("Finding Error isSetUpMember [$isHookMemberSetup] [$tag]").also {
|
else Throwable("Finding Error isSetUpMember [$isHookMemberSetup] [$tag]").also {
|
||||||
|
onNoSuchMemberFailureCallback?.invoke(it)
|
||||||
onHookingFailureCallback?.invoke(it)
|
onHookingFailureCallback?.invoke(it)
|
||||||
onAllFailureCallback?.invoke(it)
|
onAllFailureCallback?.invoke(it)
|
||||||
if (isNotIgnoredHookingFailure)
|
if (isNotIgnoredNoSuchMemberFailure)
|
||||||
yLoggerE(
|
yLoggerE(
|
||||||
msg = if (isHookMemberSetup)
|
msg = if (isHookMemberSetup)
|
||||||
"Hooked Member with a finding error by $hookClass [$tag]"
|
"Hooked Member with a finding error by $hookClass [$tag]"
|
||||||
@@ -447,8 +458,11 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
else -> error("Hooked got a no error possible")
|
else -> error("Hooked got a no error possible")
|
||||||
}
|
}
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
|
val isMemberNotFound = it.message?.lowercase()?.contains(other = "nosuch") == true
|
||||||
|
if (isMemberNotFound) onNoSuchMemberFailureCallback?.invoke(it)
|
||||||
onAllFailureCallback?.invoke(it)
|
onAllFailureCallback?.invoke(it)
|
||||||
if (isNotIgnoredHookingFailure) yLoggerE(msg = "Hooked All Members with an error in Class [$hookClass] [$tag]")
|
if ((isNotIgnoredHookingFailure && !isMemberNotFound) || (isNotIgnoredNoSuchMemberFailure && isMemberNotFound))
|
||||||
|
yLoggerE(msg = "Hooked All Members with an error in Class [$hookClass] [$tag]")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,7 +485,13 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
* 判断是否没有设置 Hook 过程中的任何异常拦截
|
* 判断是否没有设置 Hook 过程中的任何异常拦截
|
||||||
* @return [Boolean] 没有设置任何异常拦截
|
* @return [Boolean] 没有设置任何异常拦截
|
||||||
*/
|
*/
|
||||||
internal val isNotIgnoredHookingFailure get() = onHookingFailureCallback == null && onAllFailureCallback == null
|
private val isNotIgnoredHookingFailure get() = onHookingFailureCallback == null && onAllFailureCallback == null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否没有设置 Hook 过程中 [member] 找不到的任何异常拦截
|
||||||
|
* @return [Boolean] 没有设置任何异常拦截
|
||||||
|
*/
|
||||||
|
internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure
|
||||||
|
|
||||||
override fun toString() = "${hookClass.name}$member$tag#YukiHookAPI"
|
override fun toString() = "${hookClass.name}$member$tag#YukiHookAPI"
|
||||||
|
|
||||||
@@ -483,11 +503,40 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
inner class Result {
|
inner class Result {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建监听失败事件方法体
|
* 创建监听事件方法体
|
||||||
* @param initiate 方法体
|
* @param initiate 方法体
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun failures(initiate: Result.() -> Unit) = apply(initiate)
|
fun result(initiate: Result.() -> Unit) = apply(initiate)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加执行 Hook 需要满足的条件
|
||||||
|
*
|
||||||
|
* 不满足条件将直接停止 Hook
|
||||||
|
* @param initiate 条件方法体
|
||||||
|
* @return [Result] 可继续向下监听
|
||||||
|
*/
|
||||||
|
fun by(initiate: () -> Boolean): Result {
|
||||||
|
isDisableMemberRunHook = !initiate()
|
||||||
|
if (isDisableMemberRunHook) ignoredAllFailure()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听 [member] 不存在发生错误的回调方法
|
||||||
|
* @param initiate 回调错误
|
||||||
|
* @return [Result] 可继续向下监听
|
||||||
|
*/
|
||||||
|
fun onNoSuchMemberFailure(initiate: (Throwable) -> Unit): Result {
|
||||||
|
onNoSuchMemberFailureCallback = initiate
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 忽略 [member] 不存在发生的错误
|
||||||
|
* @return [Result] 可继续向下监听
|
||||||
|
*/
|
||||||
|
fun ignoredNoSuchMemberFailure() = onNoSuchMemberFailure {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监听 Hook 进行过程中发生错误的回调方法
|
* 监听 Hook 进行过程中发生错误的回调方法
|
||||||
@@ -547,11 +596,23 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
inner class Result {
|
inner class Result {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建监听失败事件方法体
|
* 创建监听事件方法体
|
||||||
* @param initiate 方法体
|
* @param initiate 方法体
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun failures(initiate: Result.() -> Unit) = apply(initiate)
|
fun result(initiate: Result.() -> Unit) = apply(initiate)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加执行 Hook 需要满足的条件
|
||||||
|
*
|
||||||
|
* 不满足条件将直接停止 Hook
|
||||||
|
* @param initiate 条件方法体
|
||||||
|
* @return [Result] 可继续向下监听
|
||||||
|
*/
|
||||||
|
fun by(initiate: () -> Boolean): Result {
|
||||||
|
isDisableCreaterRunHook = !initiate()
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监听 [hookClass] 找不到时发生错误的回调方法
|
* 监听 [hookClass] 找不到时发生错误的回调方法
|
||||||
@@ -567,6 +628,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
|
|||||||
* 忽略 [hookClass] 找不到时出现的错误
|
* 忽略 [hookClass] 找不到时出现的错误
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun ignoredHookClassNotFoundFailure() = onHookClassNotFoundFailure {}
|
fun ignoredHookClassNotFoundFailure(): Result {
|
||||||
|
by { hookClass.instance != null }
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -265,7 +265,7 @@ class ConstructorFinder(
|
|||||||
/**
|
/**
|
||||||
* 忽略任何错误发出的警告
|
* 忽略任何错误发出的警告
|
||||||
*
|
*
|
||||||
* - 若 [isNotIgnoredHookingFailure] 为 false 则自动忽略
|
* - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun ignoredError(): Result {
|
fun ignoredError(): Result {
|
||||||
|
@@ -91,7 +91,7 @@ class FieldFinder(
|
|||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
Thread {
|
Thread {
|
||||||
SystemClock.sleep(10)
|
SystemClock.sleep(10)
|
||||||
if (isNotIgnoredHookingFailure) yLoggerE(msg = "NoSuchField happend in [$classSet] [${hookTag}]", e = e)
|
if (isNotIgnoredNoSuchMemberFailure) yLoggerE(msg = "NoSuchField happend in [$classSet] [${hookTag}]", e = e)
|
||||||
}.start()
|
}.start()
|
||||||
Result(isNoSuch = true, e)
|
Result(isNoSuch = true, e)
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ class FieldFinder(
|
|||||||
/**
|
/**
|
||||||
* 忽略任何错误发出的警告
|
* 忽略任何错误发出的警告
|
||||||
*
|
*
|
||||||
* - 若 [isNotIgnoredHookingFailure] 为 false 则自动忽略
|
* - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun ignoredError(): Result {
|
fun ignoredError(): Result {
|
||||||
|
@@ -293,7 +293,7 @@ class MethodFinder(
|
|||||||
/**
|
/**
|
||||||
* 忽略任何错误发出的警告
|
* 忽略任何错误发出的警告
|
||||||
*
|
*
|
||||||
* - 若 [isNotIgnoredHookingFailure] 为 false 则自动忽略
|
* - 若 [isNotIgnoredNoSuchMemberFailure] 为 false 则自动忽略
|
||||||
* @return [Result] 可继续向下监听
|
* @return [Result] 可继续向下监听
|
||||||
*/
|
*/
|
||||||
fun ignoredError(): Result {
|
fun ignoredError(): Result {
|
||||||
|
@@ -63,10 +63,10 @@ abstract class BaseFinder(
|
|||||||
internal val hookTag get() = hookInstance?.tag ?: "FinderMode"
|
internal val hookTag get() = hookInstance?.tag ?: "FinderMode"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否没有设置 Hook 过程中的任何异常拦截
|
* 判断是否没有设置 Hook 过程中 方法、构造类、变量 找不到的任何异常拦截
|
||||||
* @return [Boolean] 没有设置任何异常拦截
|
* @return [Boolean] 没有设置任何异常拦截
|
||||||
*/
|
*/
|
||||||
internal val isNotIgnoredHookingFailure get() = hookInstance?.isNotIgnoredHookingFailure ?: true
|
internal val isNotIgnoredNoSuchMemberFailure get() = hookInstance?.isNotIgnoredNoSuchMemberFailure ?: true
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发生错误时输出日志
|
* 发生错误时输出日志
|
||||||
@@ -79,7 +79,7 @@ abstract class BaseFinder(
|
|||||||
if (isAlwaysPrint) print()
|
if (isAlwaysPrint) print()
|
||||||
else Thread {
|
else Thread {
|
||||||
SystemClock.sleep(10)
|
SystemClock.sleep(10)
|
||||||
if (isNotIgnoredHookingFailure && !isUsingRemedyPlan && !isShutErrorPrinting) print()
|
if (isNotIgnoredNoSuchMemberFailure && !isUsingRemedyPlan && !isShutErrorPrinting) print()
|
||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user