refactor(YouTube Music - Custom branding): Resolve startup app crash when patching unsupported newer app versions

This commit is contained in:
LisoUseInAIKyrios
2025-11-10 11:22:00 +02:00
parent 1d8e977a43
commit a39ef1e0a4
2 changed files with 29 additions and 18 deletions

View File

@@ -5,6 +5,7 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Color; import android.graphics.Color;
import android.view.View;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -71,6 +72,17 @@ public class CustomBrandingPatch {
} }
} }
/**
* Injection point.
*/
public static View getLottieViewOrNull(View lottieStartupView) {
if (BaseSettings.CUSTOM_BRANDING_ICON.get() == BrandingTheme.ORIGINAL) {
return lottieStartupView;
}
return null;
}
/** /**
* Injection point. * Injection point.
*/ */

View File

@@ -1,24 +1,24 @@
package app.revanced.patches.music.layout.branding package app.revanced.patches.music.layout.branding
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.gms.Constants.MUSIC_MAIN_ACTIVITY_NAME import app.revanced.patches.music.misc.gms.Constants.MUSIC_MAIN_ACTIVITY_NAME
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint
import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.shared.layout.branding.EXTENSION_CLASS_DESCRIPTOR
import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch
import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.get
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.mapping.resourceMappings
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversed
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
private val disableSplashAnimationPatch = bytecodePatch { private val disableSplashAnimationPatch = bytecodePatch {
@@ -33,23 +33,22 @@ private val disableSplashAnimationPatch = bytecodePatch {
// but the animation is not always the same size as the launch screen and it's still // but the animation is not always the same size as the launch screen and it's still
// barely shown. Instead turn off the animation entirely (app will also launch a little faster). // barely shown. Instead turn off the animation entirely (app will also launch a little faster).
cairoSplashAnimationConfigFingerprint.method.apply { cairoSplashAnimationConfigFingerprint.method.apply {
val mainActivityLaunchAnimation = resourceMappings["layout", "main_activity_launch_animation"]
val literalIndex = indexOfFirstLiteralInstructionOrThrow( val literalIndex = indexOfFirstLiteralInstructionOrThrow(
mainActivityLaunchAnimation resourceMappings["layout", "main_activity_launch_animation"]
) )
val insertIndex = indexOfFirstInstructionReversed(literalIndex) { val checkCastIndex = indexOfFirstInstructionOrThrow(literalIndex) {
this.opcode == Opcode.INVOKE_VIRTUAL && opcode == Opcode.CHECK_CAST &&
getReference<MethodReference>()?.name == "setContentView" getReference<TypeReference>()?.type == "Lcom/airbnb/lottie/LottieAnimationView;"
} + 1 }
val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { val register = getInstruction<OneRegisterInstruction>(checkCastIndex).registerA
opcode == Opcode.INVOKE_VIRTUAL &&
getReference<MethodReference>()?.parameterTypes?.firstOrNull() == "Ljava/lang/Runnable;"
} + 1
addInstructionsWithLabels( // If using a custom icon then set the lottie animation view to null to bypasses the startup animation.
insertIndex, addInstructions(
"goto :skip_animation", checkCastIndex,
ExternalLabel("skip_animation", getInstruction(jumpIndex)) """
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getLottieViewOrNull(Landroid/view/View;)Landroid/view/View;
move-result-object v$register
"""
) )
} }
} }