From 1489378ffd7634d0290185e20b0aa7b9cec91c1d Mon Sep 17 00:00:00 2001 From: zarzet Date: Fri, 19 Jun 2026 00:50:52 +0700 Subject: [PATCH] fix(android): disable Impeller on Sony audio players and Vivante GPUs The GL renderer string is empty when Flutter shell args are built (no GL context yet), so the GPU-pattern check never matched Sony Walkman devices and Impeller crashed in the Vivante driver's glLinkProgram. Match MANUFACTURER 'SonyAudio' (distinct from Xperia 'Sony') and add Vivante GC GPU patterns. --- .../kotlin/com/zarz/spotiflac/MainActivity.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/android/app/src/main/kotlin/com/zarz/spotiflac/MainActivity.kt b/android/app/src/main/kotlin/com/zarz/spotiflac/MainActivity.kt index 97e9e262..935e28c3 100644 --- a/android/app/src/main/kotlin/com/zarz/spotiflac/MainActivity.kt +++ b/android/app/src/main/kotlin/com/zarz/spotiflac/MainActivity.kt @@ -148,8 +148,15 @@ class MainActivity: FlutterFragmentActivity() { "mali-t7", "powervr sgx", "powervr ge8320", + "vivante", "gc1000", "gc2000", + "gc4000", + "gc5000", + "gc7000", + "gc8000", + "gc820", + "gc880", ) private val PROBLEMATIC_CHIPSETS = listOf( @@ -163,6 +170,15 @@ class MainActivity: FlutterFragmentActivity() { "apq8084", ) + // Sony Walkman / audio players report MANUFACTURER "SonyAudio" (distinct + // from Xperia phones, which use "Sony"). They ship legacy Vivante GPUs + // whose drivers crash in glLinkProgram with Impeller shaders, and the GL + // renderer string is unavailable when shell args are built, so match on + // the manufacturer instead. + private val PROBLEMATIC_MANUFACTURERS = listOf( + "sonyaudio", + ) + private val PROBLEMATIC_MODELS = listOf( "sm-t220", "sm-t225", @@ -173,6 +189,14 @@ class MainActivity: FlutterFragmentActivity() { val board = Build.BOARD.lowercase(Locale.ROOT) val model = Build.MODEL.lowercase(Locale.ROOT) val device = Build.DEVICE.lowercase(Locale.ROOT) + val manufacturer = Build.MANUFACTURER.lowercase(Locale.ROOT) + + for (problematicManufacturer in PROBLEMATIC_MANUFACTURERS) { + if (manufacturer.contains(problematicManufacturer)) { + android.util.Log.i("SpotiFLAC", "Matched problematic manufacturer: $problematicManufacturer") + return true + } + } for (problematicModel in PROBLEMATIC_MODELS) { if (model.contains(problematicModel) || device.contains(problematicModel)) {