---
name: adb_wsl
kind: function
lang: bash
domain: infra
version: "1.0.0"
purity: impure
signature: "source adb_wsl.sh [ADB=<path>] [ANDROID_SDK_WIN=<sdk_root>]"
description: "Wrapper sourceable para usar adb.exe Windows desde WSL2. Resuelve binario, convierte paths, espera boot del emulador."
tags: ["android", "adb", "wsl", "windows"]
params:
  - name: ADB
    desc: "Env var opcional. Path absoluto a adb.exe. Si no se fija, se construye desde ANDROID_SDK_WIN o el default /mnt/c/Users/lucas/AppData/Local/Android/Sdk."
  - name: ANDROID_SDK_WIN
    desc: "Env var opcional. Raiz del Android SDK montado en WSL. Default: /mnt/c/Users/lucas/AppData/Local/Android/Sdk."
output: "Source-able shell helpers: adb_run, adb_devices, adb_wsl_to_win, adb_wait_boot. Define ADB env var apuntando a Windows adb.exe via ANDROID_SDK_WIN."
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"
---

## Uso

```bash
# Sourcear (usa SDK default)
source bash/functions/infra/adb_wsl.sh

# Sourcear con SDK custom
ANDROID_SDK_WIN=/mnt/d/Android/Sdk source bash/functions/infra/adb_wsl.sh

# Sourcear con binario fijo
ADB=/mnt/c/my/tools/adb.exe source bash/functions/infra/adb_wsl.sh
```

## Funciones expuestas

### `adb_run "<args...>"`

Ejecuta `$ADB` con los argumentos dados. Retorna el exit code de `adb.exe`.

```bash
adb_run shell ls /sdcard/
adb_run install app.apk
```

### `adb_devices`

Alias de `adb_run devices`. Lista dispositivos/emuladores conectados.

```bash
adb_devices
# List of devices attached
# emulator-5554   device
```

### `adb_wsl_to_win <path_wsl>`

Convierte un path WSL a formato Windows con `wslpath -w`. Si `wslpath` no está disponible retorna el path sin convertir.

```bash
win_path=$(adb_wsl_to_win /home/lucas/proyecto/app.apk)
# C:\Users\lucas\AppData\Local\... (o la ruta Windows equivalente)
adb_run install "$win_path"
```

### `adb_wait_boot [timeout_s]`

Espera a que el emulador/dispositivo complete el boot (`sys.boot_completed = 1`). Útil tras lanzar un AVD en CI.

```bash
adb_wait_boot        # timeout 120s
adb_wait_boot 60     # timeout 60s
```

Retorna `0` si el boot se completó, `1` si expiró el timeout.

## Smoke test

```bash
bash bash/functions/infra/adb_wsl.sh --self-test
# OK
```

## Notas

- El script es **source-able**: define funciones en el shell actual, no crea subshell.
- `ADB` se resuelve una sola vez al sourcing. Si el binario no existe en disco, la carga falla con mensaje en stderr y `return 1` / `exit 1`.
- `adb_wait_boot` hace polling cada 3 segundos. Ajustar `interval` si el emulador es especialmente lento.
- En WSL2 `wslpath` siempre está disponible; el fallback existe para entornos Linux puros que accidentalmente sourceen el archivo.
- Si el emulador requiere `-s <serial>`, pasar el flag directamente a `adb_run`: `adb_run -s emulator-5554 shell ...`.
---
