← Volver al listado de tecnologías

Capítulo 2: Preparación del Dispositivo Android para Appium

Por: Artiko
appiumandroidusbadbdepuracióndriversdispositivo

Capítulo 2: Preparación del Dispositivo Android para Appium

Este capítulo te guiará paso a paso en la preparación de tu dispositivo Android físico para trabajar con Appium. Aprenderás a habilitar las opciones necesarias, instalar drivers USB y verificar que todo funcione correctamente.

🎯 Objetivos del Capítulo

Al finalizar este capítulo podrás:

📱 Paso 1: Habilitar Opciones de Desarrollador

Android 4.2 y Superior

// Proceso para habilitar Developer Options
fun enableDeveloperOptions() {
    // 1. Abrir Configuración/Settings
    openSettings()
    
    // 2. Navegar según versión Android:
    when (androidVersion) {
        >= 9.0 -> "Acerca del teléfono → Información del software"
        >= 8.0 -> "Sistema → Acerca del teléfono"
        else -> "Acerca del dispositivo"
    }
    
    // 3. Tocar 7 veces sobre "Número de compilación"
    repeat(7) {
        tap("Número de compilación")
    }
    
    // 4. Mensaje: "Ahora eres desarrollador"
}

Ubicación por Fabricante

Samsung:
  Path: Ajustes → Acerca del teléfono → Información del software
  Tap: Número de compilación (7 veces)

Xiaomi/Redmi/POCO:
  Path: Ajustes → Acerca del teléfono
  Tap: Versión MIUI (7 veces)
  Note: Puede requerir cuenta Mi

OnePlus:
  Path: Ajustes → Acerca del teléfono
  Tap: Número de compilación (7 veces)

Pixel/Google:
  Path: Ajustes → Acerca del teléfono
  Tap: Número de compilación (7 veces)

Huawei:
  Path: Ajustes → Sistema → Acerca del teléfono
  Tap: Número de compilación (7 veces)

Motorola:
  Path: Ajustes → Sistema → Acerca del teléfono
  Tap: Número de compilación (7 veces)

🔓 Paso 2: Activar Depuración USB

Configuración Básica

// Opciones esenciales para automatización
const developerSettings = {
  // Ubicación: Ajustes → Opciones de desarrollador
  
  "Depuración USB": true,              // OBLIGATORIO
  "Instalación vía USB": true,         // Recomendado
  "Verificar apps por USB": false,     // Desactivar
  "Permitir ubicaciones simuladas": true, // Para testing GPS
  
  // Configuración de pantalla
  "Mantener pantalla activa": true,    // Evita bloqueos
  "Mostrar toques": true,              // Útil para debug
  
  // Animaciones (acelerar tests)
  "Escala de animación de ventana": 0.5,
  "Escala de animación de transición": 0.5,
  "Escala de duración del animador": 0.5
};

Pasos Detallados

  1. Abrir Opciones de Desarrollador:
# Via ADB (si ya está conectado)
adb shell am start -n com.android.settings/.DevelopmentSettings

# O manualmente:
# Ajustes → Sistema → Avanzado → Opciones de desarrollador
  1. Activar Depuración USB:
// Toggle "Depuración USB/USB Debugging"
Settings.Developer.USB_DEBUGGING = true

// Aparecerá advertencia de seguridad
// Tap: "Aceptar" o "OK"
  1. Configuraciones Adicionales Recomendadas:
// Para evitar problemas durante testing
const additionalSettings = {
  // Seguridad
  "Desbloqueo OEM": false,  // Solo si no necesitas
  
  // Red
  "Depuración inalámbrica": false,  // USB es más estable
  "ADB sobre red": false,           // Por seguridad
  
  // Energía
  "No apagar pantalla": true,       // Durante carga USB
  
  // Permisos
  "Deshabilitar permisos": false,   // Mantener activo
  "Forzar apps redimensionables": true  // Para tablets
};

🔌 Paso 3: Instalación de Drivers USB

Windows - Drivers Específicos

# Opción 1: Google USB Driver (genérico)
# En Android Studio: SDK Manager → SDK Tools → Google USB Driver

# Opción 2: Drivers del fabricante

Enlaces de Descarga por Fabricante

Samsung:
  URL: https://developer.samsung.com/mobile/android-usb-driver.html
  Installer: SAMSUNG_USB_Driver_for_Mobile_Phones.exe
  
Xiaomi:
  URL: https://developer.android.com/studio/run/win-usb
  Note: Usar Mi PC Suite o drivers genéricos
  
