fix(youtube/enable-minimized-playback): change the method by which patches are applied

This commit is contained in:
inotia00 2023-10-06 21:49:03 +09:00
parent e13fb0340c
commit f5e3e94c21
6 changed files with 124 additions and 57 deletions

View File

@ -43,4 +43,5 @@ object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
methodDef.implementation!!.instructions.any { methodDef.implementation!!.instructions.any {
((it as? NarrowLiteralInstruction)?.narrowLiteral == 5) ((it as? NarrowLiteralInstruction)?.narrowLiteral == 5)
} }
}) }
)

View File

@ -0,0 +1,22 @@
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.AudioUnavailable
import app.revanced.util.bytecode.isWideLiteralExists
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object MinimizedPlaybackAudioFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ
),
customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(AudioUnavailable) }
)

View File

@ -0,0 +1,19 @@
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object MinimizedPlaybackFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"),
opcodes = listOf(
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ
)
)

View File

@ -2,14 +2,18 @@ package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
import app.revanced.patcher.extensions.or import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.util.bytecode.isNarrowLiteralExists
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
object MinimizedPlaybackManagerFingerprint : MethodFingerprint( object PiPPlaybackFingerprint : MethodFingerprint(
returnType = "Z", returnType = "Z",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("L"), parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"),
opcodes = listOf(Opcode.AND_INT_LIT16), opcodes = listOf(
customFingerprint = { methodDef, _ -> methodDef.isNarrowLiteralExists(64657230) } Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ
)
) )

View File

@ -6,18 +6,22 @@ import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackAudioFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.PiPPlaybackFingerprint
import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility
import app.revanced.patches.youtube.utils.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.utils.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.utils.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.playertype.patch.PlayerTypeHookPatch
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.util.integrations.Constants.MISC_PATH import app.revanced.util.integrations.Constants.MISC_PATH
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@ -26,8 +30,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Description("Enables minimized and background playback.") @Description("Enables minimized and background playback.")
@DependsOn( @DependsOn(
[ [
PlayerTypeHookPatch::class,
IntegrationsPatch::class, IntegrationsPatch::class,
PlayerTypeHookPatch::class,
SharedResourceIdPatch::class SharedResourceIdPatch::class
] ]
) )
@ -35,51 +39,46 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
class MinimizedPlaybackPatch : BytecodePatch( class MinimizedPlaybackPatch : BytecodePatch(
listOf( listOf(
KidsMinimizedPlaybackPolicyControllerFingerprint, KidsMinimizedPlaybackPolicyControllerFingerprint,
MinimizedPlaybackManagerFingerprint, MinimizedPlaybackAudioFingerprint,
MinimizedPlaybackSettingsFingerprint MinimizedPlaybackFingerprint,
MinimizedPlaybackSettingsFingerprint,
PiPPlaybackFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
val methods = arrayOf( KidsMinimizedPlaybackPolicyControllerFingerprint.result?.let {
KidsMinimizedPlaybackPolicyControllerFingerprint, it.mutableMethod.apply {
MinimizedPlaybackManagerFingerprint,
MinimizedPlaybackSettingsFingerprint
).map {
it.result?.mutableMethod ?: throw it.exception
}
methods[0].hookKidsMiniPlayer()
methods[1].hookMinimizedPlaybackManager()
methods[2].hookMinimizedPlaybackSettings(context)
}
private companion object {
const val INTEGRATIONS_METHOD_REFERENCE =
"$MISC_PATH/MinimizedPlaybackPatch;->isPlaybackNotShort()Z"
fun MutableMethod.hookKidsMiniPlayer() {
addInstruction( addInstruction(
0, 0,
"return-void" "return-void"
) )
} }
} ?: throw KidsMinimizedPlaybackPolicyControllerFingerprint.exception
fun MutableMethod.hookMinimizedPlaybackManager() { arrayOf(
addInstructions( MinimizedPlaybackAudioFingerprint,
0, """ MinimizedPlaybackFingerprint
invoke-static {}, $INTEGRATIONS_METHOD_REFERENCE ).forEach { fingerprint ->
move-result v0 fingerprint.result?.let {
return v0 it.mutableMethod.apply {
""" val insertIndex = it.scanResult.patternScanResult!!.endIndex
val insertRegister =
getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstruction(
insertIndex,
"const/4 v$insertRegister, 0x1"
) )
} }
} ?: throw fingerprint.exception
}
fun MutableMethod.hookMinimizedPlaybackSettings( MinimizedPlaybackSettingsFingerprint.result?.let {
context: BytecodeContext it.mutableMethod.apply {
) {
val booleanCalls = implementation!!.instructions.withIndex() val booleanCalls = implementation!!.instructions.withIndex()
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" } .filter { instruction ->
((instruction.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z"
}
val booleanIndex = booleanCalls.elementAt(1).index val booleanIndex = booleanCalls.elementAt(1).index
val booleanMethod = val booleanMethod =
@ -94,5 +93,25 @@ class MinimizedPlaybackPatch : BytecodePatch(
""" """
) )
} }
} ?: throw MinimizedPlaybackSettingsFingerprint.exception
PiPPlaybackFingerprint.result?.let {
it.mutableMethod.apply {
val insertIndex = it.scanResult.patternScanResult!!.endIndex
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex, """
invoke-static {}, $INTEGRATIONS_METHOD_REFERENCE
move-result v$insertRegister
"""
)
}
} ?: throw PiPPlaybackFingerprint.exception
}
private companion object {
const val INTEGRATIONS_METHOD_REFERENCE =
"$MISC_PATH/MinimizedPlaybackPatch;->isPlaybackNotShort()Z"
} }
} }

View File

@ -22,6 +22,7 @@ class SharedResourceIdPatch : ResourcePatch {
var AdAttribution: Long = -1 var AdAttribution: Long = -1
var Appearance: Long = -1 var Appearance: Long = -1
var AppRelatedEndScreenResults: Long = -1 var AppRelatedEndScreenResults: Long = -1
var AudioUnavailable: Long = -1
var AutoNavPreviewStub: Long = -1 var AutoNavPreviewStub: Long = -1
var AutoNavToggle: Long = -1 var AutoNavToggle: Long = -1
var BackgroundCategory: Long = -1 var BackgroundCategory: Long = -1
@ -102,6 +103,7 @@ class SharedResourceIdPatch : ResourcePatch {
AdAttribution = find(ID, "ad_attribution") AdAttribution = find(ID, "ad_attribution")
Appearance = find(STRING, "app_theme_appearance_dark") Appearance = find(STRING, "app_theme_appearance_dark")
AppRelatedEndScreenResults = find(LAYOUT, "app_related_endscreen_results") AppRelatedEndScreenResults = find(LAYOUT, "app_related_endscreen_results")
AudioUnavailable = find(STRING, "audio_unavailable")
AutoNavPreviewStub = find(ID, "autonav_preview_stub") AutoNavPreviewStub = find(ID, "autonav_preview_stub")
AutoNavToggle = find(ID, "autonav_toggle") AutoNavToggle = find(ID, "autonav_toggle")
BackgroundCategory = find(STRING, "pref_background_and_offline_category") BackgroundCategory = find(STRING, "pref_background_and_offline_category")