--- name: adb_wsl kind: function lang: bash domain: infra version: "1.1.0" purity: impure signature: "source adb_wsl.sh [ADB=] [ANDROID_HOME=]" description: "Wrapper sourceable para resolver e invocar adb. Linux-first: usa el adb nativo del Android SDK ($ANDROID_HOME) o del PATH; fallback a adb.exe solo si detecta WSL2. Expone adb_run, adb_devices, adb_pick_serial, adb_s, adb_wait_boot." tags: ["android", "adb", "linux", "emulator", "wsl"] params: - name: ADB desc: "Env var opcional. Path absoluto al binario adb (override explicito). Si no se fija, se resuelve Linux-first: $ANDROID_HOME/platform-tools/adb, luego adb del PATH, luego adb.exe si WSL2." - name: ANDROID_HOME desc: "Env var opcional. Raiz del Android SDK nativo. Si esta presente, se usa $ANDROID_HOME/platform-tools/adb. Tambien se acepta ANDROID_SDK_ROOT." output: "Source-able shell helpers: adb_run, adb_devices, adb_pick_serial, adb_s, adb_wait_boot, adb_wsl_to_win. Resuelve y fija la env var ADB al binario adb disponible." uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] tested: false tests: [] test_file_path: "" file_path: "bash/functions/infra/adb_wsl.sh" --- ## Cuando usarla Sourcéala como capa base de cualquier script que hable con un device o emulador Android via adb. Es la dependencia comun de todo el toolbelt android del registry (`android_screenshot`, `android_input_*`, `android_logcat`, `android_app_*`, `android_push/pull`). En Linux nativo resuelve el adb del SDK automaticamente; no hace falta configurar nada si `ANDROID_HOME` esta exportado (o `adb` esta en el PATH). ## Ejemplo ```bash # Linux nativo: con el SDK instalado y ANDROID_HOME exportado, resuelve solo. source ~/android-sdk/env.sh source bash/functions/infra/adb_wsl.sh adb_devices # List of devices attached # emulator-5554 device # Fijar binario adb explicito (override) ADB=/opt/android/platform-tools/adb source bash/functions/infra/adb_wsl.sh # Smoke test bash bash/functions/infra/adb_wsl.sh --self-test # Android Debug Bridge version 1.0.41 ``` ## Funciones expuestas ### `adb_run ""` Ejecuta `$ADB` con los argumentos dados. Retorna el exit code de adb. ```bash adb_run shell ls /sdcard/ adb_run install app.apk ``` ### `adb_devices` Alias de `adb_run devices`. Lista dispositivos/emuladores conectados. ### `adb_pick_serial [--serial ] [...]` Resuelve el serial a usar (multi-device). Lee `--serial X` de los args y setea los globals `ADB_PICK_SERIAL` y `ADB_PICK_REST`. Si no se pasa, autoselecciona el primer device/emulador conectado. ```bash adb_pick_serial "$@" || { echo "no device" >&2; exit 3; } serial="$ADB_PICK_SERIAL"; set -- "${ADB_PICK_REST[@]}" ``` ### `adb_s ` Atajo de `adb_run -s ` para multi-device. ### `adb_wait_boot [timeout_s]` Espera a que el emulador/dispositivo complete el boot (`sys.boot_completed = 1`). Polling cada 3s. Retorna `0` si bootó, `1` si timeout (default 120s). ### `adb_wsl_to_win ` Legacy WSL: convierte path WSL→Windows con `wslpath -w`. En Linux nativo (sin `wslpath`) devuelve el path tal cual. ## Gotchas - **Linux-first.** El default ya NO es Windows. Resolucion: `$ADB` → `$ANDROID_HOME/platform-tools/adb` → `adb` del PATH → (solo si `/proc/version` indica WSL2) `adb.exe`. En un PC Linux con el SDK instalado funciona sin configurar nada. - **Necesita el SDK o adb en PATH.** Si no encuentra adb aborta con mensaje a stderr. Instala con `fn run install_android_sdk_bash_infra` y exporta `ANDROID_HOME` (o `source ~/android-sdk/env.sh`). - **`ADB` se resuelve una sola vez al sourcing.** Cambiar el SDK despues requiere re-sourcear. - **Sourcéala con bash, no zsh.** Los consumidores usan `${BASH_SOURCE[0]}` para localizar este archivo; ejecutarlos con `bash ` (no `zsh`/`source` desde zsh) resuelve el path correctamente. ## Capability growth log - v1.1.0 (2026-06-03) — Linux-first: la resolucion de adb ahora prioriza el adb nativo del SDK (`$ANDROID_HOME/platform-tools/adb`) y del PATH; el adb.exe de Windows queda como fallback legacy solo bajo WSL2. Se elimina el default hardcodeado `/mnt/c/Users/lucas/...`. Todo el toolbelt android (~20 funciones) pasa a funcionar en Linux nativo sin preexportar `ADB`.