OnePlus:
  URL: https://www.oneplus.com/support/softwareupdate
  Installer: OnePlus_USB_Drivers_Setup.exe
  
LG:
  URL: https://www.lg.com/us/support/software-firmware-drivers
  Installer: LGMobileDriver.exe
  
Motorola:
  URL: https://motorola-global-portal.custhelp.com/app/answers/detail/a_id/88481
  Installer: Motorola_Mobile_Drivers.exe
  
Huawei:
  URL: https://consumer.huawei.com/en/support/hisuite/
  Note: HiSuite incluye drivers
  
Google/Pixel:
  URL: https://developer.android.com/studio/run/win-usb
  Installer: latest_usb_driver_windows.zip

Instalación Manual en Windows

# 1. Conectar dispositivo
# 2. Abrir Administrador de dispositivos
devmgmt.msc

# 3. Buscar dispositivo con signo de exclamación
# 4. Click derecho → Actualizar controlador
# 5. Buscar software de controlador en el equipo
# 6. Seleccionar carpeta con drivers descargados

# Verificar instalación
adb devices

macOS - Configuración

# macOS detecta automáticamente dispositivos Android
# No requiere drivers adicionales

# Si hay problemas, instalar Android File Transfer
brew install --cask android-file-transfer

# Verificar detección
system_profiler SPUSBDataType | grep -i android

Linux - Reglas udev

# Crear archivo de reglas para tu dispositivo
sudo nano /etc/udev/rules.d/51-android.rules

# Agregar línea según fabricante (ver tabla abajo)
# Formato: SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", MODE="0666", GROUP="plugdev"

# Ejemplos por fabricante:
# /etc/udev/rules.d/51-android.rules
# Google
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
# Samsung
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
# Xiaomi
SUBSYSTEM=="usb", ATTR{idVendor}=="2717", MODE="0666", GROUP="plugdev"
# OnePlus
SUBSYSTEM=="usb", ATTR{idVendor}=="2a70", MODE="0666", GROUP="plugdev"
# Motorola
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666", GROUP="plugdev"
# LG
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666", GROUP="plugdev"
# Huawei
SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", MODE="0666", GROUP="plugdev"
# Sony
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev"
# OPPO
SUBSYSTEM=="usb", ATTR{idVendor}=="22d9", MODE="0666", GROUP="plugdev"
# Aplicar cambios
sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo service udev restart

# Agregar usuario al grupo plugdev
sudo usermod -aG plugdev $USER

# Logout y login para aplicar cambios

🔐 Paso 4: Autorización del Dispositivo

Primera Conexión

# 1. Conectar dispositivo por USB
# 2. En el dispositivo aparecerá:
# "¿Permitir depuración USB?"
# "La huella digital de la clave RSA del equipo es: XX:XX:XX..."

# 3. Marcar: "Permitir siempre desde este ordenador"
# 4. Tap: "Aceptar"

# Verificar conexión
adb devices
# Output esperado:
# List of devices attached
# ABC123DEF456    device

Gestión de Claves RSA

# Ver claves autorizadas en el dispositivo
adb shell cat /data/misc/adb/adb_keys

# Revocar autorizaciones
# En dispositivo: Opciones de desarrollador → Revocar autorizaciones de depuración USB

# Ubicación de clave en el PC
# Windows: %USERPROFILE%\.android\adbkey.pub
# macOS/Linux: ~/.android/adbkey.pub

✅ Paso 5: Verificación con ADB

Comandos Básicos de Verificación

# Listar dispositivos conectados
adb devices -l
# Output detallado:
# ABC123DEF456   device product:ginkgo model:Redmi_Note_8 device:ginkgo transport_id:1

# Información del dispositivo
adb shell getprop ro.product.model
adb shell getprop ro.product.manufacturer
adb shell getprop ro.build.version.release
adb shell getprop ro.build.version.sdk

# Estado de la batería
adb shell dumpsys battery

Script de Verificación Completa

// check-device.js
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

