mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Added custom proxy class name for Activity Proxy function
This commit is contained in:
@@ -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 清单中。
|
||||
|
||||
:::
|
@@ -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 清单中。
|
||||
|
||||
:::
|
@@ -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 清单中。
|
||||
|
||||
:::
|
@@ -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 清单中。
|
||||
|
||||
:::
|
@@ -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
|
||||
|
@@ -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]
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user