Merge YukiHookModuleStatus to YukiHookAPI.Status

This commit is contained in:
2022-05-29 03:41:22 +08:00
parent 17225c3ad4
commit 57331234c3
13 changed files with 258 additions and 163 deletions

View File

@@ -38,15 +38,16 @@ import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder
import com.highcapable.yukihookapi.hook.core.finder.FieldFinder
import com.highcapable.yukihookapi.hook.core.finder.MethodFinder
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.isTaiChiModuleActive
import com.highcapable.yukihookapi.hook.factory.processName
import com.highcapable.yukihookapi.hook.log.*
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.store.MemberCacheStore
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge
import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel
import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs
import de.robv.android.xposed.XposedBridge
@@ -79,23 +80,77 @@ object YukiHookAPI {
const val API_VERSION_CODE = 31
/**
* 获取当前 Hook 框架的名称
*
* 从 [XposedBridge] 获取 TAG
* @return [String] 无法获取会返回 unknown - [YukiHookBridge.hasXposedBridge] 不存在会返回 invalid
* 当前 [YukiHookAPI] 的状态
*/
val executorName get() = YukiHookBridge.executorName
object Status {
/**
* 获取当前 Hook 框架的名称
*
* 从 [XposedBridge] 获取 TAG
*
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
* @return [String] 无法获取会返回 unknown - [YukiHookBridge.hasXposedBridge] 不存在会返回 invalid
*/
val executorName get() = if (YukiHookBridge.hasXposedBridge) YukiHookBridge.executorName else YukiHookModuleStatus.executorName
/**
* 获取当前 Hook 框架的版本
*
* 获取 [XposedBridge.getXposedVersion]
*
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
* @return [Int] 无法获取会返回 -1
*/
val executorVersion get() = if (YukiHookBridge.hasXposedBridge) YukiHookBridge.executorVersion else YukiHookModuleStatus.executorVersion
/**
* 判断模块是否在 Xposed 或太极、无极中激活
*
* - ❗在模块环境中你需要将 [Application] 继承于 [ModuleApplication]
*
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
*
* - ❗在 Xposed 环境中仅返回非 [isTaiChiModuleActive] 的激活状态
* @return [Boolean] 是否激活
*/
val isModuleActive get() = YukiHookBridge.hasXposedBridge || YukiHookModuleStatus.isActive() || isTaiChiModuleActive
/**
* 仅判断模块是否在 Xposed 中激活
*
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
*
* - ❗在 Xposed 环境中始终返回 true
* @return [Boolean] 是否激活
*/
val isXposedModuleActive get() = YukiHookBridge.hasXposedBridge || YukiHookModuleStatus.isActive()
/**
* 仅判断模块是否在太极、无极中激活
*
* - ❗在模块环境中你需要将 [Application] 继承于 [ModuleApplication]
*
* - ❗在 Xposed 环境中始终返回 false
* @return [Boolean] 是否激活
*/
val isTaiChiModuleActive
get() = YukiHookBridge.hasXposedBridge.not() && (ModuleApplication.currentContext?.isTaiChiModuleActive ?: false)
/**
* 判断当前 Hook Framework 是否支持资源钩子(Resources Hook)
*
* - ❗在模块环境中需要启用 [Configs.isEnableHookModuleStatus]
*
* - ❗在 Xposed 环境中可能会延迟等待事件回调后才会返回 true
* @return [Boolean] 是否支持
*/
val isSupportResourcesHook
get() = if (YukiHookBridge.hasXposedBridge) YukiHookBridge.isSupportResourcesHook else YukiHookModuleStatus.hasResourcesHook()
}
/**
* 获取当前 Hook 框架的版本
*
* 获取 [XposedBridge.getXposedVersion]
* @return [Int] 无法获取会返回 -1
*/
val executorVersion get() = YukiHookBridge.executorVersion
/**
* 配置 YukiHookAPI
* 配置 [YukiHookAPI]
*/
object Configs {
@@ -159,7 +214,7 @@ object YukiHookAPI {
*
* - 为原生支持 Xposed 模块激活状态检测 - 此功能默认启用
*
* ❗关闭后你将不能再使用 [YukiHookModuleStatus] 中的功能
* - ❗关闭后你将不能再在模块环境中使用 [YukiHookAPI.Status] 中的功能
*/
var isEnableHookModuleStatus = true
@@ -294,7 +349,7 @@ object YukiHookAPI {
private fun printSplashLog() {
if (Configs.isDebug.not() || isShowSplashLogOnceTime.not()) return
isShowSplashLogOnceTime = false
yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using $executorName API $executorVersion")
yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using ${Status.executorName} API ${Status.executorVersion}")
}
/** 输出找不到 [XposedBridge] 的错误日志 */

View File

@@ -37,7 +37,6 @@ import android.os.Process
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.param.PackageParam
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel
import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs
import com.highcapable.yukihookapi.hook.xposed.proxy.IYukiHookXposedInit
@@ -98,33 +97,15 @@ val Context.processName
}
}.getOrNull() ?: packageName ?: ""
/**
* 判断当前 Hook Framework 是否支持资源钩子(Resources Hook)
* @return [Boolean] 是否支持
*/
val Any?.isSupportResourcesHook get() = YukiHookModuleStatus.hasResourcesHook()
/**
* 判断模块是否在 Xposed 或太极、无极中激活
* @return [Boolean] 是否激活
*/
val Context.isModuleActive get() = YukiHookModuleStatus.isActive() || isTaiChiModuleActive
/**
* 仅判断模块是否在 Xposed 中激活
* @return [Boolean] 是否激活
*/
val Any?.isXposedModuleActive get() = YukiHookModuleStatus.isActive()
/**
* 仅判断模块是否在太极、无极中激活
*
* 此处的实现代码来自太极官方文档封装改进
* 此处的实现代码来自太极官方文档中示例代码的封装改进
*
* 详情请参考太极开发指南中的 [如何判断模块是否激活了?](https://taichi.cool/zh/doc/for-xposed-dev.html#%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E6%A8%A1%E5%9D%97%E6%98%AF%E5%90%A6%E6%BF%80%E6%B4%BB%E4%BA%86%EF%BC%9F)
* @return [Boolean] 是否激活
*/
val Context.isTaiChiModuleActive: Boolean
internal val Context.isTaiChiModuleActive: Boolean
get() {
var isModuleActive = false
runCatching {

View File

@@ -53,6 +53,8 @@ import me.weishu.reflection.Reflection
*
* - 在模块中使用系统隐藏 API - 核心技术引用了开源项目 [FreeReflection](https://github.com/tiann/FreeReflection)
*
* - 在模块中使用 [YukiHookAPI.Status.isTaiChiModuleActive] 判断太极、无极激活状态
*
* 详情请参考 [ModuleApplication](https://fankes.github.io/YukiHookAPI/#/api/document?id=moduleapplication-class)
*/
open class ModuleApplication : Application() {
@@ -60,7 +62,7 @@ open class ModuleApplication : Application() {
companion object {
/** 全局静态 [Application] 实例 */
private var currentContext: ModuleApplication? = null
internal var currentContext: ModuleApplication? = null
/**
* 获取全局静态 [Application] 实例

View File

@@ -51,10 +51,10 @@ import com.highcapable.yukihookapi.hook.type.android.ConfigurationClass
import com.highcapable.yukihookapi.hook.type.android.ContextClass
import com.highcapable.yukihookapi.hook.type.android.InstrumentationClass
import com.highcapable.yukihookapi.hook.type.java.IntType
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiModuleResources
import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiResources
import com.highcapable.yukihookapi.hook.xposed.bridge.inject.YukiHookBridge_Injector
import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus
import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel
import dalvik.system.PathClassLoader
import de.robv.android.xposed.*
@@ -94,6 +94,9 @@ object YukiHookBridge {
/** 当前 [PackageParam] 方法体回调 */
internal var packageParamCallback: (PackageParam.() -> Unit)? = null
/** 当前 Hook Framework 是否支持 Resources Hook */
internal var isSupportResourcesHook = false
/**
* 当前 Hook APP (宿主) 的全局生命周期 [Application]
*
@@ -388,6 +391,7 @@ object YukiHookBridge {
}?.also {
YukiHookAPI.onXposedLoaded(it)
if (it.type == HookEntryType.PACKAGE) registerToAppLifecycle(it.packageName)
if (it.type == HookEntryType.RESOURCES) isSupportResourcesHook = true
}
}

View File

@@ -25,17 +25,11 @@
*
* This file is Created by fankes on 2022/2/3.
*/
package com.highcapable.yukihookapi.hook.xposed
package com.highcapable.yukihookapi.hook.xposed.bridge.status
import android.app.Activity
import androidx.annotation.Keep
import com.highcapable.yukihookapi.hook.factory.isModuleActive
import com.highcapable.yukihookapi.hook.factory.isSupportResourcesHook
import com.highcapable.yukihookapi.hook.factory.isTaiChiModuleActive
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.log.yLoggerD
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus.executorName
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus.executorVersion
import de.robv.android.xposed.XposedBridge
/**
@@ -43,19 +37,19 @@ import de.robv.android.xposed.XposedBridge
*
* 我们需要监听自己的模块是否被激活 - 可使用以下方法调用
*
* [Activity] 中调用 [isModuleActive] [isTaiChiModuleActive]
* 调用 [YukiHookAPI.Status.isModuleActive] [YukiHookAPI.Status.isTaiChiModuleActive]
*
* 在任意地方调用 [isXposedModuleActive]
* 调用 [YukiHookAPI.Status.isXposedModuleActive]
*
* 你还可以使用以下方法获取当前 Hook 框架的详细信息
*
* 调用 [executorName] 来获取当前 Hook 框架的名称
* 调用 [YukiHookAPI.Status.executorName] 来获取当前 Hook 框架的名称
*
* 调用 [executorVersion] 来获取当前 Hook 框架的版本
* 调用 [YukiHookAPI.Status.executorVersion] 来获取当前 Hook 框架的版本
*
* 详情请参考 [Xposed 模块判断自身激活状态](https://fankes.github.io/YukiHookAPI/#/guide/example?id=xposed-%e6%a8%a1%e5%9d%97%e5%88%a4%e6%96%ad%e8%87%aa%e8%ba%ab%e6%bf%80%e6%b4%bb%e7%8a%b6%e6%80%81)
*/
object YukiHookModuleStatus {
internal object YukiHookModuleStatus {
/** 定义 Jvm 方法名 */
internal const val IS_ACTIVE_METHOD_NAME = "__--"
@@ -73,23 +67,27 @@ object YukiHookModuleStatus {
* 获取当前 Hook 框架的名称
*
* [XposedBridge] 获取 TAG
*
* 请使用 [YukiHookAPI.Status.executorName] 获取
* @return [String] 模块未激活会返回 unknown
*/
val executorName
internal val executorName
get() = getXposedBridgeTag().replace(oldValue = "Bridge", newValue = "").replace(oldValue = "-", newValue = "").trim()
/**
* 获取当前 Hook 框架的版本
*
* 获取 [XposedBridge.getXposedVersion]
*
* 请使用 [YukiHookAPI.Status.executorVersion] 获取
* @return [Int] 模块未激活会返回 -1
*/
val executorVersion get() = getXposedVersion()
internal val executorVersion get() = getXposedVersion()
/**
* 此方法经过 Hook 后返回 true 即模块已激活
*
* 请使用 [isModuleActive][isXposedModuleActive][isTaiChiModuleActive] 判断模块激活状态
* 请使用 [YukiHookAPI.Status.isModuleActive][YukiHookAPI.Status.isXposedModuleActive][YukiHookAPI.Status.isTaiChiModuleActive] 判断模块激活状态
* @return [Boolean]
*/
@Keep
@@ -102,7 +100,7 @@ object YukiHookModuleStatus {
/**
* 此方法经过 Hook 后返回 true 即当前 Hook Framework 支持资源钩子(Resources Hook)
*
* 请使用 [isSupportResourcesHook] 判断支持状态
* 请使用 [YukiHookAPI.Status.isSupportResourcesHook] 判断支持状态
* @return [Boolean]
*/
@Keep