async function checkDevice() {
  console.log('📱 Verificando dispositivo Android...\n');
  
  try {
    // Verificar ADB
    const { stdout: adbVersion } = await execPromise('adb version');
    console.log('✅ ADB instalado:', adbVersion.split('\n')[0]);
    
    // Listar dispositivos
    const { stdout: devices } = await execPromise('adb devices');
    const deviceList = devices.split('\n')
      .filter(line => line.includes('device') && !line.includes('List'))
      .map(line => line.split('\t')[0]);
    
    if (deviceList.length === 0) {
      console.log('❌ No hay dispositivos conectados');
      console.log('\nVerifica:');
      console.log('1. Cable USB conectado');
      console.log('2. Depuración USB activada');
      console.log('3. Dispositivo autorizado');
      return;
    }
    
    console.log(`✅ Dispositivos encontrados: ${deviceList.length}`);
    
    // Info de cada dispositivo
    for (const device of deviceList) {
      console.log(`\n📱 Dispositivo: ${device}`);
      
      // Modelo
      const { stdout: model } = await execPromise(
        `adb -s ${device} shell getprop ro.product.model`
      );
      console.log(`   Modelo: ${model.trim()}`);
      
      // Android version
      const { stdout: version } = await execPromise(
        `adb -s ${device} shell getprop ro.build.version.release`
      );
      console.log(`   Android: ${version.trim()}`);
      
      // API Level
      const { stdout: sdk } = await execPromise(
        `adb -s ${device} shell getprop ro.build.version.sdk`
      );
      console.log(`   API Level: ${sdk.trim()}`);
      
      // Estado
      const { stdout: state } = await execPromise(
        `adb -s ${device} get-state`
      );
      console.log(`   Estado: ${state.trim()}`);
    }
    
    console.log('\n✅ Dispositivo listo para Appium!');
    
  } catch (error) {
    console.error('❌ Error:', error.message);
  }
}

checkDevice();

🛠️ Paso 6: Configuración Avanzada

Múltiples Dispositivos

# Listar todos los dispositivos
adb devices

# Ejecutar comando en dispositivo específico
adb -s ABC123DEF456 shell pm list packages

# Variables de entorno para dispositivo por defecto
export ANDROID_SERIAL=ABC123DEF456

WiFi ADB (Opcional)

# Android 11+ tiene ADB inalámbrico integrado

# 1. Conectar por USB primero
adb tcpip 5555

# 2. Obtener IP del dispositivo
adb shell ip addr show wlan0

# 3. Conectar por WiFi
adb connect 192.168.1.100:5555

# 4. Desconectar USB

# 5. Verificar conexión WiFi
adb devices

# Volver a USB
adb usb

Configuración de Permisos Automáticos

// auto-grant-permissions.js
async function setupPermissions(deviceId) {
  const permissions = [
    'android.permission.CAMERA',
    'android.permission.ACCESS_FINE_LOCATION',
    'android.permission.RECORD_AUDIO',
    'android.permission.READ_EXTERNAL_STORAGE',
    'android.permission.WRITE_EXTERNAL_STORAGE'
  ];
  
  const packageName = 'com.example.app';
  
  for (const permission of permissions) {
    await exec(`adb -s ${deviceId} shell pm grant ${packageName} ${permission}`);
  }
}

🔧 Troubleshooting Común

Problema: “unauthorized” en adb devices

# Solución 1: Re-autorizar
adb kill-server
adb start-server
adb devices
# Aceptar prompt en el dispositivo

# Solución 2: Limpiar claves
# En PC:
rm ~/.android/adbkey*
# En dispositivo:
# Opciones desarrollador → Revocar autorizaciones USB
# Reconectar y autorizar

Problema: “device not found”

# Windows: Verificar drivers
devmgmt.msc
# Buscar "Android Device" o dispositivo con ⚠️

# Linux: Verificar permisos
ls -la /dev/bus/usb/
lsusb | grep -i android

# Todos OS: Cambiar cable USB
# Usar puerto USB 2.0 en lugar de 3.0
# Probar cable original del dispositivo

Problema: “more than one device/emulator”

// Especificar dispositivo en Appium capabilities
const caps = {
  platformName: 'Android',
  'appium:automationName': 'UiAutomator2',
  'appium:udid': 'ABC123DEF456',  // Específico device ID
  'appium:deviceName': 'Pixel 4',   // Descriptivo
};

Problema: Dispositivo se desconecta

Causas comunes:
  Cable defectuoso:
    - Usar cable de datos, no solo carga
    - Cable original recomendado
  
  Modo de energía:
    - Desactivar optimización de batería
    - Mantener pantalla activa
  
  Puerto USB:
    - Cambiar de puerto
    - Evitar hubs USB
    - Usar USB 2.0 si hay problemas con 3.0
  
  Configuración OEM:
    - Samsung: Desactivar Knox
    - Xiaomi: Desactivar optimizaciones MIUI
    - Huawei: Permitir HiSuite

📊 Información del Dispositivo para Capabilities

Obtener Información Necesaria

