Added function in YukiHookModuleStatus were "executorName" and "executorVersion"

This commit is contained in:
2022-03-18 01:40:05 +08:00
parent fee23a40bd
commit 729424bf65
5 changed files with 68 additions and 5 deletions

1
.idea/misc.xml generated
View File

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

View File

@@ -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 { _ ->

View File

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

View File

@@ -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" +

View File

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