From 388147f0899e5625cc4eaa0e876a3b4957cff85e Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Fri, 21 Apr 2023 00:13:35 +0800 Subject: [PATCH] Added custom proxy class name for Activity Proxy function --- .../activity/base/ModuleAppActivity.md | 24 ++++++++++++++++++- .../activity/base/ModuleAppCompatActivity.md | 24 ++++++++++++++++++- .../activity/base/ModuleAppActivity.md | 24 ++++++++++++++++++- .../activity/base/ModuleAppCompatActivity.md | 24 ++++++++++++++++++- .../activity/base/ModuleAppActivity.kt | 10 ++++++++ .../activity/base/ModuleAppCompatActivity.kt | 10 ++++++++ .../caller/IActivityManagerProxyCaller.kt | 24 ++++++++++++++++--- 7 files changed, 133 insertions(+), 7 deletions(-) diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md index cfd08655..a7fb5c55 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md @@ -26,4 +26,26 @@ open class ModuleAppActivity : Activity() 继承于此类的 `Activity` 可以同时在宿主与模块中启动。 -在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。 \ No newline at end of file +在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。 + +## proxyClassName - field + +```kotlin:no-line-numbers +open val proxyClassName: String +``` + +**Change Records** + +`v1.1.10` `added` + +**Function Illustrate** + +> 设置当前代理的 `Activity` 类名。 + +留空则使用 `Context.registerModuleAppActivities` 时设置的类名 + +::: danger + +代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。 + +::: \ No newline at end of file diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md index 50ace5f6..0d7c1ee3 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md @@ -42,4 +42,26 @@ open val moduleTheme: Int **Function Illustrate** -> 设置当前代理的 `Activity` 主题。 \ No newline at end of file +> 设置当前代理的 `Activity` 主题。 + +## proxyClassName - field + +```kotlin:no-line-numbers +open val proxyClassName: String +``` + +**Change Records** + +`v1.1.10` `added` + +**Function Illustrate** + +> 设置当前代理的 `Activity` 类名。 + +留空则使用 `Context.registerModuleAppActivities` 时设置的类名 + +::: danger + +代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。 + +::: \ No newline at end of file diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md index 03c46286..48b16b78 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md @@ -18,4 +18,26 @@ open class ModuleAppActivity : Activity() 继承于此类的 `Activity` 可以同时在宿主与模块中启动。 -在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。 \ No newline at end of file +在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。 + +## proxyClassName - field + +```kotlin:no-line-numbers +open val proxyClassName: String +``` + +**变更记录** + +`v1.1.10` `新增` + +**功能描述** + +> 设置当前代理的 `Activity` 类名。 + +留空则使用 `Context.registerModuleAppActivities` 时设置的类名 + +::: danger + +代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。 + +::: \ No newline at end of file diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md index fb89424d..217842ec 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md @@ -34,4 +34,26 @@ open val moduleTheme: Int **功能描述** -> 设置当前代理的 `Activity` 主题。 \ No newline at end of file +> 设置当前代理的 `Activity` 主题。 + +## proxyClassName - field + +```kotlin:no-line-numbers +open val proxyClassName: String +``` + +**变更记录** + +`v1.1.10` `新增` + +**功能描述** + +> 设置当前代理的 `Activity` 类名。 + +留空则使用 `Context.registerModuleAppActivities` 时设置的类名 + +::: danger + +代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。 + +::: \ No newline at end of file diff --git a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt index a3ac5dd5..be563262 100644 --- a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt +++ b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt @@ -47,6 +47,16 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLo */ open class ModuleAppActivity : Activity() { + /** + * 设置当前代理的 [Activity] 类名 + * + * 留空则使用 [Context.registerModuleAppActivities] 时设置的类名 + * + * - ❗代理的 [Activity] 类名必须存在于宿主的 AndroidMainifest 清单中 + * @return [String] + */ + open val proxyClassName get() = "" + override fun getClassLoader(): ClassLoader? = ModuleClassLoader.instance() @CallSuper diff --git a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt index 4dde8aeb..34653dc2 100644 --- a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt +++ b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt @@ -50,6 +50,16 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLo */ open class ModuleAppCompatActivity : AppCompatActivity() { + /** + * 设置当前代理的 [Activity] 类名 + * + * 留空则使用 [Context.registerModuleAppActivities] 时设置的类名 + * + * - ❗代理的 [Activity] 类名必须存在于宿主的 AndroidMainifest 清单中 + * @return [String] + */ + open val proxyClassName get() = "" + /** * 设置当前代理的 [Activity] 主题 * @return [Int] diff --git a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt index df377235..c146c027 100644 --- a/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt +++ b/yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt @@ -30,11 +30,14 @@ package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller +import android.app.Activity import android.app.ActivityManager import android.content.Intent import com.highcapable.yukihookapi.annotation.YukiGenerateApi -import com.highcapable.yukihookapi.hook.xposed.bridge.YukiXposedModule +import com.highcapable.yukihookapi.hook.factory.* import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics +import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base.ModuleAppActivity +import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base.ModuleAppCompatActivity import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig import java.lang.reflect.InvocationHandler import java.lang.reflect.Method @@ -70,11 +73,26 @@ object IActivityManagerProxyCaller { if (method?.name == "startActivity") args?.indexOfFirst { it is Intent }?.also { index -> val argsInstance = (args[index] as? Intent) ?: return@also val component = argsInstance.component + /** + * 使用宿主包名判断当前启动的 [Activity] 位于当前宿主 + * 使用默认的 [ClassLoader] 判断当前 [Class] 处于模块中 + */ if (component != null && component.packageName == AppParasitics.currentPackageName && - component.className.startsWith(YukiXposedModule.modulePackageName) + component.className.hasClass() ) args[index] = Intent().apply { - setClassName(component.packageName, ActivityProxyConfig.proxyClassName) + /** + * 验证类名是否存在 + * @return [String] or null + */ + fun String.verify() = if (hasClass(AppParasitics.hostApplication?.classLoader)) this else null + setClassName(component.packageName, component.className.toClassOrNull()?.runCatching { + when { + this extends classOf() -> buildOf()?.proxyClassName?.verify() + this extends classOf() -> buildOf()?.proxyClassName?.verify() + else -> null + } + }?.getOrNull() ?: ActivityProxyConfig.proxyClassName) putExtra(ActivityProxyConfig.proxyIntentName, argsInstance) } }