perf: fix high battery consumption due to chromecast not working with microg

This commit is contained in:
oSumAtrIX 2022-06-13 01:22:28 +02:00
parent 9a063d4175
commit dd8b01a5c5
No known key found for this signature in database
GPG key ID: A9B3094ACDB604B4
4 changed files with 84 additions and 8 deletions

View file

@ -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.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.BASE_MICROG_PACKAGE_NAME
import app.revanced.patches.youtube.misc.microg.shared.Constants.REVANCED_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.*
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.Opcode import org.jf.dexlib2.Opcode
import org.jf.dexlib2.builder.MutableMethodImplementation import org.jf.dexlib2.builder.MutableMethodImplementation
import org.jf.dexlib2.builder.instruction.BuilderInstruction21c 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.instruction.formats.Instruction21c
import org.jf.dexlib2.iface.reference.StringReference import org.jf.dexlib2.iface.reference.StringReference
import org.jf.dexlib2.immutable.reference.ImmutableStringReference import org.jf.dexlib2.immutable.reference.ImmutableStringReference
@ -39,12 +37,17 @@ import org.jf.dexlib2.immutable.reference.ImmutableStringReference
@Version("0.0.1") @Version("0.0.1")
class MicroGBytecodePatch : BytecodePatch( class MicroGBytecodePatch : BytecodePatch(
listOf( listOf(
IntegrityCheckSignature, ServiceCheckSignature, GooglePlayUtilitySignature, PrimeSignature IntegrityCheckSignature,
ServiceCheckSignature,
GooglePlayUtilitySignature,
CastDynamiteModuleSignature,
CastDynamiteModuleV2Signature,
CastContextFetchSignature,
PrimeSignature,
) )
) { ) {
override fun execute(data: BytecodeData): PatchResult { override fun execute(data: BytecodeData): PatchResult {
// smali patches disablePlayServiceChecksAndFixCastIssues()
disablePlayServiceChecks()
data.classes.forEach { classDef -> data.classes.forEach { classDef ->
var proxiedClass: MutableClass? = null var proxiedClass: MutableClass? = null
@ -52,6 +55,18 @@ class MicroGBytecodePatch : BytecodePatch(
val implementation = method.implementation ?: return@methodLoop val implementation = method.implementation ?: return@methodLoop
var proxiedImplementation: MutableMethodImplementation? = null 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 -> implementation.instructions.forEachIndexed { i, instruction ->
if (instruction.opcode != Opcode.CONST_STRING) return@forEachIndexed if (instruction.opcode != Opcode.CONST_STRING) return@forEachIndexed
@ -111,10 +126,11 @@ class MicroGBytecodePatch : BytecodePatch(
} }
} }
signatures.last()
return PatchResultSuccess() return PatchResultSuccess()
} }
private fun disablePlayServiceChecks() { private fun disablePlayServiceChecksAndFixCastIssues() {
for (i in 0 until signatures.count() - 1) { for (i in 0 until signatures.count() - 1) {
val result = signatures.elementAt(i).result!! val result = signatures.elementAt(i).result!!
val stringInstructions = when (result.immutableMethod.returnType.first()) { val stringInstructions = when (result.immutableMethod.returnType.first()) {

View file

@ -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.")
)

View file

@ -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")
)

View file

@ -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: ")
)