Skip to content

Commit 388147f

Browse files
committed
Added custom proxy class name for Activity Proxy function
1 parent cc321df commit 388147f

File tree

7 files changed

+133
-7
lines changed

7 files changed

+133
-7
lines changed

docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,26 @@ open class ModuleAppActivity : Activity()
2626
2727
继承于此类的 `Activity` 可以同时在宿主与模块中启动。
2828

29-
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
29+
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
30+
31+
## proxyClassName <span class="symbol">- field</span>
32+
33+
```kotlin:no-line-numbers
34+
open val proxyClassName: String
35+
```
36+
37+
**Change Records**
38+
39+
`v1.1.10` `added`
40+
41+
**Function Illustrate**
42+
43+
> 设置当前代理的 `Activity` 类名。
44+
45+
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
46+
47+
::: danger
48+
49+
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
50+
51+
:::

docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,26 @@ open val moduleTheme: Int
4242

4343
**Function Illustrate**
4444

45-
> 设置当前代理的 `Activity` 主题。
45+
> 设置当前代理的 `Activity` 主题。
46+
47+
## proxyClassName <span class="symbol">- field</span>
48+
49+
```kotlin:no-line-numbers
50+
open val proxyClassName: String
51+
```
52+
53+
**Change Records**
54+
55+
`v1.1.10` `added`
56+
57+
**Function Illustrate**
58+
59+
> 设置当前代理的 `Activity` 类名。
60+
61+
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
62+
63+
::: danger
64+
65+
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
66+
67+
:::

docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,26 @@ open class ModuleAppActivity : Activity()
1818
1919
继承于此类的 `Activity` 可以同时在宿主与模块中启动。
2020

21-
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
21+
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
22+
23+
## proxyClassName <span class="symbol">- field</span>
24+
25+
```kotlin:no-line-numbers
26+
open val proxyClassName: String
27+
```
28+
29+
**变更记录**
30+
31+
`v1.1.10` `新增`
32+
33+
**功能描述**
34+
35+
> 设置当前代理的 `Activity` 类名。
36+
37+
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
38+
39+
::: danger
40+
41+
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
42+
43+
:::

docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,26 @@ open val moduleTheme: Int
3434

3535
**功能描述**
3636

37-
> 设置当前代理的 `Activity` 主题。
37+
> 设置当前代理的 `Activity` 主题。
38+
39+
## proxyClassName <span class="symbol">- field</span>
40+
41+
```kotlin:no-line-numbers
42+
open val proxyClassName: String
43+
```
44+
45+
**变更记录**
46+
47+
`v1.1.10` `新增`
48+
49+
**功能描述**
50+
51+
> 设置当前代理的 `Activity` 类名。
52+
53+
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
54+
55+
::: danger
56+
57+
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
58+
59+
:::

yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLo
4747
*/
4848
open class ModuleAppActivity : Activity() {
4949

50+
/**
51+
* 设置当前代理的 [Activity] 类名
52+
*
53+
* 留空则使用 [Context.registerModuleAppActivities] 时设置的类名
54+
*
55+
* - ❗代理的 [Activity] 类名必须存在于宿主的 AndroidMainifest 清单中
56+
* @return [String]
57+
*/
58+
open val proxyClassName get() = ""
59+
5060
override fun getClassLoader(): ClassLoader? = ModuleClassLoader.instance()
5161

5262
@CallSuper

yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLo
5050
*/
5151
open class ModuleAppCompatActivity : AppCompatActivity() {
5252

53+
/**
54+
* 设置当前代理的 [Activity] 类名
55+
*
56+
* 留空则使用 [Context.registerModuleAppActivities] 时设置的类名
57+
*
58+
* - ❗代理的 [Activity] 类名必须存在于宿主的 AndroidMainifest 清单中
59+
* @return [String]
60+
*/
61+
open val proxyClassName get() = ""
62+
5363
/**
5464
* 设置当前代理的 [Activity] 主题
5565
* @return [Int]

yukihookapi/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@
3030

3131
package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller
3232

33+
import android.app.Activity
3334
import android.app.ActivityManager
3435
import android.content.Intent
3536
import com.highcapable.yukihookapi.annotation.YukiGenerateApi
36-
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiXposedModule
37+
import com.highcapable.yukihookapi.hook.factory.*
3738
import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics
39+
import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base.ModuleAppActivity
40+
import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base.ModuleAppCompatActivity
3841
import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig
3942
import java.lang.reflect.InvocationHandler
4043
import java.lang.reflect.Method
@@ -70,11 +73,26 @@ object IActivityManagerProxyCaller {
7073
if (method?.name == "startActivity") args?.indexOfFirst { it is Intent }?.also { index ->
7174
val argsInstance = (args[index] as? Intent) ?: return@also
7275
val component = argsInstance.component
76+
/**
77+
* 使用宿主包名判断当前启动的 [Activity] 位于当前宿主
78+
* 使用默认的 [ClassLoader] 判断当前 [Class] 处于模块中
79+
*/
7380
if (component != null &&
7481
component.packageName == AppParasitics.currentPackageName &&
75-
component.className.startsWith(YukiXposedModule.modulePackageName)
82+
component.className.hasClass()
7683
) args[index] = Intent().apply {
77-
setClassName(component.packageName, ActivityProxyConfig.proxyClassName)
84+
/**
85+
* 验证类名是否存在
86+
* @return [String] or null
87+
*/
88+
fun String.verify() = if (hasClass(AppParasitics.hostApplication?.classLoader)) this else null
89+
setClassName(component.packageName, component.className.toClassOrNull()?.runCatching {
90+
when {
91+
this extends classOf<ModuleAppActivity>() -> buildOf<ModuleAppActivity>()?.proxyClassName?.verify()
92+
this extends classOf<ModuleAppCompatActivity>() -> buildOf<ModuleAppCompatActivity>()?.proxyClassName?.verify()
93+
else -> null
94+
}
95+
}?.getOrNull() ?: ActivityProxyConfig.proxyClassName)
7896
putExtra(ActivityProxyConfig.proxyIntentName, argsInstance)
7997
}
8098
}

0 commit comments

Comments
 (0)