Releases

Kotlin 1.6.20 veröffentlicht

Read this post in other languages:

Kotlin 1.6.20 wurde offiziell veröffentlicht. Die neue Version zeigt eine Vorschau auf zukünftige Sprachmerkmale, verwendet die hierarchische Struktur als Standard für Multiplattform-Projekte und bietet Performance-Verbesserungen für die Plattformen JVM, JS und Native.

In diesem Blogeintrag finden Sie einen Überblick über die folgenden Verbesserungen sowie eine komplette Liste der weiteren evolutionären Änderungen:


So führen Sie das Update durch

Wenn Sie IntelliJ IDEA oder Android Studio verwenden, haben Sie die Möglichkeit, automatisch auf die neue Kotlin-Version zu aktualisieren.

Auf Kotlin 1.6.20 aktualisieren

Wichtige Updates

Kontext-Receiver für Kotlin/JVM als Prototyp

Mit Kotlin 1.6.20 sind Sie nicht mehr auf einen einzigen Receiver beschränkt. Wenn Sie mehrere benötigen, können Sie Funktionen, Eigenschaften und Klassen kontextabhängig (oder kontextuell) machen, indem Sie der Deklaration Kontext-Receiver hinzufügen. Eine kontextuelle Deklaration hat folgende Auswirkungen:

  • Sie erfordert, dass alle deklarierten Kontext-Receiver im Geltungsbereich eines Aufrufers als implizite Receiver vorhanden sind.
  • Sie nimmt deklarierte Kontext-Receiver als implizite Receiver in ihren Geltungsbereich auf.

Um Kontext-Receiver in Ihrem Projekt zu aktivieren, verwenden Sie die Compileroption -Xcontext-receivers. Eine ausführliche Beschreibung der Funktionalität und ihrer Syntax finden Sie im entsprechenden KEEP.

Bitte beachten Sie, dass die Implementierung ein Prototyp ist: 

  • Wenn -Xcontext-receivers aktiviert wird, erzeugt der Compiler Pre-Release-Binärdateien, die nicht in Produktionscode verwendet werden können. 
  • Die IDE-Unterstützung für Kontext-Receiver ist im Moment minimal.

Definitiv nicht-nullbare Typen

Um die Interoperabilität bei der Erweiterung von generischen Java-Klassen und -Schnittstellen zu verbessern, können Sie in Kotlin 1.6.20 einen generischen Typparameter am Verwendungsort mit der neuen Syntax T & Any als definitiv nicht-nullbar markieren. Die syntaktische Form entstammt der Intersection-Typnotation und ist hier auf einen Typparameter mit nullfähigen oberen Grenzen links vom & und einem nicht nullfähigen Any auf der rechten Seite beschränkt:

Setzen Sie die Sprachversion auf 1.7, um die Funktionalität zu aktivieren:

Weitere Informationen zu definitiv nicht-nullbaren Typen finden Sie im KEEP.

Bitte beachten Sie, dass definitiv nicht-nullbare Typen Beta-Status haben. Sie sind nahezu stabil, aber in Zukunft könnten Migrationsschritte erforderlich werden. Wir werden uns bemühen, Änderungen, die Sie später durchführen müssen, zu minimieren.

Unterstützung für paralleles Kompilieren eines Einzelmoduls im JVM-Backend

In Kotlin 1.6.20 haben wir den experimentellen JVM-IR-Backend-Modus hinzugefügt, um alle Dateien eines Moduls parallel zu kompilieren. Durch paralleles Kompilieren kann die gesamte Kompilierungszeit um bis zu 15% reduziert werden.

Sie können den experimentellen parallelen Backend-Modus mit der Compileroption -Xbackend-threads aktivieren. Verwenden Sie die folgenden Argumente für diese Option:

  • N gibt die Anzahl der Threads an, die Sie verwenden möchten. Der Wert sollte nicht größer sein als die Anzahl Ihrer CPU-Kerne, da sonst die Parallelisierung aufgrund von Kontextwechseln zwischen den Threads nicht mehr effektiv ist.
  • 0 bedeutet, dass ein Thread pro CPU-Kern verwendet wird.

Gradle kann Tasks zwar parallel ausführen, aber diese Art der Parallelisierung ist nicht sehr hilfreich, wenn ein Projekt (oder ein großer Teil davon) aus der Perspektive von Gradle ein einziger großer Task ist. Wenn Sie ein sehr großes monolithisches Modul haben, verwenden Sie die parallele Kompilierung, um den Vorgang zu beschleunigen. Wenn Ihr Projekt aus zahlreichen kleinen Modulen besteht und der Build-Prozess von Gradle parallelisiert wird, kann das Hinzufügen einer weiteren Parallelisierungsebene aufgrund von Kontextwechseln die Leistung mindern.

