feat(YouTube): add compatibility for next year's release

This commit is contained in:
inotia00 2023-12-02 11:46:55 +09:00
parent 8467b7058c
commit 9ce734ffd7
12 changed files with 104 additions and 63 deletions

View File

@ -41,6 +41,5 @@ object GeneralAdsBytecodePatch : BytecodePatch() {
}
}
}
}
}

View File

@ -10,6 +10,8 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.misc.splashanimation.fingerprints.WatchWhileActivityWithInFlagsFingerprint
import app.revanced.patches.youtube.misc.splashanimation.fingerprints.WatchWhileActivityWithOutFlagsFingerprint
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.mainActivityClassDef
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.DarkSplashAnimation
import app.revanced.patches.youtube.utils.settings.SettingsPatch
@ -24,6 +26,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
name = "Enable new splash animation",
description = "Enables a new type of splash animation.",
dependencies = [
MainActivityResolvePatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class
],
@ -55,14 +58,12 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
]
)
@Suppress("unused")
object NewSplashAnimationPatch : BytecodePatch(
setOf(
WatchWhileActivityWithInFlagsFingerprint,
WatchWhileActivityWithOutFlagsFingerprint
)
) {
object NewSplashAnimationPatch : BytecodePatch() {
override fun execute(context: BytecodeContext) {
WatchWhileActivityWithInFlagsFingerprint.resolve(context, mainActivityClassDef)
WatchWhileActivityWithOutFlagsFingerprint.resolve(context, mainActivityClassDef)
WatchWhileActivityWithInFlagsFingerprint.result
?: WatchWhileActivityWithOutFlagsFingerprint.result
?: throw PatchException("Failed to resolve fingerprints")

View File

@ -7,8 +7,7 @@ object WatchWhileActivityWithInFlagsFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Landroid/os/Bundle;"),
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("/WatchWhileActivity;")
&& methodDef.name == "onCreate"
methodDef.name == "onCreate"
&& methodDef.isWide32LiteralExists(45407550)
}
)

View File

@ -20,8 +20,7 @@ object WatchWhileActivityWithOutFlagsFingerprint : MethodFingerprint(
Opcode.IF_EQZ // target
),
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("/WatchWhileActivity;")
&& methodDef.name == "onCreate"
methodDef.name == "onCreate"
&& methodDef.isWideLiteralExists(DarkSplashAnimation)
}
)

View File

@ -13,8 +13,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.youtube.swipe.controls.fingerprints.HDRBrightnessFingerprint
import app.revanced.patches.youtube.swipe.controls.fingerprints.SwipeControlsHostActivityFingerprint
import app.revanced.patches.youtube.swipe.controls.fingerprints.WatchWhileActivityFingerprint
import app.revanced.patches.youtube.utils.lockmodestate.LockModeStateHookPatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.mainActivityMutableClass
import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts
@ -29,6 +30,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
description = "Adds volume and brightness swipe controls.",
dependencies = [
LockModeStateHookPatch::class,
MainActivityResolvePatch::class,
PlayerTypeHookPatch::class,
SettingsPatch::class
],
@ -63,17 +65,15 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
object SwipeControlsPatch : BytecodePatch(
setOf(
HDRBrightnessFingerprint,
SwipeControlsHostActivityFingerprint,
WatchWhileActivityFingerprint
SwipeControlsHostActivityFingerprint
)
) {
override fun execute(context: BytecodeContext) {
val wrapperClass = SwipeControlsHostActivityFingerprint.result?.mutableClass
?: throw SwipeControlsHostActivityFingerprint.exception
val targetClass = WatchWhileActivityFingerprint.result?.mutableClass
?: throw WatchWhileActivityFingerprint.exception
val targetClass = mainActivityMutableClass
// inject the wrapper class from integrations into the class hierarchy of WatchWhileActivity
// inject the wrapper class from integrations into the class hierarchy of MainActivity (WatchWhileActivity)
wrapperClass.setSuperClass(targetClass.superclass)
targetClass.setSuperClass(wrapperClass.type)

View File

@ -1,11 +0,0 @@
package app.revanced.patches.youtube.swipe.controls.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
object WatchWhileActivityFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
parameters = emptyList(),
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/WatchWhileActivity;") }
)

View File

@ -4,16 +4,21 @@ import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.OnBackPressedFingerprint
import app.revanced.patches.youtube.utils.mainactivity.fingerprints.MainActivityFingerprint
import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollPositionFingerprint
import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollTopFingerprint
import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollTopParentFingerprint
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.onBackPressedMethod
import app.revanced.util.integrations.Constants.UTILS_PATH
import com.android.tools.smali.dexlib2.Opcode
@Patch(dependencies = [MainActivityResolvePatch::class])
object DoubleBackToClosePatch : BytecodePatch(
setOf(
OnBackPressedFingerprint,
MainActivityFingerprint,
ScrollPositionFingerprint,
ScrollTopParentFingerprint
)
@ -21,20 +26,20 @@ object DoubleBackToClosePatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
/**
* Hook onBackPressed method inside WatchWhileActivity
* Hook onBackPressed method inside MainActivity (WatchWhileActivity)
*/
OnBackPressedFingerprint.result?.let {
it.mutableMethod.apply {
val insertIndex = it.scanResult.patternScanResult!!.endIndex
addInstruction(
insertIndex,
"invoke-static {p0}, $INTEGRATIONS_CLASS_DESCRIPTOR" +
"->" +
"closeActivityOnBackPressed(Landroid/app/Activity;)V"
)
onBackPressedMethod.apply {
val insertIndex = implementation!!.instructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.RETURN_VOID
}
} ?: throw OnBackPressedFingerprint.exception
addInstruction(
insertIndex,
"invoke-static {p0}, $INTEGRATIONS_CLASS_DESCRIPTOR" +
"->" +
"closeActivityOnBackPressed(Landroid/app/Activity;)V"
)
}
/**

View File

@ -1,16 +0,0 @@
package app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object OnBackPressedFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(Opcode.RETURN_VOID),
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("WatchWhileActivity;")
&& methodDef.name == "onBackPressed"
}
)

View File

@ -0,0 +1,44 @@
package app.revanced.patches.youtube.utils.mainactivity
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.util.proxy.mutableTypes.MutableClass
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.utils.mainactivity.fingerprints.MainActivityFingerprint
import app.revanced.util.integrations.Constants.UTILS_PATH
import com.android.tools.smali.dexlib2.iface.ClassDef
object MainActivityResolvePatch : BytecodePatch(
setOf(MainActivityFingerprint)
) {
lateinit var mainActivityClassDef: ClassDef
lateinit var mainActivityMutableClass: MutableClass
lateinit var onBackPressedMethod: MutableMethod
private lateinit var onCreateMethod: MutableMethod
override fun execute(context: BytecodeContext) {
MainActivityFingerprint.result?.let {
mainActivityClassDef = it.classDef
mainActivityMutableClass = it.mutableClass
onBackPressedMethod =
mainActivityMutableClass.methods.find { method -> method.name == "onBackPressed" }
?: throw PatchException("Could not find onBackPressedMethod")
onCreateMethod = it.mutableMethod
} ?: throw MainActivityFingerprint.exception
}
fun injectInit(
methods: String,
descriptor: String
) {
onCreateMethod.apply {
addInstruction(
2,
"invoke-static/range {p0 .. p0}, $UTILS_PATH/$methods;->$descriptor(Landroid/content/Context;)V"
)
}
}
}

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.utils.mainactivity.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
/**
* 'WatchWhileActivity' has been renamed to 'MainActivity' in YouTube v18.48.xx+
* This fingerprint was added to prepare for YouTube v18.48.xx+
*/
object MainActivityFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Landroid/os/Bundle;"),
strings = listOf("PostCreateCalledKey"),
customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("Activity;")
&& methodDef.name == "onCreate"
}
)

