diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt index 1acc2d5e..1fee751c 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt @@ -59,7 +59,7 @@ object ClassName { */ object YukiHookModuleStatusJvmName { 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_TAG_METHOD_NAME = "_-_-" } @@ -129,8 +129,8 @@ fun GenerateData.sources() = mapOf( " return false\n" + " }\n" + "\n" + - " @JvmName(\"${YukiHookModuleStatusJvmName.HAS_RESOURCES_HOOK_METHOD_NAME}\")\n" + - " fun hasResourcesHook(): Boolean {\n" + + " @JvmName(\"${YukiHookModuleStatusJvmName.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME}\")\n" + + " fun isSupportResourcesHook(): Boolean {\n" + " placeholderExecution()\n" + " return false\n" + " }\n" + diff --git a/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus_Impl.kt b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus_Impl.kt index 3347825f..f87912ac 100644 --- a/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus_Impl.kt +++ b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus_Impl.kt @@ -40,7 +40,7 @@ object YukiHookModuleStatus_Impl { private const val IS_ACTIVE_METHOD_NAME = "__--" /** 定义 Jvm 方法名 */ - private const val HAS_RESOURCES_HOOK_METHOD_NAME = "_--_" + private const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_" /** 定义 Jvm 方法名 */ private const val GET_XPOSED_VERSION_METHOD_NAME = "--__" @@ -58,13 +58,13 @@ object YukiHookModuleStatus_Impl { fun isActive(): Boolean = error("Stub!") /** - * 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子(Resources Hook) + * 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子 (Resources Hook) * * 返回值将在每次编译时自动生成 * @return [Boolean] */ - @JvmName(HAS_RESOURCES_HOOK_METHOD_NAME) - fun hasResourcesHook(): Boolean = error("Stub!") + @JvmName(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME) + fun isSupportResourcesHook(): Boolean = error("Stub!") /** * 此方法经过 Hook 后返回 [XposedBridge.getXposedVersion] diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt index 75cae9ea..d1c67b8b 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt @@ -108,7 +108,12 @@ object YukiHookAPI { * - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus] * @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 框架的版本 @@ -130,7 +135,7 @@ object YukiHookAPI { * - ❗在 (Xposed) 宿主环境中仅返回非 [isTaiChiModuleActive] 的激活状态 * @return [Boolean] 是否激活 */ - val isModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive() || isTaiChiModuleActive + val isModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive || isTaiChiModuleActive /** * 仅判断模块是否在 Xposed 中激活 @@ -140,7 +145,7 @@ object YukiHookAPI { * - ❗在 (Xposed) 宿主环境中始终返回 true * @return [Boolean] 是否激活 */ - val isXposedModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive() + val isXposedModuleActive get() = isXposedEnvironment || YukiHookModuleStatus.isActive /** * 仅判断模块是否在太极、无极中激活 @@ -163,7 +168,7 @@ object YukiHookAPI { * @return [Boolean] 是否支持 */ val isSupportResourcesHook - get() = YukiHookBridge.isSupportResourcesHook.takeIf { isXposedEnvironment } ?: YukiHookModuleStatus.hasResourcesHook() + get() = YukiHookBridge.isSupportResourcesHook.takeIf { isXposedEnvironment } ?: YukiHookModuleStatus.isSupportResourcesHook } /** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt index b17302cf..4e28df27 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt @@ -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.wrapper.PackageParamWrapper 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.parasitic.AppParasitics import dalvik.system.PathClassLoader @@ -128,7 +129,9 @@ object YukiHookBridge { */ internal val executorName get() = runCatching { - classOf().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().field { name = "TAG" }.ignored().get().string().takeIf { it.isNotBlank() } ?.replace("Bridge", "")?.replace("-", "")?.trim() ?: "unknown" }.getOrNull() ?: "invalid" diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus.kt index 9174098c..3d9ae803 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiHookModuleStatus.kt @@ -55,7 +55,7 @@ internal object YukiHookModuleStatus { internal const val IS_ACTIVE_METHOD_NAME = "__--" /** 定义 Jvm 方法名 */ - internal const val HAS_RESOURCES_HOOK_METHOD_NAME = "_--_" + internal const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_" /** 定义 Jvm 方法名 */ internal const val GET_XPOSED_VERSION_METHOD_NAME = "--__" @@ -63,6 +63,12 @@ internal object YukiHookModuleStatus { /** 定义 Jvm 方法名 */ 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] 完整类名 */ 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] 获取 * @return [String] 模块未激活会返回 unknown */ - internal val executorName - get() = runCatching { - YukiHookModuleStatus_Impl.getXposedBridgeTag().replace("Bridge", "").replace("-", "").trim() - }.getOrNull() ?: "unknown" + internal val executorName get() = runCatching { YukiHookModuleStatus_Impl.getXposedBridgeTag() }.getOrNull() ?: "unknown" /** * 获取当前 Hook 框架的版本 @@ -90,18 +93,18 @@ internal object YukiHookModuleStatus { internal val executorVersion get() = runCatching { YukiHookModuleStatus_Impl.getXposedVersion() }.getOrNull() ?: -1 /** - * 此方法经过 Hook 后返回 true 即模块已激活 + * 获取当前模块的激活状态 * * 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态 * @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] 判断支持状态 * @return [Boolean] */ - internal fun hasResourcesHook() = runCatching { YukiHookModuleStatus_Impl.hasResourcesHook() }.getOrNull() ?: false + internal val isSupportResourcesHook get() = runCatching { YukiHookModuleStatus_Impl.isSupportResourcesHook() }.getOrNull() ?: false } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt index 43ffad42..87f36d95 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt @@ -159,8 +159,8 @@ internal object AppParasitics { YukiHookHelper.hook(method { name = YukiHookModuleStatus.GET_XPOSED_VERSION_METHOD_NAME }, object : YukiMemberReplacement() { override fun replaceHookedMember(param: Param) = YukiHookBridge.executorVersion }) - } else - YukiHookHelper.hook(method { name = YukiHookModuleStatus.HAS_RESOURCES_HOOK_METHOD_NAME }, object : YukiMemberReplacement() { + } else YukiHookHelper.hook(method { name = YukiHookModuleStatus.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME }, + object : YukiMemberReplacement() { override fun replaceHookedMember(param: Param) = true }) }