diff --git a/build.gradle.kts b/build.gradle.kts index f37164fa6..c529a7c09 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ repositories { dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.21") - implementation("app.revanced:revanced-patcher:1.0.0") + implementation("app.revanced:revanced-patcher:1.1.0") implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.21") } diff --git a/src/main/kotlin/app/revanced/extensions/Extensions.kt b/src/main/kotlin/app/revanced/extensions/Extensions.kt index 4a1290740..1f2ec35a5 100644 --- a/src/main/kotlin/app/revanced/extensions/Extensions.kt +++ b/src/main/kotlin/app/revanced/extensions/Extensions.kt @@ -27,9 +27,9 @@ internal fun String.startsWithAny(vararg prefixes: String): Boolean { return false } -internal fun String.containsAny(vararg others: String): Boolean { - for (other in others) - if (this.contains(other)) +internal fun String.equalsAny(vararg other: String): Boolean { + for (_other in other) + if (this == _other) return true return false diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/annotation/GeneralAdsCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/annotation/GeneralAdsCompatibility.kt index 4d9b71ded..796593dec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/annotation/GeneralAdsCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/annotation/GeneralAdsCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.19.36", "17.20.37", "17.20.37") + "com.google.android.youtube", arrayOf("17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt index 1003e772e..b9b8d2567 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt @@ -43,7 +43,7 @@ import org.jf.dexlib2.immutable.reference.ImmutableMethodReference @Dependencies( dependencies = [ResourceIdMappingProviderResourcePatch::class, IntegrationsPatch::class, GeneralResourceAdsPatch::class] ) -@Name("general-bytecode-ads") +@Name("general-ads") @Description("Patch to remove general ads in bytecode.") @GeneralAdsCompatibility @Version("0.0.1") diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/annotations/VideoAdsCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/annotations/VideoAdsCompatibility.kt index 761786390..818c11874 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/annotations/VideoAdsCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/annotations/VideoAdsCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/annotation/SeekbarTappingCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/annotation/SeekbarTappingCompatibility.kt index 294b24d6e..1e46ab56a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/annotation/SeekbarTappingCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/annotation/SeekbarTappingCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/amoled/annotations/AmoledCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/amoled/annotations/AmoledCompatibility.kt index 94ae0ce5e..2788fcfbc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/amoled/annotations/AmoledCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/amoled/annotations/AmoledCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/annotations/CreateButtonCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/annotations/CreateButtonCompatibility.kt index e67123f86..7699cf77a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/annotations/CreateButtonCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/annotations/CreateButtonCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/annotations/MinimizedPlaybackCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/annotations/MinimizedPlaybackCompatibility.kt index ef480c97f..e008bceb2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/annotations/MinimizedPlaybackCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/minimizedplayback/annotations/MinimizedPlaybackCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/annotations/OldQualityLayoutCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/annotations/OldQualityLayoutCompatibility.kt index 1239d3b2d..2bc44bef3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/annotations/OldQualityLayoutCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/annotations/OldQualityLayoutCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/annotations/ShortsButtonCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/annotations/ShortsButtonCompatibility.kt index edf135f48..acea2ea77 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/annotations/ShortsButtonCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/shorts/button/annotations/ShortsButtonCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/annotations/IntegrationsCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/annotations/IntegrationsCompatibility.kt index a7b805954..0559bf170 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/annotations/IntegrationsCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/annotations/IntegrationsCompatibility.kt @@ -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", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.03.38", "17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/manifest/annotations/FixLocaleConfigErrorCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/manifest/annotations/FixLocaleConfigErrorCompatibility.kt index d7e47bf81..ff7996895 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/manifest/annotations/FixLocaleConfigErrorCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/manifest/annotations/FixLocaleConfigErrorCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37") + "com.google.android.youtube", arrayOf("17.14.35", "17.17.34", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/annotations/MicroGPatchCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/annotations/MicroGPatchCompatibility.kt index b5f9ef996..d172ffbad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/annotations/MicroGPatchCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/annotations/MicroGPatchCompatibility.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package @Compatibility( [Package( - "com.google.android.youtube", arrayOf("17.14.35", "17.19.36") + "com.google.android.youtube", arrayOf("17.14.35", "17.19.36", "17.20.37", "17.22.36") )] ) @Target(AnnotationTarget.CLASS) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/bytecode/MicroGBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/bytecode/MicroGBytecodePatch.kt index 4b23fe84a..80904a001 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/bytecode/MicroGBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/bytecode/MicroGBytecodePatch.kt @@ -1,24 +1,22 @@ package app.revanced.patches.youtube.misc.microg.patch.bytecode -import app.revanced.extensions.containsAny -import app.revanced.extensions.startsWithAny +import app.revanced.extensions.equalsAny 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.data.implementation.proxy import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.extensions.or +import app.revanced.patcher.patch.annotations.Dependencies +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.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.MutableClass import app.revanced.patcher.util.smali.toInstruction import app.revanced.patcher.util.smali.toInstructions import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility +import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch import app.revanced.patches.youtube.misc.microg.patch.resource.enum.StringReplaceMode import app.revanced.patches.youtube.misc.microg.shared.Constants.BASE_MICROG_PACKAGE_NAME import app.revanced.patches.youtube.misc.microg.shared.Constants.REVANCED_PACKAGE_NAME @@ -26,7 +24,6 @@ import app.revanced.patches.youtube.misc.microg.signatures.GooglePlayUtilitySign import app.revanced.patches.youtube.misc.microg.signatures.IntegrityCheckSignature import app.revanced.patches.youtube.misc.microg.signatures.PrimeSignature import app.revanced.patches.youtube.misc.microg.signatures.ServiceCheckSignature -import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.Opcode import org.jf.dexlib2.builder.MutableMethodImplementation import org.jf.dexlib2.builder.instruction.BuilderInstruction21c @@ -34,8 +31,9 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction21c import org.jf.dexlib2.iface.reference.StringReference import org.jf.dexlib2.immutable.reference.ImmutableStringReference -// @Patch TODO: finish patch -@Name("microg-bytecode-patch") +@Patch(include = false) +@Dependencies(dependencies = [MicroGResourcePatch::class]) +@Name("microg-patch") @Description("Patch to allow YouTube ReVanced to run without root and under a different package name.") @MicroGPatchCompatibility @Version("0.0.1") @@ -59,30 +57,33 @@ class MicroGBytecodePatch : BytecodePatch( val stringValue = ((instruction as Instruction21c).reference as StringReference).string - val replaceMode = - if (stringValue == "com.google" || stringValue == "com.google.android.gms" || - stringValue.startsWithAny( - "com.google.iid", - "com.google.android.gms.chimera", - "com.google.android.c2dm", - ) || stringValue.containsAny( - "com.google.android.gms.auth.accounts", - "com.google.android.gsf", - "content://com.google.settings" - ) - ) { - StringReplaceMode.REPLACE_WITH_MICROG - } else if (stringValue.startsWith("com.google.android.gms.chimera.container")) // https://github.com/TeamVanced/VancedMicroG/pull/139/file - StringReplaceMode.DO_NOT_REPLACE - else if (stringValue.startsWithAny( - "com.google.android.youtube.SuggestionsProvider", - "com.google.android.youtube.fileprovider" - ) - ) { - StringReplaceMode.REPLACE_WITH_REVANCED - } else { - StringReplaceMode.DO_NOT_REPLACE - } + val replaceMode = if (stringValue.equalsAny( + "com.google.android.gms", + "com.google.android.youtube.fileprovider", + "com.google.android.c2dm.intent.REGISTER", + "com.google.android.c2dm.permission.SEND", + "com.google.iid.TOKEN_REQUEST", + "com.google", + "com.google.android.gms.auth.accounts", + "com.google.android.youtube.SuggestionProvider", + "com.google.android.c2dm.intent.REGISTRATION", + "com.google.android.gsf.action.GET_GLS", + "com.google.android.gsf.login", + "content://com.google.settings/partner", + "content://com.google.android.gsf.gservices", + "content://com.google.android.gsf.gservices/prefix", + "com.google.android.c2dm.intent.RECEIVE" + ) + ) { + StringReplaceMode.REPLACE_WITH_MICROG + } else if (stringValue.equalsAny( + "com.google.android.youtube.SuggestionsProvider", "com.google.android.youtube.fileprovider" + ) + ) { + StringReplaceMode.REPLACE_WITH_REVANCED + } else { + StringReplaceMode.DO_NOT_REPLACE + } if (replaceMode != StringReplaceMode.DO_NOT_REPLACE) { if (proxiedClass == null) { @@ -110,20 +111,6 @@ class MicroGBytecodePatch : BytecodePatch( } } - - // replace string back - val implementation = - signatures.elementAt(2).result!!.findParentMethod(@Name("do-not-replace-method") @MatchingMethod( - "Llpe;", "c" - ) @DirectPatternScanMethod @MicroGPatchCompatibility @Version("0.0.1") object : MethodSignature( - "L", AccessFlags.PUBLIC or AccessFlags.STATIC, listOf("L"), null, listOf("com.google.android.gms") - ) {})!!.method.implementation!! - - implementation.replaceInstruction( - implementation.instructions.indexOfFirst { it.opcode == Opcode.CONST_STRING }, - "const-string v0, \"com.google.android.gms\"".toInstruction() - ) - return PatchResultSuccess() } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/resource/MicroGResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/resource/MicroGResourcePatch.kt index 074674f80..b99a62733 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/resource/MicroGResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/patch/resource/MicroGResourcePatch.kt @@ -9,61 +9,53 @@ import app.revanced.patcher.patch.implementation.misc.PatchResult import app.revanced.patcher.patch.implementation.misc.PatchResultSuccess import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility import app.revanced.patches.youtube.misc.microg.shared.Constants.BASE_MICROG_PACKAGE_NAME +import app.revanced.patches.youtube.misc.microg.shared.Constants.REVANCED_APP_NAME import app.revanced.patches.youtube.misc.microg.shared.Constants.REVANCED_PACKAGE_NAME -// @Patch TODO: finish patch @Name("microg-resource-patch") @Description("Resource patch to allow YouTube ReVanced to run without root and under a different package name.") @MicroGPatchCompatibility @Version("0.0.1") class MicroGResourcePatch : ResourcePatch() { override fun execute(data: ResourceData): PatchResult { + data.getXmlEditor("res/xml/settings_fragment.xml").use { + val settingsElementIntent = it.file.createElement("intent") + settingsElementIntent.setAttribute("android:targetPackage", "$BASE_MICROG_PACKAGE_NAME.android.gms") + settingsElementIntent.setAttribute("android:targetClass", "org.microg.gms.ui.SettingsActivity") + + val settingsElement = it.file.createElement("Preference") + settingsElement.setAttribute("android:title", "MicroG") + settingsElement.appendChild(settingsElementIntent) + + it.file.firstChild.appendChild(settingsElement) + } + val manifest = data.get("AndroidManifest.xml").readText() data.get("AndroidManifest.xml").writeText( manifest.replace( - "package=\"com.google.android.youtube\"", "package=\"$REVANCED_PACKAGE_NAME\"" + "package=\"com.google.android.youtube", "package=\"$REVANCED_PACKAGE_NAME" ).replace( - " android:label=\"@string/application_name\" ", " android:label=\"{APP_NAME}\" " + "android:label=\"@string/application_name", "android:label=\"$REVANCED_APP_NAME" ).replace( - "", - " \n " - ) - ) - - val replacement = arrayOf( - Pair( - "com.google.android.youtube.SuggestionProvider", "$REVANCED_PACKAGE_NAME.SuggestionProvider" - ), Pair( "com.google.android.youtube.fileprovider", "$REVANCED_PACKAGE_NAME.fileprovider" + ).replace( + "com.google.android.youtube.SuggestionProvider", "$REVANCED_PACKAGE_NAME.SuggestionProvider" + ).replace( + "com.google.android.youtube.permission.C2D_MESSAGE", "$REVANCED_PACKAGE_NAME.permission.C2D_MESSAGE" + ).replace( // TODO: might not be needed + "com.google.android.youtube.lifecycle-trojan", "$REVANCED_PACKAGE_NAME.lifecycle-trojan" + ).replace( // TODO: might not be needed + "com.google.android.youtube.photopicker_images", "$REVANCED_PACKAGE_NAME.photopicker_images" + ).replace( + "com.google.android.c2dm", "$BASE_MICROG_PACKAGE_NAME.android.c2dm" + ).replace( + "", "" ) ) - data.forEach { - if (it.extension != "xml") return@forEach - - // TODO: use a reader and only replace strings where needed instead of reading & writing the entire file - var content = it.readText() - replacement.filter { translation -> content.contains(translation.first) }.forEach { translation -> - content = content.replace(translation.first, translation.second) - } - it.writeText(content) - } - return PatchResultSuccess() } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/shared/Constants.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/shared/Constants.kt index 768101e0a..5d56903c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/shared/Constants.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/shared/Constants.kt @@ -3,4 +3,5 @@ package app.revanced.patches.youtube.misc.microg.shared object Constants { internal const val BASE_MICROG_PACKAGE_NAME = "com.mgoogle" internal const val REVANCED_PACKAGE_NAME = "app.revanced.android.youtube" + internal const val REVANCED_APP_NAME = "YouTube ReVanced" } \ No newline at end of file