Update demo

This commit is contained in:
2022-08-20 00:08:14 +08:00
parent 3d333a7f3d
commit c16160017e
3 changed files with 68 additions and 22 deletions

View File

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

View File

@@ -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 的方法

View File

@@ -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()
}
}