mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 02:35:40 +08:00
refactor: merge HashSet/ArraySet to MutableSet, HashMap/ArrayMap to MutableMap, ArrayList to MutableList
This commit is contained in:
@@ -441,7 +441,7 @@ fun enclosing(vararg name: String)
|
|||||||
## FromPackageRules <span class="symbol">- class</span>
|
## FromPackageRules <span class="symbol">- class</span>
|
||||||
|
|
||||||
```kotlin:no-line-numbers
|
```kotlin:no-line-numbers
|
||||||
inner class FromPackageRules internal constructor(private val packages: ArrayList<ClassRulesData.PackageRulesData>)
|
inner class FromPackageRules internal constructor(private val packages: MutableList<ClassRulesData.PackageRulesData>)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Change Records**
|
**Change Records**
|
||||||
|
@@ -259,7 +259,7 @@ fun contains(key: String): Boolean
|
|||||||
## all <span class="symbol">- method</span>
|
## all <span class="symbol">- method</span>
|
||||||
|
|
||||||
```kotlin:no-line-numbers
|
```kotlin:no-line-numbers
|
||||||
fun all(): HashMap<String, Any?>
|
fun all(): MutableMap<String, Any?>
|
||||||
```
|
```
|
||||||
|
|
||||||
**Change Records**
|
**Change Records**
|
||||||
|
@@ -433,7 +433,7 @@ fun enclosing(vararg name: String)
|
|||||||
## FromPackageRules <span class="symbol">- class</span>
|
## FromPackageRules <span class="symbol">- class</span>
|
||||||
|
|
||||||
```kotlin:no-line-numbers
|
```kotlin:no-line-numbers
|
||||||
inner class FromPackageRules internal constructor(private val packages: ArrayList<ClassRulesData.PackageRulesData>)
|
inner class FromPackageRules internal constructor(private val packages: MutableList<ClassRulesData.PackageRulesData>)
|
||||||
```
|
```
|
||||||
|
|
||||||
**变更记录**
|
**变更记录**
|
||||||
|
@@ -251,7 +251,7 @@ fun contains(key: String): Boolean
|
|||||||
## all <span class="symbol">- method</span>
|
## all <span class="symbol">- method</span>
|
||||||
|
|
||||||
```kotlin:no-line-numbers
|
```kotlin:no-line-numbers
|
||||||
fun all(): HashMap<String, Any?>
|
fun all(): MutableMap<String, Any?>
|
||||||
```
|
```
|
||||||
|
|
||||||
**变更记录**
|
**变更记录**
|
||||||
|
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
package com.highcapable.yukihookapi.hook.core
|
package com.highcapable.yukihookapi.hook.core
|
||||||
|
|
||||||
import android.util.ArrayMap
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.annotation.CauseProblemsApi
|
import com.highcapable.yukihookapi.annotation.CauseProblemsApi
|
||||||
import com.highcapable.yukihookapi.hook.bean.HookClass
|
import com.highcapable.yukihookapi.hook.bean.HookClass
|
||||||
@@ -97,13 +96,13 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
|
|||||||
private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null
|
private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null
|
||||||
|
|
||||||
/** 当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件数组 */
|
/** 当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件数组 */
|
||||||
private val disableCreatorRunHookReasons = HashSet<Boolean>()
|
private val disableCreatorRunHookReasons = mutableSetOf<Boolean>()
|
||||||
|
|
||||||
/** 是否对当前 [YukiMemberHookCreator] 禁止执行 Hook 操作 */
|
/** 是否对当前 [YukiMemberHookCreator] 禁止执行 Hook 操作 */
|
||||||
private var isDisableCreatorRunHook = false
|
private var isDisableCreatorRunHook = false
|
||||||
|
|
||||||
/** 设置要 Hook 的 [Method]、[Constructor] */
|
/** 设置要 Hook 的 [Method]、[Constructor] */
|
||||||
private var preHookMembers = ArrayMap<String, MemberHookCreator>()
|
private var preHookMembers = mutableMapOf<String, MemberHookCreator>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件
|
* 更新当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件
|
||||||
@@ -293,10 +292,10 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
|
|||||||
private var isHookMemberSetup = false
|
private var isHookMemberSetup = false
|
||||||
|
|
||||||
/** 当前被 Hook 的 [Method]、[Constructor] 实例数组 */
|
/** 当前被 Hook 的 [Method]、[Constructor] 实例数组 */
|
||||||
private val hookedMembers = HashSet<YukiMemberHook.HookedMember>()
|
private val hookedMembers = mutableSetOf<YukiMemberHook.HookedMember>()
|
||||||
|
|
||||||
/** 当前需要 Hook 的 [Method]、[Constructor] */
|
/** 当前需要 Hook 的 [Method]、[Constructor] */
|
||||||
internal val members = HashSet<Member>()
|
internal val members = mutableSetOf<Member>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手动指定要 Hook 的 [Method]、[Constructor]
|
* 手动指定要 Hook 的 [Method]、[Constructor]
|
||||||
@@ -322,7 +321,6 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
|
|||||||
*
|
*
|
||||||
* - 请现在迁移到 [MethodFinder] or [allMembers]
|
* - 请现在迁移到 [MethodFinder] or [allMembers]
|
||||||
* @param name 方法名称
|
* @param name 方法名称
|
||||||
* @return [ArrayList]<[MethodFinder.Result.Instance]>
|
|
||||||
*/
|
*/
|
||||||
@Deprecated(message = "请使用新方式来实现 Hook 所有方法", ReplaceWith("method { this.name = name }.all()"))
|
@Deprecated(message = "请使用新方式来实现 Hook 所有方法", ReplaceWith("method { this.name = name }.all()"))
|
||||||
fun allMethods(name: String) = method { this.name = name }.all()
|
fun allMethods(name: String) = method { this.name = name }.all()
|
||||||
@@ -333,7 +331,6 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
|
|||||||
* - 此方法已弃用 - 在之后的版本中将直接被删除
|
* - 此方法已弃用 - 在之后的版本中将直接被删除
|
||||||
*
|
*
|
||||||
* - 请现在迁移到 [ConstructorFinder] or [allMembers]
|
* - 请现在迁移到 [ConstructorFinder] or [allMembers]
|
||||||
* @return [ArrayList]<[ConstructorFinder.Result.Instance]>
|
|
||||||
*/
|
*/
|
||||||
@Deprecated(
|
@Deprecated(
|
||||||
message = "请使用新方式来实现 Hook 所有构造方法",
|
message = "请使用新方式来实现 Hook 所有构造方法",
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
package com.highcapable.yukihookapi.hook.core
|
package com.highcapable.yukihookapi.hook.core
|
||||||
|
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.util.ArrayMap
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.hook.bean.HookResources
|
import com.highcapable.yukihookapi.hook.bean.HookResources
|
||||||
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiCategoryHelper
|
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiCategoryHelper
|
||||||
@@ -48,7 +47,7 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType
|
|||||||
class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources) {
|
class YukiResourcesHookCreator internal constructor(internal val packageParam: PackageParam, internal val hookResources: HookResources) {
|
||||||
|
|
||||||
/** 设置要 Hook 的 Resources */
|
/** 设置要 Hook 的 Resources */
|
||||||
private var preHookResources = ArrayMap<String, ResourcesHookCreator>()
|
private var preHookResources = mutableMapOf<String, ResourcesHookCreator>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注入要 Hook 的 Resources
|
* 注入要 Hook 的 Resources
|
||||||
|
@@ -37,5 +37,5 @@ import java.lang.reflect.Member
|
|||||||
internal object YukiHookCacheStore {
|
internal object YukiHookCacheStore {
|
||||||
|
|
||||||
/** 已经 Hook 的 [Member] 数组 */
|
/** 已经 Hook 的 [Member] 数组 */
|
||||||
internal val hookedMembers = HashSet<YukiMemberHook.HookedMember>()
|
internal val hookedMembers = mutableSetOf<YukiMemberHook.HookedMember>()
|
||||||
}
|
}
|
@@ -30,7 +30,6 @@
|
|||||||
|
|
||||||
package com.highcapable.yukihookapi.hook.core.finder.base.rules
|
package com.highcapable.yukihookapi.hook.core.finder.base.rules
|
||||||
|
|
||||||
import android.util.ArrayMap
|
|
||||||
import java.lang.reflect.Field
|
import java.lang.reflect.Field
|
||||||
import java.lang.reflect.Member
|
import java.lang.reflect.Member
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
@@ -47,14 +46,14 @@ class ModifierRules private constructor(private val instance: Any) {
|
|||||||
internal companion object {
|
internal companion object {
|
||||||
|
|
||||||
/** 当前实例数组 */
|
/** 当前实例数组 */
|
||||||
private val instances = ArrayMap<Long, ModifierRules>()
|
private val instances = mutableMapOf<Long, ModifierRules>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取模板字符串数组
|
* 获取模板字符串数组
|
||||||
* @param value 唯一标识值
|
* @param value 唯一标识值
|
||||||
* @return [ArrayList]<[String]>
|
* @return [MutableList]<[String]>
|
||||||
*/
|
*/
|
||||||
internal fun templates(value: Long) = instances[value]?.templates ?: arrayListOf()
|
internal fun templates(value: Long) = instances[value]?.templates ?: mutableListOf()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建实例
|
* 创建实例
|
||||||
@@ -66,7 +65,7 @@ class ModifierRules private constructor(private val instance: Any) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 当前模板字符串数组 */
|
/** 当前模板字符串数组 */
|
||||||
private val templates = ArrayList<String>()
|
private val templates = mutableListOf<String>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Class]、[Member] 类型是否包含 public
|
* [Class]、[Member] 类型是否包含 public
|
||||||
|
@@ -176,7 +176,7 @@ class DexClassFinder internal constructor(
|
|||||||
* @param name 指定包名
|
* @param name 指定包名
|
||||||
* @return [FromPackageRules] 可设置 [FromPackageRules.absolute] 标识包名绝对匹配
|
* @return [FromPackageRules] 可设置 [FromPackageRules.absolute] 标识包名绝对匹配
|
||||||
*/
|
*/
|
||||||
fun from(vararg name: String) = FromPackageRules(arrayListOf<ClassRulesData.PackageRulesData>().also {
|
fun from(vararg name: String) = FromPackageRules(mutableListOf<ClassRulesData.PackageRulesData>().also {
|
||||||
name.takeIf { e -> e.isNotEmpty() }?.forEach { e -> it.add(rulesData.createPackageRulesData(e)) }
|
name.takeIf { e -> e.isNotEmpty() }?.forEach { e -> it.add(rulesData.createPackageRulesData(e)) }
|
||||||
if (it.isNotEmpty()) rulesData.fromPackages.addAll(it)
|
if (it.isNotEmpty()) rulesData.fromPackages.addAll(it)
|
||||||
})
|
})
|
||||||
@@ -359,7 +359,7 @@ class DexClassFinder internal constructor(
|
|||||||
* 包名范围名称过滤匹配条件实现类
|
* 包名范围名称过滤匹配条件实现类
|
||||||
* @param packages 包名数组
|
* @param packages 包名数组
|
||||||
*/
|
*/
|
||||||
inner class FromPackageRules internal constructor(private val packages: ArrayList<ClassRulesData.PackageRulesData>) {
|
inner class FromPackageRules internal constructor(private val packages: MutableList<ClassRulesData.PackageRulesData>) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置包名绝对匹配
|
* 设置包名绝对匹配
|
||||||
|
@@ -62,7 +62,7 @@ import java.lang.reflect.Method
|
|||||||
* @param constroctorRules [Constructor] 查找条件数据数组
|
* @param constroctorRules [Constructor] 查找条件数据数组
|
||||||
*/
|
*/
|
||||||
internal class ClassRulesData internal constructor(
|
internal class ClassRulesData internal constructor(
|
||||||
var fromPackages: ArrayList<PackageRulesData> = arrayListOf(),
|
var fromPackages: MutableList<PackageRulesData> = mutableListOf(),
|
||||||
var fullName: NameRulesData? = null,
|
var fullName: NameRulesData? = null,
|
||||||
var simpleName: NameRulesData? = null,
|
var simpleName: NameRulesData? = null,
|
||||||
var singleName: NameRulesData? = null,
|
var singleName: NameRulesData? = null,
|
||||||
@@ -72,13 +72,13 @@ internal class ClassRulesData internal constructor(
|
|||||||
var isAnonymousClass: Boolean? = null,
|
var isAnonymousClass: Boolean? = null,
|
||||||
var isNoExtendsClass: Boolean? = null,
|
var isNoExtendsClass: Boolean? = null,
|
||||||
var isNoImplementsClass: Boolean? = null,
|
var isNoImplementsClass: Boolean? = null,
|
||||||
var extendsClass: ArrayList<String> = arrayListOf(),
|
var extendsClass: MutableList<String> = mutableListOf(),
|
||||||
var implementsClass: ArrayList<String> = arrayListOf(),
|
var implementsClass: MutableList<String> = mutableListOf(),
|
||||||
var enclosingClass: ArrayList<String> = arrayListOf(),
|
var enclosingClass: MutableList<String> = mutableListOf(),
|
||||||
var memberRules: ArrayList<MemberRulesData> = arrayListOf(),
|
var memberRules: MutableList<MemberRulesData> = mutableListOf(),
|
||||||
var fieldRules: ArrayList<FieldRulesData> = arrayListOf(),
|
var fieldRules: MutableList<FieldRulesData> = mutableListOf(),
|
||||||
var methodRules: ArrayList<MethodRulesData> = arrayListOf(),
|
var methodRules: MutableList<MethodRulesData> = mutableListOf(),
|
||||||
var constroctorRules: ArrayList<ConstructorRulesData> = arrayListOf()
|
var constroctorRules: MutableList<ConstructorRulesData> = mutableListOf()
|
||||||
) : BaseRulesData() {
|
) : BaseRulesData() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -102,7 +102,7 @@ class ConstructorRules internal constructor(private val rulesData: ConstructorRu
|
|||||||
fun param(vararg paramType: Any) {
|
fun param(vararg paramType: Any) {
|
||||||
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
||||||
rulesData.paramTypes =
|
rulesData.paramTypes =
|
||||||
arrayListOf<Class<*>>().apply { paramType.forEach { add(it.compat(tag = "Constructor") ?: UndefinedType) } }.toTypedArray()
|
mutableListOf<Class<*>>().apply { paramType.forEach { add(it.compat(tag = "Constructor") ?: UndefinedType) } }.toTypedArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -128,7 +128,7 @@ class MethodRules internal constructor(private val rulesData: MethodRulesData) :
|
|||||||
fun param(vararg paramType: Any) {
|
fun param(vararg paramType: Any) {
|
||||||
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
||||||
rulesData.paramTypes =
|
rulesData.paramTypes =
|
||||||
arrayListOf<Class<*>>().apply { paramType.forEach { add(it.compat(tag = "Method") ?: UndefinedType) } }.toTypedArray()
|
mutableListOf<Class<*>>().apply { paramType.forEach { add(it.compat(tag = "Method") ?: UndefinedType) } }.toTypedArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -138,7 +138,7 @@ class ConstructorFinder internal constructor(override val classSet: Class<*>? =
|
|||||||
*/
|
*/
|
||||||
fun param(vararg paramType: Any): IndexTypeCondition {
|
fun param(vararg paramType: Any): IndexTypeCondition {
|
||||||
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
||||||
rulesData.paramTypes = arrayListOf<Class<*>>().apply { paramType.forEach { add(it.compat() ?: UndefinedType) } }.toTypedArray()
|
rulesData.paramTypes = mutableListOf<Class<*>>().apply { paramType.forEach { add(it.compat() ?: UndefinedType) } }.toTypedArray()
|
||||||
return IndexTypeCondition(IndexConfigType.MATCH)
|
return IndexTypeCondition(IndexConfigType.MATCH)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -169,7 +169,7 @@ class MethodFinder internal constructor(override val classSet: Class<*>? = null)
|
|||||||
*/
|
*/
|
||||||
fun param(vararg paramType: Any): IndexTypeCondition {
|
fun param(vararg paramType: Any): IndexTypeCondition {
|
||||||
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
|
||||||
rulesData.paramTypes = arrayListOf<Class<*>>().apply { paramType.forEach { add(it.compat() ?: UndefinedType) } }.toTypedArray()
|
rulesData.paramTypes = mutableListOf<Class<*>>().apply { paramType.forEach { add(it.compat() ?: UndefinedType) } }.toTypedArray()
|
||||||
return IndexTypeCondition(IndexConfigType.MATCH)
|
return IndexTypeCondition(IndexConfigType.MATCH)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
package com.highcapable.yukihookapi.hook.core.finder.tools
|
package com.highcapable.yukihookapi.hook.core.finder.tools
|
||||||
|
|
||||||
import android.util.ArrayMap
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.hook.core.finder.base.data.BaseRulesData
|
import com.highcapable.yukihookapi.hook.core.finder.base.data.BaseRulesData
|
||||||
import com.highcapable.yukihookapi.hook.core.finder.classes.data.ClassRulesData
|
import com.highcapable.yukihookapi.hook.core.finder.classes.data.ClassRulesData
|
||||||
@@ -85,10 +84,10 @@ internal object ReflectionTool {
|
|||||||
private object MemoryCache {
|
private object MemoryCache {
|
||||||
|
|
||||||
/** 缓存的 [Class] 列表数组 */
|
/** 缓存的 [Class] 列表数组 */
|
||||||
val dexClassListData = ArrayMap<String, List<String>>()
|
val dexClassListData = mutableMapOf<String, List<String>>()
|
||||||
|
|
||||||
/** 缓存的 [Class] 对象数组 */
|
/** 缓存的 [Class] 对象数组 */
|
||||||
val classData = ArrayMap<String, Class<*>?>()
|
val classData = mutableMapOf<String, Class<*>?>()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -660,7 +659,7 @@ internal object ReflectionTool {
|
|||||||
*/
|
*/
|
||||||
private val Class<*>.existMembers
|
private val Class<*>.existMembers
|
||||||
get() = runCatching {
|
get() = runCatching {
|
||||||
arrayListOf<Member>().apply {
|
mutableListOf<Member>().apply {
|
||||||
addAll(declaredFields.toList())
|
addAll(declaredFields.toList())
|
||||||
addAll(declaredMethods.toList())
|
addAll(declaredMethods.toList())
|
||||||
addAll(declaredConstructors.toList())
|
addAll(declaredConstructors.toList())
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
package com.highcapable.yukihookapi.hook.param
|
package com.highcapable.yukihookapi.hook.param
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.ArrayMap
|
|
||||||
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator
|
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator
|
||||||
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator
|
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator
|
||||||
import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper
|
import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper
|
||||||
@@ -56,7 +55,7 @@ class HookParam internal constructor(
|
|||||||
internal companion object {
|
internal companion object {
|
||||||
|
|
||||||
/** 每个回调方法体的数据存储实例数据 */
|
/** 每个回调方法体的数据存储实例数据 */
|
||||||
private val dataExtras = ArrayMap<String, Bundle>()
|
private val dataExtras = mutableMapOf<String, Bundle>()
|
||||||
|
|
||||||
/** [HookParam] 是否已经执行首次回调事件 */
|
/** [HookParam] 是否已经执行首次回调事件 */
|
||||||
internal var isCallbackCalled = false
|
internal var isCallbackCalled = false
|
||||||
|
@@ -102,10 +102,10 @@ internal inline fun <T> T.conditions(initiate: Conditions<T>.() -> Unit) = Condi
|
|||||||
internal class Conditions<T>(internal var value: T) {
|
internal class Conditions<T>(internal var value: T) {
|
||||||
|
|
||||||
/** 全部判断条件数组 (与) */
|
/** 全部判断条件数组 (与) */
|
||||||
private val andConditions = ArrayList<Boolean>()
|
private val andConditions = mutableListOf<Boolean>()
|
||||||
|
|
||||||
/** 全部判断条件数组 (或) */
|
/** 全部判断条件数组 (或) */
|
||||||
private val optConditions = ArrayList<Boolean>()
|
private val optConditions = mutableListOf<Boolean>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加与 (and) 条件
|
* 添加与 (and) 条件
|
||||||
|
@@ -30,7 +30,6 @@ package com.highcapable.yukihookapi.hook.xposed.bridge
|
|||||||
|
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.util.ArrayMap
|
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiCategoryHelper
|
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiCategoryHelper
|
||||||
import com.highcapable.yukihookapi.hook.factory.hasClass
|
import com.highcapable.yukihookapi.hook.factory.hasClass
|
||||||
@@ -59,13 +58,13 @@ internal object YukiXposedModule : IYukiXposedModuleLifecycle {
|
|||||||
private var isInitializingZygote = false
|
private var isInitializingZygote = false
|
||||||
|
|
||||||
/** 当前 [PackageParam] 实例数组 */
|
/** 当前 [PackageParam] 实例数组 */
|
||||||
private val packageParams = ArrayMap<String, PackageParam>()
|
private val packageParams = mutableMapOf<String, PackageParam>()
|
||||||
|
|
||||||
/** 已在 [PackageParam] 中被装载的 APP 包名 */
|
/** 已在 [PackageParam] 中被装载的 APP 包名 */
|
||||||
private val loadedPackageNames = HashSet<String>()
|
private val loadedPackageNames = mutableSetOf<String>()
|
||||||
|
|
||||||
/** 当前 [PackageParamWrapper] 实例数组 */
|
/** 当前 [PackageParamWrapper] 实例数组 */
|
||||||
private val packageParamWrappers = ArrayMap<String, PackageParamWrapper>()
|
private val packageParamWrappers = mutableMapOf<String, PackageParamWrapper>()
|
||||||
|
|
||||||
/** 当前 [PackageParam] 方法体回调 */
|
/** 当前 [PackageParam] 方法体回调 */
|
||||||
internal var packageParamCallback: (PackageParam.() -> Unit)? = null
|
internal var packageParamCallback: (PackageParam.() -> Unit)? = null
|
||||||
|
@@ -155,7 +155,7 @@ class YukiHookDataChannel private constructor() {
|
|||||||
intent.action?.also { action ->
|
intent.action?.also { action ->
|
||||||
runCatching {
|
runCatching {
|
||||||
receiverCallbacks.takeIf { it.isNotEmpty() }?.apply {
|
receiverCallbacks.takeIf { it.isNotEmpty() }?.apply {
|
||||||
arrayListOf<String>().also { destroyedCallbacks ->
|
mutableListOf<String>().also { destroyedCallbacks ->
|
||||||
forEach { (key, it) ->
|
forEach { (key, it) ->
|
||||||
when {
|
when {
|
||||||
(it.first as? Activity?)?.isDestroyed == true -> destroyedCallbacks.add(key)
|
(it.first as? Activity?)?.isDestroyed == true -> destroyedCallbacks.add(key)
|
||||||
@@ -259,10 +259,10 @@ class YukiHookDataChannel private constructor() {
|
|||||||
* @param stringData [String] 数据数组
|
* @param stringData [String] 数据数组
|
||||||
*/
|
*/
|
||||||
internal inner class SegmentsTempData(
|
internal inner class SegmentsTempData(
|
||||||
var listData: ArrayList<List<*>> = arrayListOf(),
|
var listData: MutableList<List<*>> = mutableListOf(),
|
||||||
var mapData: ArrayList<Map<*, *>> = arrayListOf(),
|
var mapData: MutableList<Map<*, *>> = mutableListOf(),
|
||||||
var setData: ArrayList<Set<*>> = arrayListOf(),
|
var setData: MutableList<Set<*>> = mutableListOf(),
|
||||||
var stringData: ArrayList<String> = arrayListOf()
|
var stringData: MutableList<String> = mutableListOf()
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -531,7 +531,7 @@ class YukiHookDataChannel private constructor() {
|
|||||||
if (tempData.listData.isEmpty() && wrapper.segmentsIndex > 0) return
|
if (tempData.listData.isEmpty() && wrapper.segmentsIndex > 0) return
|
||||||
tempData.listData.add(wrapper.segmentsIndex, value)
|
tempData.listData.add(wrapper.segmentsIndex, value)
|
||||||
if (tempData.listData.size == wrapper.segmentsSize) {
|
if (tempData.listData.size == wrapper.segmentsSize) {
|
||||||
result(arrayListOf<Any?>().also { list -> tempData.listData.forEach { list.addAll(it) } } as T)
|
result(mutableListOf<Any?>().also { list -> tempData.listData.forEach { list.addAll(it) } } as T)
|
||||||
tempData.listData.clear()
|
tempData.listData.clear()
|
||||||
segmentsTempData.remove(wrapper.wrapperId)
|
segmentsTempData.remove(wrapper.wrapperId)
|
||||||
}
|
}
|
||||||
@@ -540,7 +540,7 @@ class YukiHookDataChannel private constructor() {
|
|||||||
if (tempData.mapData.isEmpty() && wrapper.segmentsIndex > 0) return
|
if (tempData.mapData.isEmpty() && wrapper.segmentsIndex > 0) return
|
||||||
tempData.mapData.add(wrapper.segmentsIndex, value)
|
tempData.mapData.add(wrapper.segmentsIndex, value)
|
||||||
if (tempData.mapData.size == wrapper.segmentsSize) {
|
if (tempData.mapData.size == wrapper.segmentsSize) {
|
||||||
result(hashMapOf<Any?, Any?>().also { map -> tempData.mapData.forEach { it.forEach { (k, v) -> map[k] = v } } } as T)
|
result(mutableMapOf<Any?, Any?>().also { map -> tempData.mapData.forEach { it.forEach { (k, v) -> map[k] = v } } } as T)
|
||||||
tempData.mapData.clear()
|
tempData.mapData.clear()
|
||||||
segmentsTempData.remove(wrapper.wrapperId)
|
segmentsTempData.remove(wrapper.wrapperId)
|
||||||
}
|
}
|
||||||
@@ -549,7 +549,7 @@ class YukiHookDataChannel private constructor() {
|
|||||||
if (tempData.setData.isEmpty() && wrapper.segmentsIndex > 0) return
|
if (tempData.setData.isEmpty() && wrapper.segmentsIndex > 0) return
|
||||||
tempData.setData.add(wrapper.segmentsIndex, value)
|
tempData.setData.add(wrapper.segmentsIndex, value)
|
||||||
if (tempData.setData.size == wrapper.segmentsSize) {
|
if (tempData.setData.size == wrapper.segmentsSize) {
|
||||||
result(hashSetOf<Any?>().also { set -> tempData.setData.forEach { set.addAll(it) } } as T)
|
result(mutableSetOf<Any?>().also { set -> tempData.setData.forEach { set.addAll(it) } } as T)
|
||||||
tempData.setData.clear()
|
tempData.setData.clear()
|
||||||
segmentsTempData.remove(wrapper.wrapperId)
|
segmentsTempData.remove(wrapper.wrapperId)
|
||||||
}
|
}
|
||||||
@@ -623,13 +623,13 @@ class YukiHookDataChannel private constructor() {
|
|||||||
wrapper.isSegmentsType || isAllowSendTooLargeData -> pushReceiver(wrapper)
|
wrapper.isSegmentsType || isAllowSendTooLargeData -> pushReceiver(wrapper)
|
||||||
dataByteSize >= receiverDataMaxByteSize -> when (wrapper.instance.value) {
|
dataByteSize >= receiverDataMaxByteSize -> when (wrapper.instance.value) {
|
||||||
is List<*> -> (wrapper.instance.value as List<*>).also { value ->
|
is List<*> -> (wrapper.instance.value as List<*>).also { value ->
|
||||||
val segments = arrayListOf<List<*>>()
|
val segments = mutableListOf<List<*>>()
|
||||||
var segment = arrayListOf<Any?>()
|
var segment = mutableListOf<Any?>()
|
||||||
value.forEach {
|
value.forEach {
|
||||||
segment.add(it)
|
segment.add(it)
|
||||||
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
||||||
segments.add(segment)
|
segments.add(segment)
|
||||||
segment = arrayListOf()
|
segment = mutableListOf()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (segment.isNotEmpty()) segments.add(segment)
|
if (segment.isNotEmpty()) segments.add(segment)
|
||||||
@@ -639,13 +639,13 @@ class YukiHookDataChannel private constructor() {
|
|||||||
} ?: loggerForUnprocessableDataByFirstElement(name = "List")
|
} ?: loggerForUnprocessableDataByFirstElement(name = "List")
|
||||||
}
|
}
|
||||||
is Map<*, *> -> (wrapper.instance.value as Map<*, *>).also { value ->
|
is Map<*, *> -> (wrapper.instance.value as Map<*, *>).also { value ->
|
||||||
val segments = arrayListOf<Map<*, *>>()
|
val segments = mutableListOf<Map<*, *>>()
|
||||||
var segment = hashMapOf<Any?, Any?>()
|
var segment = mutableMapOf<Any?, Any?>()
|
||||||
value.forEach { (k, v) ->
|
value.forEach { (k, v) ->
|
||||||
segment[k] = v
|
segment[k] = v
|
||||||
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
||||||
segments.add(segment)
|
segments.add(segment)
|
||||||
segment = hashMapOf()
|
segment = mutableMapOf()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (segment.isNotEmpty()) segments.add(segment)
|
if (segment.isNotEmpty()) segments.add(segment)
|
||||||
@@ -655,13 +655,13 @@ class YukiHookDataChannel private constructor() {
|
|||||||
} ?: loggerForUnprocessableDataByFirstElement(name = "Map")
|
} ?: loggerForUnprocessableDataByFirstElement(name = "Map")
|
||||||
}
|
}
|
||||||
is Set<*> -> (wrapper.instance.value as Set<*>).also { value ->
|
is Set<*> -> (wrapper.instance.value as Set<*>).also { value ->
|
||||||
val segments = arrayListOf<Set<*>>()
|
val segments = mutableListOf<Set<*>>()
|
||||||
var segment = hashSetOf<Any?>()
|
var segment = mutableSetOf<Any?>()
|
||||||
value.forEach {
|
value.forEach {
|
||||||
segment.add(it)
|
segment.add(it)
|
||||||
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
|
||||||
segments.add(segment)
|
segments.add(segment)
|
||||||
segment = hashSetOf()
|
segment = mutableSetOf()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (segment.isNotEmpty()) segments.add(segment)
|
if (segment.isNotEmpty()) segments.add(segment)
|
||||||
@@ -673,7 +673,7 @@ class YukiHookDataChannel private constructor() {
|
|||||||
is String -> (wrapper.instance.value as String).also { value ->
|
is String -> (wrapper.instance.value as String).also { value ->
|
||||||
/** 由于字符会被按照双字节计算 - 所以这里将限制字节大小除以 2 */
|
/** 由于字符会被按照双字节计算 - 所以这里将限制字节大小除以 2 */
|
||||||
val twoByteMaxSize = receiverDataMaxByteSize / 2
|
val twoByteMaxSize = receiverDataMaxByteSize / 2
|
||||||
val segments = arrayListOf<String>()
|
val segments = mutableListOf<String>()
|
||||||
for (i in 0..value.length step twoByteMaxSize)
|
for (i in 0..value.length step twoByteMaxSize)
|
||||||
if (i + twoByteMaxSize <= value.length)
|
if (i + twoByteMaxSize <= value.length)
|
||||||
segments.add(value.substring(i, i + twoByteMaxSize))
|
segments.add(value.substring(i, i + twoByteMaxSize))
|
||||||
|
@@ -47,7 +47,6 @@ import android.content.res.Configuration
|
|||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.util.ArrayMap
|
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiProperty
|
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiProperty
|
||||||
@@ -111,7 +110,7 @@ internal object AppParasitics {
|
|||||||
private var isClassLoaderHooked = false
|
private var isClassLoaderHooked = false
|
||||||
|
|
||||||
/** [ClassLoader] 监听回调数组 */
|
/** [ClassLoader] 监听回调数组 */
|
||||||
private var classLoaderCallbacks = ArrayMap<Int, (Class<*>) -> Unit>()
|
private var classLoaderCallbacks = mutableMapOf<Int, (Class<*>) -> Unit>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当前 Hook APP (宿主) 的全局生命周期 [Application]
|
* 当前 Hook APP (宿主) 的全局生命周期 [Application]
|
||||||
@@ -476,9 +475,9 @@ internal object AppParasitics {
|
|||||||
internal var onConfigurationChangedCallback: ((Application, Configuration) -> Unit)? = null
|
internal var onConfigurationChangedCallback: ((Application, Configuration) -> Unit)? = null
|
||||||
|
|
||||||
/** 系统广播监听回调 */
|
/** 系统广播监听回调 */
|
||||||
internal val onReceiverActionsCallbacks = ArrayMap<String, Pair<Array<out String>, (Context, Intent) -> Unit>>()
|
internal val onReceiverActionsCallbacks = mutableMapOf<String, Pair<Array<out String>, (Context, Intent) -> Unit>>()
|
||||||
|
|
||||||
/** 系统广播监听回调 */
|
/** 系统广播监听回调 */
|
||||||
internal val onReceiverFiltersCallbacks = ArrayMap<String, Pair<IntentFilter, (Context, Intent) -> Unit>>()
|
internal val onReceiverFiltersCallbacks = mutableMapOf<String, Pair<IntentFilter, (Context, Intent) -> Unit>>()
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -44,10 +44,10 @@ class ModuleClassLoader private constructor() : ClassLoader(AppParasitics.baseCl
|
|||||||
private var instance: ModuleClassLoader? = null
|
private var instance: ModuleClassLoader? = null
|
||||||
|
|
||||||
/** 排除的 Hook APP (宿主) [Class] 类名数组 */
|
/** 排除的 Hook APP (宿主) [Class] 类名数组 */
|
||||||
private val excludeHostClasses = HashSet<String>()
|
private val excludeHostClasses = mutableSetOf<String>()
|
||||||
|
|
||||||
/** 排除的模块 [Class] 类名数组 */
|
/** 排除的模块 [Class] 类名数组 */
|
||||||
private val excludeModuleClasses = HashSet<String>()
|
private val excludeModuleClasses = mutableSetOf<String>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取 [ModuleClassLoader] 单例
|
* 获取 [ModuleClassLoader] 单例
|
||||||
|
@@ -34,7 +34,6 @@ package com.highcapable.yukihookapi.hook.xposed.prefs
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.util.ArrayMap
|
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import com.highcapable.yukihookapi.YukiHookAPI
|
import com.highcapable.yukihookapi.YukiHookAPI
|
||||||
import com.highcapable.yukihookapi.hook.log.YLog
|
import com.highcapable.yukihookapi.hook.log.YLog
|
||||||
@@ -68,10 +67,10 @@ class YukiHookPrefsBridge private constructor(private var context: Context? = nu
|
|||||||
private val isXposedEnvironment = YukiXposedModule.isXposedEnvironment
|
private val isXposedEnvironment = YukiXposedModule.isXposedEnvironment
|
||||||
|
|
||||||
/** 当前缓存的 [XSharedPreferencesDelegate] 实例数组 */
|
/** 当前缓存的 [XSharedPreferencesDelegate] 实例数组 */
|
||||||
private val xPrefs = ArrayMap<String, XSharedPreferencesDelegate>()
|
private val xPrefs = mutableMapOf<String, XSharedPreferencesDelegate>()
|
||||||
|
|
||||||
/** 当前缓存的 [SharedPreferences] 实例数组 */
|
/** 当前缓存的 [SharedPreferences] 实例数组 */
|
||||||
private val sPrefs = ArrayMap<String, SharedPreferences>()
|
private val sPrefs = mutableMapOf<String, SharedPreferences>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建 [YukiHookPrefsBridge] 对象
|
* 创建 [YukiHookPrefsBridge] 对象
|
||||||
@@ -269,10 +268,10 @@ class YukiHookPrefsBridge private constructor(private var context: Context? = nu
|
|||||||
*
|
*
|
||||||
* - 建议使用 [PrefsData] 创建模板并使用 [get] 获取数据
|
* - 建议使用 [PrefsData] 创建模板并使用 [get] 获取数据
|
||||||
* @param key 键值名称
|
* @param key 键值名称
|
||||||
* @param value 默认数据 - [HashSet]<[String]>
|
* @param value 默认数据 - [MutableSet]<[String]>
|
||||||
* @return [Set]<[String]>
|
* @return [Set]<[String]>
|
||||||
*/
|
*/
|
||||||
fun getStringSet(key: String, value: Set<String> = hashSetOf()) = makeWorldReadable {
|
fun getStringSet(key: String, value: Set<String> = mutableSetOf()) = makeWorldReadable {
|
||||||
if (isXposedEnvironment && isUsingNativeStorage.not())
|
if (isXposedEnvironment && isUsingNativeStorage.not())
|
||||||
currentXsp.getStringSet(key, value) ?: value
|
currentXsp.getStringSet(key, value) ?: value
|
||||||
else currentSp.getStringSet(key, value) ?: value
|
else currentSp.getStringSet(key, value) ?: value
|
||||||
@@ -385,9 +384,9 @@ class YukiHookPrefsBridge private constructor(private var context: Context? = nu
|
|||||||
* - 智能识别对应环境读取键值数据
|
* - 智能识别对应环境读取键值数据
|
||||||
*
|
*
|
||||||
* - 每次调用都会获取实时的数据 - 不受缓存控制 - 请勿在高并发场景中使用
|
* - 每次调用都会获取实时的数据 - 不受缓存控制 - 请勿在高并发场景中使用
|
||||||
* @return [HashMap] 全部类型的键值数组
|
* @return [MutableMap] 全部类型的键值数组
|
||||||
*/
|
*/
|
||||||
fun all() = hashMapOf<String, Any?>().apply {
|
fun all() = mutableMapOf<String, Any?>().apply {
|
||||||
if (isXposedEnvironment && isUsingNativeStorage.not())
|
if (isXposedEnvironment && isUsingNativeStorage.not())
|
||||||
currentXsp.all.forEach { (k, v) -> this[k] = v }
|
currentXsp.all.forEach { (k, v) -> this[k] = v }
|
||||||
else currentSp.all.forEach { (k, v) -> this[k] = v }
|
else currentSp.all.forEach { (k, v) -> this[k] = v }
|
||||||
|
Reference in New Issue
Block a user