Preguntas de entrevista para Android senior: Kotlin, Compose y arquitectura

Milad Bonakdar
Autor
Prepárate para entrevistas Android senior con preguntas prácticas sobre corrutinas Kotlin, estado en Jetpack Compose, arquitectura, rendimiento, pruebas, datos offline-first y seguridad.
Introducción
En una entrevista Android senior, prepárate para explicar decisiones de arquitectura, concurrencia segura con el ciclo de vida, propiedad del estado en Compose, flujos de datos offline-first, diagnóstico de rendimiento, estrategia de pruebas y seguridad. Una buena respuesta no solo dice qué API usarías, sino por qué encaja con la restricción del producto y cómo la depurarías en producción.
Usa esta guía como una lista práctica de preparación. Prioriza corrutinas y Flow, ViewModel y gestión de estado, repositorios con Room, decisiones entre Compose y UI heredada, arranque y memoria, y ejemplos reales de tus propias apps.
Cómo usar estas preguntas
- Practica cada respuesta como una decisión breve: contexto, trade-off, implementación y modo de fallo.
- Conecta las decisiones técnicas con impacto en usuarios, como arranque más rápido, lecturas offline fiables, tokens más seguros o menos errores de ciclo de vida.
- Prepara una historia real de proyecto para arquitectura, rendimiento, pruebas y seguridad.
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.