View File

@ -7,6 +7,8 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.shared.patch.packagename.PackageNamePatch
import app.revanced.patches.youtube.utils.fix.clientspoof.ClientSpoofPatch
import app.revanced.patches.youtube.utils.fix.parameter.SpoofPlayerParameterPatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.injectInit
import app.revanced.patches.youtube.utils.microg.Constants.PACKAGE_NAME
import app.revanced.patches.youtube.utils.microg.fingerprints.CastContextFetchFingerprint
import app.revanced.patches.youtube.utils.microg.fingerprints.CastDynamiteModuleFingerprint
@ -14,12 +16,12 @@ import app.revanced.patches.youtube.utils.microg.fingerprints.CastDynamiteModule
import app.revanced.patches.youtube.utils.microg.fingerprints.GooglePlayUtilityFingerprint
import app.revanced.patches.youtube.utils.microg.fingerprints.PrimeFingerprint
import app.revanced.patches.youtube.utils.microg.fingerprints.ServiceCheckFingerprint
import app.revanced.util.bytecode.BytecodeHelper.injectInit
import app.revanced.util.microg.MicroGBytecodeHelper
@Patch(
dependencies = [
ClientSpoofPatch::class,
MainActivityResolvePatch::class,
PackageNamePatch::class,
SpoofPlayerParameterPatch::class
]
@ -64,7 +66,7 @@ object MicroGBytecodePatch : BytecodePatch(
)
)
context.injectInit("MicroGPatch", "checkAvailability", true)
injectInit("MicroGPatch", "checkAvailability")
}
}

View File

@ -8,14 +8,16 @@ import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.shared.patch.mapping.ResourceMappingPatch
import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch
import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.injectInit
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.settings.fingerprints.ThemeSetterSystemFingerprint
import app.revanced.util.bytecode.BytecodeHelper.injectInit
import app.revanced.util.integrations.Constants.INTEGRATIONS_PATH
@Patch(
dependencies = [
IntegrationsPatch::class,
MainActivityResolvePatch::class,
ResourceMappingPatch::class,
SharedResourceIdPatch::class
]
@ -45,8 +47,8 @@ object SettingsBytecodePatch : BytecodePatch(
}
} ?: throw ThemeSetterSystemFingerprint.exception
context.injectInit("InitializationPatch", "setDeviceInformation", true)
context.injectInit("InitializationPatch", "initializeReVancedSettings", true)
injectInit("InitializationPatch", "setDeviceInformation")
injectInit("InitializationPatch", "initializeReVancedSettings")
}