refactor: merge HashSet/ArraySet to MutableSet, HashMap/ArrayMap to MutableMap, ArrayList to MutableList

This commit is contained in:
2023-10-02 00:35:20 +08:00
parent 00bea93085
commit 460ac083b0
22 changed files with 66 additions and 76 deletions

View File

@@ -29,7 +29,6 @@
package com.highcapable.yukihookapi.hook.core
import android.util.ArrayMap
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.annotation.CauseProblemsApi
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
/** 当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件数组 */
private val disableCreatorRunHookReasons = HashSet<Boolean>()
private val disableCreatorRunHookReasons = mutableSetOf<Boolean>()
/** 是否对当前 [YukiMemberHookCreator] 禁止执行 Hook 操作 */
private var isDisableCreatorRunHook = false
/** 设置要 Hook 的 [Method]、[Constructor] */
private var preHookMembers = ArrayMap<String, MemberHookCreator>()
private var preHookMembers = mutableMapOf<String, MemberHookCreator>()
/**
* 更新当前 [YukiMemberHookCreator] 禁止执行 Hook 操作的条件
@@ -293,10 +292,10 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
private var isHookMemberSetup = false
/** 当前被 Hook 的 [Method]、[Constructor] 实例数组 */
private val hookedMembers = HashSet<YukiMemberHook.HookedMember>()
private val hookedMembers = mutableSetOf<YukiMemberHook.HookedMember>()
/** 当前需要 Hook 的 [Method]、[Constructor] */
internal val members = HashSet<Member>()
internal val members = mutableSetOf<Member>()
/**
* 手动指定要 Hook 的 [Method]、[Constructor]
@@ -322,7 +321,6 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
*
* - 请现在迁移到 [MethodFinder] or [allMembers]
* @param name 方法名称
* @return [ArrayList]<[MethodFinder.Result.Instance]>
*/
@Deprecated(message = "请使用新方式来实现 Hook 所有方法", ReplaceWith("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]
* @return [ArrayList]<[ConstructorFinder.Result.Instance]>
*/
@Deprecated(
message = "请使用新方式来实现 Hook 所有构造方法",

View File

@@ -30,7 +30,6 @@
package com.highcapable.yukihookapi.hook.core
import android.content.res.Resources
import android.util.ArrayMap
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.bean.HookResources
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) {
/** 设置要 Hook 的 Resources */
private var preHookResources = ArrayMap<String, ResourcesHookCreator>()
private var preHookResources = mutableMapOf<String, ResourcesHookCreator>()
/**
* 注入要 Hook 的 Resources

View File

@@ -37,5 +37,5 @@ import java.lang.reflect.Member
internal object YukiHookCacheStore {
/** 已经 Hook 的 [Member] 数组 */
internal val hookedMembers = HashSet<YukiMemberHook.HookedMember>()
internal val hookedMembers = mutableSetOf<YukiMemberHook.HookedMember>()
}

View File

@@ -30,7 +30,6 @@
package com.highcapable.yukihookapi.hook.core.finder.base.rules
import android.util.ArrayMap
import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
@@ -47,14 +46,14 @@ class ModifierRules private constructor(private val instance: Any) {
internal companion object {
/** 当前实例数组 */
private val instances = ArrayMap<Long, ModifierRules>()
private val instances = mutableMapOf<Long, ModifierRules>()
/**
* 获取模板字符串数组
* @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

View File

@@ -176,7 +176,7 @@ class DexClassFinder internal constructor(
* @param name 指定包名
* @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)) }
if (it.isNotEmpty()) rulesData.fromPackages.addAll(it)
})
@@ -359,7 +359,7 @@ class DexClassFinder internal constructor(
* 包名范围名称过滤匹配条件实现类
* @param packages 包名数组
*/
inner class FromPackageRules internal constructor(private val packages: ArrayList<ClassRulesData.PackageRulesData>) {
inner class FromPackageRules internal constructor(private val packages: MutableList<ClassRulesData.PackageRulesData>) {
/**
* 设置包名绝对匹配

View File

@@ -62,7 +62,7 @@ import java.lang.reflect.Method
* @param constroctorRules [Constructor] 查找条件数据数组
*/
internal class ClassRulesData internal constructor(
var fromPackages: ArrayList<PackageRulesData> = arrayListOf(),
var fromPackages: MutableList<PackageRulesData> = mutableListOf(),
var fullName: NameRulesData? = null,
var simpleName: NameRulesData? = null,
var singleName: NameRulesData? = null,
@@ -72,13 +72,13 @@ internal class ClassRulesData internal constructor(
var isAnonymousClass: Boolean? = null,
var isNoExtendsClass: Boolean? = null,
var isNoImplementsClass: Boolean? = null,
var extendsClass: ArrayList<String> = arrayListOf(),
var implementsClass: ArrayList<String> = arrayListOf(),
var enclosingClass: ArrayList<String> = arrayListOf(),
var memberRules: ArrayList<MemberRulesData> = arrayListOf(),
var fieldRules: ArrayList<FieldRulesData> = arrayListOf(),
var methodRules: ArrayList<MethodRulesData> = arrayListOf(),
var constroctorRules: ArrayList<ConstructorRulesData> = arrayListOf()
var extendsClass: MutableList<String> = mutableListOf(),
var implementsClass: MutableList<String> = mutableListOf(),
var enclosingClass: MutableList<String> = mutableListOf(),
var memberRules: MutableList<MemberRulesData> = mutableListOf(),
var fieldRules: MutableList<FieldRulesData> = mutableListOf(),
var methodRules: MutableList<MethodRulesData> = mutableListOf(),
var constroctorRules: MutableList<ConstructorRulesData> = mutableListOf()
) : BaseRulesData() {
/**

View File

@@ -102,7 +102,7 @@ class ConstructorRules internal constructor(private val rulesData: ConstructorRu
fun param(vararg paramType: Any) {
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
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()
}
/**

View File

@@ -128,7 +128,7 @@ class MethodRules internal constructor(private val rulesData: MethodRulesData) :
fun param(vararg paramType: Any) {
if (paramType.isEmpty()) error("paramTypes is empty, please use emptyParam() instead")
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()
}
/**

View File

@@ -138,7 +138,7 @@ class ConstructorFinder internal constructor(override val classSet: Class<*>? =
*/
fun param(vararg paramType: Any): IndexTypeCondition {
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)
}

View File

@@ -169,7 +169,7 @@ class MethodFinder internal constructor(override val classSet: Class<*>? = null)
*/
fun param(vararg paramType: Any): IndexTypeCondition {
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)
}

View File

@@ -29,7 +29,6 @@
package com.highcapable.yukihookapi.hook.core.finder.tools
import android.util.ArrayMap
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.core.finder.base.data.BaseRulesData
import com.highcapable.yukihookapi.hook.core.finder.classes.data.ClassRulesData
@@ -85,10 +84,10 @@ internal object ReflectionTool {
private object MemoryCache {
/** 缓存的 [Class] 列表数组 */
val dexClassListData = ArrayMap<String, List<String>>()
val dexClassListData = mutableMapOf<String, List<String>>()
/** 缓存的 [Class] 对象数组 */
val classData = ArrayMap<String, Class<*>?>()
val classData = mutableMapOf<String, Class<*>?>()
}
/**
@@ -660,7 +659,7 @@ internal object ReflectionTool {
*/
private val Class<*>.existMembers
get() = runCatching {
arrayListOf<Member>().apply {
mutableListOf<Member>().apply {
addAll(declaredFields.toList())
addAll(declaredMethods.toList())
addAll(declaredConstructors.toList())

View File

@@ -30,7 +30,6 @@
package com.highcapable.yukihookapi.hook.param
import android.os.Bundle
import android.util.ArrayMap
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator
import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper
@@ -56,7 +55,7 @@ class HookParam internal constructor(
internal companion object {
/** 每个回调方法体的数据存储实例数据 */
private val dataExtras = ArrayMap<String, Bundle>()
private val dataExtras = mutableMapOf<String, Bundle>()
/** [HookParam] 是否已经执行首次回调事件 */
internal var isCallbackCalled = false

View File

@@ -102,10 +102,10 @@ internal inline fun <T> T.conditions(initiate: Conditions<T>.() -> Unit) = Condi
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) 条件

View File

@@ -30,7 +30,6 @@ package com.highcapable.yukihookapi.hook.xposed.bridge
import android.content.pm.ApplicationInfo
import android.content.res.Resources
import android.util.ArrayMap
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiCategoryHelper
import com.highcapable.yukihookapi.hook.factory.hasClass
@@ -59,13 +58,13 @@ internal object YukiXposedModule : IYukiXposedModuleLifecycle {
private var isInitializingZygote = false
/** 当前 [PackageParam] 实例数组 */
private val packageParams = ArrayMap<String, PackageParam>()
private val packageParams = mutableMapOf<String, PackageParam>()
/** 已在 [PackageParam] 中被装载的 APP 包名 */
private val loadedPackageNames = HashSet<String>()
private val loadedPackageNames = mutableSetOf<String>()
/** 当前 [PackageParamWrapper] 实例数组 */
private val packageParamWrappers = ArrayMap<String, PackageParamWrapper>()
private val packageParamWrappers = mutableMapOf<String, PackageParamWrapper>()
/** 当前 [PackageParam] 方法体回调 */
internal var packageParamCallback: (PackageParam.() -> Unit)? = null

View File

@@ -155,7 +155,7 @@ class YukiHookDataChannel private constructor() {
intent.action?.also { action ->
runCatching {
receiverCallbacks.takeIf { it.isNotEmpty() }?.apply {
arrayListOf<String>().also { destroyedCallbacks ->
mutableListOf<String>().also { destroyedCallbacks ->
forEach { (key, it) ->
when {
(it.first as? Activity?)?.isDestroyed == true -> destroyedCallbacks.add(key)
@@ -259,10 +259,10 @@ class YukiHookDataChannel private constructor() {
* @param stringData [String] 数据数组
*/
internal inner class SegmentsTempData(
var listData: ArrayList<List<*>> = arrayListOf(),
var mapData: ArrayList<Map<*, *>> = arrayListOf(),
var setData: ArrayList<Set<*>> = arrayListOf(),
var stringData: ArrayList<String> = arrayListOf()
var listData: MutableList<List<*>> = mutableListOf(),
var mapData: MutableList<Map<*, *>> = mutableListOf(),
var setData: MutableList<Set<*>> = mutableListOf(),
var stringData: MutableList<String> = mutableListOf()
)
/**
@@ -531,7 +531,7 @@ class YukiHookDataChannel private constructor() {
if (tempData.listData.isEmpty() && wrapper.segmentsIndex > 0) return
tempData.listData.add(wrapper.segmentsIndex, value)
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()
segmentsTempData.remove(wrapper.wrapperId)
}
@@ -540,7 +540,7 @@ class YukiHookDataChannel private constructor() {
if (tempData.mapData.isEmpty() && wrapper.segmentsIndex > 0) return
tempData.mapData.add(wrapper.segmentsIndex, value)
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()
segmentsTempData.remove(wrapper.wrapperId)
}
@@ -549,7 +549,7 @@ class YukiHookDataChannel private constructor() {
if (tempData.setData.isEmpty() && wrapper.segmentsIndex > 0) return
tempData.setData.add(wrapper.segmentsIndex, value)
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()
segmentsTempData.remove(wrapper.wrapperId)
}
@@ -623,13 +623,13 @@ class YukiHookDataChannel private constructor() {
wrapper.isSegmentsType || isAllowSendTooLargeData -> pushReceiver(wrapper)
dataByteSize >= receiverDataMaxByteSize -> when (wrapper.instance.value) {
is List<*> -> (wrapper.instance.value as List<*>).also { value ->
val segments = arrayListOf<List<*>>()
var segment = arrayListOf<Any?>()
val segments = mutableListOf<List<*>>()
var segment = mutableListOf<Any?>()
value.forEach {
segment.add(it)
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
segments.add(segment)
segment = arrayListOf()
segment = mutableListOf()
}
}
if (segment.isNotEmpty()) segments.add(segment)
@@ -639,13 +639,13 @@ class YukiHookDataChannel private constructor() {
} ?: loggerForUnprocessableDataByFirstElement(name = "List")
}
is Map<*, *> -> (wrapper.instance.value as Map<*, *>).also { value ->
val segments = arrayListOf<Map<*, *>>()
var segment = hashMapOf<Any?, Any?>()
val segments = mutableListOf<Map<*, *>>()
var segment = mutableMapOf<Any?, Any?>()
value.forEach { (k, v) ->
segment[k] = v
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
segments.add(segment)
segment = hashMapOf()
segment = mutableMapOf()
}
}
if (segment.isNotEmpty()) segments.add(segment)
@@ -655,13 +655,13 @@ class YukiHookDataChannel private constructor() {
} ?: loggerForUnprocessableDataByFirstElement(name = "Map")
}
is Set<*> -> (wrapper.instance.value as Set<*>).also { value ->
val segments = arrayListOf<Set<*>>()
var segment = hashSetOf<Any?>()
val segments = mutableListOf<Set<*>>()
var segment = mutableSetOf<Any?>()
value.forEach {
segment.add(it)
if (segment.calDataByteSize() >= receiverDataSegmentMaxByteSize) {
segments.add(segment)
segment = hashSetOf()
segment = mutableSetOf()
}
}
if (segment.isNotEmpty()) segments.add(segment)
@@ -673,7 +673,7 @@ class YukiHookDataChannel private constructor() {
is String -> (wrapper.instance.value as String).also { value ->
/** 由于字符会被按照双字节计算 - 所以这里将限制字节大小除以 2 */
val twoByteMaxSize = receiverDataMaxByteSize / 2
val segments = arrayListOf<String>()
val segments = mutableListOf<String>()
for (i in 0..value.length step twoByteMaxSize)
if (i + twoByteMaxSize <= value.length)
segments.add(value.substring(i, i + twoByteMaxSize))

View File

@@ -47,7 +47,6 @@ import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.os.Handler
import android.util.ArrayMap
import androidx.annotation.RequiresApi
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.core.api.compat.HookApiProperty
@@ -111,7 +110,7 @@ internal object AppParasitics {
private var isClassLoaderHooked = false
/** [ClassLoader] 监听回调数组 */
private var classLoaderCallbacks = ArrayMap<Int, (Class<*>) -> Unit>()
private var classLoaderCallbacks = mutableMapOf<Int, (Class<*>) -> Unit>()
/**
* 当前 Hook APP (宿主) 的全局生命周期 [Application]
@@ -476,9 +475,9 @@ internal object AppParasitics {
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>>()
}
}

View File

@@ -44,10 +44,10 @@ class ModuleClassLoader private constructor() : ClassLoader(AppParasitics.baseCl
private var instance: ModuleClassLoader? = null
/** 排除的 Hook APP (宿主) [Class] 类名数组 */
private val excludeHostClasses = HashSet<String>()
private val excludeHostClasses = mutableSetOf<String>()
/** 排除的模块 [Class] 类名数组 */
private val excludeModuleClasses = HashSet<String>()
private val excludeModuleClasses = mutableSetOf<String>()
/**
* 获取 [ModuleClassLoader] 单例

View File

@@ -34,7 +34,6 @@ package com.highcapable.yukihookapi.hook.xposed.prefs
import android.content.Context
import android.content.SharedPreferences
import android.util.ArrayMap
import androidx.preference.PreferenceFragmentCompat
import com.highcapable.yukihookapi.YukiHookAPI
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
/** 当前缓存的 [XSharedPreferencesDelegate] 实例数组 */
private val xPrefs = ArrayMap<String, XSharedPreferencesDelegate>()
private val xPrefs = mutableMapOf<String, XSharedPreferencesDelegate>()
/** 当前缓存的 [SharedPreferences] 实例数组 */
private val sPrefs = ArrayMap<String, SharedPreferences>()
private val sPrefs = mutableMapOf<String, SharedPreferences>()
/**
* 创建 [YukiHookPrefsBridge] 对象
@@ -269,10 +268,10 @@ class YukiHookPrefsBridge private constructor(private var context: Context? = nu
*
* - 建议使用 [PrefsData] 创建模板并使用 [get] 获取数据
* @param key 键值名称
* @param value 默认数据 - [HashSet]<[String]>
* @param value 默认数据 - [MutableSet]<[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())
currentXsp.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())
currentXsp.all.forEach { (k, v) -> this[k] = v }
else currentSp.all.forEach { (k, v) -> this[k] = v }