Wie binde ich in nur 5 Minuten Kotlin in Java-Android-Projekte ein?

Unser Kollege Aljoscha Burgmaier zeigt, dass Kotlin mühelos in Java-Android-Projekten integriert werden kann

Bislang wurde der Großteil aller Apps unter Android in Java geschrieben. Doch seit letztem Jahr wird zusätzlich Kotlin als Programmiersprache für Android unterstützt: Ab der Version 3.0 von Android Studio ist sie auch in Projekten einsetzbar. Da mobile Entwicklung ein wichtiges Thema auch für uns bei diva-e darstellt, habe ich begonnen, mich zunächst privat und im Studium mit Kotlin auseinanderzusetzen.

Wie binde ich in nur 5 Minuten Kotlin in Java-Android-Projekte ein?

Kurzausflug zu Kotlin

Kotlin ist eine seit 2010 entwickelte Programmiersprache von JetBrains. JetBrains sind unter anderem die Entwicklungsumgebung IntelliJ verantwortlich, die von vielen Java Entwicklern genutzt wird. Auf dieser Basis wurde Android Studio gebaut, die aktuelle Entwicklungsumgebung für Android Projekte.

Kotlin selbst ist eine angenehme Programmiersprache, die sich an Konzepten von Sprachen wir C#, Swift, Scala, Java und JavaScript bedient und sowohl funktionale als auch objektorientierte Konzepte vereint.

Doch nun zum eigentlichen Thema: Ich hatte schon öfter davon gehört, dass ich, falls ich bereits ein Android Projekt besitze, hier auch einfach Kotlin ausprobieren kann. Also habe ich mir ein internes Projekt geschnappt und einfach mal getestet, wie ich Kotlin einbinde und die Java Klassen in Kotlin übersetzen kann.

Projektaufbau

Als Test habe ich das Projekt „JavaToKotlin“ erstellt. Hier habe ich beispielsweise ein kleines Grußformular erstellt. Gibst du deinen Namen ein und drückst auf den Button, so wird dir eine kleine Grußnachricht ausgespielt. Falls das Feld leer ist, wird in rotem Text ausgegeben, dass die App dich nicht grüßen kann. Ziemlich einfacher Aufbau, der aber ein paar nette Möglichkeiten bietet.

Ich will hier einen kleinen Kotlin Service einbinden, der das Grüßen übernimmt. Viel muss er nicht können: Er soll mit einem Namen initialisiert werden und wenn er gefragt wird, eine kleine Grußnachricht ausgeben.

Einbinden von Kotlin

Für den aktuellen Stand habe ich das Projekt auch auf GitHub zur Verfügung gestellt. Das kannst du dir gerne auschecken und so den Weg, den ich beschrieben habe, selbst ausprobieren: https://github.com/diva-e/JavaToKotlin

Kotlin in dem Projekt zu konfigurieren ist nicht schwer. Zuerst erstelle ich den von uns geplanten Service. Ich lege also eine Klasse mit dem Namen „DivaGreeter“ an. Diese bekommt als Argumente im Konstruktor einen Namen, mehr braucht sie nicht. Außerdem füge ich noch die Methode „greet()“ hinzu, welche den Text ausgeben wird.

Die finale Klasse sieht nun bei mir wie folgt aus:

Bisher ist allerdings noch nichts konfiguriert. Vielleicht hast du die gelbe Meldung über der Kotlin Klasse schon bemerkt, die verkündet : „Kotlin not configured“. Ganz rechts wird angeboten, die Programmiersprache im Projekt zu konfigurieren. Einfach draufdrücken – und das war es eigentlich schon! Du kannst jetzt Kotlin in deinem Projekt verwenden.

Was ist da jetzt passiert?

Es hat sich direkt die „build.gradle“ geöffnet. In dieser wird dir aufgefallen sein, dass sich ein paar Dinge verändert haben:

  1. Ganz oben ist ein apply plugin: 'kotlin-android' hinzugekommen.

  2. Unter den „dependencies“ ist eine weitere hinzugefügt worden:
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

Diese Dependencies sind das Einzige, was Android Studio braucht, um Kotlin in Projekten zu kompilieren.

Falls die Meldung „Kotlin is not configured“ weiterhin angezeigt wird, startest du Android Studio einfach neu. Danach sollte alles funktionieren.

Verwendung von Kotlin

Jetzt wollen wir natürlich auch unseren Service verwenden. In der MainActivity haben wir kleine ClickListener registriert. In diesem entnehmen wir uns bislang den Namen aus dem Feld und zeigen einen Text an.

Das Ganze setze ich einfach mithilfe des DivaGreeters jetzt um. Anstatt mir den String aus dem EditText zu speichern, erstelle ich mir einen DivaGreeter und gebe in diesen die Eingabe des EditText. Nun kann ich ganz einfach die „greet()“ Methode aufrufen und loslegen.

Wenn der richtige Text angezeigt wird, ist alles super. Du kannst also Kotlin Code von Java aufrufen. Andersherum funktioniert das übrigens auch.

Was ist noch zu beachten?

Ich bin auf ein paar kleine Unterschiede gestoßen, als ich Kotlin in unser Projekt eingebaut habe:

Annotation Processing

Falls du zum Beispiel Room oder andere Architecture Components im Projekt hast, wirst du einen annotationProcessor in deiner build.gradle eingebunden haben. Leider gibt es damit ein paar Probleme, da Kotlin Annotationen nicht gleich sind wie Java Annotationen. Somit wird ein neuer Annotation Processor gebraucht. Nimm dazu einfach kapt. Füge oben bei den Plugins noch die Zeile: „apply plugin: 'kotlin-kapt'“ hinzu und anstatt „annotationProcessor“ verwende nun „kapt“. Somit sollten alle Annotationen unter Java noch funktionieren und die unter Kotlin auch.

Kotlin Android Extensions

Falls ein Projekt neu gebaut wird, werden die Kotlin Android Extensions schon automatisch in die build.gradle mit aufgenommen. Diese müssen noch manuell hinzugefügt werden. Hierzu musst du einfach nur wieder „apply plugin: 'kotlin-android-extensions“ hinzufügen und Gradle neu bauen lassen. Manchmal kann bei soetwas auch ein Neustart erforderlich sein. Danach kannst du aber alle Extensions verwenden.

Was hiermit alles machbar ist, kannst du hier nachlesen: https://kotlinlang.org/docs/tutorials/android-plugin.html

Vorsicht beim Erben

Es ist in dem Projekt einmal passiert, dass uns an einer Stelle, an der unser Java Code funktioniert hatte, eine IllegalArgumentException ausgespielt wurde. Das liegt daran, dass unter Kotlin jeder Typ, der mit Null aufgerufen werden kann, explizit angegeben werden muss. Diese nullable values können vor allem bei älteren Libraries von Android nicht ersichtlich sein. Falls also eine Methode überschrieben wird und beim Übersetzen die nullable values nicht angegeben wurden, wird während der Laufzeit versucht, die Methode aufzurufen, keine passende gefunden und eine IllegalAgumentException ausgespielt. Siehe in der Dokumentation nach oder überprüfe welche Parameter null sein können.

Zum Schluss

Einige meiner Kollegen haben Kotlin auch in Projekten ausprobiert, in denen kein Android genutzt wurde. Dort hat die Konfiguration sehr ähnlich funktioniert wie in Android Studio. Deshalb: Unbedingt selbst ausprobieren! Ich wünsche viel Spaß beim Testen von Kotlin – sollten sich noch Fragen ergeben, darfst du dich gern bei mir melden.