Android: Telefon oder Emulator
Projektnotizen
Jedes Projekt benennt seinen Emulator und seine App in .claude/android-emulator.md: den AVD-Namen, die App-ID (und die des UI-Lab-Tools, sofern vorhanden) sowie die eigenen Ausführskripte. Lies diese Datei zuerst. Fehlt sie, führe $ANDROID_HOME/emulator/emulator -list-avds aus und wähle den AVD, der nach dem Projekt benannt ist; gibt es keinen, frage den Besitzer und schreibe dann die Notizen.
Tools: sdk="${ANDROID_HOME:-$HOME/Library/Android/sdk}", adb="$sdk/platform-tools/adb". Gradle benötigt ein JDK: JAVA_HOME, sonst Homebrews openjdk@21 (/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home), sonst das mit Android Studio gebündelte (/Applications/Android Studio.app/Contents/jbr/Contents/Home).
Welches Gerät
Das Telefon des Besitzers hat Vorrang: adb devices listet es als eine Seriennummer, die nicht mit emulator- beginnt (USB- oder WLAN-Debugging). Ohne Telefon verwende den Emulator des Projekts. Der Besitzer kann nach einem bestimmten Gerät fragen; DEVICE=phone, DEVICE=emulator oder DEVICE=<seriennummer> gibt die Wahl an die Projekt-Skripte weiter.
Übergib immer -s <seriennummer> an adb, sobald ein Gerät ausgewählt ist, da sich zwischenzeitlich ein anderes verbinden könnte.
Der Emulator
Starte ihn nur, wenn er benötigt wird, und stoppe ihn, wenn die Aufgabe erledigt ist, da er mehrere Gigabyte Arbeitsspeicher belegt. Verwende das projekteigene scripts/emulator.sh, falls vorhanden; ansonsten das dieses Skills (scripts/emulator.sh im Basisverzeichnis des Skills, das beim Laden des Skills angezeigt wird), mit AVD=<name> aus den Notizen:
AVD=<name> <skill-verzeichnis>/scripts/emulator.sh up # kopflos; wartet, bis Android gestartet ist, gibt die Seriennummer aus
AVD=<name> <skill-verzeichnis>/scripts/emulator.sh status
AVD=<name> <skill-verzeichnis>/scripts/emulator.sh down # speichert den Quick-Boot-Snapshot, sodass der nächste Start nur Sekunden dauert
up fährt zuerst andere laufende Emulatoren herunter, da Skripte und adb den ersten auswählen (KEEP_OTHERS=1 behält sie); WINDOW=1 zeigt das Fenster an, das der Besitzer sehen möchte. Führe up im Hintergrund aus, wenn der Bau inzwischen fortgesetzt werden kann. Bei einem Fehler befindet sich das Log in ${TMPDIR:-/tmp}/emulator-<avd>.log.
Bauen, installieren, öffnen
Bevorzuge die Projekt-Skripte (die Notizen nennen sie: ein Ausführskript, das UI-Lab-Skript). Manuell ausgeführt:
- Baue nur die ABI des Geräts, wenn das Projekt dies unterstützt (
-Pabi=$(adb -s <seriennummer> shell getprop ro.product.cpu.abi)oderABI=für das Projekt-Skript): native Bibliotheken machen eine vollständige APK langsam bei der Übertragung über WLAN-Debugging. adb -s <seriennummer> install -r <apk>.-rbehält die App-Daten; deinstalliere niemals oder führepm clearauf der App des Besitzers auf seinem Telefon ohne Nachfrage aus, da dort echte Daten gespeichert sind.- Öffne sie mit
adb -s <seriennummer> shell am start --user current -S -f 0x10008000 -n <app-id>/<activity>:-Sstoppt den alten Prozess, damit die neue Version läuft,--user currentwird auf einem Telefon mit einem geschützten Ordner benötigt, und die Flags (neue Aufgabe, alte löschen) verhindern, dass Android einen vorherigen Bildschirm wiederherstellt.
Anschauen
- Screenshot:
adb -s <seriennummer> exec-out screencap -p > <datei>.png, dann die Datei betrachten. Alles schwarz vom Telefon bedeutet, dass es gesperrt ist: Bitte den Besitzer, es zu entsperren. - Tippen und Tippen für einen Ablauf:
adb -s <seriennummer> shell input tap <x> <y>,input text <text>,input keyevent KEYCODE_BACK; finde Koordinaten mitadb -s <seriennummer> exec-out uiautomator dump /dev/tty. - Logs:
adb -s <seriennummer> logcat -d --pid=$(adb -s <seriennummer> shell pidof <app-id>)oder-s <tag>für einen Tag. Absturz:adb -s <seriennummer> logcat -d -b crash. - Dunkelmodus und Gebietsschema für Randfälle:
adb -s <seriennummer> shell cmd uimode night yes|no; ändere das Gebietsschema nur auf dem Emulator, nicht auf dem Telefon des Besitzers.
Teile dem Besitzer mit, von welchem Gerät jedes Ergebnis stammt. Stelle alles, was du auf seinem Telefon geändert hast (z. B. Dunkelmodus), nach Abschluss wieder zurück, und stoppe den Emulator, wenn du ihn gestartet hast.