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

View File

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

View File

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