Le site officiel Kotlinlang explique bien les étapes de configuration pour les deux plateformes et pour résumer, l’architecture projet obtenue est la suivante :
androidApp et iosApp : sont utilisés pour le développement des applications natives des différentes plateformes.
SharedCode : concerne le module pour le développement de la bibliothèque qui sera partagée et est divisé en plusieurs parties :
Beaucoup d’applications mobiles utilisent les notions suivantes :
Mutualiser toutes ces parties nous laisse principalement l’interface graphique qui est codée nativement dans chaque plateforme. Mais on peut aller plus loin en introduisant une architecture telle que Viper ou la clean architecture afin de mieux organiser notre bibliothèque. Toutes les notions mutualisables seront réparties dans les différentes composantes de l’architecture choisie.
Aujourd'hui il existe des bibliothèques hybrides telles que Ktor pour les appels réseaux ou Kodein pour les injections de dépendances permettant de faciliter la mutualisation de code mais dans certains cas nous sommes hélas dépendant de l’implémentation native de certaines fonctionnalités telles que l’affichage de log ou encore, plus complexe, les notifications push.
Une des forces de Kotlin/Native c’est de facilement appeler du code natif via notre bibliothèque et cela grâce au mécanisme Actual et Expect.
Expect est un mot clé qui sera utilisé à côté d’une déclaration de fonction ou de variable se trouvant dans le dossier commonMain et qui fait appel à son implémentation se trouvant dans iosMain et androidMain dont le nom est le même et qui contient le mot clé Actual.
La bibliothèque générée ne comprendra qu’une des deux implémentation selon la plateforme ciblée. Encore une fois le site officiel Kotlinlang explique bien la démarche à suivre avec des exemples de code plus poussés.
Après m’être formé sur cette technologie j’ai pu réaliser une application permettant de convertir une monnaie d’une devise à une autre en ayant pour objectif de mutualiser tout son fonctionnement.
Sur ce prototype j’ai pu tester :
Le résultat en terme d’architecture est le suivant en utilisant une variante de la clean architecture :
Pour un développeur Android/Kotlin, une fois la connaissance des particularités du framework appréhendée, la création de la bibliothèque reste une "continuation" de ses habitudes de développement. Par contre, pour un développeur iOS sans expérience sur Kotlin, il peut y avoir une complexité plus grande liée à l'utilisation d'un nouveau langage et à un autre IDE.
Après avoir expérimenté cette technologie pendant un certain temps j’ai pu constater 3 principaux désagréments :
À noter que le framework est en pleine évolution et qu’à un certain moment, la phase de configuration était très fastidieuse. Par exemple, un plugin Cocoapods était récemment sorti pour simplifier l’utilisation de la bibliothèque générée sur Xcode alors qu’ il était nécessaire de le faire à la main auparavant.
Kotlin/Native est finalement un puissant argument à intégrer dans le large débat de la mutualisation et se démarque des technologies existantes par :
Malgré les quelques complications encourues durant mon expérimentation, ce framework a évolué en très peu de temps et aujourd'hui de plus en plus de collaborations se font autour de cette technologie telles que celle de Square et Touchlab. Pour ceux qui souhaitent voir plus de concret, je vous invite à regarder le fruit de mes expérimentations disponible sur Github.