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