feat(YouTube Music): add support versions 7.15.52 ~ 7.16.52

This commit is contained in:
inotia00 2024-08-28 16:46:29 +09:00
parent 4c22853295
commit 010a19fc9e
5 changed files with 84 additions and 33 deletions

View File

@ -162,11 +162,16 @@ object CustomBrandingIconPatch : BaseResourcePatch(
// Change splash icon. // Change splash icon.
if (ChangeSplashIcon == true) { if (ChangeSplashIcon == true) {
// Some resources have been removed in the latest YouTube Music.
// For compatibility, use try...catch.
try {
splashIconResourceGroups.let { resourceGroups -> splashIconResourceGroups.let { resourceGroups ->
resourceGroups.forEach { resourceGroups.forEach {
context.copyResources("$appIconResourcePath/splash", it) context.copyResources("$appIconResourcePath/splash", it)
} }
} }
} catch (_: Exception) {
}
} }
setIconType(appIcon) setIconType(appIcon)

View File

@ -20,7 +20,7 @@ import app.revanced.util.literalInstructionBooleanHook
"com.google.android.apps.youtube.music", "com.google.android.apps.youtube.music",
[ [
"7.08.54", "7.08.54",
"7.13.52", "7.16.52",
] ]
) )
] ]

View File

@ -34,6 +34,8 @@ import app.revanced.patches.music.player.components.fingerprints.QuickSeekOverla
import app.revanced.patches.music.player.components.fingerprints.RemixGenericButtonFingerprint import app.revanced.patches.music.player.components.fingerprints.RemixGenericButtonFingerprint
import app.revanced.patches.music.player.components.fingerprints.RepeatTrackFingerprint import app.revanced.patches.music.player.components.fingerprints.RepeatTrackFingerprint
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction
import app.revanced.patches.music.player.components.fingerprints.SwipeToCloseFingerprint import app.revanced.patches.music.player.components.fingerprints.SwipeToCloseFingerprint
import app.revanced.patches.music.player.components.fingerprints.SwitchToggleColorFingerprint import app.revanced.patches.music.player.components.fingerprints.SwitchToggleColorFingerprint
import app.revanced.patches.music.player.components.fingerprints.ZenModeFingerprint import app.revanced.patches.music.player.components.fingerprints.ZenModeFingerprint
@ -740,28 +742,53 @@ object PlayerComponentsPatch : BaseBytecodePatch(
it.mutableMethod.apply { it.mutableMethod.apply {
rememberShuffleStateObjectClass = definingClass rememberShuffleStateObjectClass = definingClass
val startIndex = it.scanResult.patternScanResult!!.startIndex val constIndex = getWideLiteralInstructionIndex(45468)
val endIndex = it.scanResult.patternScanResult!!.endIndex val iGetObjectIndex = getTargetIndexOrThrow(constIndex, Opcode.IGET_OBJECT)
val imageViewIndex = val checkCastIndex = getTargetIndexOrThrow(iGetObjectIndex, Opcode.CHECK_CAST)
getTargetIndexWithFieldReferenceTypeOrThrow("Landroid/widget/ImageView;")
val ordinalIndex = indexOfOrdinalInstruction(this)
val imageViewIndex = indexOfImageViewInstruction(this)
val iGetObjectReference =
getInstruction<ReferenceInstruction>(iGetObjectIndex).reference
val invokeInterfaceReference =
getInstruction<ReferenceInstruction>(iGetObjectIndex + 1).reference
val checkCastReference =
getInstruction<ReferenceInstruction>(checkCastIndex).reference
val getOrdinalClassReference =
getInstruction<ReferenceInstruction>(checkCastIndex + 1).reference
val ordinalReference =
getInstruction<ReferenceInstruction>(ordinalIndex).reference
val shuffleReference1 = getInstruction<ReferenceInstruction>(startIndex).reference
val shuffleReference2 =
getInstruction<ReferenceInstruction>(startIndex + 1).reference
val shuffleReference3 = getInstruction<ReferenceInstruction>(endIndex).reference
val shuffleFieldReference = shuffleReference3 as FieldReference
rememberShuffleStateImageViewReference = rememberShuffleStateImageViewReference =
getInstruction<ReferenceInstruction>(imageViewIndex).reference getInstruction<ReferenceInstruction>(imageViewIndex).reference
rememberShuffleStateShuffleStateLabel = """ rememberShuffleStateShuffleStateLabel = """
iget-object v1, v0, $shuffleReference1 iget-object v1, v0, $iGetObjectReference
invoke-interface {v1}, $shuffleReference2 invoke-interface {v1}, $invokeInterfaceReference
move-result-object v1 move-result-object v1
check-cast v1, ${shuffleFieldReference.definingClass} check-cast v1, $checkCastReference
iget-object v1, v1, $shuffleReference3
invoke-virtual {v1}, ${shuffleFieldReference.type}->ordinal()I
move-result v1
""" """
rememberShuffleStateShuffleStateLabel += if (getInstruction(checkCastIndex + 1).opcode == Opcode.INVOKE_VIRTUAL) {
// YouTube Music 7.16.52+
"""
invoke-virtual {v1}, $getOrdinalClassReference
move-result-object v1
""".trimIndent()
} else {
"""
iget-object v1, v1, $getOrdinalClassReference
""".trimIndent()
}
rememberShuffleStateShuffleStateLabel += """
invoke-virtual {v1}, $ordinalReference
move-result v1
""".trimIndent()
} }
val constructorMethod = val constructorMethod =
@ -770,7 +797,7 @@ object PlayerComponentsPatch : BaseBytecodePatch(
constructorMethod.apply { constructorMethod.apply {
addInstruction( addInstruction(
implementation!!.instructions.size - 1, implementation!!.instructions.lastIndex,
"sput-object p0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass" "sput-object p0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass"
) )
} }
@ -836,9 +863,10 @@ object PlayerComponentsPatch : BaseBytecodePatch(
sget-object v0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass sget-object v0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass
""" + rememberShuffleStateShuffleStateLabel + """ """ + rememberShuffleStateShuffleStateLabel + """
iget-object v3, v0, $rememberShuffleStateImageViewReference iget-object v3, v0, $rememberShuffleStateImageViewReference
invoke-virtual {v3}, Landroid/widget/ImageView;->performClick()Z if-eqz v3, :dont_shuffle
invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z
if-eqz v1, :dont_shuffle if-eqz v1, :dont_shuffle
invoke-virtual {v3}, Landroid/widget/ImageView;->performClick()Z invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z
:dont_shuffle :dont_shuffle
return-void return-void
""" """

View File

@ -2,20 +2,38 @@ package app.revanced.patches.music.player.components.fingerprints
import app.revanced.patcher.extensions.or import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction
import app.revanced.util.containsWideLiteralInstructionIndex
import app.revanced.util.getReference
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.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal object ShuffleClassReferenceFingerprint : MethodFingerprint( internal object ShuffleClassReferenceFingerprint : MethodFingerprint(
returnType = "V", returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(), parameters = emptyList(),
opcodes = listOf( strings = listOf("Unknown shuffle mode"),
Opcode.IGET_OBJECT, customFingerprint = { methodDef, _ ->
Opcode.INVOKE_INTERFACE, methodDef.containsWideLiteralInstructionIndex(45468) &&
Opcode.MOVE_RESULT_OBJECT, indexOfOrdinalInstruction(methodDef) >= 0 &&
Opcode.CHECK_CAST, indexOfImageViewInstruction(methodDef) >= 0
Opcode.IGET_OBJECT }
), ) {
strings = listOf("Unknown shuffle mode") fun indexOfOrdinalInstruction(methodDef: Method) =
) methodDef.indexOfFirstInstruction {
opcode == Opcode.INVOKE_VIRTUAL &&
getReference<MethodReference>()?.name == "ordinal"
}
fun indexOfImageViewInstruction(methodDef: Method) =
methodDef.indexOfFirstInstruction {
opcode == Opcode.IGET_OBJECT &&
getReference<FieldReference>()?.type == "Landroid/widget/ImageView;"
}
}

View File

@ -11,8 +11,8 @@ object Constants {
"6.33.52", // This is the latest version with the legacy code of YouTube Music. "6.33.52", // This is the latest version with the legacy code of YouTube Music.
"6.42.55", // This is the latest version that supports Android 7.0 "6.42.55", // This is the latest version that supports Android 7.0
"6.51.53", // This is the latest version of YouTube Music 6.xx.xx "6.51.53", // This is the latest version of YouTube Music 6.xx.xx
"7.12.52", // This was the latest version that was supported by the previous patch. "7.15.52", // This was the latest version that was supported by the previous patch.
"7.13.52", // This is the latest version supported by the RVX patch. "7.16.52", // This is the latest version supported by the RVX patch.
) )
) )
) )