mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 02:35:40 +08:00
refactor: make YukiXposedModuleStatus anonymous
This commit is contained in:
@@ -29,6 +29,10 @@
|
|||||||
package com.highcapable.yukihookapi.hook.xposed.bridge.status
|
package com.highcapable.yukihookapi.hook.xposed.bridge.status
|
||||||
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
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.log.YLog
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 这是一个 Xposed 模块 Hook 状态类
|
* 这是一个 Xposed 模块 Hook 状态类
|
||||||
@@ -54,8 +58,11 @@ internal object YukiXposedModuleStatus {
|
|||||||
internal const val GET_EXECUTOR_VERSION_NAME_METHOD_NAME = "-_-_"
|
internal const val GET_EXECUTOR_VERSION_NAME_METHOD_NAME = "-_-_"
|
||||||
internal const val GET_EXECUTOR_VERSION_CODE_METHOD_NAME = "___-"
|
internal const val GET_EXECUTOR_VERSION_CODE_METHOD_NAME = "___-"
|
||||||
|
|
||||||
/** [YukiXposedModuleStatus_Impl] 完整类名 */
|
/**
|
||||||
internal const val IMPL_CLASS_NAME = "com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiXposedModuleStatus_Impl"
|
* 获取 YukiXposedModuleStatus 完整类名
|
||||||
|
* @return [String]
|
||||||
|
*/
|
||||||
|
internal val className get() = runCatching { YukiXposedModuleStatus_Impl.className }.getOrNull() ?: ""
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前模块的激活状态
|
* 获取当前模块的激活状态
|
||||||
@@ -63,7 +70,7 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态
|
* 请使用 [YukiHookAPI.Status.isModuleActive]、[YukiHookAPI.Status.isXposedModuleActive]、[YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态
|
||||||
* @return [Boolean]
|
* @return [Boolean]
|
||||||
*/
|
*/
|
||||||
internal val isActive get() = runCatching { YukiXposedModuleStatus_Impl.isActive() }.getOrNull() ?: false
|
internal val isActive get() = classMethod(IS_ACTIVE_METHOD_NAME).boolean()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前 Hook Framework 是否支持资源钩子 (Resources Hook)
|
* 获取当前 Hook Framework 是否支持资源钩子 (Resources Hook)
|
||||||
@@ -71,7 +78,7 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态
|
* 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态
|
||||||
* @return [Boolean]
|
* @return [Boolean]
|
||||||
*/
|
*/
|
||||||
internal val isSupportResourcesHook get() = runCatching { YukiXposedModuleStatus_Impl.isSupportResourcesHook() }.getOrNull() ?: false
|
internal val isSupportResourcesHook get() = classMethod(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME).boolean()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前 Hook Framework 名称
|
* 获取当前 Hook Framework 名称
|
||||||
@@ -79,7 +86,7 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.Executor.name] 获取
|
* 请使用 [YukiHookAPI.Status.Executor.name] 获取
|
||||||
* @return [String] 模块未激活会返回 unknown
|
* @return [String] 模块未激活会返回 unknown
|
||||||
*/
|
*/
|
||||||
internal val executorName get() = runCatching { YukiXposedModuleStatus_Impl.getExecutorName() }.getOrNull() ?: "unknown"
|
internal val executorName get() = classMethod(GET_EXECUTOR_NAME_METHOD_NAME).string().ifBlank { "unknown" }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前 Hook Framework 的 API 版本
|
* 获取当前 Hook Framework 的 API 版本
|
||||||
@@ -87,7 +94,7 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.Executor.apiLevel] 获取
|
* 请使用 [YukiHookAPI.Status.Executor.apiLevel] 获取
|
||||||
* @return [Int] 模块未激活会返回 -1
|
* @return [Int] 模块未激活会返回 -1
|
||||||
*/
|
*/
|
||||||
internal val executorApiLevel get() = runCatching { YukiXposedModuleStatus_Impl.getExecutorApiLevel() }.getOrNull() ?: -1
|
internal val executorApiLevel get() = classMethod(GET_EXECUTOR_API_LEVEL_METHOD_NAME).int().takeIf { it > 0 } ?: -1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前 Hook Framework 版本名称
|
* 获取当前 Hook Framework 版本名称
|
||||||
@@ -95,7 +102,7 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.Executor.versionName] 获取
|
* 请使用 [YukiHookAPI.Status.Executor.versionName] 获取
|
||||||
* @return [Int] 模块未激活会返回 unknown
|
* @return [Int] 模块未激活会返回 unknown
|
||||||
*/
|
*/
|
||||||
internal val executorVersionName get() = runCatching { YukiXposedModuleStatus_Impl.getExecutorVersionName() }.getOrNull() ?: "unknown"
|
internal val executorVersionName get() = classMethod(GET_EXECUTOR_VERSION_NAME_METHOD_NAME).string().ifBlank { "unknown" }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前 Hook Framework 版本号
|
* 获取当前 Hook Framework 版本号
|
||||||
@@ -103,5 +110,14 @@ internal object YukiXposedModuleStatus {
|
|||||||
* 请使用 [YukiHookAPI.Status.Executor.versionCode] 获取
|
* 请使用 [YukiHookAPI.Status.Executor.versionCode] 获取
|
||||||
* @return [Int] 模块未激活会返回 -1
|
* @return [Int] 模块未激活会返回 -1
|
||||||
*/
|
*/
|
||||||
internal val executorVersionCode get() = runCatching { YukiXposedModuleStatus_Impl.getExecutorVersionCode() }.getOrNull() ?: -1
|
internal val executorVersionCode get() = classMethod(GET_EXECUTOR_VERSION_CODE_METHOD_NAME).int().takeIf { it > 0 } ?: -1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过 [className] 获取方法实例
|
||||||
|
* @param name 方法名称
|
||||||
|
* @return [MethodFinder.Result.Instance]
|
||||||
|
*/
|
||||||
|
private fun classMethod(name: String) = className.toClass().method { this.name = name }.ignored().onNoSuchMethod {
|
||||||
|
YLog.innerW("Failed to initialize YukiXposedModuleStatus", it)
|
||||||
|
}.get()
|
||||||
}
|
}
|
@@ -228,7 +228,7 @@ internal object AppParasitics {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (YukiHookAPI.Configs.isEnableHookModuleStatus.not()) return
|
if (YukiHookAPI.Configs.isEnableHookModuleStatus.not()) return
|
||||||
YukiXposedModuleStatus.IMPL_CLASS_NAME.toClassOrNull(loader)?.apply {
|
YukiXposedModuleStatus.className.toClassOrNull(loader)?.apply {
|
||||||
if (type != HookEntryType.RESOURCES) {
|
if (type != HookEntryType.RESOURCES) {
|
||||||
YukiHookHelper.hook(method { name = YukiXposedModuleStatus.IS_ACTIVE_METHOD_NAME },
|
YukiHookHelper.hook(method { name = YukiXposedModuleStatus.IS_ACTIVE_METHOD_NAME },
|
||||||
object : YukiMemberReplacement() {
|
object : YukiMemberReplacement() {
|
||||||
|
@@ -280,6 +280,12 @@ class YukiHookXposedProcessor : SymbolProcessorProvider {
|
|||||||
packageName = PackageName.YukiXposedModuleStatus_Impl,
|
packageName = PackageName.YukiXposedModuleStatus_Impl,
|
||||||
content = data.sources()[ClassName.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 代码 */
|
/** 插入 HandlerDelegateImpl_Impl 代码 */
|
||||||
createCodeFile(
|
createCodeFile(
|
||||||
fileName = ClassName.HandlerDelegateImpl_Impl,
|
fileName = ClassName.HandlerDelegateImpl_Impl,
|
||||||
|
@@ -54,6 +54,7 @@ object ClassName {
|
|||||||
const val YukiHookAPI_Impl = "YukiHookAPI_Impl"
|
const val YukiHookAPI_Impl = "YukiHookAPI_Impl"
|
||||||
const val ModuleApplication_Impl = "ModuleApplication_Impl"
|
const val ModuleApplication_Impl = "ModuleApplication_Impl"
|
||||||
const val YukiXposedModuleStatus_Impl = "YukiXposedModuleStatus_Impl"
|
const val YukiXposedModuleStatus_Impl = "YukiXposedModuleStatus_Impl"
|
||||||
|
const val YukiXposedModuleStatus_Impl_Impl = "YukiXposedModuleStatus_Impl_Impl"
|
||||||
const val HandlerDelegateImpl_Impl = "HandlerDelegateImpl_Impl"
|
const val HandlerDelegateImpl_Impl = "HandlerDelegateImpl_Impl"
|
||||||
const val HandlerDelegateClass = "HandlerDelegate"
|
const val HandlerDelegateClass = "HandlerDelegate"
|
||||||
const val IActivityManagerProxyImpl_Impl = "IActivityManagerProxyImpl_Impl"
|
const val IActivityManagerProxyImpl_Impl = "IActivityManagerProxyImpl_Impl"
|
||||||
@@ -162,49 +163,68 @@ fun GenerateData.sources() = mapOf(
|
|||||||
|
|
||||||
package ${PackageName.YukiXposedModuleStatus_Impl}
|
package ${PackageName.YukiXposedModuleStatus_Impl}
|
||||||
|
|
||||||
|
""".trimIndent() + "\n\n" + createCommentContent(ClassName.YukiXposedModuleStatus_Impl) + "\n" + """
|
||||||
|
object ${ClassName.YukiXposedModuleStatus_Impl} {
|
||||||
|
|
||||||
|
val className get() = "${PackageName.YukiXposedModuleStatus_Impl}.${tailPackageName(ClassName.YukiXposedModuleStatus_Impl_Impl)}"
|
||||||
|
}
|
||||||
|
""".trimIndent(),
|
||||||
|
ClassName.YukiXposedModuleStatus_Impl_Impl to """
|
||||||
|
@file:Suppress("ClassName")
|
||||||
|
|
||||||
|
package ${PackageName.YukiXposedModuleStatus_Impl}
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.annotation.Keep
|
import androidx.annotation.Keep
|
||||||
""".trimIndent() + "\n\n" + createCommentContent(ClassName.YukiXposedModuleStatus_Impl) + "\n" + """
|
""".trimIndent() + "\n\n" + createCommentContent(ClassName.YukiXposedModuleStatus_Impl) + "\n" + """
|
||||||
@Keep
|
@Keep
|
||||||
object ${ClassName.YukiXposedModuleStatus_Impl} {
|
object ${tailPackageName(ClassName.YukiXposedModuleStatus_Impl_Impl)} {
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.IS_ACTIVE_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.IS_ACTIVE_METHOD_NAME}")
|
||||||
fun isActive(): Boolean {
|
fun function${(1000..99999).random()}(): Boolean {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME}")
|
||||||
fun isSupportResourcesHook(): Boolean {
|
fun function${(1000..99999).random()}(): Boolean {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_NAME_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_NAME_METHOD_NAME}")
|
||||||
fun getExecutorName(): String {
|
fun function${(1000..99999).random()}(): String {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_API_LEVEL_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_API_LEVEL_METHOD_NAME}")
|
||||||
fun getExecutorApiLevel(): Int {
|
fun function${(1000..99999).random()}(): Int {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_VERSION_NAME_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_VERSION_NAME_METHOD_NAME}")
|
||||||
fun getExecutorVersionName(): String {
|
fun function${(1000..99999).random()}(): String {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_VERSION_CODE_METHOD_NAME}")
|
@JvmName("${YukiXposedModuleStatusJvmName.GET_EXECUTOR_VERSION_CODE_METHOD_NAME}")
|
||||||
fun getExecutorVersionCode(): Int {
|
fun function${(1000..99999).random()}(): Int {
|
||||||
placeholderExecution()
|
phe()
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun placeholderExecution() {
|
@JvmStatic
|
||||||
|
@JvmName("_${(1000..99999).random()}")
|
||||||
|
private fun phe() {
|
||||||
/** Consume a long method body */
|
/** Consume a long method body */
|
||||||
if (System.currentTimeMillis() == 0L) Log.d("${(1000..9999).random()}", "${(100000..999999).random()}")
|
if (System.currentTimeMillis() == 0L) Log.d("${(1000..9999).random()}", "${(100000..999999).random()}")
|
||||||
}
|
}
|
||||||
|
@@ -35,64 +35,9 @@ package com.highcapable.yukihookapi.hook.xposed.bridge.status
|
|||||||
*/
|
*/
|
||||||
object YukiXposedModuleStatus_Impl {
|
object YukiXposedModuleStatus_Impl {
|
||||||
|
|
||||||
private const val IS_ACTIVE_METHOD_NAME = "__--"
|
|
||||||
private const val IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME = "_--_"
|
|
||||||
private const val GET_EXECUTOR_NAME_METHOD_NAME = "_-_-"
|
|
||||||
private const val GET_EXECUTOR_API_LEVEL_METHOD_NAME = "-__-"
|
|
||||||
private const val GET_EXECUTOR_VERSION_NAME_METHOD_NAME = "-_-_"
|
|
||||||
private const val GET_EXECUTOR_VERSION_CODE_METHOD_NAME = "___-"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此方法经过 Hook 后返回 true 即模块已激活
|
* 获取 YukiXposedModuleStatus 完整类名
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [Boolean]
|
|
||||||
*/
|
|
||||||
@JvmName(IS_ACTIVE_METHOD_NAME)
|
|
||||||
fun isActive(): Boolean = error("Stub!")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子 (Resources Hook)
|
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [Boolean]
|
|
||||||
*/
|
|
||||||
@JvmName(IS_SUPPORT_RESOURCES_HOOK_METHOD_NAME)
|
|
||||||
fun isSupportResourcesHook(): Boolean = error("Stub!")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 此方法经过 Hook 后返回当前 Hook Framework 名称
|
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [String]
|
* @return [String]
|
||||||
*/
|
*/
|
||||||
@JvmName(GET_EXECUTOR_NAME_METHOD_NAME)
|
val className: String = error("Stub!")
|
||||||
fun getExecutorName(): String = error("Stub!")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 此方法经过 Hook 后返回当前 Hook Framework 的 API 版本
|
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [Int]
|
|
||||||
*/
|
|
||||||
@JvmName(GET_EXECUTOR_API_LEVEL_METHOD_NAME)
|
|
||||||
fun getExecutorApiLevel(): Int = error("Stub!")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 此方法经过 Hook 后返回当前 Hook Framework 版本名称
|
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [String]
|
|
||||||
*/
|
|
||||||
@JvmName(GET_EXECUTOR_VERSION_NAME_METHOD_NAME)
|
|
||||||
fun getExecutorVersionName(): String = error("Stub!")
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 此方法经过 Hook 后返回当前 Hook Framework 版本号
|
|
||||||
*
|
|
||||||
* 返回值将在每次编译时自动生成
|
|
||||||
* @return [Int]
|
|
||||||
*/
|
|
||||||
@JvmName(GET_EXECUTOR_VERSION_CODE_METHOD_NAME)
|
|
||||||
fun getExecutorVersionCode(): Int = error("Stub!")
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user