mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-07 03:05:36 +08:00
Update demo
This commit is contained in:
10
demo-module/proguard-rules.pro
vendored
10
demo-module/proguard-rules.pro
vendored
@@ -36,3 +36,13 @@
|
|||||||
|
|
||||||
-renamesourcefileattribute P
|
-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
|
package com.highcapable.yukihookapi.demo_module.hook
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
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.R
|
||||||
import com.highcapable.yukihookapi.demo_module.data.DataConst
|
import com.highcapable.yukihookapi.demo_module.data.DataConst
|
||||||
import com.highcapable.yukihookapi.demo_module.hook.factory.compatStyle
|
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.applyTheme
|
||||||
|
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
|
||||||
import com.highcapable.yukihookapi.hook.type.android.ActivityClass
|
import com.highcapable.yukihookapi.hook.type.android.ActivityClass
|
||||||
import com.highcapable.yukihookapi.hook.type.android.BundleClass
|
import com.highcapable.yukihookapi.hook.type.android.BundleClass
|
||||||
import com.highcapable.yukihookapi.hook.type.java.StringArrayClass
|
import com.highcapable.yukihookapi.hook.type.java.StringArrayClass
|
||||||
@@ -134,6 +137,8 @@ class HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// 装载需要 Hook 的 APP
|
// 装载需要 Hook 的 APP
|
||||||
loadApp(name = "com.highcapable.yukihookapi.demo_app") {
|
loadApp(name = "com.highcapable.yukihookapi.demo_app") {
|
||||||
|
// 注册模块 Activity 代理
|
||||||
|
onAppLifecycle { onCreate { registerModuleAppActivities() } }
|
||||||
// 得到需要 Hook 的 Class
|
// 得到需要 Hook 的 Class
|
||||||
findClass(name = "$packageName.ui.MainActivity").hook {
|
findClass(name = "$packageName.ui.MainActivity").hook {
|
||||||
// 注入要 Hook 的方法
|
// 注入要 Hook 的方法
|
||||||
@@ -209,15 +214,23 @@ class HookEntry : IYukiHookXposedInit {
|
|||||||
}
|
}
|
||||||
// 拦截整个方法
|
// 拦截整个方法
|
||||||
replaceUnit {
|
replaceUnit {
|
||||||
MaterialAlertDialogBuilder(instance<Activity>().applyTheme(R.style.Theme_Default))
|
instance<Activity>().applyTheme(R.style.Theme_Default).also { context ->
|
||||||
.setTitle("Hooked")
|
MaterialAlertDialogBuilder(context)
|
||||||
.setMessage("I am hook your toast showing!")
|
.setTitle("Hooked")
|
||||||
.setPositiveButton("OK", null)
|
.setMessage("I am hook your toast showing!")
|
||||||
.setNegativeButton("SEND MSG TO MODULE") { _, _ ->
|
.setPositiveButton("START PARASITIC") { _, _ ->
|
||||||
dataChannel.put(DataConst.TEST_CN_DATA, value = "I am host, can you hear me?")
|
MaterialAlertDialogBuilder(context)
|
||||||
}.setNeutralButton("REMOVE HOOK") { _, _ ->
|
.setTitle("Start Parasitic")
|
||||||
removeSelf()
|
.setMessage("This function will start MainActivity that exists in the module app.")
|
||||||
}.show().compatStyle()
|
.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 的方法
|
// 注入要 Hook 的方法
|
||||||
|
@@ -32,22 +32,27 @@ package com.highcapable.yukihookapi.demo_module.ui
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
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.data.DataConst
|
||||||
import com.highcapable.yukihookapi.demo_module.databinding.ActivityMainBinding
|
import com.highcapable.yukihookapi.demo_module.databinding.ActivityMainBinding
|
||||||
import com.highcapable.yukihookapi.hook.factory.dataChannel
|
import com.highcapable.yukihookapi.hook.factory.dataChannel
|
||||||
import com.highcapable.yukihookapi.hook.factory.modulePrefs
|
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?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
ActivityMainBinding.inflate(layoutInflater).apply {
|
ActivityMainBinding.inflate(layoutInflater).apply {
|
||||||
setContentView(root)
|
setContentView(root)
|
||||||
dataChannel(packageName = "com.highcapable.yukihookapi.demo_app").with {
|
moduleEnvironment(isShowWarn = false) {
|
||||||
wait(DataConst.TEST_CN_DATA) {
|
dataChannel(packageName = "com.highcapable.yukihookapi.demo_app").with {
|
||||||
Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show()
|
wait(DataConst.TEST_CN_DATA) {
|
||||||
|
Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
moduleDemoActiveText.text = "Module is Active:${YukiHookAPI.Status.isModuleActive}"
|
moduleDemoActiveText.text = "Module is Active:${YukiHookAPI.Status.isModuleActive}"
|
||||||
@@ -58,20 +63,38 @@ class MainActivity : AppCompatActivity() {
|
|||||||
moduleDemoApiVersionZhText.text = "Xposed API 版本"
|
moduleDemoApiVersionZhText.text = "Xposed API 版本"
|
||||||
moduleDemoYukiHookApiVersionText.text = "YukiHookAPI Version:${YukiHookAPI.API_VERSION_NAME}(${YukiHookAPI.API_VERSION_CODE})"
|
moduleDemoYukiHookApiVersionText.text = "YukiHookAPI Version:${YukiHookAPI.API_VERSION_NAME}(${YukiHookAPI.API_VERSION_CODE})"
|
||||||
moduleDemoYukiHookApiVersionZhText.text = "YukiHookAPI 版本"
|
moduleDemoYukiHookApiVersionZhText.text = "YukiHookAPI 版本"
|
||||||
moduleDemoNewXshareText.text = "New XShare Mode:${modulePrefs.isRunInNewXShareMode}"
|
moduleDemoNewXshareText.text =
|
||||||
moduleDemoNewXshareZhText.text = "New XShare 模式支持状态"
|
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}"
|
moduleDemoResHookText.text = "Support Resources Hook:${YukiHookAPI.Status.isSupportResourcesHook}"
|
||||||
moduleDemoResHookZhText.text = "资源钩子支持状态"
|
moduleDemoResHookZhText.text = "资源钩子支持状态"
|
||||||
moduleDemoEditText.also {
|
moduleDemoEditText.also {
|
||||||
it.setText(modulePrefs.get(DataConst.TEST_KV_DATA))
|
it.setText(modulePrefs.get(DataConst.TEST_KV_DATA))
|
||||||
moduleDemoButton.setOnClickListener { _ ->
|
moduleDemoButton.setOnClickListener { _ ->
|
||||||
if (it.text.toString().isNotEmpty()) {
|
moduleEnvironment {
|
||||||
modulePrefs.put(DataConst.TEST_KV_DATA, it.text.toString())
|
if (it.text.toString().isNotEmpty()) {
|
||||||
Toast.makeText(applicationContext, "Saved", Toast.LENGTH_SHORT).show()
|
modulePrefs.put(DataConst.TEST_KV_DATA, it.text.toString())
|
||||||
} else Toast.makeText(applicationContext, "Please enter the text", Toast.LENGTH_SHORT).show()
|
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