mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-16 07:43:56 +00:00
Compare commits
7 Commits
v2.175.0-d
...
v2.175.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c13ba26234 | ||
|
|
d0ee0de0ca | ||
|
|
fc753cad22 | ||
|
|
9a91eca97a | ||
|
|
9e32835e5a | ||
|
|
06f70f305e | ||
|
|
308b1bc0d2 |
26
CHANGELOG.md
26
CHANGELOG.md
@@ -1,3 +1,29 @@
|
||||
# [2.175.0-dev.16](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.15...v2.175.0-dev.16) (2023-05-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **spoof-wifi-connection:** use updated instruction indices ([#2199](https://github.com/revanced/revanced-patches/issues/2199)) ([76fb700](https://github.com/revanced/revanced-patches/commit/76fb700884dae5b71a57f9530fad9d4a98ba0af0))
|
||||
|
||||
# [2.175.0-dev.15](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.14...v2.175.0-dev.15) (2023-05-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/remember-video-quality:** fix typo in video resolutions ([#2323](https://github.com/revanced/revanced-patches/issues/2323)) ([a99cef8](https://github.com/revanced/revanced-patches/commit/a99cef87b40b67a5feb97999fb4f2925ea80b42e))
|
||||
|
||||
# [2.175.0-dev.14](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.13...v2.175.0-dev.14) (2023-05-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/theme:** use dynamic background color for custom splash screen ([#2319](https://github.com/revanced/revanced-patches/issues/2319)) ([28594f3](https://github.com/revanced/revanced-patches/commit/28594f3eeaf99fa32ee57214ebbc4342529c6694))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **tiktok:** remove compatibility version constraints ([#2306](https://github.com/revanced/revanced-patches/issues/2306)) ([a12c4bb](https://github.com/revanced/revanced-patches/commit/a12c4bb1610234d19b4ac86cd57bb09335566b68))
|
||||
|
||||
# [2.175.0-dev.13](https://github.com/revanced/revanced-patches/compare/v2.175.0-dev.12...v2.175.0-dev.13) (2023-05-29)
|
||||
|
||||
|
||||
|
||||
16
README.md
16
README.md
@@ -89,14 +89,14 @@ The official ReVanced Patches.
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `disable-login-requirement` | Do not force login. | all |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||
| `hide-ads` | Removes ads from TikTok. | all |
|
||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | all |
|
||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `com.zhiliaoapp.musically`](https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
|
||||
@@ -105,14 +105,14 @@ The official ReVanced Patches.
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `disable-login-requirement` | Do not force login. | all |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | 27.8.3 |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | 27.8.3 |
|
||||
| `downloads` | Removes download restrictions and changes the default path to download to. | all |
|
||||
| `feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
|
||||
| `fix-google-login` | Allows logging in with a Google account. | all |
|
||||
| `hide-ads` | Removes ads from TikTok. | all |
|
||||
| `playback-speed` | Enables the playback speed option for all videos. | all |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | 27.8.3 |
|
||||
| `settings` | Adds ReVanced settings to TikTok. | all |
|
||||
| `show-seekbar` | Shows progress bar for all video. | all |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | 27.8.3 |
|
||||
| `sim-spoof` | Spoofs the information which is retrieved from the sim-card. | all |
|
||||
</details>
|
||||
|
||||
### [📦 `tv.twitch.android.app`](https://play.google.com/store/apps/details?id=tv.twitch.android.app)
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
kotlin.code.style = official
|
||||
version = 2.175.0-dev.13
|
||||
version = 2.175.0-dev.16
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object AboutPageFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.CONST, // copyrightPolicyLabel resource id
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CONST_STRING
|
||||
),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/ss/android/ugc/aweme/setting/page/AboutPage;" &&
|
||||
methodDef.name == "onViewCreated"
|
||||
}
|
||||
)
|
||||
@@ -1,37 +0,0 @@
|
||||
package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@FuzzyPatternScanMethod(4)
|
||||
object AboutViewFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.INVOKE_DIRECT_RANGE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_DIRECT_RANGE,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
Opcode.CONST,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.CONST
|
||||
)
|
||||
)
|
||||
@@ -8,7 +8,6 @@ import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.addInstructions
|
||||
import app.revanced.patcher.extensions.instruction
|
||||
import app.revanced.patcher.extensions.replaceInstruction
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.PatchResult
|
||||
import app.revanced.patcher.patch.PatchResultError
|
||||
@@ -17,14 +16,14 @@ import app.revanced.patcher.patch.annotations.DependsOn
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patches.tiktok.misc.integrations.patch.IntegrationsPatch
|
||||
import app.revanced.patches.tiktok.misc.settings.annotations.SettingsCompatibility
|
||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.AboutViewFingerprint
|
||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.AboutPageFingerprint
|
||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.AdPersonalizationActivityOnCreateFingerprint
|
||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsOnViewCreatedFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||
import org.jf.dexlib2.iface.reference.StringReference
|
||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
@Patch
|
||||
@DependsOn([IntegrationsPatch::class])
|
||||
@@ -34,84 +33,92 @@ import org.jf.dexlib2.iface.reference.StringReference
|
||||
@Version("0.0.1")
|
||||
class SettingsPatch : BytecodePatch(
|
||||
listOf(
|
||||
AboutPageFingerprint,
|
||||
AdPersonalizationActivityOnCreateFingerprint,
|
||||
SettingsOnViewCreatedFingerprint,
|
||||
)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
SettingsOnViewCreatedFingerprint.result?.let {
|
||||
AboutViewFingerprint.resolve(context, it.method, it.classDef)
|
||||
}
|
||||
// Patch Settings UI to add 'Revanced Settings'.
|
||||
val targetIndexes = findOptionsOnClickIndex()
|
||||
with(SettingsOnViewCreatedFingerprint.result!!.mutableMethod) {
|
||||
for (index in targetIndexes) {
|
||||
if (
|
||||
instruction(index).opcode != Opcode.NEW_INSTANCE ||
|
||||
instruction(index - 4).opcode != Opcode.MOVE_RESULT_OBJECT
|
||||
)
|
||||
return PatchResultError("Hardcode offset changed.")
|
||||
patchOptionNameAndOnClickEvent(index, context)
|
||||
}
|
||||
}
|
||||
// Implement settings screen in `AdPersonalizationActivity`
|
||||
with(AdPersonalizationActivityOnCreateFingerprint.result!!.mutableMethod) {
|
||||
for ((index, instruction) in implementation!!.instructions.withIndex()) {
|
||||
if (instruction.opcode != Opcode.INVOKE_SUPER) continue
|
||||
val thisRegister = (instruction as Instruction35c).registerC
|
||||
addInstructions(
|
||||
index + 1,
|
||||
SettingsOnViewCreatedFingerprint.result?.mutableMethod?.apply {
|
||||
val instructions = implementation!!.instructions
|
||||
|
||||
// Find the indices that need to be patched.
|
||||
val copyrightPolicyLabelId = AboutPageFingerprint.result?.let {
|
||||
val startIndex = it.scanResult.patternScanResult!!.startIndex
|
||||
it.mutableMethod.instruction<WideLiteralInstruction>(startIndex).wideLiteral
|
||||
} ?: return AboutPageFingerprint.toErrorResult()
|
||||
|
||||
val copyrightIndex = instructions.indexOfFirst {
|
||||
(it as? ReferenceInstruction)?.reference.toString() == "copyright_policy"
|
||||
} - 6
|
||||
|
||||
|
||||
val copyrightPolicyIndex = instructions.indexOfFirst {
|
||||
(it as? WideLiteralInstruction)?.wideLiteral == copyrightPolicyLabelId
|
||||
} + 2
|
||||
|
||||
// Replace an existing settings entry with ReVanced settings entry.
|
||||
arrayOf(
|
||||
copyrightIndex,
|
||||
copyrightPolicyIndex
|
||||
).forEach { index ->
|
||||
val instruction = instruction(index)
|
||||
if (instruction.opcode != Opcode.MOVE_RESULT_OBJECT)
|
||||
return PatchResultError("Hardcoded offset changed.")
|
||||
|
||||
val settingsEntryStringRegister = (instruction as OneRegisterInstruction).registerA
|
||||
|
||||
// Replace the settings entry string with a custom one.
|
||||
replaceInstruction(
|
||||
index,
|
||||
"""
|
||||
invoke-static {v$thisRegister}, Lapp/revanced/tiktok/settingsmenu/SettingsMenu;->initializeSettings(Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;)V
|
||||
const-string v$settingsEntryStringRegister, "ReVanced Settings"
|
||||
"""
|
||||
)
|
||||
|
||||
// Replace the OnClickListener class with a custom one.
|
||||
val onClickListener = instruction<ReferenceInstruction>(index + 4).reference.toString()
|
||||
|
||||
context.findClass(onClickListener)?.mutableClass?.methods?.first {
|
||||
it.name == "onClick"
|
||||
}?.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->startSettingsActivity()V
|
||||
return-void
|
||||
"""
|
||||
)
|
||||
break
|
||||
) ?: return PatchResultError("Could not find the onClick method.")
|
||||
}
|
||||
}
|
||||
|
||||
} ?: return SettingsOnViewCreatedFingerprint.toErrorResult()
|
||||
|
||||
// Initialize the settings menu once the replaced setting entry is clicked.
|
||||
AdPersonalizationActivityOnCreateFingerprint.result?.mutableMethod?.apply {
|
||||
val initializeSettingsIndex = implementation!!.instructions.indexOfFirst {
|
||||
it.opcode == Opcode.INVOKE_SUPER
|
||||
} + 1
|
||||
|
||||
val thisRegister = instruction<FiveRegisterInstruction>(initializeSettingsIndex - 1).registerC
|
||||
|
||||
addInstructions(
|
||||
initializeSettingsIndex,
|
||||
"""
|
||||
invoke-static {v$thisRegister}, $INITIALIZE_SETTINGS_METHOD_DESCRIPTOR
|
||||
return-void
|
||||
"""
|
||||
)
|
||||
} ?: return AdPersonalizationActivityOnCreateFingerprint.toErrorResult()
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
private fun findOptionsOnClickIndex(): IntArray {
|
||||
val results = IntArray(2)
|
||||
SettingsOnViewCreatedFingerprint.result?.apply {
|
||||
for ((index, instruction) in mutableMethod.implementation!!.instructions.withIndex()) {
|
||||
// Old UI settings option to replace to 'Revanced Settings'
|
||||
if (instruction.opcode == Opcode.CONST_STRING) {
|
||||
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
|
||||
if (string == "copyright_policy") {
|
||||
results[0] = index - 2
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
private companion object {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/tiktok/settingsmenu/SettingsMenu;"
|
||||
|
||||
// New UI settings option to replace to 'Revanced Settings'
|
||||
results[1] = AboutViewFingerprint.result!!.scanResult.patternScanResult!!.startIndex
|
||||
} ?: throw SettingsOnViewCreatedFingerprint.toErrorResult()
|
||||
return results
|
||||
}
|
||||
|
||||
private fun patchOptionNameAndOnClickEvent(index: Int, context: BytecodeContext) {
|
||||
with(SettingsOnViewCreatedFingerprint.result!!.mutableMethod) {
|
||||
// Patch option name
|
||||
val overrideRegister = instruction<OneRegisterInstruction>(index - 4).registerA
|
||||
replaceInstruction(
|
||||
index - 4,
|
||||
"""
|
||||
const-string v$overrideRegister, "Revanced Settings"
|
||||
"""
|
||||
)
|
||||
|
||||
// Patch option OnClick Event
|
||||
val type = instruction<ReferenceInstruction>(index).reference.toString()
|
||||
context.findClass(type)!!.mutableClass.methods.first { type == "onClick" }.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsMenu;->startSettingsActivity()V
|
||||
return-void
|
||||
"""
|
||||
)
|
||||
}
|
||||
private const val INITIALIZE_SETTINGS_METHOD_DESCRIPTOR =
|
||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->initializeSettings(" +
|
||||
"Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" +
|
||||
")V"
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,8 @@ import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[
|
||||
Package("com.ss.android.ugc.trill", arrayOf("27.8.3")),
|
||||
Package("com.zhiliaoapp.musically", arrayOf("27.8.3"))
|
||||
Package("com.ss.android.ugc.trill"),
|
||||
Package("com.zhiliaoapp.musically")
|
||||
]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
|
||||
@@ -49,7 +49,7 @@ class ThemeBytecodePatch : BytecodePatch() {
|
||||
var splashScreenBackgroundColor: String? by option(
|
||||
PatchOption.StringOption(
|
||||
key = "splashScreenBackgroundColor",
|
||||
default = "@android:color/black",
|
||||
default = "?android:attr/colorBackground",
|
||||
title = "Background color for the splash screen",
|
||||
description = "The background color of the splash screen. Can be a hex color or a resource reference.",
|
||||
)
|
||||
|
||||
@@ -51,7 +51,7 @@ class RememberVideoQualityPatch : BytecodePatch(
|
||||
StringResource("revanced_video_quality_default_entry_5", "720p"),
|
||||
StringResource("revanced_video_quality_default_entry_6", "480p"),
|
||||
StringResource("revanced_video_quality_default_entry_7", "360p"),
|
||||
StringResource("revanced_video_quality_default_entry_8", "280p"),
|
||||
StringResource("revanced_video_quality_default_entry_8", "240p"),
|
||||
StringResource("revanced_video_quality_default_entry_9", "144p"),
|
||||
)
|
||||
val entryValues = listOf(
|
||||
@@ -62,7 +62,7 @@ class RememberVideoQualityPatch : BytecodePatch(
|
||||
StringResource("revanced_video_quality_default_entry_value_5", "720"),
|
||||
StringResource("revanced_video_quality_default_entry_value_6", "480"),
|
||||
StringResource("revanced_video_quality_default_entry_value_7", "360"),
|
||||
StringResource("revanced_video_quality_default_entry_value_8", "280"),
|
||||
StringResource("revanced_video_quality_default_entry_value_8", "240"),
|
||||
StringResource("revanced_video_quality_default_entry_value_9", "144"),
|
||||
)
|
||||
|
||||
|
||||
@@ -21,39 +21,44 @@ internal abstract class AbstractTransformInstructionsPatch<T> : BytecodePatch()
|
||||
|
||||
abstract fun transform(mutableMethod: MutableMethod, entry: T)
|
||||
|
||||
// Returns the patch indices as a Sequence, which will execute lazily.
|
||||
private fun findPatchIndices(classDef: ClassDef, method: Method): Sequence<T>? {
|
||||
return method.implementation?.instructions?.asSequence()?.withIndex()?.mapNotNull { (index, instruction) ->
|
||||
filterMap(classDef, method, instruction, index)
|
||||
}
|
||||
}
|
||||
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
// Find all instructions
|
||||
// Find all methods to patch
|
||||
buildMap {
|
||||
context.classes.forEach { classDef ->
|
||||
classDef.methods.let { methods ->
|
||||
buildMap methodList@{
|
||||
methods.forEach methods@{ method ->
|
||||
with(method.implementation?.instructions ?: return@methods) {
|
||||
ArrayDeque<T>().also { patchIndices ->
|
||||
this.forEachIndexed { index, instruction ->
|
||||
val result = filterMap(classDef, method, instruction, index)
|
||||
if (result != null) {
|
||||
patchIndices.add(result)
|
||||
}
|
||||
}
|
||||
}.also { if (it.isEmpty()) return@methods }.let { patches ->
|
||||
put(method, patches)
|
||||
}
|
||||
}
|
||||
val methods = buildList {
|
||||
classDef.methods.forEach { method ->
|
||||
// Since the Sequence executes lazily,
|
||||
// using any() results in only calling
|
||||
// filterMap until the first index has been found.
|
||||
val patchIndices = findPatchIndices(classDef, method)
|
||||
|
||||
if (patchIndices?.any() == true) {
|
||||
add(method)
|
||||
}
|
||||
}
|
||||
}.also { if (it.isEmpty()) return@forEach }.let { methodPatches ->
|
||||
put(classDef, methodPatches)
|
||||
}
|
||||
|
||||
if (methods.isNotEmpty()) {
|
||||
put(classDef, methods)
|
||||
}
|
||||
}
|
||||
}.forEach { (classDef, methods) ->
|
||||
// And finally transform the instructions...
|
||||
with(context.proxy(classDef).mutableClass) {
|
||||
methods.forEach { (method, patches) ->
|
||||
val mutableMethod = findMutableMethodOf(method)
|
||||
while (!patches.isEmpty()) {
|
||||
transform(mutableMethod, patches.removeLast())
|
||||
}
|
||||
// And finally transform the methods...
|
||||
val mutableClass = context.proxy(classDef).mutableClass
|
||||
|
||||
methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod ->
|
||||
val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque())
|
||||
?: return@methods
|
||||
|
||||
while (!patchIndices.isEmpty()) {
|
||||
transform(mutableMethod, patchIndices.removeLast())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user