--- name: android_emulator_start kind: function lang: bash domain: infra version: "1.1.0" purity: impure signature: "android_emulator_start(avd_name: string, timeout_s: int) -> string" description: "Arranca un AVD Android en background y espera a que termine de bootear. Linux-first: resuelve el emulator/adb nativos del SDK; fallback a binarios .exe solo bajo WSL2. Idempotente: si ya hay un emulador corriendo, imprime 'already running' y su serial sin lanzar otro." tags: [android, emulator, linux, avd, wsl] params: - name: avd_name desc: "Nombre del AVD a arrancar (visible con android_emulator_list o `emulator -list-avds`)" - name: timeout_s desc: "Timeout total en segundos para esperar el boot completo. Opcional, default 180" output: "Serial del device emulado (ej. emulator-5554) en stdout. Exit 0 = boot completo, exit 1 = timeout o emulador murio." uses_functions: ["adb_wsl_bash_infra"] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] tested: false tests: [] test_file_path: "" file_path: "bash/functions/infra/android_emulator_start.sh" --- ## Ejemplo ```bash source ~/android-sdk/env.sh # exporta ANDROID_HOME -> resuelve emulator/adb nativos source bash/functions/infra/android_emulator_start.sh # Arrancar AVD con timeout por defecto (180s) serial=$(android_emulator_start "Pixel_API34") echo "Emulador listo: $serial" # emulator-5554 # Con timeout personalizado serial=$(android_emulator_start "Pixel_API34" 300) ``` Para ver la ventana del emulador en un escritorio Linux, exporta `DISPLAY` (y `XAUTHORITY`) antes de invocar. ## Cuando usarla Cuando un script necesita un emulador booteado antes de instalar un APK o correr tests instrumentados (`gradle_instrumented_test`, `run_kotlin_app_tests`). Es idempotente, así que se puede llamar al principio de cualquier pipeline sin comprobar antes si ya hay uno arriba. ## Gotchas - **Linux-first.** Resuelve `EMULATOR`/`ADB` desde `$ANDROID_HOME/{emulator/emulator, platform-tools/adb}` o del PATH; `emulator.exe`/`adb.exe` solo como fallback bajo WSL2. Override manual con `EMULATOR=`/`ADB=`. - **Necesita `DISPLAY` para ventana.** Sin un servidor X accesible el emulador puede fallar al abrir ventana. Para headless/CI añade `-no-window` (editar la función o lanzar el emulador aparte). - **Aceleración KVM.** Requiere acceso a `/dev/kvm` (grupo `kvm` o ACL). Sin ella el boot es lentísimo o falla. - Log del emulador en `/tmp/emulator_.log`, PID en `/tmp/emulator_.pid`. - El timeout total se reparte: primera mitad para `adb wait-for-device`, segunda para `sys.boot_completed=1`. ## Capability growth log - v1.1.0 (2026-06-03) — Linux-first: resuelve emulator/adb nativos del SDK (`$ANDROID_HOME`) antes que los `.exe` de Windows (ahora solo fallback WSL2); se elimina el default hardcodeado `/mnt/c/Users/lucas/...`. fix: `timeout adb_run wait-for-device` fallaba siempre porque `timeout` no puede ejecutar la función shell `adb_run`; ahora invoca el binario `"$ADB"` directamente.