Android: teléfono o emulador
Notas del proyecto
Cada proyecto nombra su emulador y aplicación en .claude/android-emulator.md: el nombre del AVD, el ID de la aplicación (y el del laboratorio de UI, si lo tiene), y los scripts de ejecución propios del proyecto. Léelo primero. Sin él, ejecuta $ANDROID_HOME/emulator/emulator -list-avds y elige el AVD con el nombre del proyecto; si no hay ninguno, pregunta al propietario y luego escribe las notas.
Herramientas: sdk="${ANDROID_HOME:-$HOME/Library/Android/sdk}", adb="$sdk/platform-tools/adb". Gradle necesita un JDK: JAVA_HOME, o el openjdk@21 de Homebrew (/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home), o el incluido con Android Studio (/Applications/Android Studio.app/Contents/jbr/Contents/Home).
Qué dispositivo
Primero va el teléfono del propietario: adb devices lo lista como un serial que no comienza con emulator- (USB o depuración inalámbrica). Sin teléfono, usa el emulador del proyecto. El propietario puede pedir cualquiera; DEVICE=phone, DEVICE=emulator o DEVICE=<serial> es cómo los scripts del proyecto toman esa elección.
Siempre pasa -s <serial> a adb una vez seleccionado un dispositivo, ya que otro podría conectarse mientras tanto.
El emulador
Inícialo solo cuando sea necesario y detenlo cuando la tarea termine, ya que ocupa varios GB de memoria. Usa el scripts/emulator.sh del proyecto cuando lo tenga; de lo contrario, el de esta habilidad scripts/emulator.sh (en el directorio base de la habilidad, mostrado cuando se carga la habilidad), con AVD=<nombre> de las notas:
AVD=<nombre> <dir habilidad>/scripts/emulator.sh up # sin interfaz; espera hasta que Android haya arrancado, imprime el serial
AVD=<nombre> <dir habilidad>/scripts/emulator.sh status
AVD=<nombre> <dir habilidad>/scripts/emulator.sh down # guarda la instantánea de arranque rápido, por lo que el próximo up lleva segundos
up apaga primero otros emuladores en ejecución, porque los scripts y adb eligen el primero (KEEP_OTHERS=1 los conserva); WINDOW=1 muestra su ventana, que el propietario puede querer ver. Ejecuta up en segundo plano cuando la compilación pueda continuar mientras tanto. Si falla, su registro está en ${TMPDIR:-/tmp}/emulator-<avd>.log.
Compilar, instalar, abrir
Prefiere los scripts del proyecto (las notas los nombran: un script de ejecución, el script del laboratorio de UI). Hecho a mano:
- Compila solo la ABI del dispositivo cuando el proyecto lo soporte (
-Pabi=$(adb -s <serial> shell getprop ro.product.cpu.abi), oABI=para el script del proyecto): las bibliotecas nativas hacen que un APK completo sea lento de enviar por depuración inalámbrica. adb -s <serial> install -r <apk>.-rconserva los datos de la aplicación; nunca desinstales ni ejecutespm clearen la aplicación del propietario en su teléfono sin preguntar, ya que contiene sus datos reales.- Ábrelo con
adb -s <serial> shell am start --user current -S -f 0x10008000 -n <id app>/<actividad>:-Sdetiene el proceso anterior para que se ejecute la nueva compilación,--user currentes necesario en un teléfono con Carpeta Segura, y las banderas (nueva tarea, limpiando la anterior) evitan que Android reanude una pantalla anterior.
Mirarlo
- Captura de pantalla:
adb -s <serial> exec-out screencap -p > <archivo>.png, luego mira el archivo. Si todo es negro desde el teléfono, significa que está bloqueado: pide al propietario que lo desbloquee. - Tocar y escribir para un flujo:
adb -s <serial> shell input tap <x> <y>,input text <texto>,input keyevent KEYCODE_BACK; encuentra coordenadas conadb -s <serial> exec-out uiautomator dump /dev/tty. - Registros:
adb -s <serial> logcat -d --pid=$(adb -s <serial> shell pidof <id app>), o-s <etiqueta>para una etiqueta. Bloqueo:adb -s <serial> logcat -d -b crash. - Modo oscuro y configuración regional para casos extremos:
adb -s <serial> shell cmd uimode night yes|no; cambia la configuración regional solo en el emulador, no en el teléfono del propietario.
Informa al propietario de qué dispositivo proviene cada resultado. Restaura cualquier cambio que hayas hecho en su teléfono (modo oscuro, por ejemplo) al terminar, y detén el emulador si lo iniciaste.