Introduction : L'erreur « invisible » qui casse la compilation
\n\nVous écrivez une application en Kotlin, tout se passe bien, mais soudain — boum ! — Android Studio souligne une ligne en rouge, et dans les logs de compilation apparaît un message effrayant :
\n\nDefault interface methods are only supported starting with Android 7.0 (Nougat)\n\nUne situation familière ? Si vous êtes débutant en développement Android, cette erreur peut sembler un véritable mystère. Vous utilisez simplement une interface avec une méthode par défaut — qu'est-ce qui pourrait mal tourner ?
\n\nEn réalité, le problème réside dans l'incompatibilité entre le minSdkVersion de votre application et les capacités du langage Kotlin (qui utilise en interne les fonctionnalités de Java 8).
\n\nDans cet article, nous allons comprendre pourquoi cette erreur se produit, comment la corriger, et comment écrire du code moderne sans perdre la prise en charge des anciens appareils. C'est parti !
\n\nQu'est-ce qu'une « default interface method » et pourquoi est-elle apparue ?
\n\nCommençons par les bases. Dans les anciennes versions de Java (avant 8), les interfaces ne pouvaient contenir que des déclarations de méthodes — sans implémentation. Mais avec l'arrivée de Java 8, il est devenu possible d'ajouter aux interfaces des méthodes avec un corps (appelées méthodes par défaut).
\n\nKotlin, en tant que langage moderne, prend entièrement en charge ce concept. Par exemple :
\n\ninterface Logger {\n fun log(message: String)\n fun logWithTimestamp(message: String) {\n log("${System.currentTimeMillis()}: $message")\n }\n}\n\nIci, logWithTimestamp est une default interface method. Si une classe implémente Logger, elle peut ne pas redéfinir cette méthode, mais utiliser l'implémentation « par défaut ». Pratique, non ?
Le problème est qu'au niveau du bytecode Android, ces méthodes nécessitent le support du système d'exploitation. Et ce support n'est apparu qu'avec Android 7.0 (Nougat, API 24).
\n\nPourquoi l'erreur se produit-elle dans Android Studio ?
\n\nLorsque vous définissez minSdkVersion en dessous de 24 (par exemple, 21 ou 23), le compilateur Android voit que votre application peut fonctionner sur des appareils sous Android 6.0 ou 5.0. Or, sur ces versions, les méthodes d'interface par défaut ne sont pas prises en charge au niveau de la machine virtuelle (Dalvik/ART).
C'est pourquoi le compilateur génère l'erreur :
\n\nDefault interface methods are only supported starting with Android 7.0 (Nougat)\n\n
Il dit littéralement : « Je ne peux pas compiler ce code car ton application pourrait s'exécuter sur un appareil qui ne sait pas exécuter ce type de méthodes ».
\n\nScénario typique où cela se produit
\n\nLe plus souvent, l'erreur survient dans deux cas :
\n\n- \n
- Utilisation des collections Kotlin (par exemple,
listOf,mapOf) — elles ont des méthodes par défaut. \n - Utilisation de bibliothèques tierces qui contiennent en interne des interfaces avec des méthodes par défaut. \n
- Travail avec Android Jetpack (par exemple,
LifecycleObserverouDefaultLifecycleObserver). \n
Vous pouvez même ne pas écrire vos propres interfaces avec des méthodes par défaut — l'erreur apparaîtra quand même si l'une des dépendances les utilise.
\n\nComment corriger l'erreur ? 3 méthodes éprouvées
\n\nExaminons toutes les solutions possibles — de la plus simple à la plus flexible.
\n\nMéthode 1 : Augmenter minSdkVersion à 24
\n\nC'est la solution la plus directe. Si votre application n'est pas obligée de prendre en charge les appareils antérieurs à Android 7.0, modifiez simplement minSdkVersion dans le fichier build.gradle (au niveau du module) :
android {\n ...\n defaultConfig {\n minSdkVersion 24\n targetSdkVersion 34\n ...\n }\n}\n\nAvantages : rapide, propre