Métodos de interfaz predeterminados en Android: error Nougat y su solución (Kotlin)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: El error «invisible» que rompe la compilación

\n\n

Estás escribiendo una aplicación en Kotlin, todo va perfectamente, pero de repente — ¡pum! — Android Studio resalta en rojo una línea, y en los registros de compilación aparece un mensaje aterrador:

\n\n
Default interface methods are only supported starting with Android 7.0 (Nougat)
\n\n

¿Te resulta familiar? Si eres nuevo en el desarrollo de Android, este error puede parecer un verdadero misterio. Después de todo, solo estás usando una interfaz con un método predeterminado, ¿qué podría salir mal?

\n\n

En realidad, el problema radica en la incompatibilidad entre el minSdkVersion de tu aplicación y las capacidades del lenguaje Kotlin (que internamente utiliza características de Java 8).

\n\n

En este artículo, analizaremos por qué ocurre este error, cómo solucionarlo y cómo escribir código moderno sin perder soporte para dispositivos antiguos. ¡Allá vamos!

\n\n

¿Qué es un «default interface method» y por qué apareció?

\n\n

Empecemos por lo básico. En versiones antiguas de Java (anteriores a la 8), las interfaces solo podían contener declaraciones de métodos, sin implementación. Pero con la llegada de Java 8, surgió la posibilidad de añadir métodos con cuerpo a las interfaces (los llamados métodos predeterminados).

\n\n

Kotlin, como lenguaje moderno, es totalmente compatible con este concepto. Por ejemplo:

\n\n
interface Logger {\n    fun log(message: String)\n    fun logWithTimestamp(message: String) {\n        log("${System.currentTimeMillis()}: $message")\n    }\n}
\n\n

Aquí, logWithTimestamp es un default interface method. Si una clase implementa Logger, puede no sobrescribir este método y usar la implementación «por defecto». Práctico, ¿verdad?

\n\n

El problema es que, a nivel de bytecode de Android, estos métodos requieren soporte del sistema operativo. Y este soporte solo apareció en Android 7.0 (Nougat, API 24).

\n\n

¿Por qué ocurre el error en Android Studio?

\n\n

Cuando estableces minSdkVersion por debajo de 24 (por ejemplo, 21 o 23), el compilador de Android detecta que tu aplicación podría ejecutarse en dispositivos con Android 6.0 o 5.0. Y en esas versiones, los métodos predeterminados de interfaces no son compatibles a nivel de máquina virtual (Dalvik/ART).

\n\n

Por eso el compilador muestra el error:

\n\n
Default interface methods are only supported starting with Android 7.0 (Nougat)
\n\n

Literalmente dice: «No puedo compilar este código porque tu aplicación podría ejecutarse en un dispositivo que no sabe cómo ejecutar estos métodos».

\n\n

Escenario típico donde ocurre esto

\n\n

La mayoría de las veces, el error aparece en dos casos:

\n\n
    \n
  • Uso de colecciones de Kotlin (por ejemplo, listOf, mapOf) — tienen métodos predeterminados.
  • \n
  • Uso de bibliotecas de terceros que internamente contienen interfaces con métodos predeterminados.
  • \n
  • Trabajo con Android Jetpack (por ejemplo, LifecycleObserver o DefaultLifecycleObserver).
  • \n
\n\n

Incluso si no escribes tus propias interfaces con métodos predeterminados, el error igual aparecerá si alguna de las dependencias las utiliza.

\n\n

¿Cómo solucionar el error? 3 métodos comprobados

\n\n

Veamos todas las soluciones posibles, desde la más simple hasta la más flexible.

\n\n

Método 1: Subir minSdkVersion a 24

\n\n

Esta es la solución más directa. Si tu aplicación no necesita ser compatible con dispositivos anteriores a Android 7.0, simplemente cambia minSdkVersion en el archivo build.gradle (a nivel de módulo):

\n\n
android {\n    ...\n    defaultConfig {\n        minSdkVersion 24\n        targetSdkVersion 34\n        ...\n    }\n}
\n\n

Ventajas: rápido, limpio

Blogs

Book Recommendations