Introduction à Kotlin

Si Kotlin existe depuis 2011, cela fait à peine près d’un an qu’il se démocratise dans le développement Android. Cet article a un pour objectif de vous  introduire ce langage à travers le développement d’un projet simple : un Toast affichant le contenu d’une ressource internet.

Kotlin ? Kezako ? Quel intérêt ?

Kotlin est un langage de programmation que l’on peut compiler pour la JVM ou JavaScript. Cela en fait donc une alternative possible à Java dans le développement d’applications Android.

Les avantages de Kotlin pour Android sont nombreux :

  • Kotlin est facile à apprendre, vous pourrez vous en convaincre à travers cet article et en approfondissant le sujet.
  • Kotlin est une dépendance légère, ce qui est d’une importance cruciale lorsque l’on se pose la question d’ajouter une couche supplémentaire dans le développement à destination des terminaux mobiles.
  • Il est possible, et même facile, de faire fonctionner Kotlin avec du code Java existant, ce qui rend possible le fait de commencer à développer avec Kotlin sur une application Android existante.
  • Kotlin est développé par JetBrains, auteur de l’IDE Android Studio. Inutile donc de préciser que l’intégration avec Android Studio et Gradle est excellente.

 

Mise en place du projet

Commencez par créer un projet Android de manière classique, en sélectionnant (pour cet exemple) « Empty Activity ».

Allez ensuite dans les paramètres d’Android Studio (raccourci Windows Ctrl + Alt + S) et rendez-vous dans la rubrique plugins. Enfin, cliquez sur le bouton « Browse Repositories… » en bas de la fenêtre.

Enfin, dans la nouvelle fenêtre, recherchez le plugin Kotlin et installez-le :

plugin-kotlin

Plugin Kotlin

Une fois ceci fait, redémarrez Android Studio comme c’est proposé.

 

Ajout du plugin Kotlin aux dépendances dans le fichier Gradle du projet

Ouvrez le fichier build.gradle du projet (celui avec Project : [NomProjet] et non celui du module avec Module : [NomModule]). Ajoutez les lignes surlignées ci-dessous :

buildscript {    
      repositories {
            jcenter()
       }
       dependencies {
             classpath 'com.android.tools.build:gradle:1.5.0'
             // Ajout du plugin Kotlin aux dépendances du projet
             classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1"
             // NOTE: Do not place your application dependencies here; they belong
             // in the individual module build.gradle files
       }
 }

Configuration du module dans le fichier Gradle

Les étapes qui vont suivre concernent le fichier build.gradle du module. Commencez par appliquer Kotlin au module :

apply plugin: 'com.android.application'
// Application du plugin Kotlin
apply plugin: 'kotlin-android'

Puis ajoutez la bibliothèque Kotlin aux dépendances du module :

dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar'])
      // Ajout de la dépendance à la bibliothèque Kotlin
      compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1'
      testCompile 'junit:junit:4.12'
      compile 'com.android.support:appcompat-v7:23.2.0'
 }

Enfin, si vous souhaitez ajouter Kotlin à un projet existant, je vous suggère de séparer les sources Java et Kotlin, en ajoutant éventuellement la ligne suivante :

android {
      compileSdkVersion 23
      buildToolsVersion "23.0.3"
      // Ajout du répertoire Kotlin aux fichiers source de l'application
      sourceSets {
            main.java.srcDirs += 'src/main/kotlin'
      }
      ...
}

 

Il ne vous restera plus qu’à créer ce répertoire dans votre projet.

 

Conversion de MainActivity en Kotlin

Notre projet n’étant amené à contenir que du code Kotlin, la première chose que nous allons faire va être de convertir le code Java généré pour l’Activity en code Kotlin.

Pour se faire, ouvrez le fichier MainActivity, et convertissez-le en Kotlin dans le menu Code en choisissant « Convert Java File to Kotlin File » (Raccourci Windows : Ctrl + Alt + Maj + K)

convert-java-kotlin

Le code de votre Activity devrait désormais ressembler à ceci :

package package
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
      }
 }

 

