mirror of
https://github.com/revanced/revanced-patches
synced 2024-09-02 12:35:16 +02:00
Merge branch 'dev' into microg-dalvik-patch
# Conflicts: # src/main/kotlin/app/revanced/patches/Index.kt # src/main/kotlin/app/revanced/patches/music/audio/codecs/patch/CodecsUnlockPatch.kt # src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/patch/ExclusiveAudioPatch.kt # src/main/kotlin/app/revanced/patches/music/layout/tastebuilder/patch/RemoveTasteBuilderPatch.kt # src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/patch/RemoveUpgradeButtonPatch.kt # src/main/kotlin/app/revanced/patches/music/premium/backgroundplay/patch/BackgroundPlayPatch.kt # src/main/kotlin/app/revanced/patches/youtube/ad/home/annotation/PromotionsCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/ad/home/patch/HomeAdsPatch.kt # src/main/kotlin/app/revanced/patches/youtube/ad/home/patch/PromotionsPatch.kt # src/main/kotlin/app/revanced/patches/youtube/ad/home/signatures/PromotedDiscoveryActionParentSignature.kt # src/main/kotlin/app/revanced/patches/youtube/ad/home/signatures/PromotedDiscoveryAppParentSignature.kt # src/main/kotlin/app/revanced/patches/youtube/ad/video/annotations/VideoAdsCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/ad/video/patch/VideoAdsPatch.kt # src/main/kotlin/app/revanced/patches/youtube/ad/video/signatures/ShowVideoAdsConstructorSignature.kt # src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/annotation/SeekbarTappingCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/patch/EnableSeekbarTappingPatch.kt # src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/signatures/SeekbarTappingParentSignature.kt # src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/signatures/SeekbarTappingSignature.kt # src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/annotations/CreateButtonCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/patch/CreateButtonRemoverPatch.kt # src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/signatures/CreateButtonSignature.kt # src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/annotations/MinimizedPlaybackCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/patch/MinimizedPlaybackPatch.kt # src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/signatures/MinimizedPlaybackManagerSignature.kt # src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/annotations/OldQualityLayoutCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/patch/OldQualityLayoutPatch.kt # src/main/kotlin/app/revanced/patches/youtube/layout/reels/patch/HideReelsPatch.kt # src/main/kotlin/app/revanced/patches/youtube/layout/reels/signatures/HideReelsSignature.kt # src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/annotations/ShortsButtonCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/patch/ShortsButtonRemoverPatch.kt # src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/signatures/PivotBarButtonTabenumSignature.kt # src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/signatures/PivotBarButtonsViewSignature.kt # src/main/kotlin/app/revanced/patches/youtube/misc/integrations/annotations/IntegrationsCompatibility.kt # src/main/kotlin/app/revanced/patches/youtube/misc/integrations/patch/IntegrationsPatch.kt # src/main/kotlin/app/revanced/patches/youtube/misc/integrations/signatures/InitSignature.kt # src/main/kotlin/app/revanced/patches/youtube/misc/manifest/annotations/FixLocaleConfigErrorCompatibility.kt # src/test/kotlin/app/revanced/patches/SignatureChecker.kt
This commit is contained in:
commit
77a164015a
1
.github/workflows/release.yml
vendored
1
.github/workflows/release.yml
vendored
@ -1,5 +1,6 @@
|
||||
name: Release
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
15
CHANGELOG.md
15
CHANGELOG.md
@ -1,3 +1,18 @@
|
||||
# [1.0.0-dev.10](https://github.com/revanced/revanced-patches/compare/v1.0.0-dev.9...v1.0.0-dev.10) (2022-05-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* `create-button-signature` ([a173f6e](https://github.com/revanced/revanced-patches/commit/a173f6e5a7e65943657e2072e8a72a4a680e5277))
|
||||
* breaking changes by `revanced-patcher` dependency ([e12e484](https://github.com/revanced/revanced-patches/commit/e12e484e3796c5c9c8505b677838cdf8432f2e79))
|
||||
* loop in `amoled` patch ([c4c86b6](https://github.com/revanced/revanced-patches/commit/c4c86b65fd8b2463c1d86ad2e46ec9f08e60d47c))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add `amoled` patch ([d61bac4](https://github.com/revanced/revanced-patches/commit/d61bac4f8243d0ef72ca91c7c1d5facd858d515e))
|
||||
* update patches to latest version ([bad25de](https://github.com/revanced/revanced-patches/commit/bad25dec1d73137f8b7a1bf4daaceb2279b4d48c))
|
||||
|
||||
# [1.0.0-dev.9](https://github.com/revanced/revanced-patches/compare/v1.0.0-dev.8...v1.0.0-dev.9) (2022-05-13)
|
||||
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
kotlin.code.style = official
|
||||
version = 1.0.0-dev.9
|
||||
version = 1.0.0-dev.10
|
||||
|
@ -1,6 +1,6 @@
|
||||
package app.revanced.extensions
|
||||
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import org.jf.dexlib2.builder.MutableMethodImplementation
|
||||
|
||||
internal fun MutableMethodImplementation.injectHideCall(
|
||||
|
@ -1,48 +0,0 @@
|
||||
package app.revanced.patches
|
||||
|
||||
import app.revanced.patcher.data.base.Data
|
||||
import app.revanced.patcher.patch.base.Patch
|
||||
import app.revanced.patches.music.audio.codecs.patch.CodecsUnlockPatch
|
||||
import app.revanced.patches.music.audio.exclusiveaudio.patch.ExclusiveAudioPatch
|
||||
import app.revanced.patches.music.layout.tastebuilder.patch.RemoveTasteBuilderPatch
|
||||
import app.revanced.patches.music.layout.upgradebutton.patch.RemoveUpgradeButtonPatch
|
||||
import app.revanced.patches.music.premium.backgroundplay.patch.BackgroundPlayPatch
|
||||
import app.revanced.patches.youtube.ad.home.patch.PromotionsPatch
|
||||
import app.revanced.patches.youtube.ad.video.patch.VideoAdsPatch
|
||||
import app.revanced.patches.youtube.interaction.seekbar.patch.EnableSeekbarTappingPatch
|
||||
import app.revanced.patches.youtube.layout.createbutton.patch.CreateButtonRemoverPatch
|
||||
import app.revanced.patches.youtube.layout.minimizedplayback.patch.MinimizedPlaybackPatch
|
||||
import app.revanced.patches.youtube.layout.oldqualitylayout.patch.OldQualityLayoutPatch
|
||||
import app.revanced.patches.youtube.layout.reels.patch.HideReelsPatch
|
||||
import app.revanced.patches.youtube.layout.shorts.button.patch.ShortsButtonRemoverPatch
|
||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
||||
|
||||
/**
|
||||
* Index contains all the patches.
|
||||
*/
|
||||
@Suppress("Unused")
|
||||
object Index {
|
||||
/**
|
||||
* Array of patches.
|
||||
* New patches should be added to the array.
|
||||
*/
|
||||
val patches: List<() -> Patch<Data>> = listOf(
|
||||
::IntegrationsPatch,
|
||||
::FixLocaleConfigErrorPatch,
|
||||
//::HomeAdsPatch,
|
||||
::VideoAdsPatch,
|
||||
::PromotionsPatch,
|
||||
::MinimizedPlaybackPatch,
|
||||
::CreateButtonRemoverPatch,
|
||||
::ShortsButtonRemoverPatch,
|
||||
::HideReelsPatch,
|
||||
::OldQualityLayoutPatch,
|
||||
::EnableSeekbarTappingPatch,
|
||||
::ExclusiveAudioPatch,
|
||||
::RemoveUpgradeButtonPatch,
|
||||
::RemoveTasteBuilderPatch,
|
||||
::BackgroundPlayPatch,
|
||||
::CodecsUnlockPatch
|
||||
)
|
||||
}
|
@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import app.revanced.patches.music.audio.codecs.annotations.CodecsUnlockCompatibility
|
||||
import app.revanced.patches.music.audio.codecs.signatures.AllCodecsReferenceSignature
|
||||
import app.revanced.patches.music.audio.codecs.signatures.CodecsLockSignature
|
||||
@ -29,10 +29,10 @@ class CodecsUnlockPatch : BytecodePatch(
|
||||
|
||||
val implementation = result.method.implementation!!
|
||||
|
||||
val instructionIndex = result.scanData.startIndex
|
||||
val instructionIndex = result.scanResult.startIndex
|
||||
|
||||
result = signatures.last().result!!
|
||||
val codecMethod = data.toMethodWalker(result.immutableMethod).walk(result.scanData.startIndex).getMethod()
|
||||
val codecMethod = data.toMethodWalker(result.immutableMethod).walk(result.scanResult.startIndex).getMethod()
|
||||
|
||||
implementation.replaceInstruction(
|
||||
instructionIndex,
|
||||
|
@ -13,7 +13,7 @@ import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.DirectPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import app.revanced.patches.music.audio.exclusiveaudio.annotations.ExclusiveAudioCompatibility
|
||||
import app.revanced.patches.music.audio.exclusiveaudio.signatures.ExclusiveAudioSignature
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.music.layout.tastebuilder.annotations.RemoveTasteBuilderCompatibility
|
||||
import app.revanced.patches.music.layout.tastebuilder.signatures.TasteBuilderConstructorSignature
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction22c
|
||||
@ -28,7 +28,7 @@ class RemoveTasteBuilderPatch : BytecodePatch(
|
||||
val result = signatures.first().result!!
|
||||
val implementation = result.method.implementation!!
|
||||
|
||||
val insertIndex = result.scanData.endIndex - 8
|
||||
val insertIndex = result.scanResult.endIndex - 8
|
||||
|
||||
val register = (implementation.instructions[insertIndex] as Instruction22c).registerA
|
||||
|
||||
|
@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.music.layout.upgradebutton.annotations.RemoveUpgradeButtonCompatibility
|
||||
import app.revanced.patches.music.layout.upgradebutton.signatures.PivotBarConstructorSignature
|
||||
import org.jf.dexlib2.Opcode
|
||||
@ -33,7 +33,7 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
|
||||
val implementation = result.method.implementation!!
|
||||
|
||||
val pivotBarElementFieldRef =
|
||||
(implementation.instructions[result.scanData.endIndex - 1] as Instruction22c).reference
|
||||
(implementation.instructions[result.scanResult.endIndex - 1] as Instruction22c).reference
|
||||
|
||||
val register = (implementation.instructions.first() as Instruction35c).registerC
|
||||
// first compile all the needed instructions
|
||||
@ -48,14 +48,14 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
|
||||
|
||||
// replace the instruction to retain the label at given index
|
||||
implementation.replaceInstruction(
|
||||
result.scanData.endIndex - 1, instructionList[0] // invoke-interface
|
||||
result.scanResult.endIndex - 1, instructionList[0] // invoke-interface
|
||||
)
|
||||
// do not forget to remove this instruction since we added it already
|
||||
instructionList.removeFirst()
|
||||
|
||||
val exitInstruction = instructionList.last() // iput-object
|
||||
implementation.addInstruction(
|
||||
result.scanData.endIndex, exitInstruction
|
||||
result.scanResult.endIndex, exitInstruction
|
||||
)
|
||||
// do not forget to remove this instruction since we added it already
|
||||
instructionList.removeLast()
|
||||
@ -64,12 +64,12 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
|
||||
instructionList.add(
|
||||
2, // if-le
|
||||
BuilderInstruction22t(
|
||||
Opcode.IF_LE, 1, 2, implementation.newLabelForIndex(result.scanData.endIndex)
|
||||
Opcode.IF_LE, 1, 2, implementation.newLabelForIndex(result.scanResult.endIndex)
|
||||
)
|
||||
)
|
||||
|
||||
implementation.addInstructions(
|
||||
result.scanData.endIndex, instructionList
|
||||
result.scanResult.endIndex, instructionList
|
||||
)
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.music.premium.backgroundplay.annotations.BackgroundPlayCompatibility
|
||||
import app.revanced.patches.music.premium.backgroundplay.signatures.BackgroundPlaybackDisableSignature
|
||||
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.03.38", "17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.03.38", "17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -1697,7 +1697,7 @@ for (i in 0 until signatures.count()) {
|
||||
val signature = signatures.elementAt(i)
|
||||
val result = signature.result!!
|
||||
val implementation = result.method.implementation!!
|
||||
val index = result.scanData.startIndex
|
||||
val index = result.scanResult.startIndex
|
||||
val instructions = implementation.instructions
|
||||
|
||||
val register = (instructions[index + (if (i < 2) -1 else 1)] as Instruction11x).registerA
|
||||
|
@ -12,10 +12,10 @@ import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultError
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.DirectPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.youtube.ad.home.annotation.PromotionsCompatibility
|
||||
import app.revanced.patches.youtube.ad.home.signatures.PromotedDiscoveryActionParentSignature
|
||||
import app.revanced.patches.youtube.ad.home.signatures.PromotedDiscoveryAppParentSignature
|
||||
|
@ -6,16 +6,16 @@ import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
||||
import app.revanced.patches.youtube.ad.home.annotation.PromotionsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("promoted-discovery-app-parent-signature")
|
||||
@MatchingMethod(
|
||||
"Ljre;", "lP"
|
||||
"Ljqb;", "lG"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@SeekbarTappingCompatibility
|
||||
@PromotionsCompatibility
|
||||
@Version("0.0.1")
|
||||
object PromotedDiscoveryActionParentSignature : MethodSignature(
|
||||
"V",
|
||||
|
@ -6,17 +6,17 @@ import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
||||
import app.revanced.patches.youtube.ad.home.annotation.PromotionsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("promoted-discovery-action-parent-signature")
|
||||
@MatchingMethod(
|
||||
"Ljqv;",
|
||||
"lP"
|
||||
"Ljqj;",
|
||||
"lG"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@SeekbarTappingCompatibility
|
||||
@PromotionsCompatibility
|
||||
@Version("0.0.1")
|
||||
|
||||
object PromotedDiscoveryAppParentSignature : MethodSignature(
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -14,7 +14,7 @@ import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.DirectPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility
|
||||
import app.revanced.patches.youtube.ad.video.signatures.ShowVideoAdsConstructorSignature
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
@ -6,17 +6,17 @@ import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
||||
import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("show-video-ads-constructor-signature")
|
||||
@MatchingMethod(
|
||||
"Laadb",
|
||||
"Laair",
|
||||
"<init>",
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@SeekbarTappingCompatibility
|
||||
@VideoAdsCompatibility
|
||||
@Version("0.0.1")
|
||||
object ShowVideoAdsConstructorSignature : MethodSignature(
|
||||
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L"), listOf(
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -10,7 +10,7 @@ import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultError
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
||||
import app.revanced.patches.youtube.interaction.seekbar.signatures.SeekbarTappingParentSignature
|
||||
import app.revanced.patches.youtube.interaction.seekbar.signatures.SeekbarTappingSignature
|
||||
@ -66,25 +66,25 @@ class EnableSeekbarTappingPatch : BytecodePatch(
|
||||
val oMethod = tapSeekMethods["O"]!!
|
||||
|
||||
// get the required register
|
||||
val instruction = implementation.instructions[result.scanData.endIndex]
|
||||
val instruction = implementation.instructions[result.scanResult.endIndex]
|
||||
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return PatchResultError("Could not find the correct register")
|
||||
val register = (instruction as Instruction35c).registerC
|
||||
|
||||
// the instructions are written in reverse order.
|
||||
implementation.addInstructions(
|
||||
result.scanData.endIndex + 1, """
|
||||
result.scanResult.endIndex + 1, """
|
||||
invoke-virtual { v$register, v2 }, ${oMethod.definingClass}->${oMethod.name}(I)V
|
||||
invoke-virtual { v$register, v2 }, ${pMethod.definingClass}->${pMethod.name}(I)V
|
||||
""".trimIndent().toInstructions()
|
||||
)
|
||||
|
||||
// if tap-seeking is disabled, do not invoke the two methods above by jumping to the else label
|
||||
val elseLabel = implementation.newLabelForIndex(result.scanData.endIndex + 1)
|
||||
val elseLabel = implementation.newLabelForIndex(result.scanResult.endIndex + 1)
|
||||
implementation.addInstruction(
|
||||
result.scanData.endIndex + 1, BuilderInstruction21t(Opcode.IF_EQZ, 0, elseLabel)
|
||||
result.scanResult.endIndex + 1, BuilderInstruction21t(Opcode.IF_EQZ, 0, elseLabel)
|
||||
)
|
||||
implementation.addInstructions(
|
||||
result.scanData.endIndex + 1, """
|
||||
result.scanResult.endIndex + 1, """
|
||||
invoke-static { }, Lfi/razerman/youtube/preferences/BooleanPreferences;->isTapSeekingEnabled()Z
|
||||
move-result v0
|
||||
""".trimIndent().toInstructions()
|
||||
|
@ -11,7 +11,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("enable-seekbar-tapping-parent")
|
||||
@MatchingMethod("Lzhj;", "J")
|
||||
@MatchingMethod("Lzmx;", "I")
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@SeekbarTappingCompatibility
|
||||
@Version("0.0.1")
|
||||
|
@ -11,7 +11,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("enable-seekbar-tapping-signature")
|
||||
@MatchingMethod("Lfao;", "onTouchEvent")
|
||||
@MatchingMethod("Lfbl;", "onTouchEvent")
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@SeekbarTappingCompatibility
|
||||
@Version("0.0.1")
|
||||
|
@ -0,0 +1,13 @@
|
||||
package app.revanced.patches.youtube.layout.amoled.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
internal annotation class AmoledCompatibility
|
@ -0,0 +1,40 @@
|
||||
package app.revanced.patches.youtube.layout.amoled.patch
|
||||
|
||||
import app.revanced.patcher.annotation.Description
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.data.implementation.ResourceData
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.ResourcePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patches.youtube.layout.amoled.annotations.AmoledCompatibility
|
||||
import org.w3c.dom.Element
|
||||
import java.io.File
|
||||
|
||||
@Patch
|
||||
@Name("amoled")
|
||||
@Description("Enables pure black theme.")
|
||||
@AmoledCompatibility
|
||||
@Version("0.0.1")
|
||||
class AmoledPatch : ResourcePatch() {
|
||||
override fun execute(data: ResourceData): PatchResult {
|
||||
data.getXmlEditor("res${File.separator}values${File.separator}colors.xml").use { editor ->
|
||||
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
||||
|
||||
for (i in 0 until resourcesNode.childNodes.length) {
|
||||
val node = resourcesNode.childNodes.item(i)
|
||||
if (node !is Element) continue
|
||||
|
||||
val element = resourcesNode.childNodes.item(i) as Element
|
||||
element.textContent = when (element.getAttribute("name")) {
|
||||
"yt_black1", "yt_black1_opacity95", "yt_black2", "yt_black3", "yt_black4", "yt_status_bar_background_dark" -> "@android:color/black"
|
||||
"yt_selected_nav_label_dark" -> "#ffdf0000"
|
||||
else -> continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -9,16 +9,16 @@ import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultError
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import app.revanced.patches.youtube.layout.createbutton.annotations.CreateButtonCompatibility
|
||||
import app.revanced.patches.youtube.layout.createbutton.signatures.CreateButtonSignature
|
||||
import app.revanced.patches.youtube.layout.minimizedplayback.annotations.MinimizedPlaybackCompatibility
|
||||
import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||
|
||||
@Patch
|
||||
@Name("disable-create-button")
|
||||
@Description("Disable the create button.")
|
||||
@MinimizedPlaybackCompatibility
|
||||
@CreateButtonCompatibility
|
||||
@Version("0.0.1")
|
||||
class CreateButtonRemoverPatch : BytecodePatch(
|
||||
listOf(
|
||||
@ -30,14 +30,14 @@ class CreateButtonRemoverPatch : BytecodePatch(
|
||||
|
||||
// Get the required register which holds the view object we need to pass to the method hideCreateButton
|
||||
val implementation = result.method.implementation!!
|
||||
val instruction = implementation.instructions[result.scanData.endIndex + 1]
|
||||
val instruction = implementation.instructions[result.scanResult.endIndex + 1]
|
||||
if (instruction.opcode != Opcode.INVOKE_STATIC)
|
||||
return PatchResultError("Could not find the correct register")
|
||||
val register = (instruction as Instruction35c).registerC
|
||||
|
||||
// Hide the button view via proxy by passing it to the hideCreateButton method
|
||||
implementation.addInstruction(
|
||||
result.scanData.endIndex + 1,
|
||||
result.scanResult.endIndex + 1,
|
||||
"invoke-static { v$register }, Lfi/razerman/youtube/XAdRemover;->hideCreateButton(Landroid/view/View;)V".toInstruction()
|
||||
)
|
||||
|
||||
|
@ -12,7 +12,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("create-button-signature")
|
||||
@MatchingMethod(
|
||||
"Lkne", "z"
|
||||
"Lknw", "z"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@CreateButtonCompatibility
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.youtube.layout.minimizedplayback.annotations.MinimizedPlaybackCompatibility
|
||||
import app.revanced.patches.youtube.layout.minimizedplayback.signatures.MinimizedPlaybackManagerSignature
|
||||
|
||||
|
@ -12,7 +12,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("minimized-playback-manager-signature")
|
||||
@MatchingMethod(
|
||||
"Lype", "j"
|
||||
"Lyuf", "n"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@MinimizedPlaybackCompatibility
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -14,7 +14,7 @@ import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.youtube.layout.oldqualitylayout.annotations.OldQualityLayoutCompatibility
|
||||
import app.revanced.patches.youtube.layout.oldqualitylayout.signatures.OldQualityParentSignature
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
@ -51,7 +51,7 @@ class OldQualityLayoutPatch : BytecodePatch(
|
||||
|
||||
// if useOldStyleQualitySettings == true, jump over all instructions
|
||||
val jmpInstruction = BuilderInstruction21t(
|
||||
Opcode.IF_NEZ, 0, implementation.instructions[result.scanData.endIndex].location.labels.first()
|
||||
Opcode.IF_NEZ, 0, implementation.instructions[result.scanResult.endIndex].location.labels.first()
|
||||
)
|
||||
implementation.addInstruction(5, jmpInstruction)
|
||||
implementation.addInstructions(
|
||||
|
@ -4,15 +4,14 @@ import app.revanced.patcher.annotation.Description
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.data.implementation.BytecodeData
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import app.revanced.patches.youtube.layout.reels.signatures.HideReelsSignature
|
||||
|
||||
@Patch
|
||||
//@Patch TODO: converted to litho
|
||||
@Name("hide-reels")
|
||||
@Description("Hide reels on the page.")
|
||||
@HideReelsCompatibility
|
||||
@ -29,7 +28,7 @@ class HideReelsPatch : BytecodePatch(
|
||||
// HideReel will hide the reel view before it is being used,
|
||||
// so we pass the view to the HideReel method
|
||||
implementation.addInstruction(
|
||||
result.scanData.endIndex,
|
||||
result.scanResult.endIndex,
|
||||
"invoke-static { v2 }, Lfi/razerman/youtube/XAdRemover;->HideReel(Landroid/view/View;)V".toInstruction()
|
||||
)
|
||||
|
||||
|
@ -8,7 +8,6 @@ import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatt
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("hide-reels-signature")
|
||||
@MatchingMethod(
|
||||
@ -18,41 +17,6 @@ import org.jf.dexlib2.Opcode
|
||||
@HideReelsCompatibility
|
||||
@Version("0.0.1")
|
||||
object HideReelsSignature : MethodSignature(
|
||||
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf(
|
||||
"L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "[B", "[B", "[B", "[B", "[B", "[B"
|
||||
), listOf(
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT_FROM16,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT_FROM16,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.MOVE_OBJECT_FROM16,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CONST,
|
||||
Opcode.CONST_4,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.IPUT_OBJECT
|
||||
)
|
||||
null, AccessFlags.PROTECTED or AccessFlags.FINAL, listOf("L", "L"), null,
|
||||
listOf("multiReelDismissalCallback", "reelItemRenderers", "reelDismissalInfo")
|
||||
)
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -8,7 +8,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.smali.toInstruction
|
||||
import app.revanced.patcher.util.smali.toInstruction
|
||||
import app.revanced.patches.youtube.layout.shorts.button.annotations.ShortsButtonCompatibility
|
||||
import app.revanced.patches.youtube.layout.shorts.button.signatures.PivotBarButtonTabenumSignature
|
||||
import app.revanced.patches.youtube.layout.shorts.button.signatures.PivotBarButtonsViewSignature
|
||||
@ -27,24 +27,24 @@ class ShortsButtonRemoverPatch : BytecodePatch(
|
||||
override fun execute(data: BytecodeData): PatchResult {
|
||||
val result1 = signatures.first().result!!
|
||||
val implementation1 = result1.method.implementation!!
|
||||
val moveEnumInstruction = implementation1.instructions[result1.scanData.endIndex]
|
||||
val moveEnumInstruction = implementation1.instructions[result1.scanResult.endIndex]
|
||||
val enumRegister = (moveEnumInstruction as Instruction11x).registerA
|
||||
|
||||
val result2 = signatures.last().result!!
|
||||
val implementation2 = result2.method.implementation!!
|
||||
val moveViewInstruction = implementation2.instructions[result2.scanData.endIndex]
|
||||
val moveViewInstruction = implementation2.instructions[result2.scanResult.endIndex]
|
||||
val viewRegister = (moveViewInstruction as Instruction11x).registerA
|
||||
|
||||
// Save the tab enum in XGlobals to avoid smali/register workarounds
|
||||
implementation1.addInstruction(
|
||||
result1.scanData.endIndex + 1,
|
||||
result1.scanResult.endIndex + 1,
|
||||
"sput-object v$enumRegister, Lfi/razerman/youtube/XGlobals;->lastPivotTab:Ljava/lang/Enum;".toInstruction()
|
||||
)
|
||||
|
||||
// Hide the button view via proxy by passing it to the hideShortsButton method
|
||||
// It only hides it if the last tab name is "TAB_SHORTS"
|
||||
implementation2.addInstruction(
|
||||
result2.scanData.endIndex + 2,
|
||||
result2.scanResult.endIndex + 2,
|
||||
"invoke-static { v$viewRegister }, Lfi/razerman/youtube/XAdRemover;->hideShortsButton(Landroid/view/View;)V".toInstruction()
|
||||
)
|
||||
|
||||
|
@ -12,7 +12,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("pivotbar-buttons-tabenum-signature")
|
||||
@MatchingMethod(
|
||||
"Lkne", "z"
|
||||
"Lknw", "z"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@ShortsButtonCompatibility
|
||||
|
@ -12,7 +12,7 @@ import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("pivotbar-buttons-view-signature")
|
||||
@MatchingMethod(
|
||||
"Lkne", "z"
|
||||
"Lknw", "z"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@ShortsButtonCompatibility
|
||||
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.03.38", "17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.03.38", "17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -10,8 +10,8 @@ import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.implementation.BytecodePatch
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResult
|
||||
import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess
|
||||
import app.revanced.patcher.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patcher.smali.toInstructions
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patcher.util.smali.toInstructions
|
||||
import app.revanced.patches.youtube.misc.integrations.annotations.IntegrationsCompatibility
|
||||
import app.revanced.patches.youtube.misc.integrations.signatures.InitSignature
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
@ -35,7 +35,7 @@ class IntegrationsPatch : BytecodePatch(
|
||||
val count = implementation.registerCount - 1
|
||||
|
||||
implementation.addInstructions(
|
||||
result.scanData.endIndex + 1, """
|
||||
result.scanResult.endIndex + 1, """
|
||||
invoke-static {v$count}, Lpl/jakubweg/StringRef;->setContext(Landroid/content/Context;)V
|
||||
sput-object v$count, Lapp/revanced/integrations/Globals;->context:Landroid/content/Context;
|
||||
""".trimIndent().toInstructions()
|
||||
|
@ -3,55 +3,16 @@ package app.revanced.patches.youtube.misc.integrations.signatures
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.signature.implementation.method.MethodSignature
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.misc.integrations.annotations.IntegrationsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("init-signature")
|
||||
@MatchingMethod(
|
||||
"Lacnx", "onCreate"
|
||||
"Lacuu", "onCreate"
|
||||
)
|
||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
||||
@IntegrationsCompatibility
|
||||
@Version("0.0.1")
|
||||
object InitSignature : MethodSignature(
|
||||
"V",
|
||||
AccessFlags.PUBLIC.value,
|
||||
listOf(),
|
||||
listOf(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.MOVE_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.CONST_4,
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_INTERFACE_RANGE,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.SPUT_OBJECT,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.INVOKE_SUPER,
|
||||
Opcode.INVOKE_VIRTUAL
|
||||
)
|
||||
null, null, null, null,
|
||||
listOf("Application creation")
|
||||
)
|
@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34")
|
||||
"com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
@ -1,62 +0,0 @@
|
||||
package app.revanced.patches
|
||||
|
||||
import app.revanced.patcher.Patcher
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.signature.implementation.method.annotation.PatternScanMethod
|
||||
import org.jf.dexlib2.iface.Method
|
||||
import org.junit.Test
|
||||
import java.io.File
|
||||
|
||||
internal class SignatureChecker {
|
||||
@Test
|
||||
fun checkMethodSignatures() {
|
||||
|
||||
// FIXME: instead of having this as a test, it should be turned into a task which can be ran manually
|
||||
val file = File("stock.apk")
|
||||
if (!file.exists()) {
|
||||
throw IllegalStateException("Missing $file! To run this test, please place stock.apk here: ${file.absolutePath}")
|
||||
}
|
||||
val patcher = Patcher(file, "signatureCheckerCache", false)
|
||||
patcher.addPatches(Index.patches.map { it() })
|
||||
val unresolved = mutableListOf<String>()
|
||||
for (signature in patcher.resolveSignatures()) {
|
||||
val signatureAnnotations = signature::class.annotations
|
||||
|
||||
val nameAnnotation = signatureAnnotations.find { it is Name } as Name
|
||||
if (!signature.resolved) {
|
||||
unresolved.add(nameAnnotation.name)
|
||||
continue
|
||||
}
|
||||
|
||||
val patternScanMethod =
|
||||
signatureAnnotations.find { it::class.annotations.any { method -> method is PatternScanMethod } }
|
||||
if (patternScanMethod is FuzzyPatternScanMethod) {
|
||||
val warnings = signature.result!!.scanData.warnings!!
|
||||
val method = signature.result!!.method
|
||||
|
||||
val methodFromMetadata =
|
||||
signatureAnnotations.find { it is MatchingMethod } as MatchingMethod? ?: MatchingMethod()
|
||||
|
||||
println("Signature: ${nameAnnotation}.\nMethod: ${methodFromMetadata.definingClass}->${methodFromMetadata.name} (Signature matches: ${method.definingClass}->${method.toStr()})\nWarnings: ${warnings.count()}")
|
||||
for (warning in warnings) {
|
||||
println("${warning.instructionIndex} / ${warning.patternIndex}: ${warning.wrongOpcode} (expected: ${warning.correctOpcode})")
|
||||
}
|
||||
|
||||
println("=".repeat(20))
|
||||
}
|
||||
}
|
||||
if (unresolved.isNotEmpty()) {
|
||||
val base = Exception("${unresolved.size} signatures were not resolved.")
|
||||
for (name in unresolved) {
|
||||
base.addSuppressed(Exception("Signature $name was not resolved!"))
|
||||
}
|
||||
throw base
|
||||
}
|
||||
}
|
||||
|
||||
private fun Method.toStr(): String {
|
||||
return "${this.name}(${this.parameterTypes.joinToString("")})${this.returnType}"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user