refactor: move xposed module status function to auto generator

This commit is contained in:
2023-10-05 00:36:55 +08:00
parent 922907fa0f
commit da26016630
6 changed files with 42 additions and 34 deletions

View File

@@ -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
/**

View File

@@ -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
)

View File

@@ -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()
}

View File

@@ -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 },

View File

@@ -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,

View File

@@ -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
)