mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
...
This commit is contained in:
@@ -35,10 +35,13 @@ import com.highcapable.yukihookapi.YukiHookAPI.configs
|
|||||||
import com.highcapable.yukihookapi.YukiHookAPI.encase
|
import com.highcapable.yukihookapi.YukiHookAPI.encase
|
||||||
import com.highcapable.yukihookapi.annotation.DoNotUseMethod
|
import com.highcapable.yukihookapi.annotation.DoNotUseMethod
|
||||||
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
|
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.hasClass
|
||||||
import com.highcapable.yukihookapi.hook.factory.processName
|
import com.highcapable.yukihookapi.hook.factory.processName
|
||||||
|
import com.highcapable.yukihookapi.hook.log.loggerE
|
||||||
import com.highcapable.yukihookapi.hook.param.PackageParam
|
import com.highcapable.yukihookapi.hook.param.PackageParam
|
||||||
import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper
|
import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper
|
||||||
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
|
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
|
||||||
|
import de.robv.android.xposed.XposedBridge
|
||||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,7 +124,9 @@ object YukiHookAPI {
|
|||||||
* @param initiate Hook 方法体
|
* @param initiate Hook 方法体
|
||||||
*/
|
*/
|
||||||
fun encase(initiate: PackageParam.() -> Unit) {
|
fun encase(initiate: PackageParam.() -> Unit) {
|
||||||
packageParamCallback = initiate
|
if (hasXposedBridge)
|
||||||
|
packageParamCallback = initiate
|
||||||
|
else printNoXposedBridge()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -130,11 +135,13 @@ object YukiHookAPI {
|
|||||||
* @throws IllegalStateException 如果 [hooker] 是空的
|
* @throws IllegalStateException 如果 [hooker] 是空的
|
||||||
*/
|
*/
|
||||||
fun encase(vararg hooker: YukiBaseHooker) {
|
fun encase(vararg hooker: YukiBaseHooker) {
|
||||||
packageParamCallback = {
|
if (hasXposedBridge)
|
||||||
if (hooker.isNotEmpty())
|
packageParamCallback = {
|
||||||
hooker.forEach { it.assignInstance(packageParam = this) }
|
if (hooker.isNotEmpty())
|
||||||
else error("Hooker is empty")
|
hooker.forEach { it.assignInstance(packageParam = this) }
|
||||||
}
|
else error("Hooker is empty")
|
||||||
|
}
|
||||||
|
else printNoXposedBridge()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -173,7 +180,9 @@ object YukiHookAPI {
|
|||||||
* @param initiate Hook 方法体
|
* @param initiate Hook 方法体
|
||||||
*/
|
*/
|
||||||
fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit) {
|
fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit) {
|
||||||
if (baseContext != null) initiate.invoke(baseContext.packagePararm)
|
if (hasXposedBridge)
|
||||||
|
(if (baseContext != null) initiate.invoke(baseContext.packagePararm))
|
||||||
|
else printNoXposedBridge()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -209,16 +218,27 @@ object YukiHookAPI {
|
|||||||
* @throws IllegalStateException 如果 [hooker] 是空的
|
* @throws IllegalStateException 如果 [hooker] 是空的
|
||||||
*/
|
*/
|
||||||
fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker) {
|
fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker) {
|
||||||
if (baseContext != null)
|
if (hasXposedBridge)
|
||||||
if (hooker.isNotEmpty())
|
(if (baseContext != null)
|
||||||
hooker.forEach { it.assignInstance(packageParam = baseContext.packagePararm) }
|
if (hooker.isNotEmpty())
|
||||||
else error("Hooker is empty")
|
hooker.forEach { it.assignInstance(packageParam = baseContext.packagePararm) }
|
||||||
|
else error("Hooker is empty"))
|
||||||
|
else printNoXposedBridge()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 输出找不到 [XposedBridge] 的错误日志 */
|
||||||
|
private fun printNoXposedBridge() = loggerE(msg = "Could not found XposedBridge in current space! Aborted")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过 baseContext 创建 Hook 入口类
|
* 通过 baseContext 创建 Hook 入口类
|
||||||
* @return [PackageParam]
|
* @return [PackageParam]
|
||||||
*/
|
*/
|
||||||
private val Context.packagePararm
|
private val Context.packagePararm
|
||||||
get() = PackageParam(PackageParamWrapper(packageName, processName, classLoader, applicationInfo))
|
get() = PackageParam(PackageParamWrapper(packageName, processName, classLoader, applicationInfo))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否存在 [XposedBridge]
|
||||||
|
* @return [Boolean]
|
||||||
|
*/
|
||||||
|
internal val hasXposedBridge get() = ("de.robv.android.xposed.XposedBridge").hasClass
|
||||||
}
|
}
|
@@ -79,6 +79,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla
|
|||||||
*/
|
*/
|
||||||
@DoNotUseMethod
|
@DoNotUseMethod
|
||||||
fun hook() {
|
fun hook() {
|
||||||
|
if (!YukiHookAPI.hasXposedBridge) return
|
||||||
if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted")
|
if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted")
|
||||||
hookMembers.forEach { (_, member) -> member.hook() }
|
hookMembers.forEach { (_, member) -> member.hook() }
|
||||||
}
|
}
|
||||||
@@ -296,6 +297,7 @@ class YukiHookCreater(private val packageParam: PackageParam, val hookClass: Cla
|
|||||||
*/
|
*/
|
||||||
@DoNotUseMethod
|
@DoNotUseMethod
|
||||||
fun hook() {
|
fun hook() {
|
||||||
|
if (!YukiHookAPI.hasXposedBridge) return
|
||||||
/** 定义替换 Hook 回调方法体 */
|
/** 定义替换 Hook 回调方法体 */
|
||||||
val replaceMent = object : XC_MethodReplacement() {
|
val replaceMent = object : XC_MethodReplacement() {
|
||||||
override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? {
|
override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? {
|
||||||
|
@@ -40,6 +40,18 @@ import java.lang.reflect.Method
|
|||||||
*/
|
*/
|
||||||
val String.clazz: Class<*> get() = Class.forName(this)
|
val String.clazz: Class<*> get() = Class.forName(this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过字符串查找类是否存在
|
||||||
|
* @return [Boolean] 是否存在
|
||||||
|
*/
|
||||||
|
val String.hasClass
|
||||||
|
get() = try {
|
||||||
|
clazz
|
||||||
|
true
|
||||||
|
} catch (_: Throwable) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查找方法是否存在
|
* 查找方法是否存在
|
||||||
* @param name 名称
|
* @param name 名称
|
||||||
|
Reference in New Issue
Block a user