feat(Reddit): Replace with a fingerprint that supports a wider range of versions (..2025.10)

This commit is contained in:
inotia00
2025-03-14 19:00:54 +09:00
parent 35b63f3fb8
commit 4e033b355b
5 changed files with 126 additions and 24 deletions

View File

@ -1,5 +1,6 @@
package app.revanced.patches.reddit.layout.navigation
import app.revanced.util.containsLiteralInstruction
import app.revanced.util.fingerprint.legacyFingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
@ -8,6 +9,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
internal val bottomNavScreenFingerprint = legacyFingerprint(
name = "bottomNavScreenFingerprint",
@ -62,13 +64,32 @@ internal val bottomNavScreenOnGlobalLayoutFingerprint = legacyFingerprint(
}
)
private const val CHAT_BUTTON_MAGIC_NUMBER = 1906671695L
internal val bottomNavScreenSetupBottomNavigationFingerprint = legacyFingerprint(
name = "bottomNavScreenSetupBottomNavigationFingerprint",
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(Opcode.FILLED_NEW_ARRAY),
customFingerprint = { method, classDef ->
classDef.type.startsWith("Lcom/reddit/launch/bottomnav/BottomNavScreen${'$'}setupBottomNavigation${'$'}") &&
method.name == "invoke"
method.containsLiteralInstruction(CHAT_BUTTON_MAGIC_NUMBER) &&
method.name == "invoke" &&
indexOfButtonsArrayInstruction(method) >= 0
}
)
internal val composeBottomNavScreenFingerprint = legacyFingerprint(
name = "composeBottomNavScreenFingerprint",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Landroid/content/res/Resources;"),
opcodes = listOf(Opcode.FILLED_NEW_ARRAY),
customFingerprint = { method, classDef ->
classDef.type == "Lcom/reddit/launch/bottomnav/ComposeBottomNavScreen;" &&
indexOfButtonsArrayInstruction(method) >= 0
}
)
internal fun indexOfButtonsArrayInstruction(method: Method) =
method.indexOfFirstInstruction {
opcode == Opcode.FILLED_NEW_ARRAY &&
getReference<TypeReference>()?.type?.startsWith("[Lcom/reddit/widget/bottomnav/") == true
}

View File

