Modify support TaiChi Xposed activation status and change activation status code in YukiHookModuleStatus

This commit is contained in:
2023-01-02 19:32:58 +08:00
parent 75bdc2d1cb
commit 0431a4378b
6 changed files with 34 additions and 23 deletions

View File

@@ -59,7 +59,7 @@ object ClassName {
*/ */
object YukiHookModuleStatusJvmName { object YukiHookModuleStatusJvmName {
const val IS_ACTIVE_METHOD_NAME = "__--" const val IS_ACTIVE_METHOD_NAME = "__--"
const val HAS_RESOURCES_HOOK_METHOD_NAME = "_--_" const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_"
const val GET_XPOSED_VERSION_METHOD_NAME = "--__" const val GET_XPOSED_VERSION_METHOD_NAME = "--__"
const val GET_XPOSED_TAG_METHOD_NAME = "_-_-" const val GET_XPOSED_TAG_METHOD_NAME = "_-_-"
} }
@@ -129,8 +129,8 @@ fun GenerateData.sources() = mapOf(
" return false\n" + " return false\n" +
" }\n" + " }\n" +
"\n" + "\n" +
" @JvmName(\"${YukiHookModuleStatusJvmName.HAS_RESOURCES_HOOK_METHOD_NAME}\")\n" + " @JvmName(\"${YukiHookModuleStatusJvmName.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME}\")\n" +
" fun hasResourcesHook(): Boolean {\n" + " fun isSupportResourcesHook(): Boolean {\n" +
" placeholderExecution()\n" + " placeholderExecution()\n" +
" return false\n" + " return false\n" +
" }\n" + " }\n" +

View File

@@ -40,7 +40,7 @@ object YukiHookModuleStatus_Impl {
private const val IS_ACTIVE_METHOD_NAME = "__--" private const val IS_ACTIVE_METHOD_NAME = "__--"
/** 定义 Jvm 方法名 */ /** 定义 Jvm 方法名 */
private const val HAS_RESOURCES_HOOK_METHOD_NAME = "_--_" private const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_"
/** 定义 Jvm 方法名 */ /** 定义 Jvm 方法名 */
private const val GET_XPOSED_VERSION_METHOD_NAME = "--__" private const val GET_XPOSED_VERSION_METHOD_NAME = "--__"
@@ -58,13 +58,13 @@ object YukiHookModuleStatus_Impl {
fun isActive(): Boolean = error("Stub!") fun isActive(): Boolean = error("Stub!")
/** /**
* 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子(Resources Hook) * 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子 (Resources Hook)
* *
* 返回值将在每次编译时自动生成 * 返回值将在每次编译时自动生成
* @return [Boolean] * @return [Boolean]
*/ */
@JvmName(HAS_RESOURCES_HOOK_METHOD_NAME) @JvmName(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME)
fun hasResourcesHook(): Boolean = error("Stub!") fun isSupportResourcesHook(): Boolean = error("Stub!")
/** /**
* 此方法经过 Hook 后返回 [XposedBridge.getXposedVersion] * 此方法经过 Hook 后返回 [XposedBridge.getXposedVersion]

View File

@@ -108,7 +108,12 @@ object YukiHookAPI {
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus] * - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
* @return [String] 无法获取会返回 unknown - [YukiHookBridge.hasXposedBridge] 不存在会返回 invalid * @return [String] 无法获取会返回 unknown - [YukiHookBridge.hasXposedBridge] 不存在会返回 invalid
*/ */
val executorName get() = YukiHookBridge.executorName.takeIf { isXposedEnvironment } ?: YukiHookModuleStatus.executorName val executorName
get() = YukiHookBridge.executorName.takeIf { isXposedEnvironment } ?: when {
isXposedModuleActive -> YukiHookModuleStatus.executorName
isTaiChiModuleActive -> YukiHookModuleStatus.TAICHI_XPOSED_NAME
else -> YukiHookModuleStatus.executorName
}
/** /**
* 获取当前 Hook 框架的版本 * 获取当前 Hook 框架的版本
@@ -130,7 +135,7 @@ object YukiHookAPI {
* - ❗在 (Xposed) 宿主环境中仅返回非 [isTaiChiModuleActive] 的激活状态 * - ❗在 (Xposed) 宿主环境中仅返回非 [isTaiChiModuleActive] 的激活状态
* @return [Boolean] 是否激活 * @return [Boolean] 是否激活
*/ */
val isModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive() || isTaiChiModuleActive val isModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive || isTaiChiModuleActive
/** /**
* 仅判断模块是否在 Xposed 中激活 * 仅判断模块是否在 Xposed 中激活
@@ -140,7 +145,7 @@ object YukiHookAPI {
* - ❗在 (Xposed) 宿主环境中始终返回 true * - ❗在 (Xposed) 宿主环境中始终返回 true
* @return [Boolean] 是否激活 * @return [Boolean] 是否激活
*/ */
val isXposedModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive() val isXposedModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive
/** /**
* 仅判断模块是否在太极、无极中激活 * 仅判断模块是否在太极、无极中激活
@@ -163,7 +168,7 @@ object YukiHookAPI {
* @return [Boolean] 是否支持 * @return [Boolean] 是否支持
*/ */
val isSupportResourcesHook val isSupportResourcesHook
get() = YukiHookBridge.isSupportResourcesHook.takeIf { isXposedEnvironment } ?: YukiHookModuleStatus.hasResourcesHook() get() = YukiHookBridge.isSupportResourcesHook.takeIf { isXposedEnvironment } ?: YukiHookModuleStatus.isSupportResourcesHook
} }
/** /**

View File

@@ -40,6 +40,7 @@ import com.highcapable.yukihookapi.hook.param.PackageParam
import com.highcapable.yukihookapi.hook.param.type.HookEntryType import com.highcapable.yukihookapi.hook.param.type.HookEntryType
import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper
import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiResources import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiResources
import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper
import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics
import dalvik.system.PathClassLoader import dalvik.system.PathClassLoader
@@ -128,7 +129,9 @@ object YukiHookBridge {
*/ */
internal val executorName internal val executorName
get() = runCatching { get() = runCatching {
classOf<XposedBridge>().field { name = "TAG" }.ignored().get().string().takeIf { it.isNotBlank() } if (YukiHookModuleStatus.EXPOSED_BRIDGE_CLASS_NAME.hasClass(YukiHookAppHelper.currentApplication()?.classLoader))
YukiHookModuleStatus.TAICHI_XPOSED_NAME
else classOf<XposedBridge>().field { name = "TAG" }.ignored().get().string().takeIf { it.isNotBlank() }
?.replace("Bridge", "")?.replace("-", "")?.trim() ?: "unknown" ?.replace("Bridge", "")?.replace("-", "")?.trim() ?: "unknown"
}.getOrNull() ?: "invalid" }.getOrNull() ?: "invalid"

View File

@@ -55,7 +55,7 @@ internal object YukiHookModuleStatus {
internal const val IS_ACTIVE_METHOD_NAME = "__--" internal const val IS_ACTIVE_METHOD_NAME = "__--"
/** 定义 Jvm 方法名 */ /** 定义 Jvm 方法名 */
internal const val HAS_RESOURCES_HOOK_METHOD_NAME = "_--_" internal const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_"
/** 定义 Jvm 方法名 */ /** 定义 Jvm 方法名 */
internal const val GET_XPOSED_VERSION_METHOD_NAME = "--__" internal const val GET_XPOSED_VERSION_METHOD_NAME = "--__"
@@ -63,6 +63,12 @@ internal object YukiHookModuleStatus {
/** 定义 Jvm 方法名 */ /** 定义 Jvm 方法名 */
internal const val GET_XPOSED_TAG_METHOD_NAME = "_-_-" internal const val GET_XPOSED_TAG_METHOD_NAME = "_-_-"
/** TaiChi Xposed 框架名称 */
internal const val TAICHI_XPOSED_NAME = "TaiChi"
/** TaiChi ExposedBridge 完整类名 */
internal const val EXPOSED_BRIDGE_CLASS_NAME = "me.weishu.exposed.ExposedBridge"
/** [YukiHookModuleStatus_Impl] 完整类名 */ /** [YukiHookModuleStatus_Impl] 完整类名 */
internal const val IMPL_CLASS_NAME = "com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus_Impl" internal const val IMPL_CLASS_NAME = "com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus_Impl"
@@ -74,10 +80,7 @@ internal object YukiHookModuleStatus {
* 请使用 [YukiHookAPI.Status.executorName] 获取 * 请使用 [YukiHookAPI.Status.executorName] 获取
* @return [String] 模块未激活会返回 unknown * @return [String] 模块未激活会返回 unknown
*/ */
internal val executorName internal val executorName get() = runCatching { YukiHookModuleStatus_Impl.getXposedBridgeTag() }.getOrNull() ?: "unknown"
get() = runCatching {
YukiHookModuleStatus_Impl.getXposedBridgeTag().replace("Bridge", "").replace("-", "").trim()
}.getOrNull() ?: "unknown"
/** /**
* 获取当前 Hook 框架的版本 * 获取当前 Hook 框架的版本
@@ -90,18 +93,18 @@ internal object YukiHookModuleStatus {
internal val executorVersion get() = runCatching { YukiHookModuleStatus_Impl.getXposedVersion() }.getOrNull() ?: -1 internal val executorVersion get() = runCatching { YukiHookModuleStatus_Impl.getXposedVersion() }.getOrNull() ?: -1
/** /**
* 此方法经过 Hook 后返回 true 即模块激活 * 获取当前模块激活状态
* *
* 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态 * 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态
* @return [Boolean] * @return [Boolean]
*/ */
internal fun isActive() = runCatching { YukiHookModuleStatus_Impl.isActive() }.getOrNull() ?: false internal val isActive get() = runCatching { YukiHookModuleStatus_Impl.isActive() }.getOrNull() ?: false
/** /**
* 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子(Resources Hook) * 获取当前 Hook Framework 是否支持资源钩子 (Resources Hook)
* *
* 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态 * 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态
* @return [Boolean] * @return [Boolean]
*/ */
internal fun hasResourcesHook() = runCatching { YukiHookModuleStatus_Impl.hasResourcesHook() }.getOrNull() ?: false internal val isSupportResourcesHook get() = runCatching { YukiHookModuleStatus_Impl.isSupportResourcesHook() }.getOrNull() ?: false
} }

View File

@@ -159,8 +159,8 @@ internal object AppParasitics {
YukiHookHelper.hook(method { name = YukiHookModuleStatus.GET_XPOSED_VERSION_METHOD_NAME }, object : YukiMemberReplacement() { YukiHookHelper.hook(method { name = YukiHookModuleStatus.GET_XPOSED_VERSION_METHOD_NAME }, object : YukiMemberReplacement() {
override fun replaceHookedMember(param: Param) = YukiHookBridge.executorVersion override fun replaceHookedMember(param: Param) = YukiHookBridge.executorVersion
}) })
} else } else YukiHookHelper.hook(method { name = YukiHookModuleStatus.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME },
YukiHookHelper.hook(method { name = YukiHookModuleStatus.HAS_RESOURCES_HOOK_METHOD_NAME }, object : YukiMemberReplacement() { object : YukiMemberReplacement() {
override fun replaceHookedMember(param: Param) = true override fun replaceHookedMember(param: Param) = true
}) })
} }