some fixes

This commit is contained in:
oSumAtrIX
2026-01-23 17:15:54 +01:00
parent 69aa683901
commit 4950ac412f
30 changed files with 107 additions and 152 deletions

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.amazon
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val deepLinkingPatch = bytecodePatch(
@@ -11,12 +11,6 @@ val deepLinkingPatch = bytecodePatch(
compatibleWith("com.amazon.mShop.android.shopping")
apply {
deepLinkingMethod.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
""",
)
deepLinkingMethod.returnEarly(true)
}
}

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.cieid.restrictions.root
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val bypassRootChecksPatch = bytecodePatch(
@@ -11,6 +11,6 @@ val bypassRootChecksPatch = bytecodePatch(
compatibleWith("it.ipzs.cieid")
apply {
checkRootMethod.addInstruction(1, "return-void")
checkRootMethod.returnEarly()
}
}

View File

@@ -21,10 +21,10 @@ val disableAdsPatch = bytecodePatch(
// SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS".
//
// MonetizationDebugSettings seems to be the most general setting to work fine.
initializeMonetizationDebugSettingsMethod.match( // TODO
monetizationDebugSettingsToStringMethod.classDef
initializeMonetizationDebugSettingsMethodMatch.match(
monetizationDebugSettingsToStringMethod.classDef,
).method.apply {
val insertIndex = initializeMonetizationDebugSettingsMethod.instructionMatches.first().index
val insertIndex = initializeMonetizationDebugSettingsMethodMatch.indices.first()
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
addInstructions(

View File

@@ -5,15 +5,14 @@ import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.initializeMonetizationDebugSettingsMethod by gettingFirstMutableMethodDeclaratively {
internal val initializeMonetizationDebugSettingsMethodMatch = firstMethodComposite {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
returnType("V")
// Parameters have not been reliable for fingerprinting between versions.
opcodes(Opcode.IPUT_BOOLEAN)
}
internal val BytecodePatchContext.monetizationDebugSettingsToStringMethod by gettingFirstMutableMethodDeclaratively(
"MonetizationDebugSettings(" // Partial string match.
) {
internal val BytecodePatchContext.monetizationDebugSettingsToStringMethod by gettingFirstMutableMethodDeclaratively {
name("toString")
instructions(string("MonetizationDebugSettings(", String::contains))
}

View File

@@ -10,7 +10,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val enableDebugMenuPatch = bytecodePatch(
name = "Enable debug menu",
use = false
use = false,
) {
compatibleWith("com.duolingo")
@@ -19,18 +19,13 @@ val enableDebugMenuPatch = bytecodePatch(
debugCategoryAllowOnReleaseBuildsMethod.returnEarly(true)
// Change build config debug build flag.
buildConfigProviderConstructorMethod.match( // TODO
buildConfigProviderToStringMethod.classDef
buildConfigProviderConstructorMethodMatch.match(
buildConfigProviderToStringMethod.classDef,
).let {
val index = it.patternMatch.startIndex // TODO
val index = it.indices.first()
it.apply {
val register = getInstruction<OneRegisterInstruction>(index).registerA // TODO
addInstruction(
index + 1,
"const/4 v$register, 0x1"
)
}
val register = it.method.getInstruction<OneRegisterInstruction>(index).registerA
it.method.addInstruction(index + 1, "const/4 v$register, 0x1")
}
}
}

View File

@@ -12,17 +12,16 @@ internal val BytecodePatchContext.debugCategoryAllowOnReleaseBuildsMethod by get
parameterTypes()
}
internal val BytecodePatchContext.buildConfigProviderConstructorMethod by gettingFirstMutableMethodDeclaratively {
internal val buildConfigProviderConstructorMethodMatch = firstMethodComposite {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameterTypes()
opcodes(Opcode.CONST_4)
}
internal val BytecodePatchContext.buildConfigProviderToStringMethod by gettingFirstMutableMethodDeclaratively(
"BuildConfigProvider(" // Partial string match.
) {
internal val BytecodePatchContext.buildConfigProviderToStringMethod by gettingFirstMutableMethodDeclaratively {
name("toString")
parameterTypes()
returnType("Ljava/lang/String;")
instructions(string("BuildConfigProvider(", String::contains))
}

View File

@@ -14,10 +14,12 @@ internal val BytecodePatchContext.initializeEnergyConfigMethod by gettingFirstMu
}
// Class name currently is not obfuscated, but it may be in the future.
internal val BytecodePatchContext.energyConfigToStringMethod by gettingFirstMutableMethodDeclaratively(
"EnergyConfig(", "maxEnergy=" // Partial string matches.
) {
internal val BytecodePatchContext.energyConfigToStringMethod by gettingFirstMutableMethodDeclaratively {
name("toString")
parameterTypes()
returnType("Ljava/lang/String;")
instructions(
string("EnergyConfig(", String::contains),
string("maxEnergy=", String::contains),
)
}

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.finanzonline.detection.bootloader
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val bootloaderDetectionPatch = bytecodePatch(
@@ -11,14 +11,8 @@ val bootloaderDetectionPatch = bytecodePatch(
compatibleWith("at.gv.bmf.bmf2go")
apply {
setOf(createKeyMethod, bootStateMethod).forEach { fingerprint ->
fingerprint.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
""",
)
setOf(createKeyMethod, bootStateMethod).forEach { method ->
method.returnEarly(true)
}
}
}

