mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Change some code
This commit is contained in:
@@ -36,6 +36,7 @@ import android.widget.TextView
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.highcapable.yukihookapi.demo_module.R
|
||||
import com.highcapable.yukihookapi.hook.factory.isModuleActive
|
||||
import com.highcapable.yukihookapi.hook.factory.modulePrefs
|
||||
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus
|
||||
|
||||
@@ -44,7 +45,7 @@ class MainActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
findViewById<TextView>(R.id.module_demo_text).text = "Module is Active -> ${YukiHookModuleStatus.isActive()}\n" +
|
||||
findViewById<TextView>(R.id.module_demo_text).text = "Module is Active -> $isModuleActive\n" +
|
||||
"Hook Framework -> ${YukiHookModuleStatus.executorName}\n" +
|
||||
"API Version -> ${YukiHookModuleStatus.executorVersion}"
|
||||
findViewById<EditText>(R.id.module_demo_edit_text).also {
|
||||
|
@@ -38,7 +38,9 @@ package com.highcapable.yukihookapi.annotation
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
/**
|
||||
* - ❗警告方法外部调用声明
|
||||
*
|
||||
* 此方法除继承和接口外不应该在这里被调用
|
||||
*
|
||||
* 如果调用此方法可能会出现错误或 APP 发生异常
|
||||
*/
|
||||
annotation class DoNotUseClass
|
@@ -43,7 +43,9 @@ package com.highcapable.yukihookapi.annotation
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
/**
|
||||
* -️ ❗警告方法外部调用声明
|
||||
*
|
||||
* 此方法除继承和接口外不应该在这里被调用
|
||||
*
|
||||
* 如果调用此方法可能会出现错误或 APP 发生异常
|
||||
*/
|
||||
annotation class DoNotUseField
|
@@ -38,7 +38,9 @@ package com.highcapable.yukihookapi.annotation
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
/**
|
||||
* - ❗警告方法外部调用声明
|
||||
*
|
||||
* 此方法除继承和接口外不应该在这里被调用
|
||||
*
|
||||
* 如果调用此方法可能会出现错误或 APP 发生异常
|
||||
*/
|
||||
annotation class DoNotUseMethod
|
@@ -25,7 +25,10 @@
|
||||
*
|
||||
* This file is Created by fankes on 2022/2/4.
|
||||
*/
|
||||
@file:Suppress("unused", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE", "MemberVisibilityCanBePrivate", "UNCHECKED_CAST")
|
||||
@file:Suppress(
|
||||
"unused", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE",
|
||||
"MemberVisibilityCanBePrivate", "UNCHECKED_CAST", "KotlinConstantConditions"
|
||||
)
|
||||
|
||||
package com.highcapable.yukihookapi.hook.core.finder
|
||||
|
||||
@@ -102,9 +105,7 @@ class ConstructorFinder(
|
||||
runBlocking {
|
||||
isBindToHooker = isBind
|
||||
setInstance(isBind, result)
|
||||
}.result {
|
||||
onHookLogMsg(msg = "Find Constructor [${memberInstance}] takes ${it}ms [${hookTag}]")
|
||||
}
|
||||
}.result { onHookLogMsg(msg = "Find Constructor [${memberInstance}] takes ${it}ms [${hookTag}]") }
|
||||
Result()
|
||||
} catch (e: Throwable) {
|
||||
onFailureMsg(throwable = e)
|
||||
|
@@ -84,9 +84,7 @@ class FieldFinder(
|
||||
if (type != null)
|
||||
ReflectionUtils.findFieldIfExists(classSet, type?.name, name)
|
||||
else classSet?.getDeclaredField(name)?.apply { isAccessible = true }
|
||||
}.result {
|
||||
onHookLogMsg(msg = "Find Field [${memberInstance}] takes ${it}ms [${hookTag}]")
|
||||
}
|
||||
}.result { onHookLogMsg(msg = "Find Field [${memberInstance}] takes ${it}ms [${hookTag}]") }
|
||||
Result()
|
||||
} catch (e: Throwable) {
|
||||
Thread {
|
||||
|
@@ -25,7 +25,10 @@
|
||||
*
|
||||
* This file is Created by fankes on 2022/2/4.
|
||||
*/
|
||||
@file:Suppress("unused", "MemberVisibilityCanBePrivate", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE", "UNCHECKED_CAST")
|
||||
@file:Suppress(
|
||||
"unused", "MemberVisibilityCanBePrivate",
|
||||
"OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE", "UNCHECKED_CAST", "KotlinConstantConditions"
|
||||
)
|
||||
|
||||
package com.highcapable.yukihookapi.hook.core.finder
|
||||
|
||||
@@ -124,9 +127,7 @@ class MethodFinder(
|
||||
runBlocking {
|
||||
isBindToHooker = isBind
|
||||
setInstance(isBind, result)
|
||||
}.result {
|
||||
onHookLogMsg(msg = "Find Method [${memberInstance}] takes ${it}ms [${hookTag}]")
|
||||
}
|
||||
}.result { onHookLogMsg(msg = "Find Method [${memberInstance}] takes ${it}ms [${hookTag}]") }
|
||||
Result()
|
||||
} catch (e: Throwable) {
|
||||
onFailureMsg(throwable = e)
|
||||
|
@@ -88,7 +88,7 @@ abstract class BaseFinder(
|
||||
* @param msg 调试日志内容
|
||||
*/
|
||||
internal fun onHookLogMsg(msg: String) {
|
||||
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = msg)
|
||||
if (YukiHookAPI.Configs.isDebug && YukiHookAPI.hasXposedBridge) yLoggerI(msg = msg)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -25,7 +25,7 @@
|
||||
*
|
||||
* This file is Created by fankes on 2022/2/2.
|
||||
*/
|
||||
@file:Suppress("unused")
|
||||
@file:Suppress("unused", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE")
|
||||
|
||||
package com.highcapable.yukihookapi.hook.factory
|
||||
|
||||
@@ -37,6 +37,7 @@ 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.prefs.YukiHookModulePrefs
|
||||
import com.highcapable.yukihookapi.hook.xposed.proxy.YukiHookXposedInitProxy
|
||||
import java.io.BufferedReader
|
||||
@@ -92,7 +93,19 @@ val Context.processName
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断模块是否在太极、无极中激活
|
||||
* 判断模块是否在 Xposed 或太极、无极中激活
|
||||
* @return [Boolean] 是否激活
|
||||
*/
|
||||
val Context.isModuleActive get() = YukiHookModuleStatus.isActive() || isTaiChiModuleActive
|
||||
|
||||
/**
|
||||
* 仅判断模块是否在 Xposed 中激活
|
||||
* @return [Boolean] 是否激活
|
||||
*/
|
||||
val Any?.isXposedModuleActive get() = YukiHookModuleStatus.isActive()
|
||||
|
||||
/**
|
||||
* 仅判断模块是否在太极、无极中激活
|
||||
* @return [Boolean] 是否激活
|
||||
*/
|
||||
val Context.isTaiChiModuleActive: Boolean
|
||||
|
@@ -27,17 +27,27 @@
|
||||
*/
|
||||
package com.highcapable.yukihookapi.hook.xposed
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.annotation.Keep
|
||||
import com.highcapable.yukihookapi.annotation.DoNotUseMethod
|
||||
import com.highcapable.yukihookapi.hook.factory.isModuleActive
|
||||
import com.highcapable.yukihookapi.hook.factory.isTaiChiModuleActive
|
||||
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
|
||||
import com.highcapable.yukihookapi.hook.log.yLoggerI
|
||||
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus.executorName
|
||||
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus.executorVersion
|
||||
import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus.isActive
|
||||
import de.robv.android.xposed.XposedBridge
|
||||
|
||||
/**
|
||||
* 这是一个 Xposed 模块 Hook 状态类
|
||||
*
|
||||
* 我们需要监听自己的模块是否被激活 - 可直接调用这个类的 [isActive] 方法
|
||||
* 我们需要监听自己的模块是否被激活 - 可使用以下方法调用
|
||||
*
|
||||
* 在 [Activity] 中调用 [isModuleActive] 或 [isTaiChiModuleActive]
|
||||
*
|
||||
* 在任意地方调用 [isXposedModuleActive]
|
||||
*
|
||||
* 你还可以使用以下方法获取当前 Hook 框架的详细信息
|
||||
*
|
||||
* 调用 [executorName] 来获取当前 Hook 框架的名称
|
||||
*
|
||||
@@ -67,10 +77,14 @@ object YukiHookModuleStatus {
|
||||
|
||||
/**
|
||||
* 此方法经过 Hook 后返回 true 即模块已激活
|
||||
*
|
||||
* 请使用 [isModuleActive]、[isXposedModuleActive]、[isTaiChiModuleActive] 判断模块激活状态
|
||||
*
|
||||
* - ❗此方法为私有功能性 API - 你不应该手动调用此方法
|
||||
* @return [Boolean]
|
||||
*/
|
||||
@Keep
|
||||
fun isActive(): Boolean {
|
||||
@DoNotUseMethod
|
||||
internal fun isActive(): Boolean {
|
||||
yLoggerI(msg = "This Module is not actived")
|
||||
return false
|
||||
}
|
||||
@@ -79,13 +93,11 @@ object YukiHookModuleStatus {
|
||||
* 此方法经过 Hook 后返回 [XposedBridge.getXposedVersion]
|
||||
* @return [Int]
|
||||
*/
|
||||
@Keep
|
||||
private fun getXposedVersion() = -1
|
||||
|
||||
/**
|
||||
* 此方法经过 Hook 后返回 [XposedBridge] 的 TAG
|
||||
* @return [String]
|
||||
*/
|
||||
@Keep
|
||||
private fun getXposedBridgeTag() = "unknown"
|
||||
}
|
Reference in New Issue
Block a user