mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-20 01:23:57 +00:00
Compare commits
3 Commits
v5.2.1-dev
...
v5.2.1-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7aa8de6a8 | ||
|
|
4ee70e3869 | ||
|
|
c912a662ab |
@@ -1,3 +1,10 @@
|
|||||||
|
## [5.2.1-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.2.1-dev.4...v5.2.1-dev.5) (2024-12-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* Move variables to local scope ([43c0421](https://github.com/ReVanced/revanced-patches/commit/43c04216c6e647eaf6ad7e813eb5f0df0c108b77))
|
||||||
|
|
||||||
## [5.2.1-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.2.1-dev.3...v5.2.1-dev.4) (2024-11-30)
|
## [5.2.1-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.2.1-dev.3...v5.2.1-dev.4) (2024-11-30)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.2.1-dev.4
|
version = 5.2.1-dev.5
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ lateinit var resourceMappings: List<ResourceElement>
|
|||||||
private set
|
private set
|
||||||
|
|
||||||
val resourceMappingPatch = resourcePatch {
|
val resourceMappingPatch = resourcePatch {
|
||||||
val threadCount = Runtime.getRuntime().availableProcessors()
|
|
||||||
val threadPoolExecutor = Executors.newFixedThreadPool(threadCount)
|
|
||||||
|
|
||||||
val resourceMappings = Collections.synchronizedList(mutableListOf<ResourceElement>())
|
val resourceMappings = Collections.synchronizedList(mutableListOf<ResourceElement>())
|
||||||
|
|
||||||
execute {
|
execute {
|
||||||
|
val threadCount = Runtime.getRuntime().availableProcessors()
|
||||||
|
val threadPoolExecutor = Executors.newFixedThreadPool(threadCount)
|
||||||
|
|
||||||
// Save the file in memory to concurrently read from it.
|
// Save the file in memory to concurrently read from it.
|
||||||
val resourceXmlFile = get("res/values/public.xml").readBytes()
|
val resourceXmlFile = get("res/values/public.xml").readBytes()
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user