Skip to content

Commit 567feef

Browse files
refactor: Add mutableClassByOrNull()
1 parent 8f7911e commit 567feef

File tree

6 files changed

+96
-15
lines changed

6 files changed

+96
-15
lines changed

api/revanced-patcher.api

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,17 @@ public final class app/revanced/patcher/patch/BytecodePatchBuilder : app/revance
313313
public final class app/revanced/patcher/patch/BytecodePatchContext : app/revanced/patcher/patch/PatchContext, java/io/Closeable {
314314
public final fun classBy (Ljava/lang/String;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
315315
public final fun classBy (Lkotlin/jvm/functions/Function1;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
316+
public final fun classByOrNull (Ljava/lang/String;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
317+
public final fun classByOrNull (Lkotlin/jvm/functions/Function1;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
316318
public fun close ()V
317319
public synthetic fun get ()Ljava/lang/Object;
318320
public fun get ()Ljava/util/Set;
319321
public final fun getClasses ()Lapp/revanced/patcher/util/PatchClasses;
320322
public final fun mutableClassBy (Lcom/android/tools/smali/dexlib2/iface/ClassDef;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
321323
public final fun mutableClassBy (Ljava/lang/String;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
322324
public final fun mutableClassBy (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
325+
public final fun mutableClassByOrNull (Ljava/lang/String;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
326+
public final fun mutableClassByOrNull (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
323327
public final fun navigate (Lcom/android/tools/smali/dexlib2/iface/reference/MethodReference;)Lapp/revanced/patcher/util/MethodNavigator;
324328
public final fun proxy (Lcom/android/tools/smali/dexlib2/iface/ClassDef;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
325329
}
@@ -652,10 +656,14 @@ public final class app/revanced/patcher/util/MethodNavigator {
652656
public final class app/revanced/patcher/util/PatchClasses {
653657
public final fun classBy (Ljava/lang/String;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
654658
public final fun classBy (Lkotlin/jvm/functions/Function1;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
659+
public final fun classByOrNull (Ljava/lang/String;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
660+
public final fun classByOrNull (Lkotlin/jvm/functions/Function1;)Lcom/android/tools/smali/dexlib2/iface/ClassDef;
655661
public final fun forEach (Lkotlin/jvm/functions/Function1;)V
656662
public final fun mutableClassBy (Lcom/android/tools/smali/dexlib2/iface/ClassDef;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
657663
public final fun mutableClassBy (Ljava/lang/String;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
658664
public final fun mutableClassBy (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
665+
public final fun mutableClassByOrNull (Ljava/lang/String;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
666+
public final fun mutableClassByOrNull (Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;
659667
}
660668

661669
public final class app/revanced/patcher/util/proxy/mutableTypes/MutableAnnotation : com/android/tools/smali/dexlib2/base/BaseAnnotation {

src/main/kotlin/app/revanced/patcher/Fingerprint.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ class Fingerprint internal constructor(
139139
): Match? {
140140
if (_matchOrNull != null) return _matchOrNull
141141

142-
return matchOrNull(classBy { method.definingClass == it.type }!!, method)
142+
return matchOrNull(classBy(method.definingClass), method)
143143
}
144144

145145
/**

src/main/kotlin/app/revanced/patcher/patch/BytecodePatchContext.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class BytecodePatchContext internal constructor(private val config: PatcherConfi
6767
internal fun mergeExtension(bytecodePatch: BytecodePatch) {
6868
bytecodePatch.extensionInputStream?.get()?.use { extensionStream ->
6969
RawDexIO.readRawDexFile(extensionStream, 0, null).classes.forEach { classDef ->
70-
val existingClass = classes.classBy(classDef.type) ?: run {
70+
val existingClass = classes.classByOrNull(classDef.type) ?: run {
7171
logger.fine { "Adding class \"$classDef\"" }
7272

7373
classes.addClass(classDef)
@@ -107,6 +107,23 @@ class BytecodePatchContext internal constructor(private val config: PatcherConfi
107107
*/
108108
fun classBy(predicate: (ClassDef) -> Boolean) = classes.classBy(predicate)
109109

110+
/**
111+
* Find a class with a predicate.
112+
*
113+
* @param classType The full classname.
114+
* @return An immutable instance of the class type.
115+
* @see mutableClassBy
116+
*/
117+
fun classByOrNull(classType: String) = classes.classByOrNull(classType)
118+
119+
/**
120+
* Find a class with a predicate.
121+
*
122+
* @param predicate A predicate to match the class.
123+
* @return An immutable instance of the class type.
124+
*/
125+
fun classByOrNull(predicate: (ClassDef) -> Boolean) = classes.classByOrNull(predicate)
126+
110127
/**
111128
* Find a class with a predicate.
112129
*
@@ -131,6 +148,23 @@ class BytecodePatchContext internal constructor(private val config: PatcherConfi
131148
*/
132149
fun mutableClassBy(predicate: (ClassDef) -> Boolean) = classes.mutableClassBy(predicate)
133150

151+
/**
152+
* Mutable class from a full class name.
153+
* Returns `null` if class is not available, such as a built in Android or Java library.
154+
*
155+
* @param classType The full classname.
156+
* @return A mutable version of the class type.
157+
*/
158+
fun mutableClassByOrNull(classType: String) = classes.mutableClassByOrNull(classType)
159+
160+
/**
161+
* Find a mutable class with a predicate.
162+
*
163+
* @param predicate A predicate to match the class.
164+
* @return A mutable class that matches the predicate.
165+
*/
166+
fun mutableClassByOrNull(predicate: (ClassDef) -> Boolean) = classes.mutableClassByOrNull(predicate)
167+
134168
/**
135169
* @return The mutable instance of an immutable class.
136170
*/

src/main/kotlin/app/revanced/patcher/util/ClassMerger.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ internal object ClassMerger {
181181
callback(targetClass)
182182

183183
targetClass.superclass ?: return
184-
this.mutableClassBy { targetClass.superclass == it.type }?.let {
184+
mutableClassByOrNull(targetClass.superclass!!)?.let {
185185
traverseClassHierarchy(it, callback)
186186
}
187187
}

src/main/kotlin/app/revanced/patcher/util/MethodNavigator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class MethodNavigator internal constructor(
9595
*
9696
* @return The last navigated method immutably.
9797
*/
98-
fun original(): Method = classes.classBy(lastNavigatedMethodReference.definingClass)!!.firstMethodBySignature
98+
fun original(): Method = classes.classBy(lastNavigatedMethodReference.definingClass).firstMethodBySignature
9999

100100
/**
101101
* Find the first [lastNavigatedMethodReference] in the class.

src/main/kotlin/app/revanced/patcher/util/PatchClasses.kt

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,72 @@ class PatchClasses internal constructor(
4242
* @return An immutable instance of the class type.
4343
* @see mutableClassBy
4444
*/
45-
fun classBy(classType: String) = pool[classType]
45+
fun classByOrNull(classType: String) = pool[classType]
46+
47+
/**
48+
* Find a class with a predicate.
49+
*
50+
* @param predicate A predicate to match the class.
51+
* @return An immutable instance of the class type, or null if not found.
52+
*/
53+
fun classByOrNull(predicate: (ClassDef) -> Boolean) = pool.values.find(predicate)
4654

4755
/**
4856
* Find a class with a predicate.
4957
*
5058
* @param predicate A predicate to match the class.
5159
* @return An immutable instance of the class type.
5260
*/
53-
fun classBy(predicate: (ClassDef) -> Boolean) = pool.values.find(predicate)
61+
fun classBy(predicate: (ClassDef) -> Boolean) = classByOrNull(predicate)
62+
?: throw PatchException("Could not find any class match")
5463

5564
/**
5665
* Find a class with a predicate.
5766
*
67+
* @param classType The full classname.
68+
* @return An immutable instance of the class type.
69+
* @see mutableClassBy
70+
*/
71+
fun classBy(classType: String) = classByOrNull(classType)
72+
?: throw PatchException("Could not find class: $classType")
73+
74+
/**
75+
* Mutable class from a full class name.
76+
* Returns `null` if class is not available, such as a built in Android or Java library.
77+
*
5878
* @param classDefType The full classname.
5979
* @return A mutable version of the class type.
6080
*/
61-
fun mutableClassBy(classDefType: String) : MutableClass {
62-
var classDef = pool[classDefType] ?: throw PatchException("Could not find class: $classDefType")
63-
if (classDef is MutableClass) {
64-
return classDef
65-
}
81+
fun mutableClassByOrNull(classDefType: String) : MutableClass? {
82+
var classDef = pool[classDefType]
83+
if (classDef == null) return null
84+
if (classDef is MutableClass) return classDef
85+
6686
classDef = MutableClass(classDef)
6787
pool[classDefType] = classDef
6888
return classDef
6989
}
7090

91+
/**
92+
* Find a class with a predicate.
93+
*
94+
* @param classDefType The full classname.
95+
* @return A mutable version of the class type.
96+
*/
97+
fun mutableClassBy(classDefType: String) = mutableClassByOrNull(classDefType)
98+
?: throw PatchException("Could not find class: $classDefType")
99+
100+
/**
101+
* Find a mutable class with a predicate.
102+
*
103+
* @param predicate A predicate to match the class.
104+
* @return A mutable class that matches the predicate.
105+
*/
106+
fun mutableClassByOrNull(predicate: (ClassDef) -> Boolean) =
107+
classByOrNull(predicate)?.let {
108+
if (it is MutableClass) it else mutableClassBy(it.type)
109+
}
110+
71111
/**
72112
* @param classDef An immutable class.
73113
* @return A mutable version of the class definition.
@@ -81,8 +121,7 @@ class PatchClasses internal constructor(
81121
* @param predicate A predicate to match the class.
82122
* @return A mutable class that matches the predicate.
83123
*/
84-
fun mutableClassBy(predicate: (ClassDef) -> Boolean) =
85-
classBy(predicate)?.let {
86-
if (it is MutableClass) it else mutableClassBy(it.type)
87-
}
124+
fun mutableClassBy(predicate: (ClassDef) -> Boolean) = mutableClassByOrNull(predicate)
125+
?: throw PatchException("Could not find any class match")
126+
88127
}

0 commit comments

Comments
 (0)