mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 01:35:17 +08:00
Added excludeHostClasses, excludeModuleClasses function in ModuleClassLoader
This commit is contained in:
@@ -38,6 +38,7 @@ const navigationLinks = {
|
||||
baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppActivity',
|
||||
baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppCompatActivity',
|
||||
baseApiPath + 'hook/xposed/parasitic/context/wrapper/ModuleContextThemeWrapper',
|
||||
baseApiPath + 'hook/xposed/parasitic/reference/ModuleClassLoader',
|
||||
baseApiPath + 'hook/xposed/bridge/dummy/YukiModuleResources',
|
||||
baseApiPath + 'hook/xposed/bridge/dummy/YukiResources',
|
||||
baseApiPath + 'hook/xposed/bridge/dummy/YukiResForwarder',
|
||||
|
@@ -0,0 +1,75 @@
|
||||
---
|
||||
pageClass: code-page
|
||||
---
|
||||
|
||||
::: warning
|
||||
|
||||
The English translation of this page has not been completed, you are welcome to contribute translations to us.
|
||||
|
||||
You can use the **Chrome Translation Plugin** to translate entire pages for reference.
|
||||
|
||||
:::
|
||||
|
||||
# ModuleClassLoader <span class="symbol">- class</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
class ModuleClassLoader private constructor() : ClassLoader
|
||||
```
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.2` `added`
|
||||
|
||||
**Function Illustrate**
|
||||
|
||||
> 自动处理 (Xposed) 宿主环境与模块环境的 `ClassLoader`。
|
||||
|
||||
## companion object <span class="symbol">- object</span>
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.2` `added`
|
||||
|
||||
### excludeHostClasses <span class="symbol">- method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun excludeHostClasses(vararg name: String)
|
||||
```
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.2` `added`
|
||||
|
||||
**Function Illustrate**
|
||||
|
||||
> 添加到 Hook APP (宿主) `Class` 排除列表。
|
||||
|
||||
排除列表中的 `Class` 将会使用宿主的 `ClassLoader` 进行装载。
|
||||
|
||||
::: danger
|
||||
|
||||
排除列表仅会在 (Xposed) 宿主环境生效。
|
||||
|
||||
:::
|
||||
|
||||
### excludeModuleClasses <span class="symbol">- method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun excludeModuleClasses(vararg name: String)
|
||||
```
|
||||
|
||||
**Change Records**
|
||||
|
||||
`v1.1.2` `added`
|
||||
|
||||
**Function Illustrate**
|
||||
|
||||
> 添加到模块 `Class` 排除列表。
|
||||
|
||||
排除列表中的 `Class` 将会使用模块 (当前宿主环境的模块注入进程) 的 `ClassLoader` 进行装载。
|
||||
|
||||
::: danger
|
||||
|
||||
排除列表仅会在 (Xposed) 宿主环境生效。
|
||||
|
||||
:::
|
@@ -0,0 +1,67 @@
|
||||
---
|
||||
pageClass: code-page
|
||||
---
|
||||
|
||||
# ModuleClassLoader <span class="symbol">- class</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
class ModuleClassLoader private constructor() : ClassLoader
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.2` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 自动处理 (Xposed) 宿主环境与模块环境的 `ClassLoader`。
|
||||
|
||||
## companion object <span class="symbol">- object</span>
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.2` `新增`
|
||||
|
||||
### excludeHostClasses <span class="symbol">- method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun excludeHostClasses(vararg name: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.2` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 添加到 Hook APP (宿主) `Class` 排除列表。
|
||||
|
||||
排除列表中的 `Class` 将会使用宿主的 `ClassLoader` 进行装载。
|
||||
|
||||
::: danger
|
||||
|
||||
排除列表仅会在 (Xposed) 宿主环境生效。
|
||||
|
||||
:::
|
||||
|
||||
### excludeModuleClasses <span class="symbol">- method</span>
|
||||
|
||||
```kotlin:no-line-numbers
|
||||
fun excludeModuleClasses(vararg name: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.1.2` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 添加到模块 `Class` 排除列表。
|
||||
|
||||
排除列表中的 `Class` 将会使用模块 (当前宿主环境的模块注入进程) 的 `ClassLoader` 进行装载。
|
||||
|
||||
::: danger
|
||||
|
||||
排除列表仅会在 (Xposed) 宿主环境生效。
|
||||
|
||||
:::
|
@@ -26,6 +26,8 @@
|
||||
* This file is Created by fankes on 2022/8/8.
|
||||
* Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java
|
||||
*/
|
||||
@file:Suppress("unused")
|
||||
|
||||
package com.highcapable.yukihookapi.hook.xposed.parasitic.reference
|
||||
|
||||
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge
|
||||
@@ -35,26 +37,64 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics
|
||||
/**
|
||||
* 自动处理 (Xposed) 宿主环境与模块环境的 [ClassLoader]
|
||||
*/
|
||||
internal class ModuleClassLoader private constructor() : ClassLoader(AppParasitics.baseClassLoader) {
|
||||
class ModuleClassLoader private constructor() : ClassLoader(AppParasitics.baseClassLoader) {
|
||||
|
||||
internal companion object {
|
||||
companion object {
|
||||
|
||||
/** 当前 [ModuleClassLoader] 单例 */
|
||||
private var instance: ModuleClassLoader? = null
|
||||
|
||||
/** 排除的 Hook APP (宿主) [Class] 类名数组 */
|
||||
private val excludeHostClasses = HashSet<String>()
|
||||
|
||||
/** 排除的模块 [Class] 类名数组 */
|
||||
private val excludeModuleClasses = HashSet<String>()
|
||||
|
||||
/**
|
||||
* 获取 [ModuleClassLoader] 单例
|
||||
* @return [ModuleClassLoader]
|
||||
*/
|
||||
internal fun instance() = instance ?: ModuleClassLoader().apply { instance = this }
|
||||
|
||||
/**
|
||||
* 添加到 Hook APP (宿主) [Class] 排除列表
|
||||
*
|
||||
* 排除列表中的 [Class] 将会使用宿主的 [ClassLoader] 进行装载
|
||||
*
|
||||
* - ❗排除列表仅会在 (Xposed) 宿主环境生效
|
||||
* @param name 需要添加的 [Class] 完整类名
|
||||
*/
|
||||
fun excludeHostClasses(vararg name: String) {
|
||||
excludeHostClasses.addAll(name.toList())
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加到模块 [Class] 排除列表
|
||||
*
|
||||
* 排除列表中的 [Class] 将会使用模块 (当前宿主环境的模块注入进程) 的 [ClassLoader] 进行装载
|
||||
*
|
||||
* - ❗排除列表仅会在 (Xposed) 宿主环境生效
|
||||
* @param name 需要添加的 [Class] 完整类名
|
||||
*/
|
||||
fun excludeModuleClasses(vararg name: String) {
|
||||
excludeModuleClasses.addAll(name.toList())
|
||||
}
|
||||
|
||||
init {
|
||||
excludeHostClasses.add("androidx.lifecycle.ReportFragment")
|
||||
}
|
||||
}
|
||||
|
||||
/** 默认 [ClassLoader] */
|
||||
private val baseLoader get() = AppParasitics.baseClassLoader
|
||||
|
||||
override fun loadClass(name: String, resolve: Boolean): Class<*> {
|
||||
if (YukiHookBridge.hasXposedBridge.not()) return AppParasitics.baseClassLoader.loadClass(name)
|
||||
return YukiHookAppHelper.currentApplication()?.classLoader?.let { loader ->
|
||||
runCatching { if (name == "androidx.lifecycle.ReportFragment") return@let loader.loadClass(name) }
|
||||
runCatching { return@let AppParasitics.baseClassLoader.loadClass(name) }
|
||||
runCatching { AppParasitics.baseClassLoader.loadClass(name) }.getOrNull() ?: loader.loadClass(name)
|
||||
if (YukiHookBridge.hasXposedBridge.not()) return baseLoader.loadClass(name)
|
||||
return YukiHookAppHelper.currentApplication()?.classLoader?.let { hostLoader ->
|
||||
excludeHostClasses.takeIf { it.isNotEmpty() }?.forEach { runCatching { if (name == it) return@let hostLoader.loadClass(name) } }
|
||||
excludeModuleClasses.takeIf { it.isNotEmpty() }?.forEach { runCatching { if (name == it) return@let baseLoader.loadClass(name) } }
|
||||
runCatching { return@let baseLoader.loadClass(name) }
|
||||
runCatching { baseLoader.loadClass(name) }.getOrNull() ?: hostLoader.loadClass(name)
|
||||
} ?: super.loadClass(name, resolve)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user