Einführung
Beim Android-Entwickeln mit Claude Code oder Cursor stoßen Sie unweigerlich auf Grenzen:
- logcat ungefiltert: mehrere tausend Zeilen
- UIAutomator XML: pro Bildschirm hunderte KB
adb dumpsysAusgabe: zehntausende Zeilen
Eine einfache Tokenreduktion durch standard gzip-Kompression würde zwar den Byteverbrauch reduzieren. Aber für LLMs ist "semantische Kompression" notwendig. Der Zweck unterscheidet sich grundlegend.
| Standard-Kompression | LLM-semantische Kompression | |
|---|---|---|
| Ziel | Bytes reduzieren | Reasoning-Rauschen reduzieren |
| Kriterium | Wiederherstellbarkeit | KI-Verständlichkeit |
| Ausgabe | Mit Eingangsdaten äquivalent | Semantisch äquivalent |
Mehrschichtige Pipeline-Struktur
Die Grundstruktur der LLM-semantischen Kompression sieht so aus:
input
↓ parser (Strukturieren)
↓ normalizer (Schreibvarianten entfernen)
↓ dedupe (Duplikate entfernen)
↓ semantic reduction (Unnötige Infos entfernen)
↓ structuring (Organisieren)
↓ encoder (TOON/DSL-Umwandlung)
↓ LLM
1. Parser — Zuerst strukturieren
Eingabedaten strukturieren ist die erste Aufgabe.
logcat-Beispiel:
05-28 10:00:00 E MyApp: NullPointerException
↓
{
"time": "05-28 10:00:00",
"level": "E",
"tag": "MyApp",
"message": "NullPointerException"
}
Durch Strukturierung wird die nachgelagerte Filterung einfacher.
2. Normalizer — Schreibvarianten entfernen
Gleiche Informationen in verschiedenen Formaten vereinheitlichen.
Package-Name kürzen:
com.example.myapp.feature.login.LoginViewModel
↓
LoginViewModel
Exception-Klassen normalisieren:
java.lang.NullPointerException
↓
NPE
3. Dedupe — Duplikate entfernen
Wiederholungen sind für LLMs nahezu schädlich.
Eingabe:
Loading...
Loading...
Loading...
Loading...
Nach Kompression:
Loading... x4
Noch wichtiger: wenn derselbe Stacktrace 100-mal wiederholt wird:
EXCEPTION repeated x100 { type=NPE source=LoginViewModel.kt line=42 }
Allein damit lassen sich enorme Mengen an Tokens sparen.
4. Semantic Reduction — Für KI unnötige Daten entfernen
Dies ist der Kernpunkt der LLM-Kompression.
Android-spezifische Rausch-Tags
Folgende Tags sind für KI-Debugging nicht notwendig:
| Tag | Inhalt |
|---|---|
BufferQueue |
Grafiksystem intern |
OpenGLRenderer |
Rendering-Engine |
libEGL |
OpenGL ES |
AudioTrack |
Audio intern |
TrafficStats |
Netzwerkstatistik |
chatty |
Log-Verkürzungsnachrichten |
GC_ |
Garbage Collection |
Filter-Beispiel:
NOISE_PATTERNS = [
r"BufferQueue",
r"OpenGLRenderer",
r"libEGL",
r"AudioTrack",
r"chatty",
r"GC_",
]
def filter_noise(line: str) -> bool:
return not any(re.search(p, line) for p in NOISE_PATTERNS)
Zu behaltende wichtige Logs
Exception / ANR / Activity lifecycle / Network error / Firebase / WorkManager
5. Structuring — In KI-verständliche Form organisieren
Vorher:
MainActivity created
Fragment onResume called
API request started
Nachher:
ACTIVITY{ name=MainActivity state=created }
FRAGMENT{ state=onResume }
API{ state=start }
Allein durch explizite Labels verbessert sich die KI-Verständlichkeit erheblich.
6. Encoder — TOON/DSL-Umwandlung
Schließlich in ein eigenes Format (TOON) umwandeln:
events[3]{type,target,state}:
ACT|MainActivity|created
API|LoginApi|start
ERR|Auth|401
Eine Zeile kann mehr Informationen ausdrücken, und mehr Informationen passen in den Kontext.
UIAutomator und UI-Tree-Kompression
Bei Verwendung von Android MCP ist UIAutomator XML noch ausführlicher.
Ursprüngliches XML (Auszug):
{
"x": 120,
"y": 400,
"width": 200,
"height": 48,
"padding": 0,
"alpha": 1.0,
"focusable": false,
"clickable": true,
"text": "Login"
}
Nach Kompression:
BTN[text=Login]
Padding und Alpha sind für LLMs nahezu irrelevant. Mit einer Regel, die nur clickable=true und text-Elemente behält, lassen sich dieselben Informationen mit weniger als 1/20 der Tokens übergeben.
Domänen-Spezialisierung wirkt am besten
Android-spezifische Kompressionslogik ist wirkungsvoller als generische Kompression.
Automatische Log-Kategorie-Klassifizierung
CATEGORIES = {
"lifecycle": ["onCreate", "onResume", "onPause", "onDestroy"],
"crash": ["Exception", "ANR", "Fatal"],
"network": ["Retrofit", "OkHttp", "HttpException"],
"database": ["Room", "SQLite"],
"compose": ["Recomposition", "Composition"],
"firebase": ["Firebase", "Firestore", "FCM"],
"workmanager": ["WorkManager", "Worker"],
}
Wichtigkeitsscore für Kontext-Kontrolle
priority=10 EXCEPTION / ANR
priority=8 Netzwerkfehler
priority=5 Lifecycle-Ereignis
priority=3 Debug-Log
priority=1 Verbose
Bei Kontexteinschränkungen werden zuerst hochprioritäre Einträge aufgenommen.
Slash-Command-Format
Im Slash-Command-Format wird die Integration mit KI natürlich:
/logcat → logcat-spezifische Kompression
/uiauto → UIAutomator XML-spezifische Kompression
/json → Große JSON-spezifische Kompression
/stacktrace → Nur Stacktrace extrahieren
MCP-Server-Implementierung
Diese Pipeline kann als MCP-Server implementiert werden:
@mcp.tool()
def compress_logcat(text: str) -> str:
return run_pipeline(text, mode="logcat")
@mcp.tool()
def compress_uiauto(xml: str) -> str:
return run_pipeline(xml, mode="uiauto")
@mcp.tool()
def compress_json(data: str) -> str:
return run_pipeline(data, mode="json")
Claude Desktop oder Claude Code können es automatisch als Tool aufrufen. Die ideale Form ist, Kompression ohne Bewusstsein zu nutzen.
Zusammenfassung
| Schritt | Effekt |
|---|---|
| Parser | Ermöglicht nachgelagerte Filterung |
| Normalizer | Beseitigt Duplikate derselben Information |
| Dedupe | Komprimiert sich wiederholende Logs |
| Semantic Reduction | Entfernt für KI unnötiges Rauschen |
| Structuring | Ordnet in KI-verständliche Form |
| Encoder (TOON) | Erhöht Informationsdichte |
Das Wichtigste ist „zu wissen, was für KI unnötig ist". Standard-Kompression reduziert Bytes, LLM-semantische Kompression reduziert Reasoning-Rauschen. Diesen Unterschied im Bewusstsein zu haben, macht die Kombination von Android MCP und KI erheblich leistungsfähiger.