mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-25 03:31:03 +00:00
Compare commits
5 Commits
v5.29.0-de
...
v5.29.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e22d4e6a4b | ||
|
|
a07f946633 | ||
|
|
29c86ac6a3 | ||
|
|
19cf5667d8 | ||
|
|
fb83e58f79 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
|||||||
|
# [5.29.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.9...v5.29.0-dev.10) (2025-06-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - Hide Shorts components:** Add `Hide Effects button` ([#5255](https://github.com/ReVanced/revanced-patches/issues/5255)) ([240897a](https://github.com/ReVanced/revanced-patches/commit/240897a94008ce9a148c87bb41b978d553d5a6f5))
|
||||||
|
|
||||||
|
# [5.29.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.8...v5.29.0-dev.9) (2025-06-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add `Spoof app signature` patch ([#5158](https://github.com/ReVanced/revanced-patches/issues/5158)) ([78b25aa](https://github.com/ReVanced/revanced-patches/commit/78b25aa4e87ec3f9df1d57831b48a39029969416))
|
||||||
|
|
||||||
# [5.29.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.7...v5.29.0-dev.8) (2025-06-25)
|
# [5.29.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.7...v5.29.0-dev.8) (2025-06-25)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -274,6 +274,11 @@ public final class ShortsFilter extends Filter {
|
|||||||
Settings.HIDE_SHORTS_UPCOMING_BUTTON,
|
Settings.HIDE_SHORTS_UPCOMING_BUTTON,
|
||||||
"yt_outline_bell_"
|
"yt_outline_bell_"
|
||||||
),
|
),
|
||||||
|
new ByteArrayFilterGroup(
|
||||||
|
Settings.HIDE_SHORTS_EFFECT_BUTTON,
|
||||||
|
// https://www.gstatic.com/youtube/effects/xeno/arcade/effects/icons/
|
||||||
|
"/arcade/effects/icons/"
|
||||||
|
),
|
||||||
new ByteArrayFilterGroup(
|
new ByteArrayFilterGroup(
|
||||||
Settings.HIDE_SHORTS_GREEN_SCREEN_BUTTON,
|
Settings.HIDE_SHORTS_GREEN_SCREEN_BUTTON,
|
||||||
"greenscreen_temp"
|
"greenscreen_temp"
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ public class Settings extends BaseSettings {
|
|||||||
public static final BooleanSetting HIDE_SHORTS_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_shorts_comments_button", FALSE);
|
public static final BooleanSetting HIDE_SHORTS_COMMENTS_BUTTON = new BooleanSetting("revanced_hide_shorts_comments_button", FALSE);
|
||||||
public static final BooleanSetting HIDE_SHORTS_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_shorts_dislike_button", FALSE);
|
public static final BooleanSetting HIDE_SHORTS_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_shorts_dislike_button", FALSE);
|
||||||
public static final BooleanSetting HIDE_SHORTS_FULL_VIDEO_LINK_LABEL = new BooleanSetting("revanced_hide_shorts_full_video_link_label", FALSE);
|
public static final BooleanSetting HIDE_SHORTS_FULL_VIDEO_LINK_LABEL = new BooleanSetting("revanced_hide_shorts_full_video_link_label", FALSE);
|
||||||
|
public static final BooleanSetting HIDE_SHORTS_EFFECT_BUTTON = new BooleanSetting("revanced_hide_shorts_effect_button", TRUE);
|
||||||
public static final BooleanSetting HIDE_SHORTS_GREEN_SCREEN_BUTTON = new BooleanSetting("revanced_hide_shorts_green_screen_button", TRUE);
|
public static final BooleanSetting HIDE_SHORTS_GREEN_SCREEN_BUTTON = new BooleanSetting("revanced_hide_shorts_green_screen_button", TRUE);
|
||||||
public static final BooleanSetting HIDE_SHORTS_NEW_POSTS_BUTTON = new BooleanSetting("revanced_hide_shorts_new_posts_button", TRUE);
|
public static final BooleanSetting HIDE_SHORTS_NEW_POSTS_BUTTON = new BooleanSetting("revanced_hide_shorts_new_posts_button", TRUE);
|
||||||
public static final BooleanSetting HIDE_SHORTS_HASHTAG_BUTTON = new BooleanSetting("revanced_hide_shorts_hashtag_button", TRUE);
|
public static final BooleanSetting HIDE_SHORTS_HASHTAG_BUTTON = new BooleanSetting("revanced_hide_shorts_hashtag_button", TRUE);
|
||||||
|
|||||||
@@ -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.29.0-dev.8
|
version = 5.29.0-dev.10
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ appcompat = "1.7.0"
|
|||||||
okhttp = "5.0.0-alpha.14"
|
okhttp = "5.0.0-alpha.14"
|
||||||
retrofit = "2.11.0"
|
retrofit = "2.11.0"
|
||||||
guava = "33.4.0-jre"
|
guava = "33.4.0-jre"
|
||||||
|
apksig = "8.10.1"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" }
|
annotation = { module = "androidx.annotation:annotation", version.ref = "annotation" }
|
||||||
@@ -18,7 +19,7 @@ appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "a
|
|||||||
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
||||||
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
|
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
|
||||||
guava = { module = "com.google.guava:guava", version.ref = "guava" }
|
guava = { module = "com.google.guava:guava", version.ref = "guava" }
|
||||||
|
apksig = { group = "com.android.tools.build", name = "apksig", version.ref = "apksig" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
android-library = { id = "com.android.library", version.ref = "agp" }
|
android-library = { id = "com.android.library", version.ref = "agp" }
|
||||||
|
|||||||
@@ -116,6 +116,10 @@ public final class app/revanced/patches/all/misc/shortcut/sharetargets/RemoveSha
|
|||||||
public static final fun getRemoveShareTargetsPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
public static final fun getRemoveShareTargetsPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/all/misc/spoof/SignatureSpoofPatchKt {
|
||||||
|
public static final fun getSignatureSpoofPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34Kt {
|
public final class app/revanced/patches/all/misc/targetSdk/SetTargetSdkVersion34Kt {
|
||||||
public static final fun getSetTargetSdkVersion34 ()Lapp/revanced/patcher/patch/ResourcePatch;
|
public static final fun getSetTargetSdkVersion34 ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ patches {
|
|||||||
dependencies {
|
dependencies {
|
||||||
// Required due to smali, or build fails. Can be removed once smali is bumped.
|
// Required due to smali, or build fails. Can be removed once smali is bumped.
|
||||||
implementation(libs.guava)
|
implementation(libs.guava)
|
||||||
|
|
||||||
|
implementation(libs.apksig)
|
||||||
|
|
||||||
// Android API stubs defined here.
|
// Android API stubs defined here.
|
||||||
compileOnly(project(":patches:stub"))
|
compileOnly(project(":patches:stub"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package app.revanced.patches.all.misc.spoof
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.resourcePatch
|
||||||
|
import app.revanced.patcher.patch.stringOption
|
||||||
|
import app.revanced.util.getNode
|
||||||
|
import com.android.apksig.ApkVerifier
|
||||||
|
import com.android.apksig.apk.ApkFormatException
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
import java.io.ByteArrayInputStream
|
||||||
|
import java.io.IOException
|
||||||
|
import java.nio.file.Files
|
||||||
|
import java.nio.file.InvalidPathException
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes
|
||||||
|
import java.security.NoSuchAlgorithmException
|
||||||
|
import java.security.cert.CertificateException
|
||||||
|
import java.security.cert.CertificateFactory
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.io.path.Path
|
||||||
|
|
||||||
|
val signatureSpoofPatch = resourcePatch(
|
||||||
|
name = "Spoof app signature",
|
||||||
|
description = "Spoofs the app signature via the \"fake-signature\" meta key. " +
|
||||||
|
"This patch only works with patched device roms.",
|
||||||
|
use = false,
|
||||||
|
) {
|
||||||
|
val signature by stringOption(
|
||||||
|
key = "spoofedAppSignature",
|
||||||
|
title = "Signature",
|
||||||
|
validator = { signature ->
|
||||||
|
optionToSignature(signature) != null
|
||||||
|
},
|
||||||
|
description = "The hex-encoded signature or path to an apk file with the desired signature",
|
||||||
|
required = true,
|
||||||
|
)
|
||||||
|
execute {
|
||||||
|
document("AndroidManifest.xml").use { document ->
|
||||||
|
val manifest = document.getNode("manifest") as Element
|
||||||
|
|
||||||
|
val fakeSignaturePermission = document.createElement("uses-permission")
|
||||||
|
fakeSignaturePermission.setAttribute("android:name", "android.permission.FAKE_PACKAGE_SIGNATURE")
|
||||||
|
manifest.appendChild(fakeSignaturePermission)
|
||||||
|
|
||||||
|
val application = document.getNode("application") ?: {
|
||||||
|
val child = document.createElement("application")
|
||||||
|
manifest.appendChild(child)
|
||||||
|
child
|
||||||
|
} as Element;
|
||||||
|
|
||||||
|
val fakeSignatureMetadata = document.createElement("meta-data")
|
||||||
|
fakeSignatureMetadata.setAttribute("android:name", "fake-signature")
|
||||||
|
fakeSignatureMetadata.setAttribute("android:value", optionToSignature(signature))
|
||||||
|
application.appendChild(fakeSignatureMetadata)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun optionToSignature(signature: String?): String? {
|
||||||
|
if (signature == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// TODO: Replace with signature.hexToByteArray when stable in kotlin
|
||||||
|
val signatureBytes = HexFormat.of()
|
||||||
|
.parseHex(signature)
|
||||||
|
val factory = CertificateFactory.getInstance("X.509")
|
||||||
|
factory.generateCertificate(ByteArrayInputStream(signatureBytes))
|
||||||
|
return signature;
|
||||||
|
} catch (_: IllegalArgumentException) {
|
||||||
|
} catch (_: CertificateException) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
val signaturePath = Path(signature)
|
||||||
|
if (!Files.readAttributes(signaturePath, BasicFileAttributes::class.java).isRegularFile) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
val verifier = ApkVerifier.Builder(signaturePath.toFile())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val result = verifier.verify()
|
||||||
|
if (result.isVerifiedUsingV3Scheme) {
|
||||||
|
return HexFormat.of().formatHex(result.v3SchemeSigners[0].certificate.encoded)
|
||||||
|
} else if (result.isVerifiedUsingV2Scheme) {
|
||||||
|
return HexFormat.of().formatHex(result.v2SchemeSigners[0].certificate.encoded)
|
||||||
|
} else if (result.isVerifiedUsingV1Scheme) {
|
||||||
|
return HexFormat.of().formatHex(result.v1SchemeSigners[0].certificate.encoded)
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (_: IOException) {
|
||||||
|
} catch (_: InvalidPathException) {
|
||||||
|
} catch (_: ApkFormatException) {
|
||||||
|
} catch (_: NoSuchAlgorithmException) {
|
||||||
|
} catch (_: IllegalArgumentException) {}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
@@ -97,6 +97,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch {
|
|||||||
SwitchPreference("revanced_hide_shorts_use_sound_button"),
|
SwitchPreference("revanced_hide_shorts_use_sound_button"),
|
||||||
SwitchPreference("revanced_hide_shorts_use_template_button"),
|
SwitchPreference("revanced_hide_shorts_use_template_button"),
|
||||||
SwitchPreference("revanced_hide_shorts_upcoming_button"),
|
SwitchPreference("revanced_hide_shorts_upcoming_button"),
|
||||||
|
SwitchPreference("revanced_hide_shorts_effect_button"),
|
||||||
SwitchPreference("revanced_hide_shorts_green_screen_button"),
|
SwitchPreference("revanced_hide_shorts_green_screen_button"),
|
||||||
SwitchPreference("revanced_hide_shorts_hashtag_button"),
|
SwitchPreference("revanced_hide_shorts_hashtag_button"),
|
||||||
SwitchPreference("revanced_hide_shorts_new_posts_button"),
|
SwitchPreference("revanced_hide_shorts_new_posts_button"),
|
||||||
|
|||||||
@@ -835,6 +835,9 @@ To show the Audio track menu, change \'Spoof video streams\' to iOS TV"</string>
|
|||||||
<string name="revanced_hide_shorts_upcoming_button_title">Hide Upcoming button</string>
|
<string name="revanced_hide_shorts_upcoming_button_title">Hide Upcoming button</string>
|
||||||
<string name="revanced_hide_shorts_upcoming_button_summary_on">Upcoming button is hidden</string>
|
<string name="revanced_hide_shorts_upcoming_button_summary_on">Upcoming button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_upcoming_button_summary_off">Upcoming button is shown</string>
|
<string name="revanced_hide_shorts_upcoming_button_summary_off">Upcoming button is shown</string>
|
||||||
|
<string name="revanced_hide_shorts_effect_button_title">Hide Effect button</string>
|
||||||
|
<string name="revanced_hide_shorts_effect_button_summary_on">Effect button is hidden</string>
|
||||||
|
<string name="revanced_hide_shorts_effect_button_summary_off">Effect button is shown</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_title">Hide Green screen button</string>
|
<string name="revanced_hide_shorts_green_screen_button_title">Hide Green screen button</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_summary_on">Green screen button is hidden</string>
|
<string name="revanced_hide_shorts_green_screen_button_summary_on">Green screen button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_summary_off">Green screen button is shown</string>
|
<string name="revanced_hide_shorts_green_screen_button_summary_off">Green screen button is shown</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user