Die parallele Kompilierung unterliegt einigen Beschränkungen:

  • Sie funktioniert nicht mit kapt, da kapt das IR-Backend deaktiviert.
  • Sie benötigt bauartbedingt mehr JVM-Heap. Die Heap-Größe ist proportional zur Anzahl der Threads.

Inkrementelle Kompilierung für Entwicklungs-Binaries mit dem Kotlin/JS-IR-Compiler

Um die Kotlin/JS-Entwicklung mit dem IR-Compiler effizienter zu gestalten, haben wir einen neuen inkrementellen Kompiliermodus eingeführt.

Beim Kompilieren von Entwicklungs-Binärdateien mit dem Gradle-Task compileDevelopmentExecutableKotlinJs speichert der Compiler in diesem Modus die Ergebnisse früherer Kompilierungen auf der Modulebene in einem Cache. Bei nachfolgenden Kompilierungen werden bei unveränderten Quellcode-Dateien die im Cache gespeicherten Kompilierungsergebnisse verwendet. Dadurch wird der Vorgang insbesondere bei kleinen Änderungen beschleunigt. Zu beachten ist, dass diese Verbesserung ausschließlich auf den Entwicklungsprozess abzielt (Verkürzung des Edit-Build-Debug-Zyklus) und keinen Einfluss auf die Kompilierung von Produktionsartefakten hat.

Um die inkrementelle Kompilierung für Entwicklungs-Binärdateien zu aktivieren, fügen Sie der gradle.properties-Datei im Projekt die folgende Zeile hinzu:

Bei unseren Testprojekten hat der neue Modus das inkrementelle Kompilieren um bis zu 30% beschleunigt. Der erste Build wird in diesem Modus jedoch verlangsamt, da die Caches angelegt und gefüllt werden müssen.

Performance-Verbesserungen für Kotlin/Native

Kotlin 1.6.20 enthält einige Leistungsupdates und Bugfixes, die den von Kotlin generierten LLVM-Zwischencode betreffen. In den Benchmarks mit unseren internen Projekten haben wir im Durchschnitt folgende Leistungssteigerungen erzielt:

  • Um 15% kürzere Ausführungszeit
  • Um 20% reduzierte Codegröße von Release- und Debug-Binärdateien
  • Um 26% kürzere Kompilierungszeit von Release-Binärdateien

Außerdem ermöglichten diese Änderungen in einem großen internen Projekt eine um 10% kürzere Kompilierungszeit von Debug-Binärdateien.

Um dies zu erreichen, haben wir eine statische Initialisierung für einige der vom Compiler erzeugten synthetischen Objekte implementiert, die Strukturierung des LLVM-Zwischencodes für jede Funktion verbessert und die Compiler-Caches optimiert.

Hierarchische Strukturen für Multiplattform-Projekte

In Kotlin 1.6.20 ist die Unterstützung für hierarchische Strukturen standardmäßig aktiviert. Seit der Einführung in Kotlin 1.4.0 haben wir das Frontend erheblich verbessert und den IDE-Import stabilisiert.

Früher gab es zwei Möglichkeiten, Code zu einem Multiplattform-Projekt hinzuzufügen. Die erste Möglichkeit besteht darin, den Code in ein plattformspezifisches Quellcode-Set aufzunehmen, das auf eine einzige Zielplattform beschränkt ist und nicht für andere Plattformen verwendet werden kann. Die zweite Möglichkeit ist die Verwendung eines gemeinsamen Quellcode-Sets für alle Plattformen, die derzeit von Kotlin unterstützt werden.

Jetzt haben Sie auch die Möglichkeit, gemeinsamen Quellcode für mehrere ähnliche native Zielplattformen zu nutzen und dadurch einen Großteil der gemeinsamen Logik und der Drittanbieter-APIs gemeinsam zu verwenden. Die Technologie stellt die korrekten Standardabhängigkeiten bereit und findet die genaue API, die im gemeinsamen Code verfügbar ist. Dadurch entfällt die Notwendigkeit komplexer Build-Setups und Workarounds, um IDE-Unterstützung für gemeinsame Quellcode-Sets für native Kompilierungsziele zu erhalten. Außerdem wird dadurch die unsichere Nutzung von APIs verhindert, die für eine andere Zielplattform bestimmt sind.

Diese Technologie ist auch bei der Entwicklung von Bibliotheken sehr nützlich, da eine hierarchische Projektstruktur die Möglichkeit bietet, Bibliotheken mit gemeinsamen APIs für eine Untermenge von Zielplattformen zu veröffentlichen und zu konsumieren.
Standardmäßig sind Bibliotheken, die mit einer hierarchischen Projektstruktur veröffentlicht werden, nur mit Projekten kompatibel, die ebenfalls eine hierarchische Struktur verwenden. Erfahren Sie mehr über die Kompatibilität zwischen Projekten und Bibliotheken.

