Kotlin Multiplatform (Mobile), c'est la techno qui décolle en 2021 ! Fruit de plusieurs années de développement et d'innovation, elle est en passe de réussir un tour de force : partager facilement du code entre une application iOS et Android sans les compromis inhérents aux frameworks cross-platform (par exemple React Native ou Flutter).
Mais tout d'abord, qu'est-ce que Kotlin ?
C'est un langage de programmation initialement prévu pour l'écosystème Java (JVM).
Il a été créé par l'éditeur Jetbrains pour améliorer Java.
Il apporte une syntaxe plus moderne et plus concise, mais aussi des fonctionnalités inédites pour les développeurs Java : null safety, coroutines, fonctions d'extensions... Tout en restant 100% compatible avec ce langage.
On peut sans problème mélanger du Java et du Kotlin dans le même projet et ainsi migrer tout en douceur vers ce langage. Pour en savoir plus, consultez notre article sur pourquoi choisir Kotlin pour son projet ?
Les versions de Kotlin jusqu'à aujourd'hui
Au cours de son développement, les concepteurs de Kotlin ont rendu possible quelque chose d'assez novateur : la possibilité de faire tourner du Kotlin en dehors de la JVM pour laquelle il avait été initialement conçu !
On peut ainsi écrire du Kotlin et le faire tourner dans un environnement Javascript (dans le browser ou dans un environnement Node.js) ou bien natif : on se passe alors de VM pour faire tourner notre programme, et on peut le compiler pour tout un tas de plateformes : Windows, Linux, macOS ou même iOS !
Les nombreux frameworks que supporte Kotlin
À ce stade, on peut déjà écrire un algorithme en Kotlin et le copier-coller dans des projets supportant différentes plateformes, mais pas une application entière !
En effet, les APIs des différents systèmes sont complètement incompatibles (on ne dessine pas un bouton ou on n'accède pas au réseau de la même manière sous Windows et sous iOS).
De plus, toutes ces plateformes n'utilisent pas le même langage pour développer des applications : C/C++ pour Windows, Objective-C ou Swift pour iOS et macOS, ...
Ce sont ces deux problèmes que Kotlin Multiplatform propose de résoudre.
Kotlin Multiplatform, c'est un SDK, c'est-à-dire un ensemble d'outils de développement qui permettent de faire tourner Kotlin... sur plusieurs plateformes !
Parmi ces outils, on retrouve l'interopérabilité du langage Kotlin avec les langages des autres plateformes supportées. En effet, si la plupart des langages permettent d'appeler des bibliothèques écrites dans un autre langage (bien souvent seul le langage C est supporté), il y a un travail manuel fastidieux à effectuer pour chaque bibliothèque et pour chaque fonction de la bibliothèque. Les outils d'interopérabilité de Kotlin Multiplatform fournissent ce code automatiquement et dans les 2 sens (on peut appeler du code Kotlin depuis un langage cible ou bien appeler le code d'une bibliothèque écrite dans un autre langage depuis Kotlin).
Le mapping des types de Kotlin vers Swift et Objective-C
Au-delà du langage, les outils permettent également de produire des bibliothèques au même format que celui du langage cible. Par exemple les développeurs iOS ont l'habitude d'utiliser des bibliothèques au format .framework écrites en Swift ou en Objective C. Le SDK Kotlin Multiplatform permet de produire des bibliothèques dans ce même format. Un développeur iOS pourra l'utiliser de la même manière que n'importe quelle autre bibliothèque, sans même savoir qu'il a été écrit en Kotlin !
Une autre innovation de Kotlin Multiplatform est la possibilité d'avoir des implémentations différentes pour certaines fonctions selon la plateforme sur laquelle le programme tourne. En effet, comme vu plus haut on doit dans certains cas faire tourner du code spécifique à la plateforme visée. Pour résoudre ce problème, Kotlin Multiplatform propose d'écrire plusieurs fois la fonction (une pour chaque plateforme) et choisira la bonne au moment de compiler le programme.
À ce stade, concentrons-nous sur le cas d'usage le plus populaire : écrire du code une seule fois et le faire tourner à la fois sur iOS et sur Android.
Comme vu précédemment, on a techniquement tous les outils pour le faire, mais il reste que pour tout ce qui touche à la plateforme, on doit écrire le code 2 fois.
De plus, même si l'écosystème Kotlin est riche de centaines de bibliothèques de qualité elles sont en général prévues pour ne tourner que dans l'environnement JVM : impossible de les réutiliser telles quel dans notre code multiplateforme.
Or des bibliothèques on en utilise en général beaucoup pour une application : pour accéder au réseau, pour sérialiser/désérialiser des données, pour gérer une base de données locale, les dates....
La bonne nouvelle, c'est qu'on a maintenant une bonne quantité de bibliothèques qui sont compatibles Multiplatform ! Écrites par Jetbrains ou par la communauté, on retrouve par exemple ktor pour gérer les appels réseaux, SQLDelight pour gérer une base de données locale, Koin pour faire de l'injection de dépendances...
Grâce à ces bibliothèques, on n'a quasiment plus besoin d'écrire du code spécifique à la plateforme (excepté pour l'UI), et la totalité du code écrit peut tourner sur les 2 plateformes !
Kotlin Multiplatform (KMP) est le nom du SDK exposé aux paragraphes précédents. Or une grande partie des usages est dirigée vers le partage de code entre iOS et Android. C'est donc vers ce cas d'usage que Jetbrains concentre ses efforts. Kotlin MultiplatformMobile (KMM) est donc le nom donné au sous-ensemble de KMP pour les usages mobiles, ainsi qu'à un plugin pour Intellij (l'IDE de Jetbrains qui permet entre autres de coder en Kotlin) qui permet de développer facilement pour iOS et Android.
Une application mobile est souvent architecturée en plusieurs couches. La couche UI qui contient le code de tous ce qui est visible sur l'écran, une couche de règles de gestion (Domain) qui contient la logique de l'application et les structures de données, et enfin une couche dite Data qui contient la logique de récupération de données sur le réseau et de persistance de données (une base de données par exemple).
Aujourd'hui, les promoteurs de KMM considèrent qu'on peut mutualiser le code des couches Domain et Data, et garder l'implémentation de l'UI spécifique à chaque plateforme.
C'est cette architecture qui donnera le maximum de flexibilité et de possibilités d'évolution aux applications. Garder une couche UI implémentée nativement permet de concevoir une UI tenant compte des spécificités de chaque plateforme et d'intégrer immédiatement les nouveautés graphiques des nouvelles versions d'iOS et d'Android.
Aujourd'hui plusieurs entreprises de renom développent tout ou partie de leur produit en utilisant KMM. Il est ainsi très facile de démarrer un projet KMM : à l'aide des templates disponibles dans Intellij, on peut en quelques clics générer un squelette d'application multiplateforme.
L'écosystème de bibliothèques s'agrandit chaque jour et Jetbrains travaille à passer KMM en beta (et donc à le sortir de son statut experimental) pour le printemps prochain.
Vous hésitez ? Parlons-en !