mirror of
https://github.com/ReVanced/revanced-patcher.git
synced 2024-11-10 01:02:22 +01:00
feat: migrate to DexPatchBundle
and JarPatchBundle
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
This commit is contained in:
parent
70ca184cf9
commit
7573db2575
6 changed files with 64 additions and 6 deletions
|
@ -16,7 +16,7 @@ class ProxyBackedClassList(internal val internalClasses: MutableList<ClassDef>)
|
|||
/**
|
||||
* Apply all resolved classes into [internalClasses] and clean the [proxies] list.
|
||||
*/
|
||||
fun applyProxies() {
|
||||
internal fun applyProxies() {
|
||||
// FIXME: check if this could cause issues when multiple patches use the same proxy
|
||||
proxies.removeIf { proxy ->
|
||||
// if the proxy is unused, keep it in the list
|
||||
|
|
|
@ -19,11 +19,7 @@ object PatchLoader {
|
|||
val entry = entries.nextElement()
|
||||
if (!entry.name.endsWith(".class") || entry.name.contains("$")) continue
|
||||
|
||||
val clazz = classLoader.loadClass(
|
||||
entry.name
|
||||
.replace('/', '.')
|
||||
.replace(".class", "")
|
||||
)
|
||||
val clazz = classLoader.loadClass(entry.realName.replace('/', '.').replace(".class", ""))
|
||||
|
||||
if (!clazz.isAnnotationPresent(app.revanced.patcher.patch.annotations.Patch::class.java)) continue
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package app.revanced.patcher.util.patch.base
|
||||
|
||||
import app.revanced.patcher.patch.base.Patch
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* @param patchBundlePath The path to the patch bundle.
|
||||
*/
|
||||
abstract class PatchBundle(patchBundlePath: String) : File(patchBundlePath) {
|
||||
internal fun loadPatches(classLoader: ClassLoader, classNames: Iterator<String>) = buildList {
|
||||
classNames.forEach { className ->
|
||||
val clazz = classLoader.loadClass(className)
|
||||
if (!clazz.isAnnotationPresent(app.revanced.patcher.patch.annotations.Patch::class.java)) return@forEach
|
||||
@Suppress("UNCHECKED_CAST") this.add(clazz as Class<Patch<*>>)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package app.revanced.patcher.util.patch.implementation
|
||||
|
||||
import app.revanced.patcher.util.patch.base.PatchBundle
|
||||
import app.revanced.patcher.util.patch.util.StringIterator
|
||||
import org.jf.dexlib2.DexFileFactory
|
||||
|
||||
/**
|
||||
* A patch bundle of the ReVanced [DexPatchBundle] format.
|
||||
* @param patchBundlePath The path to a patch bundle of dex format.
|
||||
* @param dexClassLoader The dex class loader.
|
||||
*/
|
||||
class DexPatchBundle(patchBundlePath: String, private val dexClassLoader: ClassLoader) : PatchBundle(patchBundlePath) {
|
||||
fun loadPatches() = loadPatches(dexClassLoader,
|
||||
StringIterator(DexFileFactory.loadDexFile(path, null).classes.iterator()) { classDef ->
|
||||
classDef.type.substring(1, classDef.length - 1).replace('/', '.')
|
||||
})
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package app.revanced.patcher.util.patch.implementation
|
||||
|
||||
import app.revanced.patcher.util.patch.base.PatchBundle
|
||||
import app.revanced.patcher.util.patch.util.StringIterator
|
||||
import java.net.URLClassLoader
|
||||
import java.util.jar.JarFile
|
||||
|
||||
/**
|
||||
* A patch bundle of the ReVanced [JarPatchBundle] format.
|
||||
* @param patchBundlePath The path to the patch bundle.
|
||||
*/
|
||||
class JarPatchBundle(patchBundlePath: String) : PatchBundle(patchBundlePath) {
|
||||
fun loadPatches() = loadPatches(URLClassLoader(arrayOf(this.toURI().toURL()), null), StringIterator(
|
||||
JarFile(this).entries().iterator()
|
||||
) {
|
||||
it.realName.replace('/', '.').replace(".class", "")
|
||||
})
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package app.revanced.patcher.util.patch.util
|
||||
|
||||
internal class StringIterator<T, I : Iterator<T>>(
|
||||
private val iterator: I,
|
||||
private val _next: (T) -> String
|
||||
) : Iterator<String> {
|
||||
override fun hasNext() = iterator.hasNext()
|
||||
|
||||
override fun next() = _next(iterator.next())
|
||||
}
|
Loading…
Reference in a new issue