# Script para obtener toda la info necesaria
cat > device-info.sh << 'EOF'
#!/bin/bash
echo "📱 Información del Dispositivo"
echo "=============================="
echo "UDID: $(adb get-serialno)"
echo "Modelo: $(adb shell getprop ro.product.model)"
echo "Fabricante: $(adb shell getprop ro.product.manufacturer)"
echo "Android Version: $(adb shell getprop ro.build.version.release)"
echo "API Level: $(adb shell getprop ro.build.version.sdk)"
echo "Arquitectura: $(adb shell getprop ro.product.cpu.abi)"
echo "Resolución: $(adb shell wm size | cut -d' ' -f3)"
echo "Densidad: $(adb shell wm density | cut -d' ' -f3)"
EOF

chmod +x device-info.sh
./device-info.sh

Capabilities para Appium

// Basado en la info obtenida
const capabilities = {
  platformName: 'Android',
  'appium:platformVersion': '12',           // ro.build.version.release
  'appium:deviceName': 'Redmi Note 8',      // ro.product.model
  'appium:udid': 'ABC123DEF456',           // adb get-serialno
  'appium:automationName': 'UiAutomator2',
  'appium:noReset': true,
  'appium:fullReset': false,
  'appium:newCommandTimeout': 300,
  
  // Opcionales pero útiles
  'appium:systemPort': 8200,  // Para múltiples dispositivos
  'appium:skipServerInstallation': false,
  'appium:skipDeviceInitialization': false,
  'appium:ignoreHiddenApiPolicyError': true,
  'appium:disableWindowAnimation': true
};

🎯 Ejercicio Práctico

Verificación Completa del Dispositivo

// full-device-check.js
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

class DeviceChecker {
  async checkAll() {
    console.log('🔍 Iniciando verificación completa...\n');
    
    const checks = [
      this.checkADB(),
      this.checkDevice(),
      this.checkDeveloperOptions(),
      this.checkPackages(),
      this.checkConnectivity()
    ];
    
    await Promise.all(checks);
    console.log('\n✅ Verificación completa!');
  }
  
  async checkADB() {
    try {
      await execPromise('adb version');
      console.log('✅ ADB funcionando');
    } catch (e) {
      console.log('❌ ADB no encontrado');
    }
  }
  
  async checkDevice() {
    try {
      const { stdout } = await execPromise('adb devices');
      if (stdout.includes('\tdevice')) {
        console.log('✅ Dispositivo conectado');
      } else {
        console.log('❌ No hay dispositivos');
      }
    } catch (e) {
      console.log('❌ Error verificando dispositivos');
    }
  }
  
  async checkDeveloperOptions() {
    try {
      const { stdout } = await execPromise(
        'adb shell settings get global development_settings_enabled'
      );
      if (stdout.trim() === '1') {
        console.log('✅ Opciones de desarrollador activas');
      } else {
        console.log('⚠️ Opciones de desarrollador inactivas');
      }
    } catch (e) {
      console.log('❌ No se pudo verificar opciones');
    }
  }
  
  async checkPackages() {
    try {
      const { stdout } = await execPromise(
        'adb shell pm list packages | grep -c package'
      );
      console.log(`✅ Packages instalados: ${stdout.trim()}`);
    } catch (e) {
      console.log('❌ Error listando packages');
    }
  }
  
  async checkConnectivity() {
    try {
      const { stdout } = await execPromise(
        'adb shell ping -c 1 google.com'
      );
      if (stdout.includes('1 received')) {
        console.log('✅ Conectividad a Internet');
      }
    } catch (e) {
      console.log('⚠️ Sin conectividad a Internet');
    }
  }
}

new DeviceChecker().checkAll();

📋 Checklist Final

### ✅ Dispositivo Listo para Appium

- [ ] Opciones de desarrollador habilitadas
- [ ] Depuración USB activada
- [ ] Instalación vía USB permitida
- [ ] Dispositivo autorizado (RSA key)
- [ ] Drivers USB instalados (Windows)
- [ ] Reglas udev configuradas (Linux)
- [ ] ADB detecta el dispositivo
- [ ] Pantalla configurada para no apagarse
- [ ] Animaciones reducidas/desactivadas
- [ ] Cable USB de datos (no solo carga)
- [ ] Puerto USB funcionando correctamente
- [ ] Sin aplicaciones de seguridad bloqueando

📚 Resumen

Has preparado exitosamente tu dispositivo Android para automatización con Appium:

🚀 Próximo Paso

Con el dispositivo listo, ahora configuraremos el driver UiAutomator2 para comenzar a automatizar.

👉 Continuar con Capítulo 3: Configuración del Driver UiAutomator2


Tip: Si trabajas con múltiples dispositivos, crea un script que automatice estas configuraciones para ahorrar tiempo en futuros setups.