From dd8b01a5c5d75b00ea4d04ce35bc43942c1b0409 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 13 Jun 2022 01:22:28 +0200 Subject: [PATCH] perf: fix high battery consumption due to chromecast not working with `microg` --- .../patch/bytecode/MicroGBytecodePatch.kt | 32 ++++++++++++++----- .../signatures/CastContextFetchSignature.kt | 20 ++++++++++++ .../signatures/CastDynamiteModuleSignature.kt | 20 ++++++++++++ .../CastDynamiteModuleV2Signature.kt | 20 ++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastContextFetchSignature.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleSignature.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleV2Signature.kt 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 80904a001..8d24995e0 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 @@ -20,13 +20,11 @@ import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePat 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 -import app.revanced.patches.youtube.misc.microg.signatures.GooglePlayUtilitySignature -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 app.revanced.patches.youtube.misc.microg.signatures.* import org.jf.dexlib2.Opcode import org.jf.dexlib2.builder.MutableMethodImplementation import org.jf.dexlib2.builder.instruction.BuilderInstruction21c +import org.jf.dexlib2.builder.instruction.BuilderInstruction21s import org.jf.dexlib2.iface.instruction.formats.Instruction21c import org.jf.dexlib2.iface.reference.StringReference import org.jf.dexlib2.immutable.reference.ImmutableStringReference @@ -39,12 +37,17 @@ import org.jf.dexlib2.immutable.reference.ImmutableStringReference @Version("0.0.1") class MicroGBytecodePatch : BytecodePatch( listOf( - IntegrityCheckSignature, ServiceCheckSignature, GooglePlayUtilitySignature, PrimeSignature + IntegrityCheckSignature, + ServiceCheckSignature, + GooglePlayUtilitySignature, + CastDynamiteModuleSignature, + CastDynamiteModuleV2Signature, + CastContextFetchSignature, + PrimeSignature, ) ) { override fun execute(data: BytecodeData): PatchResult { - // smali patches - disablePlayServiceChecks() + disablePlayServiceChecksAndFixCastIssues() data.classes.forEach { classDef -> var proxiedClass: MutableClass? = null @@ -52,6 +55,18 @@ class MicroGBytecodePatch : BytecodePatch( val implementation = method.implementation ?: return@methodLoop var proxiedImplementation: MutableMethodImplementation? = null + + // disable cast button since it is unsupported by microg and causes battery issues + // the code is here instead of the fixCastIssues method because we do not need a signature this way + if (classDef.type.endsWith("MediaRouteButton;") && method.name == "setVisibility") { + proxiedClass = data.proxy(classDef).resolve() + proxiedImplementation = proxiedClass!!.methods.first { it.name == "setVisibility" }.implementation + + proxiedImplementation!!.replaceInstruction( + 0, BuilderInstruction21s(Opcode.CONST_16, 1, 8) // 8 == HIDDEN + ) + } + implementation.instructions.forEachIndexed { i, instruction -> if (instruction.opcode != Opcode.CONST_STRING) return@forEachIndexed @@ -111,10 +126,11 @@ class MicroGBytecodePatch : BytecodePatch( } } + signatures.last() return PatchResultSuccess() } - private fun disablePlayServiceChecks() { + private fun disablePlayServiceChecksAndFixCastIssues() { for (i in 0 until signatures.count() - 1) { val result = signatures.elementAt(i).result!! val stringInstructions = when (result.immutableMethod.returnType.first()) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastContextFetchSignature.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastContextFetchSignature.kt new file mode 100644 index 000000000..cb1d94399 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastContextFetchSignature.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.youtube.misc.microg.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.DirectPatternScanMethod +import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod +import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility + +@Name("cast-context-fetch-signature") +@MatchingMethod( + "Lvvz;", "a" +) +@DirectPatternScanMethod +@MicroGPatchCompatibility +@Version("0.0.1") +object CastContextFetchSignature : MethodSignature( + null, null, null, null, + listOf("Error fetching CastContext.") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleSignature.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleSignature.kt new file mode 100644 index 000000000..25cecd32c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleSignature.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.youtube.misc.microg.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.DirectPatternScanMethod +import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod +import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility + +@Name("cast-module-signature") +@MatchingMethod( + "Llqh;", "c" +) +@DirectPatternScanMethod +@MicroGPatchCompatibility +@Version("0.0.1") +object CastDynamiteModuleSignature : MethodSignature( + null, null, null, null, + listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleV2Signature.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleV2Signature.kt new file mode 100644 index 000000000..5fda66f00 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/microg/signatures/CastDynamiteModuleV2Signature.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.youtube.misc.microg.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.DirectPatternScanMethod +import app.revanced.patcher.signature.implementation.method.annotation.MatchingMethod +import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility + +@Name("cast-context-fetch-signature") +@MatchingMethod( + "Lmcf;", "c" +) +@DirectPatternScanMethod +@MicroGPatchCompatibility +@Version("0.0.1") +object CastDynamiteModuleV2Signature : MethodSignature( + null, null, null, null, + listOf("Failed to load module via V2: ") +) \ No newline at end of file