Sobes.tech
Middle

Que se passe-t-il lorsque nous utilisons des expressions lambda sur d'anciennes versions d'Android?

sobes.tech IA

Réponse de l'IA

Quand utilise-t-on des expressions lambda dans un projet pour les anciennes versions d'Android (avant API 24), le compilateur Kotlin ou Java (en utilisant la syntaxe lambda de Java 8) les transforme-t-il en classes anonymes ? Ce processus est automatique et effectué à l'aide d'outils de construction tels que le desugaring (pour Java) ou la génération de bytecode Kotlin.

Le desugaring est un processus qui permet d'utiliser de nouvelles fonctionnalités du langage Java, telles que les lambdas, les méthodes par défaut dans les interfaces, try-with-resources et autres, sur des versions plus anciennes d'Android où ces fonctionnalités ne sont pas disponibles au niveau JVM (Dalvik/ART). Les outils de construction (par exemple, D8/R8) transforment le bytecode généré à partir du code source utilisant ces nouvelles fonctionnalités en bytecode compatible avec l'environnement d'exécution de la version cible d'Android.

Pour Kotlin, le compilateur convertit également les lambdas en représentations bytecode appropriées, souvent en utilisant des classes anonymes. Lors de la compilation pour de anciennes versions d'Android, ce bytecode généré est également compatible avec l'environnement d'exécution cible.

Ainsi, le bytecode résultant fonctionne sur d'anciennes versions d'Android, mais peut contenir des classes supplémentaires (une classe anonyme par lambda), ce qui peut augmenter légèrement la taille de l'APK et le temps d'exécution (en raison de la création de nouveaux objets).

// Exemple de lambda en Java
Runnable r = () -> System.out.println("Bonjour!");
r.run();

Après le desugaring, cela peut être transformé approximativement en le bytecode suivant, équivalent à :

// Résultat émule du desugaring pour lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Bonjour!");
    }
};
r.run();

Pour Kotlin, le processus est similaire, le compilateur transforme également les lambdas en une forme équivalente.

// Exemple de lambda en Kotlin
val action = { println("Bonjour!") }
action.invoke()

Ce code sera également transformé en bytecode utilisant des classes anonymes ou des constructions équivalentes, compatibles avec la version cible d'Android.

Il est important de noter que dans les environnements de développement Android modernes (Android Studio, Gradle), le desugaring est activé par défaut pour la majorité des projets utilisant Kotlin ou certaines versions de Java. Cela rend l'utilisation des lambdas et d'autres fonctionnalités modernes du langage totalement transparente pour le développeur, sans étapes supplémentaires pour supporter les anciennes versions d'Android.