Android-Logs an KI massiv reduzieren — Semantische Kompressions-Pipeline für LLMs

Android-Logs an KI massiv reduzieren — Semantische Kompressions-Pipeline für LLMs

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 dumpsys Ausgabe: 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.