Modify auto matched Class<*> instance in PackageParam and changed some function

This commit is contained in:
2022-07-31 01:26:04 +08:00
parent 8f68ca5de7
commit 2c389dd49a
8 changed files with 143 additions and 115 deletions

View File

@@ -33,7 +33,11 @@ package com.highcapable.yukihookapi.hook.bean
* @param name 完整名称
* @param throwable 异常
*/
class HookClass internal constructor(var instance: Class<*>? = null, var name: String, var throwable: Throwable? = null) {
class HookClass internal constructor(
@PublishedApi internal var instance: Class<*>? = null,
@PublishedApi internal var name: String,
@PublishedApi internal var throwable: Throwable? = null
) {
override fun toString() = "[class] $name [throwable] $throwable [instance] $instance"
}

View File

@@ -30,7 +30,6 @@
package com.highcapable.yukihookapi.hook.factory
import com.highcapable.yukihookapi.hook.bean.CurrentClass
import com.highcapable.yukihookapi.hook.bean.HookClass
import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder
import com.highcapable.yukihookapi.hook.core.finder.FieldFinder
import com.highcapable.yukihookapi.hook.core.finder.MethodFinder
@@ -43,26 +42,6 @@ import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
/**
* [Class] 转换为 [HookClass]
* @return [HookClass]
*/
val Class<*>.hookClass get() = HookClass(instance = this, name)
/**
* [HookClass] 转换为 [Class]
* @return [Class] or null
*/
val HookClass.normalClass get() = instance
/**
* 通过字符串查找类是否存在
*
* - ❗仅限使用当前的 [ClassLoader]
* @return [Boolean] 是否存在
*/
val String.hasClass get() = hasClass(loader = null)
/**
* 当前 [Class] 是否有继承关系 - 父类是 [Any] 将被认为没有继承关系
* @return [Boolean]
@@ -94,10 +73,10 @@ fun classOf(name: String, loader: ClassLoader? = null): Class<*> {
/**
* 通过字符串查找类是否存在
* @param loader [Class] 所在的 [ClassLoader]
* @param loader [Class] 所在的 [ClassLoader] - 不填使用默认 [ClassLoader]
* @return [Boolean] 是否存在
*/
fun String.hasClass(loader: ClassLoader?) = try {
fun String.hasClass(loader: ClassLoader? = null) = try {
classOf(name = this, loader)
true
} catch (_: Throwable) {

View File

@@ -45,7 +45,6 @@ import com.highcapable.yukihookapi.hook.core.YukiResourcesHookCreater
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.classOf
import com.highcapable.yukihookapi.hook.factory.hasClass
import com.highcapable.yukihookapi.hook.factory.hookClass
import com.highcapable.yukihookapi.hook.param.type.HookEntryType
import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper
import com.highcapable.yukihookapi.hook.utils.value
@@ -318,68 +317,76 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper:
/**
* 通过字符串查找类是否存在
*
* - 默认使用当前 [appClassLoader] 装载目标 [Class]
* - 使用当前 [appClassLoader] 装载目标 [Class]
* @return [Boolean] 是否存在
*/
val String.hasClass get() = hasClass(appClassLoader)
/**
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
* 查找并装载 [Class]
*
* - ❗使用此方法会得到一个 [HookClass] 仅用于 Hook - 若想查找 [Class] 请使用 [classOf]、[clazz] 功能
* @param name 类名
* @param loader 当前 [ClassLoader] - 默认使用 [appClassLoader] - 设为 null 使用默认 [ClassLoader]
* @return [HookClass]
*/
fun findClass(name: String) = try {
name.clazz.hookClass
fun findClass(name: String, loader: ClassLoader? = appClassLoader) = try {
classOf(name, loader).hookClass
} catch (e: Throwable) {
HookClass(name = name, throwable = e)
}
/**
* 默认使用当前 [appClassLoader] 查询并装载 [Class]
* 查找并装载 [Class]
*
* 使用此方法查将会取 [name] 其中命中存在的第一个 [Class] 作为结果
* 使用此方法查将会取 [name] 其中命中存在的第一个 [Class] 作为结果
*
* - ❗使用此方法会得到一个 [HookClass] 仅用于 Hook - 若想查找 [Class] 请使用 [classOf]、[clazz] 功能
* @param name 可填入多个类名 - 自动匹配
* @return [VariousClass]
* @param loader 当前 [ClassLoader] - 默认使用 [appClassLoader] - 设为 null 使用默认 [ClassLoader]
* @return [HookClass]
*/
fun findClass(vararg name: String) = VariousClass(*name)
fun findClass(vararg name: String, loader: ClassLoader? = appClassLoader) = VariousClass(*name).hookClass(loader)
/**
* Hook 方法、构造方法
*
* - 使用当前 [appClassLoader] 装载目标 [Class]
*
* - ❗为防止任何字符串都被当做 [Class] 进行 Hook - 推荐优先使用 [findClass]
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiMemberHookCreater.Result]
*/
inline fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiMemberHookCreater.() -> Unit) =
findClass(name = this).hook(isUseAppClassLoader, initiate)
inline fun String.hook(initiate: YukiMemberHookCreater.() -> Unit) = findClass(name = this).hook(initiate)
/**
* Hook 方法、构造方法
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
*
* - 自动选择与当前 [Class] 相匹配的 [ClassLoader] - 优先使用 [appClassLoader]
* @param initiate 方法体
* @return [YukiMemberHookCreater.Result]
*/
inline fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiMemberHookCreater.() -> Unit) =
hookClass.hook(isUseAppClassLoader, initiate)
inline fun Class<*>.hook(initiate: YukiMemberHookCreater.() -> Unit) = when {
name.hasClass(appClassLoader) -> findClass(name)
else -> hookClass
}.hook(initiate)
/**
* Hook 方法、构造方法
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
*
* - 使用当前 [appClassLoader] 装载目标 [Class]
* @param initiate 方法体
* @return [YukiMemberHookCreater.Result]
*/
inline fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiMemberHookCreater.() -> Unit) =
hookClass(if (isUseAppClassLoader) appClassLoader else null).hook(isUseAppClassLoader, initiate)
inline fun VariousClass.hook(initiate: YukiMemberHookCreater.() -> Unit) = hookClass(appClassLoader).hook(initiate)
/**
* Hook 方法、构造方法
* @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用
* @param initiate 方法体
* @return [YukiMemberHookCreater.Result]
*/
inline fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiMemberHookCreater.() -> Unit) =
YukiMemberHookCreater(packageParam = this@PackageParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook()
inline fun HookClass.hook(initiate: YukiMemberHookCreater.() -> Unit) =
YukiMemberHookCreater(packageParam = this@PackageParam, hookClass = this).apply(initiate).hook()
/**
* Hook APP 的 Resources
@@ -391,7 +398,7 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper:
YukiResourcesHookCreater(packageParam = this@PackageParam, hookResources = this).apply(initiate).hook()
/**
* [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader]
* [VariousClass] 转换为 [HookClass]
* @param loader 当前 [ClassLoader] - 若留空使用默认 [ClassLoader]
* @return [HookClass]
*/
@@ -403,17 +410,12 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper:
}
/**
* 将目标 [Class] 绑定到 [appClassLoader]
*
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定
* [Class] 转换为 [HookClass]
* @return [HookClass]
*/
@PublishedApi
internal fun HookClass.bind() = try {
name.clazz.hookClass
} catch (e: Throwable) {
HookClass(name = name, throwable = throwable ?: e)
}
internal val Class<*>.hookClass
get() = HookClass(instance = this, name)
/**
* 当前 Hook APP 的生命周期实例处理类

View File

@@ -180,7 +180,7 @@ object YukiHookBridge {
* @return [Boolean] 是否存在
*/
private fun isMiuiCatcherPatch(packageName: String?) =
(packageName == "com.miui.contentcatcher" || packageName == "com.miui.catcherpatch") && ("android.miui.R").hasClass
(packageName == "com.miui.contentcatcher" || packageName == "com.miui.catcherpatch") && ("android.miui.R").hasClass()
/**
* 当前包名是否已在指定的 [HookEntryType] 被装载