Verbesserte gemeinsame Codeverwendung in Ihrem Projekt

Ohne hierarchische Struktur gibt es keine einfache Möglichkeit, gemeinsamen Code für einige, aber nicht alle Kotlin-Zielplattformen zu verwenden. Ein häufiges Beispiel ist die gemeinsame Codeverwendung für alle iOS-Plattformen einschließlich Zugriff auf iOS-spezifische Abhängigkeiten wie Foundation.

Durch die hierarchische Projektstruktur ist dies jetzt standardmäßig möglich. In der neuen Struktur bilden die Quellcode-Sets eine Hierarchie. Sie können plattformspezifische Sprachmerkmale und Abhängigkeiten verwenden, die für alle Zielplattformen verfügbar sind, für die ein bestimmtes Quellcode-Set kompiliert wird.

Betrachten wir als Beispiel ein typisches Multiplattform-Projekt mit zwei Zielplattformen: iosArm64 und iosX64 für iOS-Geräte und -Simulatoren. Die Kotlin-Tools erkennen, dass beide Ziele über die gleiche Funktion verfügen und ermöglichen Ihnen den Zugriff auf diese Funktion aus dem intermediären Quellcode-Set iosMain.

Die Kotlin-Toolchain stellt die korrekten Standardabhängigkeiten bereit, z. B. die Kotlin/Native-Standardbibliothek oder native Bibliotheken. Außerdem versucht das Kotlin-Tool, den genauen API-Umfang zu ermitteln, der für den gemeinsamen Code verfügbar ist. Dadurch wird zum Beispiel verhindert, dass eine macOS-spezifische Funktion in gemeinsamem Code verwendet wird, der auch auf Windows abzielt.

Mehr Möglichkeiten für die Bibliotheksentwicklung

Wenn eine Multiplattform-Bibliothek veröffentlicht wird, wird die API der intermediären Quellcode-Sets jetzt ordnungsgemäß mitveröffentlicht, sodass sie verwendet werden kann. Auch hier ermittelt die Kotlin-Toolchain automatisch, welche API im Quellcode-Set des Konsumenten verfügbar ist. Dabei wird sorgfältig auf unsichere Verwendungen geachtet, zum Beispiel die Verwendung einer für die JVM bestimmten API in JS-Code. Erfahren Sie mehr über die gemeinsame Codeverwendung in Bibliotheken.

Konfiguration und Einrichtung

Ab Kotlin 1.6.20 werden alle Ihre neuen Multiplattform-Projekte eine hierarchische Projektstruktur haben. Eine weitere Einrichtung ist nicht erforderlich.

  • Wenn Sie diese Funktion bereits manuell aktiviert haben, können Sie die nunmehr veralteten Optionen aus gradle.properties entfernen:

  • Für eine optimale Erfahrung empfehlen wir, Kotlin 1.6.20 mit Android Studio 2021.1.1 (Bumblebee) oder höher zu verwenden.
  • Sie können die Funktion auch deaktivieren. Um hierarchische Strukturen zu deaktivieren, speichern Sie die folgenden Optionen in gradle.properties:

Komplette Liste der Verbesserungen

Sprache

Kotlin/JVM

Kotlin/Native

Kotlin Multiplatform

Kotlin/JS

Sicherheit

Gradle

Installation von Kotlin 1.6.20

Wenn Sie IntelliJ IDEA oder Android Studio bereits verwenden, schlägt Ihnen die IDE automatisch die Aktualisierung auf Kotlin 1.6.20 vor. Eine manuelle Aktualisierung ist ebenfalls möglich. Folgen Sie dazu diesen Anweisungen

Sie können die neuesten Versionen dieser IDEs herunterladen, um eine umfassende Kotlin-Unterstützung zu erhalten:

  • IntelliJ IDEA – zur Entwicklung von Kotlin-Anwendungen für verschiedene Plattformen.
  • Android Studio – zur Entwicklung von Android-Apps und plattformübergreifenden Mobilanwendungen.

Achten Sie darauf, auch die kotlinx-Bibliotheken auf die kompatiblen Versionen zu aktualisieren und die Kotlin-Version 1.6.20 in den Build-Skripten Ihrer bestehenden Projekte anzugeben.

Den Befehlszeilen-Compiler können Sie bei Bedarf von der GitHub-Release-Seite herunterladen.

Hilfe bei Problemen

Bleiben Sie stets auf dem neuesten Stand der Kotlin-Entwicklung! Abonnieren Sie unsere Kotlin-Updates, indem Sie das Formular rechts neben diesem Beitrag ausfüllen.

Weitere Informationen zum Lesen und Ansehen

Autor des Original-Blogposts:

Elizaveta Semakova

Andrey Polyakov

image description