fix(qr-scan): R8/ProGuard zerstörte ML-Kit-Komponenten-Registrierung

Root Cause endlich gefunden (via adb-Logcat auf echtem T10-Pro-Tablet):
NICHT primär ein Hardware/CameraX-Problem, sondern R8-Minifizierung im
Release-Build ohne Keep-Regeln für ML Kit (mobile_scanner nutzt Reflection-
basierte Komponenten-Registrierung, ComponentDiscovery). Log zeigte
"NoSuchMethodException: ...BarcodeRegistrar.<init> []" → in Folge
NullPointerException beim eigentlichen Scan-Callback.

Fix: android/app/build.gradle.kts explizit isMinifyEnabled=true +
proguardFiles inkl. neuer android/app/proguard-rules.pro mit ML-Kit-Keep-
Regeln. Damit war auch der vorherige Downgrade auf mobile_scanner 5.2.3
unnötig – zurück auf ^6.0.2, funktioniert jetzt mit den Keep-Regeln
einwandfrei (auf echtem Gerät verifiziert).

Die vorherige cameraResolution/formats-Einschränkung (v0.1.8) war ein
Fehlschluss (Symptom sah nach Hardware-Inkompatibilität aus), bleibt aber
als sinnvolle Optimierung bestehen (weniger Codec-Last).

v0.1.10+11, deployed 137, release-signiert (gleicher Fingerprint).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-10 14:43:06 +02:00
1 parent 1e05f7b929
commit 5b8bfeb4b0
4 files changed
+26 -2

No files matched your search

+13
View File
@@ -54,6 +54,19 @@ android {
} else {
signingConfigs.getByName("debug")
}
// R8 lief bereits implizit (Standard-Verhalten des Flutter-
// Gradle-Plugins für Release-Builds) und zerstörte ohne
// proguard-rules.pro die Reflection-basierte Komponenten-
// Registrierung von ML Kit (mobile_scanner) – führte zu
// "NoSuchMethodException: ...Registrar.<init> []" und in Folge
// zu NullPointerExceptions beim Scannen. Jetzt explizit mit
// passenden Keep-Regeln statt implizit ohne.
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
+11
View File
@@ -0,0 +1,11 @@
# ML Kit (mobile_scanner) registriert seine Komponenten zur Laufzeit per
# Reflection (No-Arg-Konstruktor). R8 entfernt/obfuskiert diese ohne Keep-
# Regeln, was zu "NoSuchMethodException: ...Registrar.<init> []" und in
# Folge zu NullPointerExceptions beim eigentlichen Scan führt (siehe
# Kiosk-App v0.1.8/0.1.9-Debugging, echtes Tablet – nicht nur Hardware-Bug).
-keep class com.google.mlkit.** { *; }
-keep interface com.google.mlkit.** { *; }
-keep class com.google.android.gms.internal.mlkit_vision_barcode.** { *; }
-keep class * extends com.google.mlkit.common.internal.MlKitComponentDiscoveryService {
<init>();
}
+1 -1
View File
@@ -1,3 +1,3 @@
/// Manuell mit pubspec.yaml synchron halten (siehe timemaster-mobile,
/// gleiche Konvention – kein package_info_plus während aktiver Feldtests).
const String kAppVersion = '0.1.8+9';
const String kAppVersion = '0.1.10+11';
+1 -1
View File
@@ -1,7 +1,7 @@
name: timemaster_kiosk
description: TimeMaster Kiosk – Stempeluhr für Android-Tablets hinter VPN
publish_to: 'none'
version: 0.1.8+9
version: 0.1.10+11
environment:
sdk: '>=3.3.0 <4.0.0'