chore: lint code

This commit is contained in:
inotia00 2024-03-22 23:53:17 +09:00
parent 9f0e512283
commit 49727dfb3a
11 changed files with 116 additions and 69 deletions

View File

@ -14,12 +14,9 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.music.utils.settings.CategoryType
import app.revanced.patches.music.utils.settings.SettingsPatch
import app.revanced.util.exception
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.Opcode
import app.revanced.util.getTargetIndexWithMethodReferenceName
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Patch(
name = "Hide handle",
@ -61,19 +58,12 @@ object HideHandlePatch : BytecodePatch(
AccountSwitcherAccessibilityLabelFingerprint.result?.let { result ->
result.mutableMethod.apply {
val textColorIndex = indexOfFirstInstruction {
getReference<MethodReference>()?.name == "setTextColor"
}
val setTextIndex = implementation!!.instructions.let {
textColorIndex + it.subList(textColorIndex, textColorIndex + 10).indexOfFirst { instruction ->
instruction.opcode == Opcode.INVOKE_VIRTUAL
&& instruction.getReference<MethodReference>()?.name == "setVisibility"
}
}
val textViewInstruction = getInstruction<Instruction35c>(setTextIndex)
val textColorIndex = getTargetIndexWithMethodReferenceName("setTextColor")
val setVisibilityIndex = getTargetIndexWithMethodReferenceName(textColorIndex, "setVisibility")
val textViewInstruction = getInstruction<FiveRegisterInstruction>(setVisibilityIndex)
replaceInstruction(
setTextIndex,
setVisibilityIndex,
"invoke-static {v${textViewInstruction.registerC}, v${textViewInstruction.registerD}}, $ACCOUNT->hideHandle(Landroid/widget/TextView;I)V"
)
}

View File

@ -1,13 +1,10 @@
package app.revanced.patches.music.general.floatingbutton.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object FloatingButtonFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
parameters = listOf("L"),
opcodes = listOf(Opcode.AND_INT_LIT16)
)

View File

@ -16,7 +16,7 @@ object HistoryMenuItemOfflineTabFingerprint : MethodFingerprint(
Opcode.INVOKE_INTERFACE,
Opcode.RETURN_VOID
),
customFingerprint = { methodDef, classDef ->
customFingerprint = { methodDef, _ ->
methodDef.containsWideLiteralInstructionIndex(HistoryMenuItem)
&& methodDef.containsWideLiteralInstructionIndex(OfflineSettingsMenuItem)
}

View File

@ -9,7 +9,6 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.music.general.startpage.fingerprints.ColdStartUpFingerprint
import app.revanced.patches.music.utils.integrations.Constants.GENERAL
import app.revanced.patches.music.utils.intenthook.IntentHookPatch
import app.revanced.patches.music.utils.settings.CategoryType
import app.revanced.patches.music.utils.settings.SettingsPatch
import app.revanced.patches.music.utils.settings.SettingsPatch.contexts
@ -20,10 +19,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Patch(
name = "Change start page",
description = "Adds an option to set which page the app opens in instead of the homepage.",
dependencies = [
IntentHookPatch::class,
SettingsPatch::class
],
dependencies = [SettingsPatch::class],
compatiblePackages = [
CompatiblePackage(
"com.google.android.apps.youtube.music",

View File

@ -10,7 +10,7 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.music.misc.tastebuilder.fingerprints.TasteBuilderConstructorFingerprint
import app.revanced.patches.music.misc.tastebuilder.fingerprints.TasteBuilderSyntheticFingerprint
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTastebuilderShelf
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTasteBuilderShelf
import app.revanced.util.exception
import app.revanced.util.getTargetIndex
import app.revanced.util.getWideLiteralInstructionIndex
@ -49,7 +49,7 @@ object TasteBuilderPatch : BytecodePatch(
parentResult.mutableMethod.apply {
val freeRegister = implementation!!.registerCount - parameters.size - 2
val constIndex = getWideLiteralInstructionIndex(MusicTastebuilderShelf)
val constIndex = getWideLiteralInstructionIndex(MusicTasteBuilderShelf)
val targetIndex = getTargetIndex(constIndex, Opcode.MOVE_RESULT_OBJECT)
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA

View File

@ -1,12 +1,12 @@
package app.revanced.patches.music.misc.tastebuilder.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTastebuilderShelf
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTasteBuilderShelf
import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
object TasteBuilderConstructorFingerprint : LiteralValueFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
literalSupplier = { MusicTastebuilderShelf }
literalSupplier = { MusicTasteBuilderShelf }
)

View File

@ -32,7 +32,7 @@ object SharedResourceIdPatch : ResourcePatch() {
var MiniPlayerPlayPauseReplayButton: Long = -1
var MusicMenuLikeButtons: Long = -1
var MusicNotifierShelf: Long = -1
var MusicTastebuilderShelf: Long = -1
var MusicTasteBuilderShelf: Long = -1
var NamesInactiveAccountThumbnailSize: Long = -1
var OfflineSettingsMenuItem: Long = -1
var PlayerCastMediaRouteButton: Long = -1

View File

@ -11,9 +11,14 @@ import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH
import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL
import app.revanced.patches.youtube.utils.litho.LithoFilterPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.exception
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import app.revanced.util.getTargetIndex
import app.revanced.util.getTargetIndexWithMethodReferenceName
import app.revanced.util.getWideLiteralInstructionIndex
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
@Patch(
name = "Hide handle",
@ -66,13 +71,15 @@ object HideHandlePatch : BytecodePatch(
AccountSwitcherAccessibilityLabelFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.endIndex - 2
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
val constIndex = getWideLiteralInstructionIndex(AccountSwitcherAccessibility)
val insertIndex = getTargetIndex(constIndex, Opcode.IF_EQZ)
val setVisibilityIndex = getTargetIndexWithMethodReferenceName(insertIndex, "setVisibility")
val visibilityRegister = getInstruction<FiveRegisterInstruction>(setVisibilityIndex).registerD
addInstructions(
targetIndex + 2, """
invoke-static {v$targetRegister}, $GENERAL->hideHandle(I)I
move-result v$targetRegister
insertIndex, """
invoke-static {v$visibilityRegister}, $GENERAL->hideHandle(I)I
move-result v$visibilityRegister
"""
)
}

View File

@ -2,19 +2,9 @@ package app.revanced.patches.youtube.general.handle.fingerprints
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility
import app.revanced.util.fingerprint.LiteralValueFingerprint
import com.android.tools.smali.dexlib2.Opcode
object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint(
returnType = "V",
parameters = listOf("L", "Ljava/lang/Object;"),
opcodes = listOf(
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.NEW_ARRAY,
Opcode.CONST_4,
Opcode.APUT_OBJECT,
Opcode.CONST
),
literalSupplier = { AccountSwitcherAccessibility }
)

View File

@ -11,17 +11,11 @@ import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR
import app.revanced.patches.youtube.utils.overridequality.OverrideQualityHookPatch
import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.TotalTime
import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.exception
import app.revanced.util.getReference
import app.revanced.util.getTargetIndex
import app.revanced.util.getWideLiteralInstructionIndex
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.Opcode
import app.revanced.util.getTargetIndexWithMethodReferenceName
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Patch(
name = "Append time stamps information",
@ -71,14 +65,11 @@ object AppendTimeStampInformationPatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
TotalTimeFingerprint.result?.let {
it.mutableMethod.apply {
val constIndex = getWideLiteralInstructionIndex(TotalTime)
val charSequenceIndex = getTargetIndex(constIndex, Opcode.MOVE_RESULT_OBJECT)
val charSequenceIndex = getTargetIndexWithMethodReferenceName("getString") + 1
val charSequenceRegister = getInstruction<OneRegisterInstruction>(charSequenceIndex).registerA
val textViewIndex = indexOfFirstInstruction {
getReference<MethodReference>()?.name == "getText"
}
val textViewIndex = getTargetIndexWithMethodReferenceName("getText")
val textViewRegister =
getInstruction<Instruction35c>(textViewIndex).registerC
getInstruction<FiveRegisterInstruction>(textViewIndex).registerC
addInstructions(
textViewIndex, """

View File

@ -1,3 +1,5 @@
@file:Suppress("unused")
package app.revanced.util
import app.revanced.patcher.data.BytecodeContext
@ -15,6 +17,8 @@ import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.Reference
import com.android.tools.smali.dexlib2.util.MethodUtil
@ -109,6 +113,9 @@ fun Method.getStringInstructionIndex(value: String) = implementation?.let {
fun Method.containsWideLiteralInstructionIndex(literal: Long) =
getWideLiteralInstructionIndex(literal) >= 0
fun Method.containsMethodReferenceNameInstructionIndex(methodName: String) =
getTargetIndexWithMethodReferenceName(methodName) >= 0
/**
* Traverse the class hierarchy starting from the given root class.
*
@ -136,14 +143,10 @@ fun BytecodeContext.traverseClassHierarchy(
inline fun <reified T : Reference> Instruction.getReference() =
(this as? ReferenceInstruction)?.reference as? T
/**
* Get the index of the first [Instruction] that matches the predicate.
*
* @param predicate The predicate to match.
* @return The index of the first [Instruction] that matches the predicate.
*/
fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) =
this.implementation!!.instructions.indexOfFirst(predicate)
fun MutableMethod.getTargetIndex(opcode: Opcode) = getTargetIndex(0, opcode)
fun MutableMethod.getTargetIndexReversed(opcode: Opcode) =
getTargetIndex(implementation!!.instructions.size - 1, opcode)
fun MutableMethod.getTargetIndex(startIndex: Int, opcode: Opcode) =
implementation!!.instructions.let {
@ -159,7 +162,80 @@ fun MutableMethod.getTargetIndexReversed(startIndex: Int, opcode: Opcode): Int {
return index
}
throw PatchException("Failed to find target index")
return -1
}
fun Method.getTargetIndexWithFieldReferenceType(returnType: String) = implementation?.let {
it.instructions.indexOfFirst { instruction ->
instruction.getReference<FieldReference>()?.type == returnType
}
} ?: -1
fun MutableMethod.getTargetIndexWithFieldReferenceTypeReversed(returnType: String)
= getTargetIndexWithFieldReferenceTypeReversed(implementation!!.instructions.size - 1, returnType)
fun MutableMethod.getTargetIndexWithFieldReferenceType(startIndex: Int, returnType: String) =
implementation!!.instructions.let {
startIndex + it.subList(startIndex, it.size - 1).indexOfFirst { instruction ->
instruction.getReference<FieldReference>()?.type == returnType
}
}
fun MutableMethod.getTargetIndexWithFieldReferenceTypeReversed(startIndex: Int, returnType: String): Int {
for (index in startIndex downTo 0) {
val instruction = getInstruction(index)
if (instruction.getReference<FieldReference>()?.type != returnType)
continue
return index
}
return -1
}
fun Method.getTargetIndexWithMethodReferenceName(methodName: String) = implementation?.let {
it.instructions.indexOfFirst { instruction ->
instruction.getReference<MethodReference>()?.name == methodName
}
} ?: -1
fun MutableMethod.getTargetIndexWithMethodReferenceNameReversed(methodName: String)
= getTargetIndexWithMethodReferenceNameReversed(implementation!!.instructions.size - 1, methodName)
fun MutableMethod.getTargetIndexWithMethodReferenceName(startIndex: Int, methodName: String) =
implementation!!.instructions.let {
startIndex + it.subList(startIndex, it.size - 1).indexOfFirst { instruction ->
instruction.getReference<MethodReference>()?.name == methodName
}
}
fun MutableMethod.getTargetIndexWithMethodReferenceNameReversed(startIndex: Int, methodName: String): Int {
for (index in startIndex downTo 0) {
val instruction = getInstruction(index)
if (instruction.getReference<MethodReference>()?.name != methodName)
continue
return index
}
return -1
}
fun MutableMethod.getTargetIndexWithReference(startIndex: Int, reference: String) =
implementation!!.instructions.let {
startIndex + it.subList(startIndex, it.size - 1).indexOfFirst { instruction ->
(instruction as? ReferenceInstruction)?.reference.toString().contains(reference)
}
}
fun MutableMethod.getTargetIndexWithReferenceReversed(startIndex: Int, reference: String): Int {
for (index in startIndex downTo 0) {
val instruction = getInstruction(index)
if (!(instruction as? ReferenceInstruction)?.reference.toString().contains(reference))
continue
return index
}
return -1
}
fun BytecodeContext.updatePatchStatus(