mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Update demo
This commit is contained in:
12
demo-module/proguard-rules.pro
vendored
12
demo-module/proguard-rules.pro
vendored
@@ -35,4 +35,14 @@
|
||||
-adaptresourcefilecontents
|
||||
|
||||
-renamesourcefileattribute P
|
||||
-keepattributes SourceFile,LineNumberTable
|
||||
-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
-keepclassmembers class androidx.appcompat.app.AlertDialog {
|
||||
*** mAlert;
|
||||
}
|
||||
|
||||
-keepclassmembers class androidx.appcompat.app.AlertController {
|
||||
*** mButtonPositive;
|
||||
*** mButtonNegative;
|
||||
*** mButtonNeutral;
|
||||
}
|
@@ -30,6 +30,7 @@
|
||||
package com.highcapable.yukihookapi.demo_module.hook
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.widget.Button
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.highcapable.yukihookapi.YukiHookAPI
|
||||
@@ -37,7 +38,9 @@ import com.highcapable.yukihookapi.annotation.xposed.InjectYukiHookWithXposed
|
||||
import com.highcapable.yukihookapi.demo_module.R
|
||||
import com.highcapable.yukihookapi.demo_module.data.DataConst
|
||||
import com.highcapable.yukihookapi.demo_module.hook.factory.compatStyle
|
||||
import com.highcapable.yukihookapi.demo_module.ui.MainActivity
|
||||
import com.highcapable.yukihookapi.hook.factory.applyTheme
|
||||
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
|
||||
import com.highcapable.yukihookapi.hook.type.android.ActivityClass
|
||||
import com.highcapable.yukihookapi.hook.type.android.BundleClass
|
||||
import com.highcapable.yukihookapi.hook.type.java.StringArrayClass
|
||||
@@ -134,6 +137,8 @@ class HookEntry : IYukiHookXposedInit {
|
||||
}
|
||||
// 装载需要 Hook 的 APP
|
||||
loadApp(name = "com.highcapable.yukihookapi.demo_app") {
|
||||
// 注册模块 Activity 代理
|
||||
onAppLifecycle { onCreate { registerModuleAppActivities() } }
|
||||
// 得到需要 Hook 的 Class
|
||||
findClass(name = "$packageName.ui.MainActivity").hook {
|
||||
// 注入要 Hook 的方法
|
||||
@@ -209,15 +214,23 @@ class HookEntry : IYukiHookXposedInit {
|
||||
}
|
||||
// 拦截整个方法
|
||||
replaceUnit {
|
||||
MaterialAlertDialogBuilder(instance<Activity>().applyTheme(R.style.Theme_Default))
|
||||
.setTitle("Hooked")
|
||||
.setMessage("I am hook your toast showing!")
|
||||
.setPositiveButton("OK", null)
|
||||
.setNegativeButton("SEND MSG TO MODULE") { _, _ ->
|
||||
dataChannel.put(DataConst.TEST_CN_DATA, value = "I am host, can you hear me?")
|
||||
}.setNeutralButton("REMOVE HOOK") { _, _ ->
|
||||
removeSelf()
|
||||
}.show().compatStyle()
|
||||
instance<Activity>().applyTheme(R.style.Theme_Default).also { context ->
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle("Hooked")
|
||||
.setMessage("I am hook your toast showing!")
|
||||
.setPositiveButton("START PARASITIC") { _, _ ->
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle("Start Parasitic")
|
||||
.setMessage("This function will start MainActivity that exists in the module app.")
|
||||
.setPositiveButton("YES") { _, _ ->
|
||||
context.startActivity(Intent(context, MainActivity::class.java))
|
||||
}.setNegativeButton("NO", null).show().compatStyle()
|
||||
}.setNegativeButton("SEND MSG TO MODULE") { _, _ ->
|
||||
dataChannel.put(DataConst.TEST_CN_DATA, value = "I am host, can you hear me?")
|
||||
}.setNeutralButton("REMOVE HOOK") { _, _ ->
|
||||
removeSelf()
|
||||
}.show().compatStyle()
|
||||
}
|
||||
}
|
||||
}
|
||||
// 注入要 Hook 的方法
|
||||
|
@@ -32,22 +32,27 @@ package com.highcapable.yukihookapi.demo_module.ui
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.highcapable.yukihookapi.YukiHookAPI
|
||||
import com.highcapable.yukihookapi.demo_module.R
|
||||
import com.highcapable.yukihookapi.demo_module.data.DataConst
|
||||
import com.highcapable.yukihookapi.demo_module.databinding.ActivityMainBinding
|
||||
import com.highcapable.yukihookapi.hook.factory.dataChannel
|
||||
import com.highcapable.yukihookapi.hook.factory.modulePrefs
|
||||
import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base.ModuleAppCompatActivity
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
class MainActivity : ModuleAppCompatActivity() {
|
||||
|
||||
override val moduleTheme get() = R.style.Theme_Default
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
ActivityMainBinding.inflate(layoutInflater).apply {
|
||||
setContentView(root)
|
||||
dataChannel(packageName = "com.highcapable.yukihookapi.demo_app").with {
|
||||
wait(DataConst.TEST_CN_DATA) {
|
||||
Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show()
|
||||
moduleEnvironment(isShowWarn = false) {
|
||||
dataChannel(packageName = "com.highcapable.yukihookapi.demo_app").with {
|
||||
wait(DataConst.TEST_CN_DATA) {
|
||||
Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
moduleDemoActiveText.text = "Module is Active:${YukiHookAPI.Status.isModuleActive}"
|
||||
@@ -58,20 +63,38 @@ class MainActivity : AppCompatActivity() {
|
||||
moduleDemoApiVersionZhText.text = "Xposed API 版本"
|
||||
moduleDemoYukiHookApiVersionText.text = "YukiHookAPI Version:${YukiHookAPI.API_VERSION_NAME}(${YukiHookAPI.API_VERSION_CODE})"
|
||||
moduleDemoYukiHookApiVersionZhText.text = "YukiHookAPI 版本"
|
||||
moduleDemoNewXshareText.text = "New XShare Mode:${modulePrefs.isRunInNewXShareMode}"
|
||||
moduleDemoNewXshareZhText.text = "New XShare 模式支持状态"
|
||||
moduleDemoNewXshareText.text =
|
||||
if (YukiHookAPI.Status.isXposedEnvironment) "XSharedPreferences:${modulePrefs.isXSharePrefsReadable}"
|
||||
else "New XShare Mode:${modulePrefs.isRunInNewXShareMode}"
|
||||
moduleDemoNewXshareZhText.text = if (YukiHookAPI.Status.isXposedEnvironment) "XSharedPreferences 是否可用" else "New XShare 模式支持状态"
|
||||
moduleDemoResHookText.text = "Support Resources Hook:${YukiHookAPI.Status.isSupportResourcesHook}"
|
||||
moduleDemoResHookZhText.text = "资源钩子支持状态"
|
||||
moduleDemoEditText.also {
|
||||
it.setText(modulePrefs.get(DataConst.TEST_KV_DATA))
|
||||
moduleDemoButton.setOnClickListener { _ ->
|
||||
if (it.text.toString().isNotEmpty()) {
|
||||
modulePrefs.put(DataConst.TEST_KV_DATA, it.text.toString())
|
||||
Toast.makeText(applicationContext, "Saved", Toast.LENGTH_SHORT).show()
|
||||
} else Toast.makeText(applicationContext, "Please enter the text", Toast.LENGTH_SHORT).show()
|
||||
moduleEnvironment {
|
||||
if (it.text.toString().isNotEmpty()) {
|
||||
modulePrefs.put(DataConst.TEST_KV_DATA, it.text.toString())
|
||||
Toast.makeText(applicationContext, "Saved", Toast.LENGTH_SHORT).show()
|
||||
} else Toast.makeText(applicationContext, "Please enter the text", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
moduleDemoFrgButton.setOnClickListener { startActivity(Intent(this@MainActivity, PreferenceActivity::class.java)) }
|
||||
moduleDemoFrgButton.setOnClickListener {
|
||||
moduleEnvironment { startActivity(Intent(this@MainActivity, PreferenceActivity::class.java)) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅在模块环境执行
|
||||
* @param isShowWarn 是否显示警告 - 默认是
|
||||
* @param callback 在模块环境执行
|
||||
*/
|
||||
private inline fun moduleEnvironment(isShowWarn: Boolean = true, callback: () -> Unit) {
|
||||
if (YukiHookAPI.Status.isXposedEnvironment)
|
||||
(if (isShowWarn)
|
||||
Toast.makeText(applicationContext, "This operation is not allowed in Xposed Environment", Toast.LENGTH_SHORT).show())
|
||||
else callback()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user