Compare commits

..

2 Commits

Author SHA1 Message Date
xehpuk
39aaf42b2b docs: Fix typo (#393) 2025-12-29 22:17:45 +01:00
Pun Butrach
d2cf491ffc docs: Use American spelling (#389) 2025-12-14 16:20:47 +01:00
4 changed files with 65 additions and 112 deletions

View File

@@ -117,9 +117,9 @@ you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced
The documentation contains the fundamentals of ReVanced Patcher and how to use ReVanced Patcher to create patches. The documentation contains the fundamentals of ReVanced Patcher and how to use ReVanced Patcher to create patches.
You can find it [here](https://github.com/ReVanced/revanced-patcher/tree/main/docs). You can find it [here](https://github.com/ReVanced/revanced-patcher/tree/main/docs).
## 📜 Licence ## 📜 License
ReVanced Patcher is licensed under the GPLv3 license. Please see the [licence file](LICENSE) for more information. ReVanced Patcher is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information.
[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Patcher as long as you track changes/dates in source files. [tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Patcher as long as you track changes/dates in source files.
Any modifications to ReVanced Patcher must also be made available under the GPL, Any modifications to ReVanced Patcher must also be made available under the GPL,
along with build & install instructions. along with build & install instructions.

View File

@@ -342,12 +342,8 @@ public final class app/revanced/patcher/patch/PatchKt {
public static final fun bytecodePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static final fun bytecodePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch;
public static synthetic fun bytecodePatch$default (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun bytecodePatch$default (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch;
public static final fun loadPatchesFromDex (Ljava/util/Set;Ljava/io/File;)Lapp/revanced/patcher/patch/PatchLoader$Dex; public static final fun loadPatchesFromDex (Ljava/util/Set;Ljava/io/File;)Lapp/revanced/patcher/patch/PatchLoader$Dex;
public static final fun loadPatchesFromDex (Ljava/util/Set;Ljava/io/File;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/PatchLoader$Dex;
public static synthetic fun loadPatchesFromDex$default (Ljava/util/Set;Ljava/io/File;ILjava/lang/Object;)Lapp/revanced/patcher/patch/PatchLoader$Dex; public static synthetic fun loadPatchesFromDex$default (Ljava/util/Set;Ljava/io/File;ILjava/lang/Object;)Lapp/revanced/patcher/patch/PatchLoader$Dex;
public static synthetic fun loadPatchesFromDex$default (Ljava/util/Set;Ljava/io/File;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/revanced/patcher/patch/PatchLoader$Dex;
public static final fun loadPatchesFromJar (Ljava/util/Set;)Lapp/revanced/patcher/patch/PatchLoader$Jar; public static final fun loadPatchesFromJar (Ljava/util/Set;)Lapp/revanced/patcher/patch/PatchLoader$Jar;
public static final fun loadPatchesFromJar (Ljava/util/Set;Lkotlin/jvm/functions/Function2;)Lapp/revanced/patcher/patch/PatchLoader$Jar;
public static synthetic fun loadPatchesFromJar$default (Ljava/util/Set;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/revanced/patcher/patch/PatchLoader$Jar;
public static final fun rawResourcePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/RawResourcePatch; public static final fun rawResourcePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/RawResourcePatch;
public static synthetic fun rawResourcePatch$default (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch; public static synthetic fun rawResourcePatch$default (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/RawResourcePatch;
public static final fun resourcePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; public static final fun resourcePatch (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch;
@@ -356,7 +352,7 @@ public final class app/revanced/patcher/patch/PatchKt {
public abstract class app/revanced/patcher/patch/PatchLoader : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { public abstract class app/revanced/patcher/patch/PatchLoader : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker {
public synthetic fun <init> (Ljava/util/Map;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/util/Map;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Ljava/util/Set;Lkotlin/jvm/functions/Function1;Ljava/lang/ClassLoader;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun <init> (Ljava/util/Set;Lkotlin/jvm/functions/Function1;Ljava/lang/ClassLoader;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun add (Lapp/revanced/patcher/patch/Patch;)Z public fun add (Lapp/revanced/patcher/patch/Patch;)Z
public synthetic fun add (Ljava/lang/Object;)Z public synthetic fun add (Ljava/lang/Object;)Z
public fun addAll (Ljava/util/Collection;)Z public fun addAll (Ljava/util/Collection;)Z
@@ -377,9 +373,12 @@ public abstract class app/revanced/patcher/patch/PatchLoader : java/util/Set, ko
} }
public final class app/revanced/patcher/patch/PatchLoader$Dex : app/revanced/patcher/patch/PatchLoader { public final class app/revanced/patcher/patch/PatchLoader$Dex : app/revanced/patcher/patch/PatchLoader {
public fun <init> (Ljava/util/Set;Ljava/io/File;)V
public synthetic fun <init> (Ljava/util/Set;Ljava/io/File;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
} }
public final class app/revanced/patcher/patch/PatchLoader$Jar : app/revanced/patcher/patch/PatchLoader { public final class app/revanced/patcher/patch/PatchLoader$Jar : app/revanced/patcher/patch/PatchLoader {
public fun <init> (Ljava/util/Set;)V
} }
public final class app/revanced/patcher/patch/PatchResult { public final class app/revanced/patcher/patch/PatchResult {

View File

@@ -27,7 +27,7 @@ typealias Package = Pair<PackageName, Set<VersionName>?>
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
* @param compatiblePackages The packages the patch is compatible with. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
@@ -87,7 +87,8 @@ sealed class Patch<C : PatchContext<*>>(
finalizeBlock?.invoke(context) finalizeBlock?.invoke(context)
} }
override fun toString() = name ?: "Patch@${System.identityHashCode(this)}" override fun toString() = name ?:
"Patch@${System.identityHashCode(this)}"
} }
internal fun Patch<*>.anyRecursively( internal fun Patch<*>.anyRecursively(
@@ -121,7 +122,7 @@ internal fun Iterable<Patch<*>>.forEachRecursively(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -170,7 +171,7 @@ class BytecodePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -213,7 +214,7 @@ class RawResourcePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -257,7 +258,7 @@ class ResourcePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @property compatiblePackages The packages the patch is compatible with. * @property compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @property dependencies Other patches this patch depends on. * @property dependencies Other patches this patch depends on.
@@ -374,7 +375,7 @@ private fun <B : PatchBuilder<*>> B.buildPatch(block: B.() -> Unit = {}) = apply
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @property extensionInputStream Getter for the extension input stream of the patch. * @property extensionInputStream Getter for the extension input stream of the patch.
* An extension is a precompiled DEX file that is merged into the patched app before this patch is executed. * An extension is a precompiled DEX file that is merged into the patched app before this patch is executed.
* *
@@ -424,7 +425,7 @@ class BytecodePatchBuilder internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param block The block to build the patch. * @param block The block to build the patch.
* *
* @return The created [BytecodePatch]. * @return The created [BytecodePatch].
@@ -442,7 +443,7 @@ fun bytecodePatch(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* *
* @constructor Create a new [RawResourcePatch] builder. * @constructor Create a new [RawResourcePatch] builder.
*/ */
@@ -469,7 +470,7 @@ class RawResourcePatchBuilder internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param block The block to build the patch. * @param block The block to build the patch.
* @return The created [RawResourcePatch]. * @return The created [RawResourcePatch].
*/ */
@@ -486,7 +487,7 @@ fun rawResourcePatch(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* *
* @constructor Create a new [ResourcePatch] builder. * @constructor Create a new [ResourcePatch] builder.
*/ */
@@ -513,7 +514,7 @@ class ResourcePatchBuilder internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @param description The description of the patch.
* @param use Weather or not the patch should be used. * @param use Whether or not the patch should be used.
* @param block The block to build the patch. * @param block The block to build the patch.
* *
* @return The created [ResourcePatch]. * @return The created [ResourcePatch].
@@ -528,11 +529,11 @@ fun resourcePatch(
/** /**
* An exception thrown when patching. * An exception thrown when patching.
* *
* @param message The exception message. * @param errorMessage The exception message.
* @param cause The cause of the exception. * @param cause The corresponding [Throwable].
*/ */
class PatchException(message: String?, cause: Throwable?) : Exception(message, cause) { class PatchException(errorMessage: String?, cause: Throwable?) : Exception(errorMessage, cause) {
constructor(message: String) : this(message, null) constructor(errorMessage: String) : this(errorMessage, null)
constructor(cause: Throwable) : this(cause.message, cause) constructor(cause: Throwable) : this(cause.message, cause)
} }
@@ -542,7 +543,6 @@ class PatchException(message: String?, cause: Throwable?) : Exception(message, c
* @param patch The [Patch] that was executed. * @param patch The [Patch] that was executed.
* @param exception The [PatchException] thrown, if any. * @param exception The [PatchException] thrown, if any.
*/ */
@Deprecated("This class is not used anymore. Instead a callback is used")
class PatchResult internal constructor(val patch: Patch<*>, val exception: PatchException? = null) class PatchResult internal constructor(val patch: Patch<*>, val exception: PatchException? = null)
/** /**
@@ -553,47 +553,36 @@ class PatchResult internal constructor(val patch: Patch<*>, val exception: Patch
* *
* @param byPatchesFile The patches associated by the patches file they were loaded from. * @param byPatchesFile The patches associated by the patches file they were loaded from.
*/ */
sealed class PatchLoader( sealed class PatchLoader private constructor(
val byPatchesFile: Map<File, Set<Patch<*>>>, val byPatchesFile: Map<File, Set<Patch<*>>>,
) : Set<Patch<*>> by byPatchesFile.values.flatten().toSet() { ) : Set<Patch<*>> by byPatchesFile.values.flatten().toSet() {
/** /**
* @param patchesFiles A set of JAR or DEX files to load the patches from. * @param patchesFiles A set of JAR or DEX files to load the patches from.
* @param getBinaryClassNames A function that returns the binary names of all classes accessible by the class loader. * @param getBinaryClassNames A function that returns the binary names of all classes accessible by the class loader.
* @param classLoader The [ClassLoader] to use for loading the classes. * @param classLoader The [ClassLoader] to use for loading the classes.
* @param onLoadPatchesException The callback for patches that could not be loaded.
*/ */
constructor( private constructor(
patchesFiles: Set<File>, patchesFiles: Set<File>,
getBinaryClassNames: (patchesFile: File) -> List<String>, getBinaryClassNames: (patchesFile: File) -> List<String>,
classLoader: ClassLoader, classLoader: ClassLoader,
onLoadPatchesException: (message: String, cause: Throwable) -> Unit ) : this(classLoader.loadPatches(patchesFiles.associateWith { getBinaryClassNames(it).toSet() }))
) : this(
classLoader.loadPatches(
patchesFiles.associateWith { getBinaryClassNames(it).toSet() },
onLoadPatchesException
)
)
/** /**
* A [PatchLoader] for JAR files. * A [PatchLoader] for JAR files.
* *
* @param patchesFiles The JAR files to load the patches from. * @param patchesFiles The JAR files to load the patches from.
* @param onLoadPatchesException The callback for patches that could not be loaded.
* *
* @constructor Create a new [PatchLoader] for JAR files. * @constructor Create a new [PatchLoader] for JAR files.
*/ */
class Jar internal constructor( class Jar(patchesFiles: Set<File>) :
patchesFiles: Set<File>, PatchLoader(
onLoadPatchesException: (message: String, cause: Throwable) -> Unit patchesFiles,
) : PatchLoader( { file ->
patchesFiles, JarFile(file).entries().toList().filter { it.name.endsWith(".class") }
{ file -> .map { it.name.substringBeforeLast('.').replace('/', '.') }
JarFile(file).entries().toList().filter { it.name.endsWith(".class") } },
.map { it.name.substringBeforeLast('.').replace('/', '.') } URLClassLoader(patchesFiles.map { it.toURI().toURL() }.toTypedArray()),
}, )
URLClassLoader(patchesFiles.map { it.toURI().toURL() }.toTypedArray()),
onLoadPatchesException
)
/** /**
* A [PatchLoader] for [Dex] files. * A [PatchLoader] for [Dex] files.
@@ -601,30 +590,25 @@ sealed class PatchLoader(
* @param patchesFiles The DEX files to load the patches from. * @param patchesFiles The DEX files to load the patches from.
* @param optimizedDexDirectory The directory to store optimized DEX files in. * @param optimizedDexDirectory The directory to store optimized DEX files in.
* This parameter is deprecated and has no effect since API level 26. * This parameter is deprecated and has no effect since API level 26.
* @param onLoadPatchesException The callback for patches that could not be loaded.
* *
* @constructor Create a new [PatchLoader] for [Dex] files. * @constructor Create a new [PatchLoader] for [Dex] files.
*/ */
class Dex internal constructor( class Dex(patchesFiles: Set<File>, optimizedDexDirectory: File? = null) :
patchesFiles: Set<File>, PatchLoader(
optimizedDexDirectory: File? = null, patchesFiles,
onLoadPatchesException: (message: String, cause: Throwable) -> Unit { patchBundle ->
) : PatchLoader( MultiDexIO.readDexFile(true, patchBundle, BasicDexFileNamer(), null, null).classes
patchesFiles, .map { classDef ->
{ patchBundle -> classDef.type.substring(1, classDef.length - 1)
MultiDexIO.readDexFile(true, patchBundle, BasicDexFileNamer(), null, null).classes }
.map { classDef -> },
classDef.type.substring(1, classDef.length - 1) DexClassLoader(
} patchesFiles.joinToString(File.pathSeparator) { it.absolutePath },
}, optimizedDexDirectory?.absolutePath,
DexClassLoader( null,
patchesFiles.joinToString(File.pathSeparator) { it.absolutePath }, this::class.java.classLoader,
optimizedDexDirectory?.absolutePath, ),
null, )
this::class.java.classLoader,
),
onLoadPatchesException
)
// Companion object required for unit tests. // Companion object required for unit tests.
private companion object { private companion object {
@@ -656,24 +640,19 @@ sealed class PatchLoader(
* *
* @param binaryClassNamesByPatchesFile The binary class name of the classes to load the patches from * @param binaryClassNamesByPatchesFile The binary class name of the classes to load the patches from
* associated by the patches file. * associated by the patches file.
* @param onLoadPatchesException The callback for patches that could not be loaded.
* *
* @return The loaded patches associated by the patches file. * @return The loaded patches associated by the patches file.
*/ */
private fun ClassLoader.loadPatches( private fun ClassLoader.loadPatches(binaryClassNamesByPatchesFile: Map<File, Set<String>>) =
binaryClassNamesByPatchesFile: Map<File, Set<String>>, binaryClassNamesByPatchesFile.mapValues { (_, binaryClassNames) ->
onLoadPatchesException: (message: String, cause: Throwable) -> Unit binaryClassNames.asSequence().map {
) = binaryClassNamesByPatchesFile.mapValues { (_, binaryClassNames) -> loadClass(it)
binaryClassNames.asSequence().mapNotNull { }.flatMap {
runCatching { loadClass(it) }.onFailure { exception -> it.patchFields + it.patchMethods
onLoadPatchesException("Failed to load patch class $it", exception) }.filter {
}.getOrNull() it.name != null
}.flatMap { }.toSet()
it.patchFields + it.patchMethods }
}.filter {
it.name != null
}.toSet()
}
private fun Member.canAccess(): Boolean { private fun Member.canAccess(): Boolean {
if (this is Method && parameterCount != 0) return false if (this is Method && parameterCount != 0) return false
@@ -689,22 +668,11 @@ sealed class PatchLoader(
* Patches with no name are not loaded. * Patches with no name are not loaded.
* *
* @param patchesFiles The JAR files to load the patches from. * @param patchesFiles The JAR files to load the patches from.
* @param onLoadPatchesException The callback for patches that could not be loaded.
* *
* @return The loaded patches. * @return The loaded patches.
*/ */
fun loadPatchesFromJar( fun loadPatchesFromJar(patchesFiles: Set<File>) =
patchesFiles: Set<File>, PatchLoader.Jar(patchesFiles)
onLoadPatchesException: ((message: String, cause: Throwable) -> Unit)? = null
) = PatchLoader.Jar(patchesFiles, onLoadPatchesException ?: { message, cause -> })
@Deprecated(
"Use the function with the onLoadPatchesException overload",
replaceWith = ReplaceWith("loadPatchesFromJar(patchesFiles, null)")
)
fun loadPatchesFromJar(
patchesFiles: Set<File>
) = loadPatchesFromJar(patchesFiles, null)
/** /**
* Loads patches from DEX files declared as public static fields * Loads patches from DEX files declared as public static fields
@@ -712,21 +680,8 @@ fun loadPatchesFromJar(
* Patches with no name are not loaded. * Patches with no name are not loaded.
* *
* @param patchesFiles The DEX files to load the patches from. * @param patchesFiles The DEX files to load the patches from.
* @param onLoadPatchesException The callback for patches that could not be loaded.
* *
* @return The loaded patches. * @return The loaded patches.
*/ */
fun loadPatchesFromDex( fun loadPatchesFromDex(patchesFiles: Set<File>, optimizedDexDirectory: File? = null) =
patchesFiles: Set<File>, PatchLoader.Dex(patchesFiles, optimizedDexDirectory)
optimizedDexDirectory: File? = null,
onLoadPatchesException: ((message: String, cause: Throwable) -> Unit)? = null
) = PatchLoader.Dex(patchesFiles, optimizedDexDirectory, onLoadPatchesException ?: { message, cause -> })
@Deprecated(
"Use the function with the onLoadPatchesException overload",
replaceWith = ReplaceWith("loadPatchesFromJar(patchesFiles, optimizedDexDirectory, null)")
)
fun loadPatchesFromDex(
patchesFiles: Set<File>,
optimizedDexDirectory: File? = null,
) = loadPatchesFromDex(patchesFiles, optimizedDexDirectory, null)

View File

@@ -71,7 +71,6 @@ internal object PatchLoaderTest {
patchLoaderCompanionObject, patchLoaderCompanionObject,
TEST_PATCHES_CLASS_LOADER, TEST_PATCHES_CLASS_LOADER,
mapOf(File("patchesFile") to setOf(TEST_PATCHES_CLASS)), mapOf(File("patchesFile") to setOf(TEST_PATCHES_CLASS)),
null
).values.first() ).values.first()
assertEquals( assertEquals(