From da260166302d8fe1a915ff366a8cd0cb365b2382 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Thu, 5 Oct 2023 00:36:55 +0800 Subject: [PATCH] refactor: move xposed module status function to auto generator --- .../highcapable/yukihookapi/YukiHookAPI.kt | 21 +++++++------- .../xposed/InjectYukiHookWithXposed.kt | 2 ++ .../bridge/status/YukiXposedModuleStatus.kt | 20 ++++++------- .../hook/xposed/parasitic/AppParasitics.kt | 1 - .../yukihookapi/YukiHookXposedProcessor.kt | 28 +++++++++++-------- .../yukihookapi/bean/GenerateData.kt | 4 ++- 6 files changed, 42 insertions(+), 34 deletions(-) diff --git a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/YukiHookAPI.kt b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/YukiHookAPI.kt index 5db1d101..70839022 100644 --- a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/YukiHookAPI.kt +++ b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/YukiHookAPI.kt @@ -148,7 +148,7 @@ object YukiHookAPI { * * - 在模块环境中你需要将 [Application] 继承于 [ModuleApplication] * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * * - 在 (Xposed) 宿主环境中仅返回非 [isTaiChiModuleActive] 的激活状态 * @return [Boolean] 是否激活 @@ -158,7 +158,7 @@ object YukiHookAPI { /** * 仅判断模块是否在 Xposed 中激活 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * * - 在 (Xposed) 宿主环境中始终返回 true * @return [Boolean] 是否激活 @@ -178,7 +178,7 @@ object YukiHookAPI { /** * 判断当前 Hook Framework 是否支持资源钩子(Resources Hook) * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * * - 在 (Xposed) 宿主环境中可能会延迟等待事件回调后才会返回 true * @@ -196,7 +196,7 @@ object YukiHookAPI { /** * 获取当前 Hook Framework 名称 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * @return [String] 无法获取会返回 unknown - 获取失败会返回 invalid */ val name @@ -209,7 +209,7 @@ object YukiHookAPI { /** * 获取当前 Hook Framework 类型 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * @return [ExecutorType] */ val type get() = HookApiProperty.type.takeIf { isXposedEnvironment } ?: HookApiProperty.type(YukiXposedModuleStatus.executorName) @@ -217,7 +217,7 @@ object YukiHookAPI { /** * 获取当前 Hook Framework 的 API 版本 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * @return [Int] 无法获取会返回 -1 */ val apiLevel get() = HookApiProperty.apiLevel.takeIf { isXposedEnvironment } ?: YukiXposedModuleStatus.executorApiLevel @@ -225,7 +225,7 @@ object YukiHookAPI { /** * 获取当前 Hook Framework 版本名称 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * @return [String] 无法获取会返回 unknown - 不支持会返回 unsupported */ val versionName get() = HookApiProperty.versionName.takeIf { isXposedEnvironment } ?: YukiXposedModuleStatus.executorVersionName @@ -233,7 +233,7 @@ object YukiHookAPI { /** * 获取当前 Hook Framework 版本号 * - * - 在模块环境中需要启用 [Configs.isEnableHookModuleStatus] + * - 在模块环境中需要启用 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] * @return [Int] 无法获取会返回 -1 - 不支持会返回 0 */ val versionCode get() = HookApiProperty.versionCode.takeIf { isXposedEnvironment } ?: YukiXposedModuleStatus.executorVersionCode @@ -322,10 +322,11 @@ object YukiHookAPI { /** * 是否启用 Hook Xposed 模块激活等状态功能 * - * - 为原生支持 Xposed 模块激活状态检测 - 此功能默认启用 + * - 此方法已弃用 - 在之后的版本中将直接被删除 * - * - 关闭后你将不能再在模块环境中使用 [YukiHookAPI.Status] 中的功能 + * - 请现在迁移到 [InjectYukiHookWithXposed.isUsingXposedModuleStatus] */ + @Deprecated(message = "请手动迁移到新用法") var isEnableHookModuleStatus = true /** diff --git a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.kt b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.kt index eacdccb2..15a7bb48 100644 --- a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.kt +++ b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/annotation/xposed/InjectYukiHookWithXposed.kt @@ -56,6 +56,7 @@ import de.robv.android.xposed.IXposedHookInitPackageResources * @param sourcePath 你的项目 source 相对路径 - 默认为 ..src/main.. * @param modulePackageName 模块包名 - 不填默认自动生成 * @param entryClassName 定义 [YukiHookAPI] 自动生成 Xposed 模块入口类的名称 - 不填默认使用 "入口类名_YukiHookXposedInit" 进行生成 + * @param isUsingXposedModuleStatus 是否启用 Xposed 模块激活等状态功能 (自动 Hook 模块自身实现状态检测) - 默认是 * @param isUsingResourcesHook 是否启用 Resources Hook (资源钩子) - 启用后将自动注入 [IXposedHookInitPackageResources] - 默认否 */ @Target(AnnotationTarget.CLASS) @@ -63,5 +64,6 @@ annotation class InjectYukiHookWithXposed( val sourcePath: String = "src/main", val modulePackageName: String = "", val entryClassName: String = "", + val isUsingXposedModuleStatus: Boolean = true, val isUsingResourcesHook: Boolean = false ) \ No newline at end of file diff --git a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiXposedModuleStatus.kt b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiXposedModuleStatus.kt index 30be6095..bb17eb37 100644 --- a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiXposedModuleStatus.kt +++ b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/bridge/status/YukiXposedModuleStatus.kt @@ -31,7 +31,7 @@ package com.highcapable.yukihookapi.hook.xposed.bridge.status import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.hook.core.finder.members.MethodFinder import com.highcapable.yukihookapi.hook.factory.method -import com.highcapable.yukihookapi.hook.factory.toClass +import com.highcapable.yukihookapi.hook.factory.toClassOrNull import com.highcapable.yukihookapi.hook.log.YLog /** @@ -70,7 +70,7 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态 * @return [Boolean] */ - internal val isActive get() = classMethod(IS_ACTIVE_METHOD_NAME).boolean() + internal val isActive get() = classMethod(IS_ACTIVE_METHOD_NAME)?.boolean() ?: false /** * 获取当前 Hook Framework 是否支持资源钩子 (Resources Hook) @@ -78,7 +78,7 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态 * @return [Boolean] */ - internal val isSupportResourcesHook get() = classMethod(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME).boolean() + internal val isSupportResourcesHook get() = classMethod(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME)?.boolean() ?: false /** * 获取当前 Hook Framework 名称 @@ -86,7 +86,7 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.Executor.name] 获取 * @return [String] 模块未激活会返回 unknown */ - internal val executorName get() = classMethod(GET_EXECUTOR_NAME_METHOD_NAME).string().ifBlank { "unknown" } + internal val executorName get() = classMethod(GET_EXECUTOR_NAME_METHOD_NAME)?.string()?.ifBlank { "unknown" } ?: "unknown" /** * 获取当前 Hook Framework 的 API 版本 @@ -94,7 +94,7 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.Executor.apiLevel] 获取 * @return [Int] 模块未激活会返回 -1 */ - internal val executorApiLevel get() = classMethod(GET_EXECUTOR_API_LEVEL_METHOD_NAME).int().takeIf { it > 0 } ?: -1 + internal val executorApiLevel get() = classMethod(GET_EXECUTOR_API_LEVEL_METHOD_NAME)?.int()?.takeIf { it > 0 } ?: -1 /** * 获取当前 Hook Framework 版本名称 @@ -102,7 +102,7 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.Executor.versionName] 获取 * @return [Int] 模块未激活会返回 unknown */ - internal val executorVersionName get() = classMethod(GET_EXECUTOR_VERSION_NAME_METHOD_NAME).string().ifBlank { "unknown" } + internal val executorVersionName get() = classMethod(GET_EXECUTOR_VERSION_NAME_METHOD_NAME)?.string()?.ifBlank { "unknown" } ?: "unknown" /** * 获取当前 Hook Framework 版本号 @@ -110,14 +110,14 @@ internal object YukiXposedModuleStatus { * 请使用 [YukiHookAPI.Status.Executor.versionCode] 获取 * @return [Int] 模块未激活会返回 -1 */ - internal val executorVersionCode get() = classMethod(GET_EXECUTOR_VERSION_CODE_METHOD_NAME).int().takeIf { it > 0 } ?: -1 + internal val executorVersionCode get() = classMethod(GET_EXECUTOR_VERSION_CODE_METHOD_NAME)?.int()?.takeIf { it > 0 } ?: -1 /** * 通过 [className] 获取方法实例 * @param name 方法名称 - * @return [MethodFinder.Result.Instance] + * @return [MethodFinder.Result.Instance] or null */ - private fun classMethod(name: String) = className.toClass().method { this.name = name }.ignored().onNoSuchMethod { + private fun classMethod(name: String) = className.toClassOrNull()?.method { this.name = name }?.ignored()?.onNoSuchMethod { YLog.innerW("Failed to initialize YukiXposedModuleStatus", it) - }.get() + }?.get() } \ No newline at end of file diff --git a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt index 49bebc7d..3c56787e 100644 --- a/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt +++ b/yukihookapi-core/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt @@ -227,7 +227,6 @@ internal object AppParasitics { if ((param.args?.get(0) as? String?)?.endsWith("preferences.xml") == true) param.args?.set(1, 1) } }) - if (YukiHookAPI.Configs.isEnableHookModuleStatus.not()) return YukiXposedModuleStatus.className.toClassOrNull(loader)?.apply { if (type != HookEntryType.RESOURCES) { YukiHookHelper.hook(method { name = YukiXposedModuleStatus.IS_ACTIVE_METHOD_NAME }, diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/YukiHookXposedProcessor.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/YukiHookXposedProcessor.kt index d3c54525..cb61550e 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/YukiHookXposedProcessor.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/YukiHookXposedProcessor.kt @@ -184,6 +184,8 @@ class YukiHookXposedProcessor : SymbolProcessorProvider { data.customMPackageName = args.value.toString().trim() if (args.name?.asString() == "entryClassName") data.xInitClassName = args.value.toString().trim() + if (args.name?.asString() == "isUsingXposedModuleStatus") + data.isUsingXposedModuleStatus = args.value as? Boolean ?: true if (args.name?.asString() == "isUsingResourcesHook") data.isUsingResourcesHook = args.value as? Boolean ?: true } @@ -274,18 +276,20 @@ class YukiHookXposedProcessor : SymbolProcessorProvider { packageName = PackageName.ModuleApplication_Impl, content = data.sources()[ClassName.ModuleApplication_Impl] ) - /** 插入 YukiXposedModuleStatus_Impl 代码 */ - createCodeFile( - fileName = ClassName.YukiXposedModuleStatus_Impl, - packageName = PackageName.YukiXposedModuleStatus_Impl, - content = data.sources()[ClassName.YukiXposedModuleStatus_Impl] - ) - /** 插入 YukiXposedModuleStatus_Impl_Impl 代码 */ - createCodeFile( - fileName = ClassName.YukiXposedModuleStatus_Impl_Impl, - packageName = PackageName.YukiXposedModuleStatus_Impl, - content = data.sources()[ClassName.YukiXposedModuleStatus_Impl_Impl] - ) + if (data.isUsingXposedModuleStatus) { + /** 插入 YukiXposedModuleStatus_Impl 代码 */ + createCodeFile( + fileName = ClassName.YukiXposedModuleStatus_Impl, + packageName = PackageName.YukiXposedModuleStatus_Impl, + content = data.sources()[ClassName.YukiXposedModuleStatus_Impl] + ) + /** 插入 YukiXposedModuleStatus_Impl_Impl 代码 */ + createCodeFile( + fileName = ClassName.YukiXposedModuleStatus_Impl_Impl, + packageName = PackageName.YukiXposedModuleStatus_Impl, + content = data.sources()[ClassName.YukiXposedModuleStatus_Impl_Impl] + ) + } /** 插入 HandlerDelegateImpl_Impl 代码 */ createCodeFile( fileName = ClassName.HandlerDelegateImpl_Impl, diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/bean/GenerateData.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/bean/GenerateData.kt index 82687f2e..13f71cdf 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/bean/GenerateData.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi/bean/GenerateData.kt @@ -35,6 +35,7 @@ package com.highcapable.yukihookapi.bean * @param entryClassName 入口类名 * @param xInitClassName xposed_init 入口类名 * @param isEntryClassKindOfObject 入口类种类 (类型) 是否为 object (单例) + * @param isUsingXposedModuleStatus 是否启用 Xposed 模块状态检测 * @param isUsingResourcesHook 是否启用 Resources Hook */ data class GenerateData( @@ -44,5 +45,6 @@ data class GenerateData( var entryClassName: String = "", var xInitClassName: String = "", var isEntryClassKindOfObject: Boolean = false, - var isUsingResourcesHook: Boolean = true + var isUsingXposedModuleStatus: Boolean = true, + var isUsingResourcesHook: Boolean = false ) \ No newline at end of file