#!/usr/bin/env bash # adb_wsl — Wrapper sourceable para usar adb.exe Windows desde WSL2. # Uso: source bash/functions/infra/adb_wsl.sh # Smoke test: bash bash/functions/infra/adb_wsl.sh --self-test # --------------------------------------------------------------------------- # Resolver ADB # --------------------------------------------------------------------------- # El caller puede fijar ADB antes de sourcing para apuntar a otro binario. if [[ -z "${ADB:-}" ]]; then _sdk_root="${ANDROID_SDK_WIN:-/mnt/c/Users/lucas/AppData/Local/Android/Sdk}" ADB="${_sdk_root}/platform-tools/adb.exe" unset _sdk_root fi if [[ ! -f "$ADB" ]]; then echo "adb_wsl: ADB no encontrado en '$ADB'. Fija ADB= o ANDROID_SDK_WIN= antes de sourcear." >&2 # Solo abortamos si el script se ejecuta directamente; si se sourcea, # permitimos continuar para que el caller maneje el error. return 1 2>/dev/null || exit 1 fi # --------------------------------------------------------------------------- # adb_run "" # Ejecuta el ADB Windows con los argumentos dados. # Retorna el exit code de adb.exe. # --------------------------------------------------------------------------- adb_run() { "$ADB" "$@" } # --------------------------------------------------------------------------- # adb_devices # Lista dispositivos ADB conectados. # --------------------------------------------------------------------------- adb_devices() { adb_run devices } # --------------------------------------------------------------------------- # adb_wsl_to_win # Convierte un path WSL a formato Windows usando wslpath. # Si wslpath no está disponible retorna el path tal cual. # --------------------------------------------------------------------------- adb_wsl_to_win() { local path_wsl="$1" if command -v wslpath &>/dev/null; then wslpath -w "$path_wsl" else echo "$path_wsl" fi } # --------------------------------------------------------------------------- # adb_wait_boot [timeout_s] # Espera a que el dispositivo/emulador complete el boot (sys.boot_completed=1). # timeout_s: segundos máximos de espera (default 120). # Retorna 0 si boot completado, 1 si timeout. # --------------------------------------------------------------------------- adb_wait_boot() { local timeout_s="${1:-120}" local elapsed=0 local interval=3 while (( elapsed < timeout_s )); do local val val=$(adb_run shell getprop sys.boot_completed 2>/dev/null | tr -d '[:space:]') if [[ "$val" == "1" ]]; then return 0 fi sleep "$interval" (( elapsed += interval )) done echo "adb_wsl: timeout ${timeout_s}s esperando boot del dispositivo." >&2 return 1 } # --------------------------------------------------------------------------- # adb_pick_serial [--serial ] [...] # Resuelve el serial a usar para multi-device. Lee --serial X de los args. # Setea globals ADB_PICK_SERIAL y ADB_PICK_REST (no usa stdout para evitar # perder los globals via subshell de $()). # Exit 1 si no hay device disponible. # # Uso tipico: # adb_pick_serial "$@" || { echo "no device" >&2; exit 3; } # local serial="$ADB_PICK_SERIAL" # set -- "${ADB_PICK_REST[@]}" # --------------------------------------------------------------------------- adb_pick_serial() { ADB_PICK_SERIAL="${ADB_SERIAL:-}" ADB_PICK_REST=() while [[ $# -gt 0 ]]; do case "$1" in --serial) ADB_PICK_SERIAL="$2"; shift 2 ;; --serial=*) ADB_PICK_SERIAL="${1#--serial=}"; shift ;; *) ADB_PICK_REST+=("$1"); shift ;; esac done if [[ -z "$ADB_PICK_SERIAL" ]]; then ADB_PICK_SERIAL=$(adb_run devices 2>/dev/null | awk '/(emulator-|device$)/ && !/List of/ {print $1; exit}') fi if [[ -z "$ADB_PICK_SERIAL" ]]; then echo "adb_wsl: ningun device/emulador conectado." >&2 return 1 fi if ! adb_run devices 2>/dev/null | awk '{print $1}' | grep -qx "$ADB_PICK_SERIAL"; then echo "adb_wsl: serial '$ADB_PICK_SERIAL' no encontrado en adb devices." >&2 return 1 fi return 0 } # --------------------------------------------------------------------------- # adb_s # Atajo: adb_run -s # --------------------------------------------------------------------------- adb_s() { local serial="$1"; shift adb_run -s "$serial" "$@" } # --------------------------------------------------------------------------- # Smoke test (solo si invocado directamente con --self-test) # --------------------------------------------------------------------------- if [[ "${1:-}" == "--self-test" ]]; then adb_run version || exit 1 echo "OK" fi