Added custom proxy class name for Activity Proxy function

This commit is contained in:
2023-04-21 00:13:35 +08:00
parent cc321df3b8
commit 388147f089
7 changed files with 133 additions and 7 deletions

View File

@@ -26,4 +26,26 @@ open class ModuleAppActivity : Activity()
继承于此类的 `Activity` 可以同时在宿主与模块中启动。
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
## proxyClassName <span class="symbol">- field</span>
```kotlin:no-line-numbers
open val proxyClassName: String
```
**Change Records**
`v1.1.10` `added`
**Function Illustrate**
> 设置当前代理的 `Activity` 类名。
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
::: danger
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
:::

View File

@@ -42,4 +42,26 @@ open val moduleTheme: Int
**Function Illustrate**
> 设置当前代理的 `Activity` 主题。
> 设置当前代理的 `Activity` 主题。
## proxyClassName <span class="symbol">- field</span>
```kotlin:no-line-numbers
open val proxyClassName: String
```
**Change Records**
`v1.1.10` `added`
**Function Illustrate**
> 设置当前代理的 `Activity` 类名。
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
::: danger
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
:::

View File

@@ -18,4 +18,26 @@ open class ModuleAppActivity : Activity()
继承于此类的 `Activity` 可以同时在宿主与模块中启动。
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
在 (Xposed) 宿主环境需要在宿主启动时调用 `Context.registerModuleAppActivities` 进行注册。
## proxyClassName <span class="symbol">- field</span>
```kotlin:no-line-numbers
open val proxyClassName: String
```
**变更记录**
`v1.1.10` `新增`
**功能描述**
> 设置当前代理的 `Activity` 类名。
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
::: danger
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
:::

View File

@@ -34,4 +34,26 @@ open val moduleTheme: Int
**功能描述**
> 设置当前代理的 `Activity` 主题。
> 设置当前代理的 `Activity` 主题。
## proxyClassName <span class="symbol">- field</span>
```kotlin:no-line-numbers
open val proxyClassName: String
```
**变更记录**
`v1.1.10` `新增`
**功能描述**
> 设置当前代理的 `Activity` 类名。
留空则使用 `Context.registerModuleAppActivities` 时设置的类名
::: danger
代理的 **Activity** 类名必须存在于宿主的 AndroidMainifest 清单中。
:::

View File

@@ -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

View File

@@ -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]

View File

@@ -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<ModuleAppActivity>() -> buildOf<ModuleAppActivity>()?.proxyClassName?.verify()
this extends classOf<ModuleAppCompatActivity>() -> buildOf<ModuleAppCompatActivity>()?.proxyClassName?.verify()
else -> null
}
}?.getOrNull() ?: ActivityProxyConfig.proxyClassName)
putExtra(ActivityProxyConfig.proxyIntentName, argsInstance)
}
}