mirror of
https://github.com/revanced/revanced-patcher.git
synced 2025-05-01 13:44:25 +02:00
add: applyProxies
method
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
This commit is contained in:
parent
6cb1fdf617
commit
f58a498849
@ -70,16 +70,8 @@ class Patcher(
|
|||||||
fun save(): Map<String, MemoryDataStore> {
|
fun save(): Map<String, MemoryDataStore> {
|
||||||
val newDexFile = object : DexFile {
|
val newDexFile = object : DexFile {
|
||||||
override fun getClasses(): Set<ClassDef> {
|
override fun getClasses(): Set<ClassDef> {
|
||||||
val classes = patcherData.classes
|
patcherData.classes.applyProxies()
|
||||||
val internalClasses = classes.internalClasses
|
return ListBackedSet(patcherData.classes.internalClasses)
|
||||||
for (proxy in classes.proxies) {
|
|
||||||
if (!proxy.proxyUsed) continue
|
|
||||||
|
|
||||||
val index = internalClasses.indexOfFirst { it.type == proxy.immutableClass.type }
|
|
||||||
internalClasses[index] = proxy.mutatedClass
|
|
||||||
}
|
|
||||||
|
|
||||||
return ListBackedSet(internalClasses)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getOpcodes(): Opcodes {
|
override fun getOpcodes(): Opcodes {
|
||||||
|
@ -72,10 +72,10 @@ internal inline fun <T> Iterable<T>.findIndexed(predicate: (T) -> Boolean): Pair
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun PatcherData.proxy(classProxy: ClassDef): ClassProxy {
|
fun PatcherData.proxy(classDef: ClassDef): ClassProxy {
|
||||||
var proxy = this.classes.proxies.find { it.immutableClass.type == classProxy.type }
|
var proxy = this.classes.proxies.find { it.immutableClass.type == classDef.type }
|
||||||
if (proxy == null) {
|
if (proxy == null) {
|
||||||
proxy = ClassProxy(classProxy)
|
proxy = ClassProxy(classDef)
|
||||||
this.classes.proxies.add(proxy)
|
this.classes.proxies.add(proxy)
|
||||||
}
|
}
|
||||||
return proxy
|
return proxy
|
||||||
|
@ -16,6 +16,15 @@ class ClassProxy(
|
|||||||
internal var proxyUsed = false
|
internal var proxyUsed = false
|
||||||
internal lateinit var mutatedClass: MutableClass
|
internal lateinit var mutatedClass: MutableClass
|
||||||
|
|
||||||
|
init {
|
||||||
|
// in the instance, that a [MutableClass] is being proxied,
|
||||||
|
// do not create an additional clone and reuse the [MutableClass] instance
|
||||||
|
if (immutableClass is MutableClass) {
|
||||||
|
mutatedClass = immutableClass
|
||||||
|
proxyUsed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocates and returns a mutable clone of the original class.
|
* Allocates and returns a mutable clone of the original class.
|
||||||
* A patch should always use the original immutable class reference
|
* A patch should always use the original immutable class reference
|
||||||
|
@ -14,6 +14,21 @@ class ProxyBackedClassList(internal val internalClasses: MutableList<ClassDef>)
|
|||||||
proxies.add(classProxy)
|
proxies.add(classProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply all resolved classes into [internalClasses] and clear the [proxies] list.
|
||||||
|
*/
|
||||||
|
fun applyProxies() {
|
||||||
|
proxies.forEachIndexed { i, proxy ->
|
||||||
|
if (!proxy.proxyUsed) return@forEachIndexed
|
||||||
|
|
||||||
|
val index = internalClasses.indexOfFirst { it.type == proxy.immutableClass.type }
|
||||||
|
internalClasses[index] = proxy.mutatedClass
|
||||||
|
|
||||||
|
proxies.removeAt(i) // FIXME: check if this could cause issues when multiple patches use the same proxy
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
override val size get() = internalClasses.size
|
override val size get() = internalClasses.size
|
||||||
override fun contains(element: ClassDef) = internalClasses.contains(element)
|
override fun contains(element: ClassDef) = internalClasses.contains(element)
|
||||||
override fun containsAll(elements: Collection<ClassDef>) = internalClasses.containsAll(elements)
|
override fun containsAll(elements: Collection<ClassDef>) = internalClasses.containsAll(elements)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user