Fix some bugs

This commit is contained in:
2022-04-01 01:07:02 +08:00
parent 7028a8d75f
commit 6e415715eb
3 changed files with 28 additions and 15 deletions

View File

@@ -383,7 +383,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
val replaceMent = object : XC_MethodReplacement() {
override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? {
if (baseParam == null) return null
return HookParam(HookParamWrapper(baseParam)).let { param ->
return HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).let { param ->
try {
if (replaceHookCallback != null)
onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]")
@@ -402,7 +402,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
val beforeAfterHook = object : XC_MethodHook() {
override fun beforeHookedMethod(baseParam: MethodHookParam?) {
if (baseParam == null) return
HookParam(HookParamWrapper(baseParam)).also { param ->
HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param ->
runCatching {
beforeHookCallback?.invoke(param)
if (beforeHookCallback != null)
@@ -417,7 +417,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
override fun afterHookedMethod(baseParam: MethodHookParam?) {
if (baseParam == null) return
HookParam(HookParamWrapper(baseParam)).also { param ->
HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param ->
runCatching {
afterHookCallback?.invoke(param)
if (afterHookCallback != null)

View File

@@ -29,6 +29,7 @@
package com.highcapable.yukihookapi.hook.param
import com.highcapable.yukihookapi.hook.core.YukiHookCreater
import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper
import java.lang.reflect.Constructor
import java.lang.reflect.Member
@@ -36,9 +37,10 @@ import java.lang.reflect.Method
/**
* Hook 方法、构造类的目标对象实现类
* @param createrInstance [YukiHookCreater] 的实例对象
* @param wrapper [HookParam] 的参数包装类实例
*/
class HookParam(private val wrapper: HookParamWrapper) {
class HookParam(private val createrInstance: YukiHookCreater, private val wrapper: HookParamWrapper) {
/**
* 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组
@@ -62,16 +64,18 @@ class HookParam(private val wrapper: HookParamWrapper) {
/**
* 获取当前 Hook 实例的对象
*
* - ❗如果你当前 Hook 的对象是一个静态 - 那么它将不存在实例的对象
* @return [Any]
* @throws IllegalStateException 如果对象为空
*/
val instance get() = wrapper.instance ?: error("HookParam must with a non-null instance")
val instance get() = wrapper.instance ?: error("HookParam instance got null,Is this a static member?")
/**
* 获取当前 Hook 实例的类对象
* @return [Class]
*/
val instanceClass get() = instance.javaClass
val instanceClass get() = wrapper.instance?.javaClass ?: createrInstance.instanceClass
/**
* 获取当前 Hook 对象的方法

View File

@@ -136,6 +136,8 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* 通过字符串转换为实体类
*
* - 使用当前 [appClassLoader] 装载目标 [Class]
*
* - 若要使用指定的 [ClassLoader] 装载 - 请手动调用 [classOf] 方法
* @return [Class]
* @throws NoClassDefFoundError 如果找不到 [Class]
*/
@@ -165,13 +167,13 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
/**
* 通过字符串查找类是否存在
*
* - 使用当前 [appClassLoader] 装载目标 [Class]
* - 默认使用当前 [appClassLoader] 装载目标 [Class]
* @return [Boolean] 是否存在
*/
val String.hasClass get() = hasClass(appClassLoader)
/**
* 通过 [appClassLoader] 查询并装载 [Class]
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
* @param name 类名
* @return [HookClass]
*/
@@ -182,7 +184,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
}
/**
* 通过 [appClassLoader] 查询并装载 [Class]
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
*
* 使用此方法查询将会取 [name] 其中命中存在的第一个 [Class] 作为结果
* @param name 可填入多个类名 - 自动匹配
@@ -194,32 +196,39 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* Hook 方法、构造类
*
* - ❗为防止任何字符串都被当做 [Class] 进行 Hook - 推荐优先使用 [findClass]
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiHookCreater.Result]
*/
fun String.hook(initiate: YukiHookCreater.() -> Unit) = findClass(name = this).hook(initiate)
fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
findClass(name = this).hook(isUseAppClassLoader, initiate)
/**
* Hook 方法、构造类
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiHookCreater.Result]
*/
fun Class<*>.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate)
fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
hookClass.hook(isUseAppClassLoader, initiate)
/**
* Hook 方法、构造类
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiHookCreater.Result]
*/
fun VariousClass.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate)
fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
hookClass.hook(isUseAppClassLoader, initiate)
/**
* Hook 方法、构造类
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiHookCreater.Result]
*/
fun HookClass.hook(initiate: YukiHookCreater.() -> Unit) =
YukiHookCreater(packageParam = thisParam, hookClass = bind()).apply(initiate).hook()
fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
YukiHookCreater(packageParam = thisParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook()
/**
* [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader]
@@ -235,7 +244,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
/**
* 将目标 [Class] 绑定到 [appClassLoader]
*
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 不能被装载 - 调用 [hook] 方法会自动绑定
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定
* @return [HookClass]
*/
private fun HookClass.bind() = try {