mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-01 16:25:31 +08:00
Added function in YukiHookModuleStatus were "executorName" and "executorVersion"
This commit is contained in:
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
@@ -5,6 +5,7 @@
|
||||
<map>
|
||||
<entry key="app/src/main/res/layout/activity_main.xml" value="0.4169230769230769" />
|
||||
<entry key="app_demo/src/main/res/layout/activity_main.xml" value="0.4375" />
|
||||
<entry key="demo-module/src/main/res/layout/activity_main.xml" value="0.4375" />
|
||||
<entry key="demo/src/main/res/layout/activity_main.xml" value="0.4375" />
|
||||
<entry key="module_demo/src/main/res/layout/activity_main.xml" value="0.4375" />
|
||||
</map>
|
||||
|
@@ -44,7 +44,9 @@ 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()}"
|
||||
findViewById<TextView>(R.id.module_demo_text).text = "Module is Active -> ${YukiHookModuleStatus.isActive()}\n" +
|
||||
"Hook Framework -> ${YukiHookModuleStatus.executorName}\n" +
|
||||
"API Version -> ${YukiHookModuleStatus.executorVersion}"
|
||||
findViewById<EditText>(R.id.module_demo_edit_text).also {
|
||||
it.setText(modulePrefs.getString(key = "test_data"))
|
||||
findViewById<Button>(R.id.module_demo_button).setOnClickListener { _ ->
|
||||
|
@@ -12,6 +12,8 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="15dp"
|
||||
android:gravity="center"
|
||||
android:lineSpacingExtra="6dp"
|
||||
android:text="sample"
|
||||
android:textSize="20sp" />
|
||||
|
||||
|
@@ -227,6 +227,7 @@ class YukiHookXposedProcessor : SymbolProcessorProvider {
|
||||
"import de.robv.android.xposed.IXposedHookLoadPackage\n" +
|
||||
"import de.robv.android.xposed.XC_MethodReplacement\n" +
|
||||
"import de.robv.android.xposed.XposedHelpers\n" +
|
||||
"import de.robv.android.xposed.XposedBridge\n" +
|
||||
"import de.robv.android.xposed.callbacks.XC_LoadPackage\n" +
|
||||
"import $packageName.$className\n" +
|
||||
"\n" +
|
||||
@@ -244,12 +245,12 @@ class YukiHookXposedProcessor : SymbolProcessorProvider {
|
||||
"\n" +
|
||||
" override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam?) {\n" +
|
||||
" if (lpparam == null) return\n" +
|
||||
" runCatching {\n" +
|
||||
" try {\n" +
|
||||
" $className().onHook()\n" +
|
||||
" }.onFailure {\n" +
|
||||
" loggerE(tag = \"YukiHookAPI\", msg = \"YukiHookAPI try to load HookEntryClass failed\", e = it)\n" +
|
||||
" } catch (e: Throwable) {\n" +
|
||||
" loggerE(tag = \"YukiHookAPI\", msg = \"YukiHookAPI try to load HookEntryClass failed\", e = e)\n" +
|
||||
" }\n" +
|
||||
" if (lpparam.packageName == \"$realPackageName\")\n" +
|
||||
" if (lpparam.packageName == \"$realPackageName\") {\n" +
|
||||
" XposedHelpers.findAndHookMethod(\n" +
|
||||
" YukiHookModuleStatus::class.java.name,\n" +
|
||||
" lpparam.classLoader,\n" +
|
||||
@@ -257,6 +258,25 @@ class YukiHookXposedProcessor : SymbolProcessorProvider {
|
||||
" object : XC_MethodReplacement() {\n" +
|
||||
" override fun replaceHookedMethod(param: MethodHookParam?) = true\n" +
|
||||
" })\n" +
|
||||
" XposedHelpers.findAndHookMethod(\n" +
|
||||
" YukiHookModuleStatus::class.java.name,\n" +
|
||||
" lpparam.classLoader,\n" +
|
||||
" \"getXposedBridgeTag\",\n" +
|
||||
" object : XC_MethodReplacement() {\n" +
|
||||
" override fun replaceHookedMethod(param: MethodHookParam?) = try {\n" +
|
||||
" XposedBridge::class.java.getDeclaredField(\"TAG\").apply { isAccessible = true }.get(null) as String\n" +
|
||||
" } catch (_: Throwable) {\n" +
|
||||
" \"invalid\"\n" +
|
||||
" }\n" +
|
||||
" })\n" +
|
||||
" XposedHelpers.findAndHookMethod(\n" +
|
||||
" YukiHookModuleStatus::class.java.name,\n" +
|
||||
" lpparam.classLoader,\n" +
|
||||
" \"getXposedVersion\",\n" +
|
||||
" object : XC_MethodReplacement() {\n" +
|
||||
" override fun replaceHookedMethod(param: MethodHookParam?) = XposedBridge.getXposedVersion()\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" YukiHookAPI.modulePackageName = \"$realPackageName\"\n" +
|
||||
" YukiHookAPI.onXposedLoaded(lpparam)\n" +
|
||||
" }\n" +
|
||||
|
@@ -29,18 +29,56 @@ package com.highcapable.yukihookapi.hook.xposed
|
||||
|
||||
import androidx.annotation.Keep
|
||||
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] 方法
|
||||
*
|
||||
* 调用 [executorName] 来获取当前 Hook 框架的名称
|
||||
*
|
||||
* 调用 [executorVersion] 来获取当前 Hook 框架的版本
|
||||
*
|
||||
* 详情请参考 [判断自身激活状态](https://github.com/fankes/YukiHookAPI/wiki#%E5%88%A4%E6%96%AD%E8%87%AA%E8%BA%AB%E6%BF%80%E6%B4%BB%E7%8A%B6%E6%80%81)
|
||||
*/
|
||||
@Keep
|
||||
object YukiHookModuleStatus {
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 框架的名称
|
||||
*
|
||||
* 从 [XposedBridge] 获取 TAG
|
||||
* @return [String] 模块未激活会返回 unknown
|
||||
*/
|
||||
val executorName
|
||||
get() = getXposedBridgeTag().replace(oldValue = "Bridge", newValue = "").replace(oldValue = "-", newValue = "").trim()
|
||||
|
||||
/**
|
||||
* 获取当前 Hook 框架的版本
|
||||
*
|
||||
* 获取 [XposedBridge.getXposedVersion]
|
||||
* @return [Int] 模块未激活会返回 -1
|
||||
*/
|
||||
val executorVersion get() = getXposedVersion()
|
||||
|
||||
/**
|
||||
* 此方法经过 Hook 后返回 [XposedBridge.getXposedVersion]
|
||||
* @return [Int]
|
||||
*/
|
||||
@Keep
|
||||
private fun getXposedVersion() = -1
|
||||
|
||||
/**
|
||||
* 此方法经过 Hook 后返回 [XposedBridge] 的 TAG
|
||||
* @return [String]
|
||||
*/
|
||||
@Keep
|
||||
private fun getXposedBridgeTag() = "unknown"
|
||||
|
||||
/**
|
||||
* 此方法经过 Hook 后返回 true 即模块已激活
|
||||
* @return [Boolean]
|
||||
|
Reference in New Issue
Block a user