@ -8,12 +8,12 @@ import app.revanced.patches.reddit.utils.compatibility.Constants.COMPATIBLE_PACK
import app.revanced.patches.reddit.utils.extension.Constants.PATCHES_PATH
import app.revanced.patches.reddit.utils.patch.PatchList.HIDE_NAVIGATION_BUTTONS
import app.revanced.patches.reddit.utils.settings.is_2024_26_or_greater
import app.revanced.patches.reddit.utils.settings.is_2025_06_or_greater
import app.revanced.patches.reddit.utils.settings.settingsPatch
import app.revanced.patches.reddit.utils.settings.updatePatchStatus
import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.fingerprint.resolvable
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@ -34,17 +34,23 @@ val navigationButtonsPatch = bytecodePatch(
execute {
if (is_2024_26_or_greater) {
bottomNavScreenSetupBottomNavigationFingerprint.methodOrThrow().apply {
val arrayIndex = indexOfFirstInstructionReversedOrThrow(Opcode.FILLED_NEW_ARRAY)
val arrayRegister =
getInstruction<OneRegisterInstruction>(arrayIndex + 1).registerA
val fingerprints = mutableListOf(bottomNavScreenSetupBottomNavigationFingerprint)
addInstructions(
arrayIndex + 2, """
invoke-static {v$arrayRegister}, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtons([Ljava/lang/Object;)[Ljava/lang/Object;
move-result-object v$arrayRegister
"""
)
if (is_2025_06_or_greater) fingerprints += composeBottomNavScreenFingerprint
fingerprints.forEach { fingerprint ->
fingerprint.methodOrThrow().apply {
val arrayIndex = indexOfButtonsArrayInstruction(this)
val arrayRegister =
getInstruction<OneRegisterInstruction>(arrayIndex + 1).registerA
addInstructions(
arrayIndex + 2, """
invoke-static {v$arrayRegister}, $EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtons([Ljava/lang/Object;)[Ljava/lang/Object;
move-result-object v$arrayRegister
"""
)
}
}
} else {
if (bottomNavScreenFingerprint.resolvable()) {

View File

@ -1,9 +1,32 @@
package app.revanced.patches.reddit.layout.screenshotpopup
import app.revanced.patches.reddit.utils.resourceid.screenShotShareBanner
import app.revanced.util.containsLiteralInstruction
import app.revanced.util.fingerprint.legacyFingerprint
import com.android.tools.smali.dexlib2.Opcode
/**
* Reddit 2025.06.0 ~
*/
internal val screenshotTakenBannerFingerprint = legacyFingerprint(
name = "screenshotTakenBannerFingerprint",
returnType = "L",
opcodes = listOf(
Opcode.CONST_4,
Opcode.IF_NE,
),
customFingerprint = { method, classDef ->
method.containsLiteralInstruction(screenShotShareBanner) &&
classDef.type.startsWith("Lcom/reddit/sharing/screenshot/composables/") &&
method.name == "invoke"
}
)
/**
* ~ Reddit 2025.05.1
*/
internal val screenshotTakenBannerLegacyFingerprint = legacyFingerprint(
name = "screenshotTakenBannerLegacyFingerprint",
returnType = "V",
parameters = listOf("Landroidx/compose/runtime/", "I"),
customFingerprint = { method, classDef ->

View File

@ -7,9 +7,17 @@ import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.reddit.utils.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.reddit.utils.extension.Constants.PATCHES_PATH
import app.revanced.patches.reddit.utils.patch.PatchList.DISABLE_SCREENSHOT_POPUP
import app.revanced.patches.reddit.utils.resourceid.screenShotShareBanner
import app.revanced.patches.reddit.utils.resourceid.sharedResourceIdPatch
import app.revanced.patches.reddit.utils.settings.is_2025_06_or_greater
import app.revanced.patches.reddit.utils.settings.settingsPatch
import app.revanced.patches.reddit.utils.settings.updatePatchStatus
import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
private const val EXTENSION_METHOD_DESCRIPTOR =
"$PATCHES_PATH/ScreenshotPopupPatch;->disableScreenshotPopup()Z"
@ -21,18 +29,39 @@ val screenshotPopupPatch = bytecodePatch(
) {
compatibleWith(COMPATIBLE_PACKAGE)
dependsOn(settingsPatch)
dependsOn(
settingsPatch,
sharedResourceIdPatch,
)
execute {
screenshotTakenBannerFingerprint.methodOrThrow().apply {
addInstructionsWithLabels(
0, """
invoke-static {}, $EXTENSION_METHOD_DESCRIPTOR
move-result v0
if-eqz v0, :dismiss
return-void
""", ExternalLabel("dismiss", getInstruction(0))
)
if (is_2025_06_or_greater) {
screenshotTakenBannerFingerprint.methodOrThrow().apply {
val literalIndex = indexOfFirstLiteralInstructionOrThrow(screenShotShareBanner)
val insertIndex = indexOfFirstInstructionReversedOrThrow(literalIndex, Opcode.CONST_4)
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
val jumpIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.SGET_OBJECT)
addInstructionsWithLabels(
insertIndex, """
invoke-static {}, $EXTENSION_METHOD_DESCRIPTOR
move-result v$insertRegister
if-nez v$insertRegister, :hidden
""", ExternalLabel("hidden", getInstruction(jumpIndex))
)
}
} else {
screenshotTakenBannerLegacyFingerprint.methodOrThrow().apply {
addInstructionsWithLabels(
0, """
invoke-static {}, $EXTENSION_METHOD_DESCRIPTOR
move-result v0
if-eqz v0, :dismiss
return-void
""", ExternalLabel("dismiss", getInstruction(0))
)
}
}
updatePatchStatus(

View File

@ -0,0 +1,23 @@
package app.revanced.patches.reddit.utils.resourceid
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.shared.mapping.ResourceType.STRING
import app.revanced.patches.shared.mapping.get
import app.revanced.patches.shared.mapping.resourceMappingPatch
import app.revanced.patches.shared.mapping.resourceMappings
var screenShotShareBanner = -1L
private set
internal val sharedResourceIdPatch = resourcePatch(
description = "sharedResourceIdPatch"
) {
dependsOn(resourceMappingPatch)
execute {
screenShotShareBanner = resourceMappings[
STRING,
"screenshot_share_banner_title",
]
}
}