Méthodes d'interface par défaut dans Android : l'erreur Nougat et sa solution (Kotlin)

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : L'erreur « invisible » qui casse la compilation

\n\n

Vous é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\n
Default interface methods are only supported starting with Android 7.0 (Nougat)
\n\n

Une 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\n

En 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\n

Dans 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\n

Qu'est-ce qu'une « default interface method » et pourquoi est-elle apparue ?

\n\n

Commenç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\n

Kotlin, en tant que langage moderne, prend entièrement en charge ce concept. Par exemple :

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

Ici, 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 ?

\n\n

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\n

Pourquoi l'erreur se produit-elle dans Android Studio ?

\n\n

Lorsque 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).

\n\n

C'est pourquoi le compilateur génère l'erreur :

\n\n
Default 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\n

Scénario typique où cela se produit

\n\n

Le 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, LifecycleObserver ou DefaultLifecycleObserver).
  • \n
\n\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\n

Comment corriger l'erreur ? 3 méthodes éprouvées

\n\n

Examinons toutes les solutions possibles — de la plus simple à la plus flexible.

\n\n

Méthode 1 : Augmenter minSdkVersion à 24

\n\n

C'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) :

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

Avantages : rapide, propre

Blogs

Book Recommendations