Preguntas para Entrevistas de Desarrollador Senior Mobile (Android): Guía Completa

Milad Bonakdar
Autor
Domina el desarrollo avanzado de Android con preguntas esenciales para entrevistas que cubren patrones de arquitectura, optimización del rendimiento, inyección de dependencias, pruebas, seguridad y diseño de sistemas para desarrolladores senior.
Introducción
Se espera que los desarrolladores Android Senior diseñen aplicaciones escalables y mantenibles, al tiempo que garantizan un alto rendimiento y calidad del código. Este rol exige una profunda experiencia en frameworks de Android, patrones arquitectónicos, inyección de dependencias, estrategias de pruebas y la capacidad de tomar decisiones técnicas informadas.
Esta guía completa cubre las preguntas esenciales de la entrevista para Desarrolladores Android Senior, que abarcan conceptos avanzados de Kotlin, patrones arquitectónicos, optimización del rendimiento, inyección de dependencias, pruebas y diseño de sistemas. Cada pregunta incluye respuestas detalladas, evaluación de rareza y niveles de dificultad.
Kotlin Avanzado y Características del Lenguaje (5 Preguntas)
1. Explica las Corrutinas de Kotlin y sus ventajas sobre los hilos.
Respuesta: Las corrutinas son primitivas de concurrencia ligeras que permiten escribir código asíncrono de forma secuencial.
- Ventajas sobre los Hilos:
- Ligereza: Se pueden crear miles de corrutinas sin problemas de rendimiento
- Concurrencia Estructurada: La relación padre-hijo garantiza una limpieza adecuada
- Soporte de Cancelación: Propagación de cancelación incorporada
- Manejo de Excepciones: Manejo de excepciones estructurado
- Componentes Clave:
- CoroutineScope: Define el ciclo de vida
- Dispatchers: Controlan el contexto de ejecución (Main, IO, Default)
- suspend functions: Se pueden pausar y reanudar
Rareza: Muy Común Dificultad: Difícil
2. ¿Qué son las Sealed Classes y cuándo deberías usarlas?
Respuesta: Las sealed classes representan jerarquías de clases restringidas donde todas las subclases se conocen en tiempo de compilación.
- Beneficios:
- Expresiones
whenexhaustivas - Gestión de estado con seguridad de tipos
- Mejor que los enums para datos complejos
- Expresiones
- Casos de Uso: Representación de estados, resultados, eventos de navegación
Rareza: Común Dificultad: Media
3. Explica Kotlin Flow y en qué se diferencia de LiveData.
Respuesta: Flow es el stream asíncrono frío de Kotlin que emite valores secuencialmente.
- Flow vs LiveData:
- Flow: Stream frío, soporta operadores, no es consciente del ciclo de vida, más flexible
- LiveData: Stream caliente, consciente del ciclo de vida, específico de Android, más simple para la UI
- Tipos de Flow:
- Flow: Stream frío (comienza al ser recolectado)
- StateFlow: Stream caliente con estado actual
- SharedFlow: Stream caliente para eventos
Rareza: Muy Común Dificultad: Difícil
4. ¿Qué son las Inline Functions y cuándo deberías usarlas?
Respuesta: Las inline functions copian el cuerpo de la función al sitio de la llamada, evitando la sobrecarga de la llamada a la función.
- Beneficios:
- Elimina la sobrecarga de la asignación de lambdas
- Permite retornos no locales desde lambdas
- Mejor rendimiento para funciones de orden superior
- Casos de Uso: Funciones de orden superior con parámetros lambda
- Compromiso: Aumenta el tamaño del código
Rareza: Media Dificultad: Difícil
5. Explica la Delegación en Kotlin.
Respuesta: La delegación permite que un objeto delegue algunas de sus responsabilidades a otro objeto.
- Delegación de Clases: Palabra clave
by - Delegación de Propiedades: Lazy, observable, delegates
- Beneficios: Reutilización de código, composición sobre herencia
Rareza: Media Dificultad: Media
Patrones de Arquitectura (6 Preguntas)
6. Explica la arquitectura MVVM y sus beneficios.
Respuesta: MVVM (Model-View-ViewModel) separa la lógica de la UI de la lógica de negocio.
- Model: Capa de datos (repositories, data sources)
- View: Capa de UI (Activities, Fragments, Composables)
- ViewModel: Lógica de presentación, sobrevive a los cambios de configuración
- Beneficios: Testeable, separación de responsabilidades, consciente del ciclo de vida
Rareza: Muy Común Dificultad: Media
7. ¿Qué es la Arquitectura Limpia y cómo la implementas en Android?
Respuesta: La Arquitectura Limpia separa el código en capas con dependencias claras.
- Presentation: UI, ViewModels
- Domain: Use Cases, Business Logic, Entities
- Data: Repositories, Data Sources (API, Database)
- Dependency Rule: Las capas internas no conocen las capas externas
Rareza: Común Dificultad: Difícil
8. Explica la Inyección de Dependencias y Dagger/Hilt.
Respuesta: La Inyección de Dependencias proporciona dependencias a las clases en lugar de crearlas internamente.
- Beneficios: Testeabilidad, bajo acoplamiento, reutilización
- Dagger: Framework de DI en tiempo de compilación
- Hilt: Dagger simplificado para Android
Rareza: Muy Común Dificultad: Difícil
9. ¿Qué es el patrón Repository y por qué usarlo?
Respuesta: El patrón Repository abstrae las fuentes de datos, proporcionando una API limpia para el acceso a los datos.
- Beneficios:
- Única fuente de verdad
- Lógica de datos centralizada
- Fácil de cambiar las fuentes de datos
- Testeable
- Implementación: Coordina entre múltiples fuentes de datos
Rareza: Muy Común Dificultad: Media
10. Explica la arquitectura de Single Activity.
Respuesta: La arquitectura de Single Activity utiliza una Activity con múltiples Fragments, gestionados por el Navigation Component.
- Beneficios:
- Navegación simplificada
- ViewModels compartidos entre fragments
- Mejores animaciones
- Deep linking más fácil
- Navigation Component: Maneja las transacciones de fragmentos, la pila de retroceso, los argumentos
Rareza: Común Dificultad: Media
11. ¿Qué es la arquitectura MVI (Model-View-Intent)?
Respuesta: MVI es una arquitectura de flujo de datos unidireccional inspirada en Redux.
- Componentes:
- Model: Representa el estado de la UI
- View: Renderiza el estado, emite intents
- Intent: Acciones/eventos del usuario
- Beneficios: Estado predecible, depuración más fácil, depuración de viaje en el tiempo
Rareza: Media Dificultad: Difícil
Rendimiento y Optimización (5 Preguntas)
12. ¿Cómo optimizas el rendimiento de RecyclerView?
Respuesta: Múltiples estrategias mejoran el rendimiento del desplazamiento de RecyclerView:
- ViewHolder Pattern: Reutiliza vistas (incorporado)
- DiffUtil: Actualizaciones de listas eficientes
- Stable IDs: Sobrescribe
getItemId()ysetHasStableIds(true) - Prefetching: Aumenta la distancia de prefetch
- Image Loading: Utiliza bibliotecas como Glide/Coil con el tamaño adecuado
- Avoid Heavy Operations: No realices cálculos costosos en
onBindViewHolder - Nested RecyclerViews: Establece
setRecycledViewPool()ysetHasFixedSize(true)
Rareza: Muy Común Dificultad: Media
13. ¿Cómo detectas y corriges las fugas de memoria en Android?
Respuesta: Las fugas de memoria ocurren cuando los objetos se mantienen en la memoria más tiempo del necesario.
- Causas Comunes:
- Fugas de contexto (referencias a Activity/Fragment)
- Referencias estáticas
- Clases internas anónimas
- Listeners no registrados
- Corrutinas no canceladas
- Herramientas de Detección:
- Librería LeakCanary
- Android Studio Memory Profiler
- Heap dumps
Rareza: Muy Común Dificultad: Media
14. ¿Cómo optimizas el tiempo de inicio de la app?
Respuesta: Un inicio más rápido mejora la experiencia del usuario:
- Lazy Initialization: Inicializa los objetos solo cuando sea necesario
- Avoid Heavy Work in Application.onCreate():
- Mueve al hilo de fondo
- Aplaza la inicialización no crítica
- Content Providers: Minimiza o carga de forma lazy
- Reduce Dependencies: Menos librerías = inicio más rápido
- App Startup Library: Inicialización estructurada
- Baseline Profiles: Sugerencias de compilación Ahead-of-time
Rareza: Común Dificultad: Media
15. ¿Cómo manejas la carga y el almacenamiento en caché de bitmaps de forma eficiente?
Respuesta: El manejo eficiente de imágenes es crucial para el rendimiento:
- Libraries: Glide, Coil (manejan el almacenamiento en caché automáticamente)
- Manual Optimization:
- Downsampling (carga imágenes más pequeñas)
- Memory cache (LruCache)
- Disk cache
- Bitmap pooling
Rareza: Común Dificultad: Difícil
16. ¿Qué es ANR y cómo lo previenes?
Respuesta: ANR (Application Not Responding) ocurre cuando el hilo principal se bloquea durante demasiado tiempo.
- Causas:
- Computación pesada en el hilo principal
- Llamadas de red en el hilo principal
- Operaciones de base de datos en el hilo principal
- Deadlocks
- Prevention:
- Mueve el trabajo pesado a hilos de fondo
- Utiliza corrutinas con dispatchers adecuados
- Evita bloques synchronized en el hilo principal
- Utiliza WorkManager para tareas en segundo plano
Rareza: Común Dificultad: Fácil
Pruebas (3 Preguntas)
17. ¿Cómo escribes pruebas unitarias para ViewModels?
Respuesta: Los ViewModels deben probarse de forma aislada con dependencias mockeadas.


