Introducción: El error «invisible» que rompe la compilación
\n\nEstá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\nDefault 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\nEn 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\nEn 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\nEmpecemos 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\nKotlin, como lenguaje moderno, es totalmente compatible con este concepto. Por ejemplo:
\n\ninterface Logger {\n fun log(message: String)\n fun logWithTimestamp(message: String) {\n log("${System.currentTimeMillis()}: $message")\n }\n}\n\nAquí, 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?
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\nCuando 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).
Por eso el compilador muestra el error:
\n\nDefault 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\nEscenario típico donde ocurre esto
\n\nLa 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,
LifecycleObserveroDefaultLifecycleObserver). \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\nVeamos todas las soluciones posibles, desde la más simple hasta la más flexible.
\n\nMétodo 1: Subir minSdkVersion a 24
\n\nEsta 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):
android {\n ...\n defaultConfig {\n minSdkVersion 24\n targetSdkVersion 34\n ...\n }\n}\n\nVentajas: rápido, limpio