Cómo construí DGTest Autoescuela: simulacros del examen de conducir para Android
DGTest Autoescuela es una app Android para preparar el examen teórico de conducir en España: simulacros con las preguntas oficiales de la DGT, analítica de progreso por temas y modo offline completo. Está disponible gratis en Google Play y puedes ver su ficha completa en la sección de apps.
En este artículo explico cómo tomé las decisiones técnicas clave: desde la elección de la fuente de datos hasta la arquitectura offline-first con Room, pasando por el motor de analítica de progreso y la integración de AdMob sin perjudicar la experiencia de estudio.
La idea: un problema real con datos abiertos
El examen teórico de conducir en España tiene una tasa de suspensos alta. La mayoría de los aspirantes estudia con las preguntas oficiales que la DGT pone a disposición pública, pero las apps existentes o estaban desactualizadas, o requerían conexión constante, o saturaban al usuario con anuncios en mitad de un simulacro.
La oportunidad era clara: una app con el banco de preguntas oficial, modo offline real (no solo caché), y analítica honesta para que el alumno supiera exactamente en qué temas flojeaba. Todo en una sola descarga, gratis.
Arquitectura: MVVM offline-first con Room
El requisito de offline-first determina la arquitectura desde el principio. No puedes depender de una API: las preguntas tienen que estar en el dispositivo antes de que el usuario abra la app por primera vez. Elegí Room como base de datos local por tres razones:
- Integración nativa con Jetpack y coroutines de Kotlin sin código boilerplate
- Consultas SQL con tipado en tiempo de compilación gracias a las anotaciones
@Dao - Soporte para migraciones de esquema cuando actualizo el banco de preguntas
La arquitectura sigue el patrón MVVM con tres capas bien separadas:
el QuizViewModel gestiona el estado de la sesión; el QuestionRepository
abstrae el acceso a Room; y la capa de UI con Fragments y un StateFlow
que refleja cualquier cambio de estado automáticamente.
El banco de preguntas: pre-population con Room
Las preguntas oficiales de la DGT se distribuyen en un dataset estructurado. Procesé ese
dataset para generar una base de datos SQLite pre-poblada que se empaqueta directamente en
los assets de la app. Room ofrece soporte nativo para esto mediante
createFromAsset() al construir la instancia de la base de datos:
Decisión de diseño: Pre-poblar la base de datos en build time tiene un coste: el APK pesa más. Pero para una app de estudio offline, ese intercambio vale la pena: el usuario puede usar la app en el metro, sin WiFi, desde el primer arranque, sin ninguna pantalla de "descargando contenido".
Analítica de progreso: saber dónde fallas
La analítica de progreso es la funcionalidad que más valoran los usuarios según las reseñas. Registré cada respuesta con su resultado, el tema y el tiempo de respuesta. Esto permite calcular métricas útiles por tema:
- Porcentaje de aciertos por tema: el usuario ve de un vistazo si tiene débil el tema de señales de prohibición frente al de prioridad de paso
- Preguntas falladas recientemente: lista de preguntas que el usuario ha fallado en los últimos 7 días para repaso dirigido
- Racha de simulacros superados: motivación por consistencia, no por puntuación puntual
Todo el historial se guarda en Room con una tabla AnswerRecord que relaciona
cada respuesta con el ID de la pregunta, el tema, si fue correcta y el timestamp. Las
consultas de analítica son simples agregaciones SQL que Room ejecuta en segundo plano
con suspend fun en el DAO.
Modo simulacro: reproducir el examen real
El examen de conducir de la DGT tiene formato fijo: 30 preguntas, 30 minutos, máximo 3 fallos. El modo simulacro de DGTest replica exactamente esas condiciones para que el alumno llegue sin sorpresas el día del examen:
- Contador regresivo de 30 minutos con alerta visual cuando quedan 5 minutos
- Selección aleatoria de preguntas respetando la distribución por temas del examen real (señales, normas de circulación, comportamiento del conductor, etc.)
- Resumen al finalizar: aciertos, fallos, tiempo empleado y enlace directo al repaso de los errores
Monetización con AdMob: sin interrumpir el estudio
Monetizar una app de estudio es más delicado que monetizar un juego. Un anuncio en mitad de una pregunta destruye la concentración y genera reseñas negativas. Decidí restringir los anuncios a dos momentos neutros:
- Banners en la pantalla de inicio y en la pantalla de resultados del simulacro (nunca durante las preguntas)
- Interstitials únicamente entre simulacros completos, con un mínimo de 2 simulacros completados antes del primer interstitial
La lógica de frecuencia es idéntica a la que usé en ConnectAll:
un contador en SharedPreferences que solo activa el interstitial cuando se
cumple el umbral mínimo de sesiones.
Lanzamiento en Google Play
El proceso de publicación fue similar al de ConnectAll, con un detalle adicional: las apps educativas con contenido de exámenes oficiales necesitan dejar claro en la descripción que el contenido es de preparación y no el examen oficial de la DGT. El equipo de revisión de Google Play lo verificó antes de aprobar la app.
- Descripción diferenciada que menciona explícitamente "simulacros de preparación"
- Capturas de pantalla mostrando la analítica de progreso, punto de venta diferencial respecto a la competencia
- Política de privacidad con el alcance exacto de los datos almacenados localmente
- Categoría Educación con público objetivo adolescente y adultos
Lecciones aprendidas
- El modo offline no es un bonus: es la razón principal por la que los usuarios eligen la app. Hacer offline-first desde el inicio de la arquitectura evita refactorizaciones costosas
- Room con base de datos pre-poblada funciona muy bien para contenido estático; la clave está en definir bien las migraciones antes de publicar la primera versión
- La analítica local —sin servidor, sin Firebase— tiene un límite: no puedes ver métricas de uso agregadas. Para una app v1 está bien, pero hay que tenerlo en cuenta si quieres iterar con datos reales
- Los usuarios de apps de autoescuela tienen un comportamiento de uso muy predecible (sesiones cortas, frecuentes, durante semanas) que simplifica el diseño de la UX y la calibración de los anuncios
Prueba DGTest Autoescuela en Google Play
Simulacros oficiales DGT, analítica de progreso y modo offline. Gratis en Android.