feat(YouTube Music): Add Unlock Android Auto Media Browser patch (#6477)

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
(cherry picked from commit 89645dcc2e13603b8f2fedb5e16231cb396e5965)
This commit is contained in:
Johannes Obermeier
2026-01-22 18:47:12 +01:00
committed by oSumAtrIX
parent 9c18e1e649
commit 5edd9dccae
4 changed files with 54 additions and 17 deletions

View File

@@ -501,6 +501,10 @@ public final class app/revanced/patches/music/misc/androidauto/BypassCertificate
public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
public final class app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatchKt {
public static final fun getUnlockAndroidAutoMediaBrowserPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatchKt { public final class app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatchKt {
public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }

View File

@@ -5,24 +5,11 @@ import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.util.returnEarly import app.revanced.util.returnEarly
@Deprecated("This patch is useless by itself and has been merged into another patch.", ReplaceWith("unlockAndroidAutoMediaBrowserPatch"))
@Suppress("unused") @Suppress("unused")
val bypassCertificateChecksPatch = bytecodePatch( val bypassCertificateChecksPatch = bytecodePatch(
name = "Bypass certificate checks",
description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.", description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.",
) { ) {
dependsOn( dependsOn(unlockAndroidAutoMediaBrowserPatch)
sharedExtensionPatch,
settingsPatch
)
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52",
"8.10.52"
)
)
execute {
checkCertificateFingerprint.method.returnEarly(true)
}
} }

View File

@@ -1,6 +1,5 @@
package app.revanced.patches.music.misc.androidauto package app.revanced.patches.music.misc.androidauto
import com.android.tools.smali.dexlib2.AccessFlags
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
internal val checkCertificateFingerprint = fingerprint { internal val checkCertificateFingerprint = fingerprint {
@@ -10,4 +9,13 @@ internal val checkCertificateFingerprint = fingerprint {
"X509", "X509",
"Failed to get certificate" // Partial String match. "Failed to get certificate" // Partial String match.
) )
}
internal val searchMediaItemsConstructorFingerprint = fingerprint {
returns("V")
strings("ytm_media_browser/search_media_items")
}
internal val searchMediaItemsExecuteFingerprint = fingerprint {
parameters()
} }

View File

@@ -0,0 +1,38 @@
package app.revanced.patches.music.misc.androidauto
import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.getReference
import app.revanced.util.registersUsed
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
@Suppress("unused")
val unlockAndroidAutoMediaBrowserPatch = bytecodePatch(
name = "Unlock Android Auto Media Browser",
description = "Unlocks Android Auto Media Browser which enables the search function including speech to text.",
) {
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52",
"8.10.52"
)
)
execute {
checkCertificateFingerprint.method.returnEarly(true)
searchMediaItemsExecuteFingerprint
.match(searchMediaItemsConstructorFingerprint.classDef)
.method.apply {
val targetIndex = instructions.indexOfFirst {
it.opcode == Opcode.IGET_OBJECT && it.getReference<FieldReference>()?.type == "Ljava/lang/String;"
}
val register = instructions[targetIndex].registersUsed.first()
replaceInstruction(targetIndex, "const-string v$register, \"com.google.android.apps.youtube.music\"")
}
}
}