diff --git a/src/main/kotlin/app/revanced/patcher/Patcher.kt b/src/main/kotlin/app/revanced/patcher/Patcher.kt index 533f89fb..4c31e8a0 100644 --- a/src/main/kotlin/app/revanced/patcher/Patcher.kt +++ b/src/main/kotlin/app/revanced/patcher/Patcher.kt @@ -1,11 +1,11 @@ package app.revanced.patcher import app.revanced.patcher.cache.Cache -import app.revanced.patcher.extensions.replace import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.signature.resolver.SignatureResolver import app.revanced.patcher.signature.MethodSignature +import app.revanced.patcher.util.ListBackedSet import lanchon.multidexlib2.BasicDexFileNamer import lanchon.multidexlib2.DexIO import lanchon.multidexlib2.MultiDexIO @@ -33,7 +33,7 @@ class Patcher( init { val dexFile = MultiDexIO.readDexFile(true, input, NAMER, null, null) opcodes = dexFile.opcodes - cache = Cache(dexFile.classes.toMutableSet(), SignatureResolver(dexFile.classes, signatures).resolve()) + cache = Cache(dexFile.classes.toMutableList(), SignatureResolver(dexFile.classes, signatures).resolve()) } /** * Add additional dex file container to the patcher. @@ -62,13 +62,13 @@ class Patcher( // this is a slow workaround for now cache.methodMap.values.forEach { if (it.definingClassProxy.proxyUsed) { - cache.classes.replace(it.definingClassProxy.originalIndex, it.definingClassProxy.mutatedClass) + cache.classes[it.definingClassProxy.originalIndex] = it.definingClassProxy.mutatedClass } } cache.classProxy.filter { it.proxyUsed }.forEach { proxy -> - cache.classes.replace(proxy.originalIndex, proxy.mutatedClass) + cache.classes[proxy.originalIndex] = proxy.mutatedClass } - return cache.classes + return ListBackedSet(cache.classes) } override fun getOpcodes(): Opcodes { diff --git a/src/main/kotlin/app/revanced/patcher/cache/Cache.kt b/src/main/kotlin/app/revanced/patcher/cache/Cache.kt index faf3d05c..a728ebd8 100644 --- a/src/main/kotlin/app/revanced/patcher/cache/Cache.kt +++ b/src/main/kotlin/app/revanced/patcher/cache/Cache.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.signature.SignatureResolverResult import org.jf.dexlib2.iface.ClassDef class Cache( - internal val classes: MutableSet, + internal val classes: MutableList, val methodMap: MethodMap ) { // TODO: currently we create ClassProxies at multiple places, which is why we could have merge conflicts diff --git a/src/main/kotlin/app/revanced/patcher/extensions/Extensions.kt b/src/main/kotlin/app/revanced/patcher/extensions/Extensions.kt index 73d809b8..5e077751 100644 --- a/src/main/kotlin/app/revanced/patcher/extensions/Extensions.kt +++ b/src/main/kotlin/app/revanced/patcher/extensions/Extensions.kt @@ -3,7 +3,6 @@ package app.revanced.patcher.extensions import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.builder.BuilderInstruction import org.jf.dexlib2.builder.MutableMethodImplementation -import org.jf.dexlib2.iface.ClassDef infix fun AccessFlags.or(other: AccessFlags) = this.value or other.value @@ -12,8 +11,3 @@ fun MutableMethodImplementation.addInstructions(index: Int, instructions: List.replace(originalIndex: Int, mutatedClass: ClassDef) { - this.remove(this.elementAt(originalIndex)) - this.add(mutatedClass) -} diff --git a/src/main/kotlin/app/revanced/patcher/util/ListBackedSet.kt b/src/main/kotlin/app/revanced/patcher/util/ListBackedSet.kt new file mode 100644 index 00000000..f019b145 --- /dev/null +++ b/src/main/kotlin/app/revanced/patcher/util/ListBackedSet.kt @@ -0,0 +1,15 @@ +package app.revanced.patcher.util + +class ListBackedSet(private val list: MutableList) : MutableSet { + override val size get() = list.size + override fun add(element: E) = list.add(element) + override fun addAll(elements: Collection) = list.addAll(elements) + override fun clear() = list.clear() + override fun iterator() = list.listIterator() + override fun remove(element: E) = list.remove(element) + override fun removeAll(elements: Collection) = list.removeAll(elements) + override fun retainAll(elements: Collection) = list.retainAll(elements) + override fun contains(element: E) = list.contains(element) + override fun containsAll(elements: Collection) = list.containsAll(elements) + override fun isEmpty() = list.isEmpty() +} \ No newline at end of file