View File

@@ -29,18 +29,17 @@ internal val BytecodePatchContext.bootStateMethod by gettingFirstMutableMethodDe
Opcode.IF_NE,
Opcode.GOTO,
Opcode.MOVE,
Opcode.RETURN
Opcode.RETURN,
)
}
// Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1)
internal val BytecodePatchContext.createKeyMethod by gettingFirstMutableMethodDeclaratively(
"attestation",
"SHA-256",
"random",
"EC",
"AndroidKeyStore"
"AndroidKeyStore",
) {
accessFlags(AccessFlags.PUBLIC)
returnType("Z")

View File

@@ -13,8 +13,8 @@ val enableCustomTabsPatch = bytecodePatch(
compatibleWith("com.google.android.apps.magazines")
apply {
launchCustomTabMethod.apply {
val checkIndex = launchCustomTabMethod.instructionMatches.last().index + 1 // TODO
launchCustomTabMethodMatch.method.apply {
val checkIndex = launchCustomTabMethodMatch.indices.last() + 1
val register = getInstruction<OneRegisterInstruction>(checkIndex).registerA
replaceInstruction(checkIndex, "const/4 v$register, 0x1")

View File

@@ -2,13 +2,12 @@ package app.revanced.patches.googlenews.customtabs
import app.revanced.patcher.accessFlags
import app.revanced.patcher.definingClass
import app.revanced.patcher.gettingFirstMutableMethodDeclaratively
import app.revanced.patcher.firstMethodComposite
import app.revanced.patcher.opcodes
import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.launchCustomTabMethod by gettingFirstMutableMethodDeclaratively {
internal val launchCustomTabMethodMatch = firstMethodComposite {
definingClass("CustomTabsArticleLauncher;"::endsWith)
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
opcodes(

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.hexeditor.ad
import app.revanced.patcher.extensions.replaceInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val disableAdsPatch = bytecodePatch(
@@ -10,12 +10,6 @@ val disableAdsPatch = bytecodePatch(
compatibleWith("com.myprog.hexedit")
apply {
primaryAdsMethod.replaceInstructions(
0,
"""
const/4 v0, 0x1
return v0
""",
)
primaryAdsMethod.returnEarly(true)
}
}

View File

@@ -1,22 +0,0 @@
package app.revanced.patches.lightroom.misc.version
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.lightroom.misc.bypassVersionCheck.refreshRemoteConfigurationMethod
@Suppress("unused")
val disableVersionCheckPatch = bytecodePatch(
name = "Disable version check",
description = "Disables the server-side version check that prevents the app from starting.",
) {
compatibleWith("com.adobe.lrmobile"("9.3.0"))
apply {
refreshRemoteConfigurationMethod.apply {
val igetIndex = refreshRemoteConfigurationMethod.patternMatch!!.endIndex // TODO
// This value represents the server command to clear all version restrictions.
val statusForceReset = "-0x2";
replaceInstruction(igetIndex, "const/4 v1, $statusForceReset")
}
}
}

View File

@@ -1,5 +1,6 @@
package app.revanced.patches.lightroom.misc.login
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
@@ -10,10 +11,8 @@ val disableMandatoryLoginPatch = bytecodePatch(
compatibleWith("com.adobe.lrmobile"("9.3.0"))
apply {
isLoggedInMethod.apply {
val index = implementation!!.instructions.lastIndex - 1
// Set isLoggedIn = true.
replaceInstruction(index, "const/4 v0, 0x1")
}
val index = isLoggedInMethod.instructions.lastIndex - 1
// Set isLoggedIn = true.
isLoggedInMethod.replaceInstruction(index, "const/4 v0, 0x1")
}
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.lightroom.misc.version
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
@Suppress("unused")
val disableVersionCheckPatch = bytecodePatch(
name = "Disable version check",
description = "Disables the server-side version check that prevents the app from starting.",
) {
compatibleWith("com.adobe.lrmobile"("9.3.0"))
apply {
val igetIndex = refreshRemoteConfigurationMethodMatch.indices.last()
// This value represents the server command to clear all version restrictions.
val statusForceReset = "-0x2"
refreshRemoteConfigurationMethodMatch.method.replaceInstruction(igetIndex, "const/4 v1, $statusForceReset")
}
}

View File

@@ -1,15 +1,14 @@
package app.revanced.patches.lightroom.misc.bypassVersionCheck
package app.revanced.patches.lightroom.misc.version
import app.revanced.patcher.accessFlags
import app.revanced.patcher.gettingFirstMutableMethodDeclaratively
import app.revanced.patcher.firstMethodComposite
import app.revanced.patcher.opcodes
import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.refreshRemoteConfigurationMethod by gettingFirstMutableMethodDeclaratively(
internal val refreshRemoteConfigurationMethodMatch = firstMethodComposite(
"com.adobe.lrmobile.denylisted_version_set_key",
"com.adobe.lrmobile.app_min_version_key"
"com.adobe.lrmobile.app_min_version_key",
) {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
opcodes(

View File

@@ -7,12 +7,11 @@ import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.getMobileConfigBoolMethod by gettingFirstMutableMethodDeclaratively {
returnType("Z")
opcodes(Opcode.RETURN)
custom { immutableClassDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") }
custom { "Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;" in immutableClassDef.interfaces }
}
internal val BytecodePatchContext.metaAIKillSwitchCheckMethod by gettingFirstMutableMethodDeclaratively("SearchAiagentImplementationsKillSwitch") {
opcodes(Opcode.CONST_WIDE)
}
internal val BytecodePatchContext.extensionMethodMethod by gettingFirstMutableMethodDeclaratively("REPLACED_BY_PATCH") {
name(EXTENSION_METHOD_NAME)

View File

@@ -4,14 +4,11 @@ import app.revanced.patcher.*
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE
import app.revanced.patches.shared.misc.mapping.ResourceType
import app.revanced.patches.shared.misc.mapping.resourceLiteral
internal val BytecodePatchContext.cairoSplashAnimationConfigMethod by gettingFirstMutableMethodDeclaratively {
name("onCreate")
returnType("V")
definingClass(YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE)
parameterTypes("Landroid/os/Bundle;")
instructions(
resourceLiteral(ResourceType.LAYOUT, "main_activity_launch_animation")
)
instructions(ResourceType.LAYOUT("main_activity_launch_animation"))
}

View File

@@ -1,6 +1,5 @@
package app.revanced.patches.music.misc.backgroundplayback
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.settingsPatch
@@ -12,22 +11,18 @@ val backgroundPlaybackPatch = bytecodePatch(
) {
dependsOn(
sharedExtensionPatch,
settingsPatch
settingsPatch,
)
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52",
"8.10.52"
)
"8.10.52",
),
)
apply {
kidsBackgroundPlaybackPolicyControllerMethod.addInstruction(
0,
"return-void",
)
kidsBackgroundPlaybackPolicyControllerMethod.returnEarly()
backgroundPlaybackDisableMethod.returnEarly(true)
}
}

View File

@@ -1,8 +1,8 @@
package app.revanced.patches.protonvpn.splittunneling
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow

View File

@@ -1,7 +1,6 @@
package app.revanced.patches.shared.misc.mapping
import app.revanced.patcher.InstructionLocation
import app.revanced.patcher.LiteralFilter
import app.revanced.patcher.Predicate
import app.revanced.patcher.extensions.wideLiteral
import app.revanced.patcher.literal
import app.revanced.patcher.patch.PatchException
@@ -35,10 +34,12 @@ enum class ResourceType(val value: String) {
STYLEABLE("styleable"),
TRANSITION("transition"),
VALUES("values"),
XML("xml");
XML("xml"),
;
operator fun invoke(name: String): Instruction.() -> Boolean =
getResourceId(this, name).let { { wideLiteral(it) } }
val id = getResourceId(this, name)
operator fun invoke(name: String): Predicate<Instruction> = { wideLiteral == id }
companion object {
private val VALUE_MAP: Map<String, ResourceType> = entries.associateBy { it.value }
@@ -82,7 +83,7 @@ fun hasResourceId(type: ResourceType, name: String) = resourceMappings[type.valu
fun resourceLiteral(
type: ResourceType,
name: String,
location: InstructionLocation = InstructionLocation.MatchAfterAnywhere()
location: InstructionLocation = InstructionLocation.MatchAfterAnywhere(),
) = literal({ getResourceId(type, name) }, null, location)
val resourceMappingPatch = resourcePatch {

View File

@@ -37,7 +37,7 @@ val enableOfflineSync = bytecodePatch(
// Patch the URL builder to use the HTTPS_STREAM endpoint
// instead of the offline sync endpoint to downloading the track.
downloadOperationsURLBuilderFingerprint.apply {
downloadOperationsURLBuilderMethod.apply {
val getEndpointsEnumFieldIndex = 1
val getEndpointsEnumFieldInstruction = getInstruction<OneRegisterInstruction>(getEndpointsEnumFieldIndex)
@@ -53,7 +53,7 @@ val enableOfflineSync = bytecodePatch(
// The HTTPS_STREAM endpoint does not return the necessary headers for offline sync.
// Mock the headers to prevent the app from crashing by setting them to empty strings.
// The headers are all cosmetic and do not affect the functionality of the app.
downloadOperationsHeaderVerificationFingerprint.apply {
downloadOperationsHeaderVerificationMethod.apply {
// The first three null checks need to be patched.
instructions.asSequence().filter {
it.opcode == Opcode.IF_EQZ

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.downloadOperationsURLBuilderFingerprint by gettingFirstMutableMethodDeclaratively {
internal val BytecodePatchContext.downloadOperationsURLBuilderMethod by gettingFirstMutableMethodDeclaratively {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returnType("Ljava/lang/String")
parameterTypes("L", "L")
@@ -16,10 +16,10 @@ internal val BytecodePatchContext.downloadOperationsURLBuilderFingerprint by get
)
}
internal val BytecodePatchContext.downloadOperationsHeaderVerificationFingerprint by gettingFirstMutableMethodDeclaratively(
internal val BytecodePatchContext.downloadOperationsHeaderVerificationMethod by gettingFirstMutableMethodDeclaratively(
"X-SC-Mime-Type",
"X-SC-Preset",
"X-SC-Quality"
"X-SC-Quality",
) {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returnType("V")

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.strava.upselling
import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.patch.bytecodePatch
import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable
@Suppress("unused")
val disableSubscriptionSuggestionsPatch = bytecodePatch(
@@ -20,11 +19,11 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch(
val pageSuffix = "_upsell"
val label = "original"
val className = getModulesMethod.classDef.type
val originalMethod = getModulesMethod
val className = getModulesMethodMatch.classDef.type
val originalMethod = getModulesMethodMatch.method
val returnType = originalMethod.returnType
getModulesMethod.classDef.methods.add(
getModulesMethodMatch.classDef.methods.add(
ImmutableMethod(
className,
helperMethodName,
@@ -53,16 +52,14 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch(
},
)
val getModulesIndex = getModulesMethod.instructionMatches.first().index // TODO
with(originalMethod) {
removeInstruction(getModulesIndex)
addInstructions(
getModulesIndex,
"""
invoke-direct {p0}, $className->$helperMethodName()$returnType
move-result-object v0
""",
)
}
val getModulesIndex = getModulesMethodMatch.indices.first()
originalMethod.removeInstruction(getModulesIndex)
originalMethod.addInstructions(
getModulesIndex,
"""
invoke-direct {p0}, $className->$helperMethodName()$returnType
move-result-object v0
""",
)
}
}

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.strava.upselling
import app.revanced.patcher.definingClass
import app.revanced.patcher.gettingFirstMutableMethodDeclaratively
import app.revanced.patcher.firstMethodComposite
import app.revanced.patcher.name
import app.revanced.patcher.opcodes
import app.revanced.patcher.patch.BytecodePatchContext
import com.android.tools.smali.dexlib2.Opcode
internal val BytecodePatchContext.getModulesMethod by gettingFirstMutableMethodDeclaratively {
internal val getModulesMethodMatch = firstMethodComposite {
name("getModules")
definingClass("/GenericLayoutEntry;"::endsWith)
opcodes(Opcode.IGET_OBJECT)

View File

@@ -1,10 +1,6 @@
package app.revanced.patches.tiktok.interaction.downloads
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.removeInstructions
import app.revanced.patcher.extensions.*
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch
import app.revanced.patches.tiktok.misc.settings.settingsPatch
@@ -75,7 +71,7 @@ val downloadsPatch = bytecodePatch(
}
}
settingsStatusLoadFingerprint.method.addInstruction( // TODO
settingsStatusLoadFingerprint.method.addInstruction(
0,
"invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableDownload()V",
)

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.tumblr.annoyances.popups
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val disableGiftMessagePopupPatch = bytecodePatch(
@@ -11,6 +11,6 @@ val disableGiftMessagePopupPatch = bytecodePatch(
compatibleWith("com.tumblr")
apply {
showGiftMessagePopupMethod.addInstructions(0, "return-void")
showGiftMessagePopupMethod.returnEarly()
}
}

View File

@@ -28,7 +28,7 @@ val embeddedAdsPatch = bytecodePatch(
ListPreference("revanced_block_embedded_ads"),
)
// Inject OkHttp3 application interceptor
// Inject OkHttp3 application interceptor.
createsUsherClientMethod.addInstructions(
3,
"""

View File

@@ -1,10 +1,10 @@
package app.revanced.patches.twitch.chat.autoclaim
import app.revanced.patcher.extensions.ExternalLabel
import app.revanced.patcher.extensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.extensions.ExternalLabel
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference

View File

@@ -33,8 +33,8 @@ val debugModePatch = bytecodePatch(
isDebugConfigEnabledMethod,
isOmVerificationEnabledMethod,
shouldShowDebugOptionsMethod,
).forEach { fingerprint ->
fingerprint.addInstructions(
).forEach { method ->
method.addInstructions(
0,
"""
invoke-static {}, Lapp/revanced/extension/twitch/patches/DebugModePatch;->isDebugModeEnabled()Z