Les principales différences sont les suivantes :

  • Les deux points remplacent le mot extends
  • L’ajout de « override » dans la déclaration de la méthode onCreate(), obligatoire avec Kotlin
  • Le mot fun, abréviation de function dans la déclaration de la méthode onCreate()
  • Le nom de l’argument précède le type, les deux étant séparés par deux points
  • L’ajout du point d’interrogation en suffixe du type, indiquant que l’argument peut prendre la valeur null (obligatoire avec Kotlin), votre code ne compilera pas si une variable peut prendre la valeur null et que son type n’est pas suffixé d’un ?

 

Ajout de la bibliothèque Anko

Un article d’introduction au développement Kotlin pour Android serait vraiment incomplet sans une introduction à la bibliothèque Anko. Cette bibliothèque se vante de vous permettre de développer plus rapidement et plus facilement, vous permettant d’écrire un code plus propre et plus facile à lire. Je vous laisserai juger de cette affirmation dans la suite de ce tutoriel.

Pour ajouter la bibliothèque Anko à votre projet, ajoutez simplement les lignes suivantes au fichier Gradle de votre module :

dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
      // Ajout de la dépendance à la bibliothèque Kotlin
      compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1'
      // Ajout des dépendances à la bibliothèque Anko
      compile 'org.jetbrains.anko:anko-sdk15:0.8.3' // sdk19, sdk21, sdk23 are also available
      compile 'org.jetbrains.anko:anko-support-v4:0.8.3' // In case you need support-v4 bindings
      compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.3' // For appcompat-v7 bindings
      testCompile 'junit:junit:4.12'
      compile 'com.android.support:appcompat-v7:23.2.0'
}

 

Développement de notre mini application

Retournez dans le code de la MainActivity et ajoutez les lignes suivantes :

class MainActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      async() {
           val result = URL("http://www.gahfy.net/helloworld.txt").readText()
            uiThread {
                 toast(result)
            }
     }
     }
 }

 

L’extrême simplicité du code suivant est dû en grande partie à l’utilisation de la biblitohèque Anko :

  • La syntaxe async(){} et uiThread{}
  • L’utilisation de la méthode readText()
  • L’utilisation de la méthode simplifiée toast()

Compilez et exécutez l’application, attendez le toast, attendez encore, attendez longtemps, il n’apparaîtra jamais. Peut-être qu’avec la permission INTERNET dans le manifest, ça fonctionnerait mieux, mais cette erreur n’est là que pour vous montrer une chose très importante : il n’y a pas eu de fermeture forcée de votre application.

L’exception est bien lancée, mais Kotlin se contente de ne pas exécuter le code qui suit. L’exception est bien générée (un try catch vous permettra de vous en assurer), mais Kotlin arrête l’exécution du code sans forcer la fermeture.

Cela présente un avantage énorme, éviter les try/catch à rallonge imposé par Java, notamment lorsque vous appelez une fonction générant une exception. Ainsi, vous pouvez ne catcher que les exceptions qui risquent d’être déclenchées, et ignorer celles qui n’apparaîtront jamais dans votre contexte. Fini de devoir catcher WrongEncodingException alors que vous spécifiez UTF-8.

Ajoutez la permission dans le Manifest :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
       package="package">
<uses-permission android:name="android.permission.INTERNET" />

Vous pouvez recompiler et exécuter cette application, normalement, le Toast devrait apparaître (pour peu que votre mobile soit connecté à Internet).

 

Conclusion

Ce projet avait pour unique but de vous fournir un très rapide aperçu des possibilités offertes par Kotlin utilisé conjointement avec la bibliothèque Anko dans le cadre du développement d’application Android.

Vous pourrez retrouver l’intégralité du code de cette mini-application sur le repo GitHub : https://github.com/gahfy/PaugKotlinIntro

En espérant que cet article vous aura été utile. N’hésitez pas à réagir en indiquant si des articles de ce type vous intéressent ou à poser vos questions en commentaire.

Gaëtan HERFRAY, développeur Android freelance, auteur du blog Gahfy. Suivez-moi sur Twitter.

paug