From c16160017eba73827d3f32bdc51bdc503a5008d9 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sat, 20 Aug 2022 00:08:14 +0800 Subject: [PATCH] Update demo --- demo-module/proguard-rules.pro | 12 ++++- .../yukihookapi/demo_module/hook/HookEntry.kt | 31 ++++++++---- .../demo_module/ui/MainActivity.kt | 47 ++++++++++++++----- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/demo-module/proguard-rules.pro b/demo-module/proguard-rules.pro index a8458749..397189b9 100644 --- a/demo-module/proguard-rules.pro +++ b/demo-module/proguard-rules.pro @@ -35,4 +35,14 @@ -adaptresourcefilecontents -renamesourcefileattribute P --keepattributes SourceFile,LineNumberTable \ No newline at end of file +-keepattributes SourceFile,LineNumberTable + +-keepclassmembers class androidx.appcompat.app.AlertDialog { + *** mAlert; +} + +-keepclassmembers class androidx.appcompat.app.AlertController { + *** mButtonPositive; + *** mButtonNegative; + *** mButtonNeutral; +} \ No newline at end of file diff --git a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt index 0e1f1078..ca7deeb1 100644 --- a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt +++ b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/hook/HookEntry.kt @@ -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().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().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 的方法 diff --git a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/ui/MainActivity.kt b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/ui/MainActivity.kt index 28cb16bc..d0faabd8 100644 --- a/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/ui/MainActivity.kt +++ b/demo-module/src/main/java/com/highcapable/yukihookapi/demo_module/ui/MainActivity.kt @@ -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() + } } \ No newline at end of file