--- name: install_android_sdk kind: function lang: bash domain: infra version: "1.0.1" purity: impure signature: "install_android_sdk() -> void" description: "Descarga e instala Android SDK command-line tools y JDK 17 localmente (sin root/sudo) en $ANDROID_SDK_DIR (default: $HOME/android-sdk). Idempotente: detecta instalacion existente y sale sin hacer nada. Genera env.sh con JAVA_HOME, ANDROID_HOME y PATH listos para hacer source." tags: [android, sdk, jdk, java, install, infra, mobile] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: [] output: "sin salida estructurada; imprime progreso y resumen final con rutas de instalacion" tested: false tests: [] test_file_path: "" file_path: "bash/functions/infra/install_android_sdk.sh" --- ## Ejemplo ```bash # Instalacion en directorio por defecto ($HOME/android-sdk) source install_android_sdk.sh # Instalacion en directorio personalizado ANDROID_SDK_DIR=/opt/android source install_android_sdk.sh # Si ya esta instalado: # Android SDK ya instalado en: /home/user/android-sdk # Instalacion completa imprime: # Descargando JDK 17... # JDK 17 instalado: /home/user/android-sdk/jdk-17/jdk-17.0.x+y # Descargando Android cmdline-tools... # cmdline-tools instalados # Aceptando licencias de Android SDK... # Instalando platform-tools, platforms;android-34, build-tools;34.0.0... # # Android SDK instalado en: /home/user/android-sdk # JDK 17: /home/user/android-sdk/jdk-17/jdk-17.0.x+y # Para activar: source /home/user/android-sdk/env.sh # Activar entorno en sesion actual source ~/android-sdk/env.sh ``` ## Cuando usarla Cuando necesites un Android SDK funcional en una maquina Linux sin permisos de root: CI, contenedores, o un PC de desarrollo donde quieras un SDK aislado en `$HOME`. Instala la base minima para compilar (cmdline-tools + JDK 17 + platform-tools + API 34 + build-tools). Hazle `source` para tener `sdkmanager`/`avdmanager`/`adb` en el PATH antes de invocar `gradle_run`, `gradle_assemble_debug` o `capacitor_build_apk`. ## Gotchas - **No instala `emulator` ni system images.** Solo la base de compilacion. Para correr un AVD: tras hacer `source env.sh`, instala `emulator` y una imagen (`sdkmanager "emulator" "system-images;android-34;google_apis;x86_64"`) y crea el AVD con `avdmanager create avd`. - **Aceleracion KVM:** el emulador necesita acceso a `/dev/kvm`. Verifica con `[ -w /dev/kvm ]`; si no, anade tu usuario al grupo `kvm` (`sudo usermod -aG kvm $USER` + re-login) o concede ACL. - **URL de cmdline-tools clavada** a la build 11076708 (2024). Si Google la retira, actualizar `tools_url` en el `.sh`. - **Idempotente:** re-ejecutar no reinstala; detecta `sdkmanager` existente y sale en 0. ## Notas Requiere `curl` y `unzip` (disponibles en la mayoria de distros Linux). No requiere root ni sudo. El JDK se descarga desde Adoptium (Eclipse Temurin) via su API oficial. La URL de cmdline-tools apunta a la version 11076708 (2024). Si Google actualiza la version, cambiar la URL con el nuevo numero de build. La reorganizacion del zip es necesaria porque Google distribuye cmdline-tools con estructura `cmdline-tools/bin/...` pero sdkmanager espera estar en `cmdline-tools/latest/bin/sdkmanager` para que Android Studio y otras herramientas lo detecten correctamente. El archivo `env.sh` generado en `$ANDROID_SDK_DIR/env.sh` contiene las variables de entorno necesarias (`JAVA_HOME`, `ANDROID_HOME`, `ANDROID_SDK_ROOT`, `PATH`) y puede hacerse source desde `.bashrc`, `.zshrc` o desde scripts de CI. Paquetes instalados: `platform-tools` (adb, fastboot), `platforms;android-34` (API 34), `build-tools;34.0.0`. ## Capability growth log - v1.0.1 (2026-06-03) — fix: `yes | sdkmanager --licenses` daba falso negativo bajo `pipefail` (SIGPIPE de `yes`, exit 141) abortando una instalacion exitosa; ahora se desactiva `pipefail` solo en ese pipe. fix: el trap `EXIT` referenciaba `$tmp_dir` (variable `local`) fuera del scope de la funcion → "unbound variable" con `set -u`; ahora es global con expansion defensiva.