mirror of
https://github.com/revanced/revanced-patches
synced 2025-01-14 20:57:38 +01:00
refactor(YouTube): Change fingerprints to support a wider range of target versions (#4026)
This commit is contained in:
parent
1080a68da2
commit
7623b3ae18
@ -1200,10 +1200,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl
|
|||||||
public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/youtube/layout/startupshortsreset/FingerprintsKt {
|
|
||||||
public static final fun indexOfOptionalInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;)I
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt {
|
public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt {
|
||||||
public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String;
|
public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String;
|
||||||
public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
@ -1329,6 +1325,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
|
|||||||
public static final fun is_19_41_or_greater ()Z
|
public static final fun is_19_41_or_greater ()Z
|
||||||
public static final fun is_19_43_or_greater ()Z
|
public static final fun is_19_43_or_greater ()Z
|
||||||
public static final fun is_19_46_or_greater ()Z
|
public static final fun is_19_46_or_greater ()Z
|
||||||
|
public static final fun is_19_47_or_greater ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
|
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {
|
||||||
|
@ -20,6 +20,8 @@ import app.revanced.patches.shared.misc.settings.preference.*
|
|||||||
import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
|
import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
|
||||||
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch
|
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch
|
import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch
|
||||||
|
import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater
|
||||||
|
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||||
@ -118,6 +120,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
|||||||
addResourcesPatch,
|
addResourcesPatch,
|
||||||
hideLayoutComponentsResourcePatch,
|
hideLayoutComponentsResourcePatch,
|
||||||
navigationBarHookPatch,
|
navigationBarHookPatch,
|
||||||
|
versionCheckPatch
|
||||||
)
|
)
|
||||||
|
|
||||||
compatibleWith(
|
compatibleWith(
|
||||||
@ -243,22 +246,27 @@ val hideLayoutComponentsPatch = bytecodePatch(
|
|||||||
|
|
||||||
// region Mix playlists
|
// region Mix playlists
|
||||||
|
|
||||||
val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex
|
|
||||||
|
|
||||||
parseElementFromBufferFingerprint.method.apply {
|
parseElementFromBufferFingerprint.method.apply {
|
||||||
val freeRegister = "v0"
|
val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex
|
||||||
|
// Target code is a mess with a lot of register moves.
|
||||||
|
// There is no simple way to find a free register for all versions so this is hard coded.
|
||||||
|
val freeRegister = if (is_19_47_or_greater) 6 else 0
|
||||||
val byteArrayParameter = "p3"
|
val byteArrayParameter = "p3"
|
||||||
val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA
|
val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA
|
||||||
val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC }
|
val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC }
|
||||||
|
val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC
|
||||||
|
|
||||||
addInstructionsWithLabels(
|
addInstructionsWithLabels(
|
||||||
startIndex + 1,
|
startIndex + 1,
|
||||||
"""
|
"""
|
||||||
invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z
|
invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z
|
||||||
move-result $freeRegister
|
move-result v$freeRegister
|
||||||
if-nez $freeRegister, :return_empty_component
|
if-eqz v$freeRegister, :show
|
||||||
const/4 $freeRegister, 0x0 # Restore register, required for 19.16
|
move-object v$returnEmptyComponentRegister, p1 # Required for 19.47
|
||||||
""",
|
goto :return_empty_component
|
||||||
|
:show
|
||||||
|
const/4 v$freeRegister, 0x0 # Restore register, required for 19.16
|
||||||
|
""",
|
||||||
ExternalLabel("return_empty_component", returnEmptyComponentInstruction),
|
ExternalLabel("return_empty_component", returnEmptyComponentInstruction),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -125,8 +125,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
|
|||||||
|
|
||||||
if (is_19_33_or_greater) {
|
if (is_19_33_or_greater) {
|
||||||
insertIndex = indexOfFirstInstructionOrThrow {
|
insertIndex = indexOfFirstInstructionOrThrow {
|
||||||
opcode == Opcode.INVOKE_STATIC_RANGE &&
|
(opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE)
|
||||||
getReference<MethodReference>()?.returnType == textDataClassType
|
&& getReference<MethodReference>()?.returnType == textDataClassType
|
||||||
}
|
}
|
||||||
|
|
||||||
tempRegister = getInstruction<OneRegisterInstruction>(insertIndex + 1).registerA
|
tempRegister = getInstruction<OneRegisterInstruction>(insertIndex + 1).registerA
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package app.revanced.patches.youtube.layout.startupshortsreset
|
package app.revanced.patches.youtube.layout.startupshortsreset
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
import app.revanced.patches.all.misc.resources.addResources
|
import app.revanced.patches.all.misc.resources.addResources
|
||||||
@ -49,31 +49,6 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
|
|||||||
SwitchPreference("revanced_disable_resuming_shorts_player"),
|
SwitchPreference("revanced_disable_resuming_shorts_player"),
|
||||||
)
|
)
|
||||||
|
|
||||||
userWasInShortsConfigFingerprint.originalMethod.apply {
|
|
||||||
val startIndex = indexOfOptionalInstruction(this)
|
|
||||||
val walkerIndex = indexOfFirstInstructionOrThrow(startIndex) {
|
|
||||||
val reference = getReference<MethodReference>()
|
|
||||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
|
||||||
reference?.returnType == "Z" &&
|
|
||||||
reference.definingClass != "Lj${'$'}/util/Optional;" &&
|
|
||||||
reference.parameterTypes.isEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Presumably a method that processes the ProtoDataStore value (boolean) for the 'user_was_in_shorts' key.
|
|
||||||
navigate(this).to(walkerIndex).stop().addInstructionsWithLabels(
|
|
||||||
0,
|
|
||||||
"""
|
|
||||||
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z
|
|
||||||
move-result v0
|
|
||||||
if-eqz v0, :show
|
|
||||||
const/4 v0, 0x0
|
|
||||||
return v0
|
|
||||||
:show
|
|
||||||
nop
|
|
||||||
""",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
userWasInShortsFingerprint.method.apply {
|
userWasInShortsFingerprint.method.apply {
|
||||||
val listenableInstructionIndex = indexOfFirstInstructionOrThrow {
|
val listenableInstructionIndex = indexOfFirstInstructionOrThrow {
|
||||||
opcode == Opcode.INVOKE_INTERFACE &&
|
opcode == Opcode.INVOKE_INTERFACE &&
|
||||||
@ -94,5 +69,18 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
|
|||||||
""",
|
""",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userWasInShortsConfigFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z
|
||||||
|
move-result v0
|
||||||
|
if-eqz v0, :show
|
||||||
|
const/4 v0, 0x0
|
||||||
|
return v0
|
||||||
|
:show
|
||||||
|
nop
|
||||||
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,8 @@
|
|||||||
package app.revanced.patches.youtube.layout.startupshortsreset
|
package app.revanced.patches.youtube.layout.startupshortsreset
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint
|
import app.revanced.patcher.fingerprint
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.literal
|
||||||
import app.revanced.util.indexOfFirstInstruction
|
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.iface.Method
|
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
|
||||||
import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference
|
|
||||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
|
||||||
|
|
||||||
internal val userWasInShortsFingerprint = fingerprint {
|
internal val userWasInShortsFingerprint = fingerprint {
|
||||||
returns("V")
|
returns("V")
|
||||||
@ -20,22 +15,9 @@ internal val userWasInShortsFingerprint = fingerprint {
|
|||||||
* 18.15.40+
|
* 18.15.40+
|
||||||
*/
|
*/
|
||||||
internal val userWasInShortsConfigFingerprint = fingerprint {
|
internal val userWasInShortsConfigFingerprint = fingerprint {
|
||||||
returns("V")
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
strings("Failed to get offline response: ")
|
returns("Z")
|
||||||
custom { method, _ ->
|
literal {
|
||||||
indexOfOptionalInstruction(method) >= 0
|
45358360L
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val optionalOfMethodReference = ImmutableMethodReference(
|
|
||||||
"Lj${'$'}/util/Optional;",
|
|
||||||
"of",
|
|
||||||
listOf("Ljava/lang/Object;"),
|
|
||||||
"Lj${'$'}/util/Optional;",
|
|
||||||
)
|
|
||||||
|
|
||||||
fun indexOfOptionalInstruction(method: Method) = method.indexOfFirstInstruction {
|
|
||||||
val reference = getReference<MethodReference>() ?: return@indexOfFirstInstruction false
|
|
||||||
|
|
||||||
MethodUtil.methodSignaturesMatch(reference, optionalOfMethodReference)
|
|
||||||
}
|
|
||||||
|
@ -8,6 +8,8 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref
|
|||||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
|
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||||
|
import app.revanced.patches.youtube.misc.playservice.is_19_16_or_greater
|
||||||
|
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||||
@ -25,6 +27,7 @@ val enableDebuggingPatch = bytecodePatch(
|
|||||||
sharedExtensionPatch,
|
sharedExtensionPatch,
|
||||||
settingsPatch,
|
settingsPatch,
|
||||||
addResourcesPatch,
|
addResourcesPatch,
|
||||||
|
versionCheckPatch
|
||||||
)
|
)
|
||||||
|
|
||||||
compatibleWith(
|
compatibleWith(
|
||||||
@ -91,20 +94,22 @@ val enableDebuggingPatch = bytecodePatch(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
experimentalLongFeatureFlagFingerprint.match(
|
if (is_19_16_or_greater) {
|
||||||
experimentalFeatureFlagParentFingerprint.originalClassDef
|
experimentalLongFeatureFlagFingerprint.match(
|
||||||
).method.apply {
|
experimentalFeatureFlagParentFingerprint.originalClassDef
|
||||||
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
|
).method.apply {
|
||||||
|
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_WIDE)
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"""
|
"""
|
||||||
move-result-wide v0
|
move-result-wide v0
|
||||||
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J
|
invoke-static/range { v0 .. v5 }, $EXTENSION_CLASS_DESCRIPTOR->isLongFeatureFlagEnabled(JJJ)J
|
||||||
move-result-wide v0
|
move-result-wide v0
|
||||||
return-wide v0
|
return-wide v0
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
experimentalStringFeatureFlagFingerprint.match(
|
experimentalStringFeatureFlagFingerprint.match(
|
||||||
|
@ -39,6 +39,8 @@ var is_19_43_or_greater = false
|
|||||||
private set
|
private set
|
||||||
var is_19_46_or_greater = false
|
var is_19_46_or_greater = false
|
||||||
private set
|
private set
|
||||||
|
var is_19_47_or_greater = false
|
||||||
|
private set
|
||||||
|
|
||||||
val versionCheckPatch = resourcePatch(
|
val versionCheckPatch = resourcePatch(
|
||||||
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
|
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
|
||||||
@ -71,5 +73,6 @@ val versionCheckPatch = resourcePatch(
|
|||||||
is_19_41_or_greater = 244305000 <= playStoreServicesVersion
|
is_19_41_or_greater = 244305000 <= playStoreServicesVersion
|
||||||
is_19_43_or_greater = 244405000 <= playStoreServicesVersion
|
is_19_43_or_greater = 244405000 <= playStoreServicesVersion
|
||||||
is_19_46_or_greater = 244705000 <= playStoreServicesVersion
|
is_19_46_or_greater = 244705000 <= playStoreServicesVersion
|
||||||
|
is_19_47_or_greater = 244799000 <= playStoreServicesVersion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user