{"id":254692,"date":"2022-04-04T12:09:26","date_gmt":"2022-04-04T11:09:26","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2022\/04\/kotlin-1-6-20-released\/"},"modified":"2025-09-18T13:12:18","modified_gmt":"2025-09-18T12:12:18","slug":"kotlin-1-6-20-released","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/de\/kotlin\/2022\/04\/kotlin-1-6-20-released\/","title":{"rendered":"Kotlin 1.6.20 ver\u00f6ffentlicht"},"content":{"rendered":"<p>Kotlin 1.6.20 wurde offiziell ver\u00f6ffentlicht. Die neue Version zeigt eine Vorschau auf zuk\u00fcnftige Sprachmerkmale, verwendet die hierarchische Struktur als Standard f\u00fcr Multiplattform-Projekte und bietet Performance-Verbesserungen f\u00fcr die Plattformen JVM, JS und Native.<\/p>\n<\/p>\n<p>In diesem Blogeintrag finden Sie einen \u00dcberblick \u00fcber die folgenden Verbesserungen sowie eine <a title=\"#complete-list-of-improvements\" href=\"#complete-list-of-improvements\">komplette Liste der weiteren evolution\u00e4ren \u00c4nderungen<\/a>:<\/p>\n<\/p>\n<ul>\n<li>Neu eingef\u00fchrte Unterst\u00fctzung f\u00fcr die Definition kontextabh\u00e4ngiger Deklarationen in Kotlin\/JVM, abgeleitet aus dem <a title=\"#prototype-of-context-receivers-for-kotlin-jvm\" href=\"#prototype-of-context-receivers-for-kotlin-jvm\">Prototyp f\u00fcr Kontext-Receiver<\/a>.<\/li>\n<li>Verbesserte Interoperabilit\u00e4t mit generischen Java-Klassen und -Schnittstellen dank <a title=\"#definitely-non-nullable-types\" href=\"#definitely-non-nullable-types\">definitiv nicht-nullbarer Typen<\/a>.<\/li>\n<li>K\u00fcrzere Build-Zeiten durch die <a title=\"#support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\" href=\"#support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\">parallele Kompilierung von Einzelmodulen im JVM-IR-Backend<\/a>.<\/li>\n<li>Optimierte Entwicklungserfahrung durch <a href=\"#incremental-compilation-for-development-binaries-with-kotlin-js-ir-compiler\">inkrementelle Kompilierung in Kotlin\/JS IR<\/a>.<\/li>\n<li><a href=\"#kotlin-native-performance-improvements\">Performance-Verbesserungen f\u00fcr Kotlin\/Native<\/a>.<\/li>\n<li>Einfachere plattform\u00fcbergreifende Codeverwendung durch <a href=\"#hierarchical-structure-support-for-multiplatform-projects\">hierarchische Strukturierung von Multiplattform-Projekten<\/a>.<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Das ist neu in Kotlin 1.6.20\" src=\"https:\/\/www.youtube.com\/embed\/8F19ds109-o?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<hr class=\"wp-block-separator\">\n<h1 id=\"how-to-update\">So f\u00fchren Sie das Update durch<\/h1>\n<\/p>\n<p>Wenn Sie <a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> oder <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> verwenden, haben Sie die M\u00f6glichkeit, automatisch auf die neue Kotlin-Version zu aktualisieren.<\/p>\n<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Auf Kotlin 1.6.20 aktualisieren\" href=\"#how-to-install\">Auf Kotlin 1.6.20 aktualisieren<\/a><\/p>\n<\/p>\n<h1 id=\"major-updates\">Wichtige Updates<\/h1>\n<\/p>\n<h2 id=\"prototype-of-context-receivers-for-kotlin-jvm\"><span id=\"Prototype_of_context_receivers_for_KotlinJVM\" class=\"ez-toc-section\"><\/span>Kontext-Receiver f\u00fcr Kotlin\/JVM als Prototyp<\/h2>\n<\/p>\n<p>Mit Kotlin 1.6.20 sind Sie nicht mehr auf einen einzigen Receiver beschr\u00e4nkt. Wenn Sie mehrere ben\u00f6tigen, k\u00f6nnen Sie Funktionen, Eigenschaften und Klassen kontextabh\u00e4ngig (oder <em>kontextuell<\/em>) machen, indem Sie der Deklaration Kontext-Receiver hinzuf\u00fcgen. Eine kontextuelle Deklaration hat folgende Auswirkungen:<\/p>\n<\/p>\n<ul>\n<li>Sie erfordert, dass alle deklarierten Kontext-Receiver im Geltungsbereich eines Aufrufers als implizite Receiver vorhanden sind.<\/li>\n<li>Sie nimmt deklarierte Kontext-Receiver als implizite Receiver in ihren Geltungsbereich auf.<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\ninterface LoggingContext {&lt;br \/&gt;\n    val log: Logger \/\/ This context provides a reference to a logger&lt;br \/&gt;\n}&lt;\/p&gt;\n&lt;p&gt;context(LoggingContext)&lt;br \/&gt;\nfun startBusinessOperation() {&lt;br \/&gt;\n    \/\/ You can access the log property since LoggingContext is an implicit receiver&lt;br \/&gt;\n    log.info(\"Operation has started\")&lt;br \/&gt;\n}&lt;\/p&gt;\n&lt;p&gt;fun test(loggingContext: LoggingContext) {&lt;br \/&gt;\n    with(loggingContext) {&lt;br \/&gt;\n        \/\/ You need to have LoggingContext in a scope as an implicit receiver&lt;br \/&gt;\n        \/\/ to call startBusinessOperation()&lt;br \/&gt;\n        startBusinessOperation()&lt;br \/&gt;\n    }&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<\/p>\n<p>Um Kontext-Receiver in Ihrem Projekt zu aktivieren, verwenden Sie die Compileroption <code>-Xcontext-receivers<\/code>. Eine ausf\u00fchrliche Beschreibung der Funktionalit\u00e4t und ihrer Syntax finden Sie im entsprechenden <a href=\"https:\/\/github.com\/Kotlin\/KEEP\/blob\/master\/proposals\/context-receivers.md#detailed-design\" target=\"_blank\" rel=\"noopener\">KEEP<\/a>.<\/p>\n<\/p>\n<p>Bitte beachten Sie, dass die Implementierung ein <strong>Prototyp<\/strong> ist:&nbsp;<\/p>\n<\/p>\n<ul>\n<li>Wenn <code>-Xcontext-receivers<\/code> aktiviert wird, erzeugt der Compiler Pre-Release-Bin\u00e4rdateien, die nicht in Produktionscode verwendet werden k\u00f6nnen.&nbsp;<\/li>\n<li>Die IDE-Unterst\u00fctzung f\u00fcr Kontext-Receiver ist im Moment minimal.<\/li>\n<\/ul>\n<h2 id=\"definitely-non-nullable-types\"><span id=\"Definitely_non-nullable_types\" class=\"ez-toc-section\"><\/span>Definitiv nicht-nullbare Typen<\/h2>\n<\/p>\n<p>Um die Interoperabilit\u00e4t bei der Erweiterung von generischen Java-Klassen und -Schnittstellen zu verbessern, k\u00f6nnen Sie in Kotlin 1.6.20 einen generischen Typparameter am Verwendungsort mit der neuen Syntax <code>T &amp; Any<\/code> als definitiv nicht-nullbar markieren. Die syntaktische Form entstammt der <a href=\"https:\/\/en.wikipedia.org\/wiki\/Intersection_type\" target=\"_blank\" rel=\"noopener\">Intersection-Typnotation<\/a> und ist hier auf einen Typparameter mit nullf\u00e4higen oberen Grenzen links vom <code>&amp;<\/code> und einem nicht nullf\u00e4higen <code>Any<\/code> auf der rechten Seite beschr\u00e4nkt:<\/p>\n<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nfun &lt;T&gt; elvisLike(x: T, y: T &amp; Any): T &amp; Any = x ?: y&lt;\/p&gt;\n&lt;p&gt;fun main() {&lt;br \/&gt;\n   \/\/ OK&lt;br \/&gt;\n   elvisLike&lt;String&gt;(\"\", \"\").length&lt;br \/&gt;\n   \/\/ Error: 'null' cannot be a value of a non-null type&lt;br \/&gt;\n   elvisLike&lt;String&gt;(\"\", null).length&lt;\/p&gt;\n&lt;p&gt;   \/\/ OK&lt;br \/&gt;\n   elvisLike&lt;String?&gt;(null, \"\").length&lt;br \/&gt;\n   \/\/ Error: 'null' cannot be a value of a non-null type&lt;br \/&gt;\n   elvisLike&lt;String?&gt;(null, null).length&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<\/p>\n<p>Setzen Sie die Sprachversion auf 1.7, um die Funktionalit\u00e4t zu aktivieren:<\/p>\n<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin {&lt;br \/&gt;\n   sourceSets.all {&lt;br \/&gt;\n       languageSettings.apply {&lt;br \/&gt;\n           languageVersion = \"1.7\"&lt;br \/&gt;\n       }&lt;br \/&gt;\n   }&lt;br \/&gt;\n}&lt;br \/&gt;\n<\/pre>\n<\/p>\n<p>Weitere Informationen zu definitiv nicht-nullbaren Typen finden Sie im <a href=\"https:\/\/github.com\/Kotlin\/KEEP\/blob\/c72601cf35c1e95a541bb4b230edb474a6d1d1a8\/proposals\/definitely-non-nullable-types.md\" target=\"_blank\" rel=\"noopener\">KEEP<\/a>.<\/p>\n<\/p>\n<p>Bitte beachten Sie, dass definitiv nicht-nullbare Typen <strong>Beta<\/strong>-Status haben. Sie sind nahezu stabil, aber in Zukunft k\u00f6nnten Migrationsschritte erforderlich werden. Wir werden uns bem\u00fchen, \u00c4nderungen, die Sie sp\u00e4ter durchf\u00fchren m\u00fcssen, zu minimieren.<\/p>\n<\/p>\n<h2 id=\"support-for-parallel-compilation-of-a-single-module-in-the-JVM-backend\"><span id=\"Support_for_parallel_compilation_of_a_single_module_in_the_JVM_backend\" class=\"ez-toc-section\"><\/span>Unterst\u00fctzung f\u00fcr paralleles Kompilieren eines Einzelmoduls im JVM-Backend<\/h2>\n<\/p>\n<p>In Kotlin 1.6.20 haben wir den experimentellen JVM-IR-Backend-Modus hinzugef\u00fcgt, um alle Dateien eines Moduls parallel zu kompilieren. Durch paralleles Kompilieren kann die gesamte Kompilierungszeit um bis zu 15% reduziert werden.<\/p>\n<\/p>\n<p>Sie k\u00f6nnen den experimentellen parallelen Backend-Modus mit der <a href=\"https:\/\/kotlinlang.org\/docs\/compiler-reference.html#compiler-options\" target=\"_blank\" rel=\"noopener\">Compileroption<\/a> <code>-Xbackend-threads<\/code> aktivieren. Verwenden Sie die folgenden Argumente f\u00fcr diese Option:<\/p>\n<\/p>\n<ul>\n<li><code>N<\/code> gibt die Anzahl der Threads an, die Sie verwenden m\u00f6chten. Der Wert sollte nicht gr\u00f6\u00dfer sein als die Anzahl Ihrer CPU-Kerne, da sonst die Parallelisierung aufgrund von Kontextwechseln zwischen den Threads nicht mehr effektiv ist.<\/li>\n<li><code>0<\/code> bedeutet, dass ein Thread pro CPU-Kern verwendet wird.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/kotlinlang.org\/docs\/gradle.html\" target=\"_blank\" rel=\"noopener\">Gradle<\/a> kann Tasks zwar parallel ausf\u00fchren, aber diese Art der Parallelisierung ist nicht sehr hilfreich, wenn ein Projekt (oder ein gro\u00dfer Teil davon) aus der Perspektive von Gradle ein einziger gro\u00dfer Task ist. Wenn Sie ein sehr gro\u00dfes 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\u00fcgen einer weiteren Parallelisierungsebene aufgrund von Kontextwechseln die Leistung mindern.<\/p>\n<\/p>\n<p>Die parallele Kompilierung unterliegt einigen Beschr\u00e4nkungen:<\/p>\n<\/p>\n<ul>\n<li>Sie funktioniert nicht mit <a href=\"https:\/\/kotlinlang.org\/docs\/kapt.html\" target=\"_blank\" rel=\"noopener\">kapt<\/a>, da kapt das IR-Backend deaktiviert.<\/li>\n<li>Sie ben\u00f6tigt bauartbedingt mehr JVM-Heap. Die Heap-Gr\u00f6\u00dfe ist proportional zur Anzahl der Threads.<\/li>\n<\/ul>\n<h2 id=\"incremental-compilation-for-development-binaries-with-kotlin-js-ir-compiler\"><span id=\"Incremental_compilation_for_development_binaries_with_KotlinJS_IR_compiler\" class=\"ez-toc-section\"><\/span>Inkrementelle Kompilierung f\u00fcr Entwicklungs-Binaries mit dem Kotlin\/JS-IR-Compiler<\/h2>\n<\/p>\n<p>Um die Kotlin\/JS-Entwicklung mit dem IR-Compiler effizienter zu gestalten, haben wir einen neuen <em>inkrementellen Kompiliermodus<\/em> eingef\u00fchrt.<\/p>\n<\/p>\n<p>Beim Kompilieren von <strong>Entwicklungs-Bin\u00e4rdateien<\/strong> mit dem Gradle-Task <code>compileDevelopmentExecutableKotlinJs<\/code> speichert der Compiler in diesem Modus die Ergebnisse fr\u00fcherer Kompilierungen auf der Modulebene in einem Cache. Bei nachfolgenden Kompilierungen werden bei unver\u00e4nderten Quellcode-Dateien die im Cache gespeicherten Kompilierungsergebnisse verwendet. Dadurch wird der Vorgang insbesondere bei kleinen \u00c4nderungen beschleunigt. Zu beachten ist, dass diese Verbesserung ausschlie\u00dflich auf den Entwicklungsprozess abzielt (Verk\u00fcrzung des Edit-Build-Debug-Zyklus) und keinen Einfluss auf die Kompilierung von Produktionsartefakten hat.<\/p>\n<\/p>\n<p>Um die inkrementelle Kompilierung f\u00fcr Entwicklungs-Bin\u00e4rdateien zu aktivieren, f\u00fcgen Sie der <code>gradle.properties<\/code>-Datei im Projekt die folgende Zeile hinzu:<\/p>\n<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.incremental.js.ir=true \/\/ false by default&lt;br \/&gt;\n<\/pre>\n<\/p>\n<p>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\u00fcllt werden m\u00fcssen.<\/p>\n<\/p>\n<h2 id=\"kotlin-native-performance-improvements\"><span id=\"KotlinNative_performance_improvements\" class=\"ez-toc-section\"><\/span>Performance-Verbesserungen f\u00fcr Kotlin\/Native<\/h2>\n<\/p>\n<p>Kotlin 1.6.20 enth\u00e4lt 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:<\/p>\n<\/p>\n<ul>\n<li>Um 15% k\u00fcrzere Ausf\u00fchrungszeit<\/li>\n<li>Um 20% reduzierte Codegr\u00f6\u00dfe von Release- und Debug-Bin\u00e4rdateien<\/li>\n<li>Um 26% k\u00fcrzere Kompilierungszeit von Release-Bin\u00e4rdateien<\/li>\n<\/ul>\n<p>Au\u00dferdem erm\u00f6glichten diese \u00c4nderungen in einem gro\u00dfen internen Projekt eine um 10% k\u00fcrzere Kompilierungszeit von Debug-Bin\u00e4rdateien.<\/p>\n<\/p>\n<p>Um dies zu erreichen, haben wir eine statische Initialisierung f\u00fcr einige der vom Compiler erzeugten synthetischen Objekte implementiert, die Strukturierung des LLVM-Zwischencodes f\u00fcr jede Funktion verbessert und die Compiler-Caches optimiert.<\/p>\n<\/p>\n<h2 id=\"hierarchical-structure-support-for-multiplatform-projects\"><span id=\"Hierarchical_structure_support_for_multiplatform_projects\" class=\"ez-toc-section\"><\/span>Hierarchische Strukturen f\u00fcr Multiplattform-Projekte<\/h2>\n<\/p>\n<p>In Kotlin 1.6.20 ist die Unterst\u00fctzung f\u00fcr hierarchische Strukturen standardm\u00e4\u00dfig aktiviert. Seit der Einf\u00fchrung in <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew14.html#sharing-code-in-several-targets-with-the-hierarchical-project-structure\" target=\"_blank\" rel=\"noopener\">Kotlin 1.4.0<\/a> haben wir das Frontend erheblich verbessert und den IDE-Import stabilisiert.<\/p>\n<\/p>\n<p>Fr\u00fcher gab es zwei M\u00f6glichkeiten, Code zu einem Multiplattform-Projekt hinzuzuf\u00fcgen. Die erste M\u00f6glichkeit besteht darin, den Code in ein plattformspezifisches Quellcode-Set aufzunehmen, das auf eine einzige Zielplattform beschr\u00e4nkt ist und nicht f\u00fcr andere Plattformen verwendet werden kann. Die zweite M\u00f6glichkeit ist die Verwendung eines gemeinsamen Quellcode-Sets f\u00fcr alle Plattformen, die derzeit von Kotlin unterst\u00fctzt werden.<\/p>\n<\/p>\n<p>Jetzt haben Sie auch die M\u00f6glichkeit, <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2022\/02\/kotlin-1-6-20-m1-released\/#better-code-sharing-in-your-project\">gemeinsamen Quellcode<\/a> f\u00fcr mehrere \u00e4hnliche native Zielplattformen zu nutzen und dadurch einen Gro\u00dfteil der gemeinsamen Logik und der Drittanbieter-APIs gemeinsam zu verwenden. Die Technologie stellt die korrekten Standardabh\u00e4ngigkeiten bereit und findet die genaue API, die im gemeinsamen Code verf\u00fcgbar ist. Dadurch entf\u00e4llt die Notwendigkeit komplexer Build-Setups und Workarounds, um IDE-Unterst\u00fctzung f\u00fcr gemeinsame Quellcode-Sets f\u00fcr native Kompilierungsziele zu erhalten. Au\u00dferdem wird dadurch die unsichere Nutzung von APIs verhindert, die f\u00fcr eine andere Zielplattform bestimmt sind.<\/p>\n<\/p>\n<p>Diese Technologie ist auch bei der Entwicklung von Bibliotheken sehr n\u00fctzlich, da eine hierarchische Projektstruktur die M\u00f6glichkeit bietet, Bibliotheken mit gemeinsamen APIs f\u00fcr eine Untermenge von Zielplattformen zu ver\u00f6ffentlichen und zu konsumieren.<br \/>Standardm\u00e4\u00dfig sind Bibliotheken, die mit einer hierarchischen Projektstruktur ver\u00f6ffentlicht werden, nur mit Projekten kompatibel, die ebenfalls eine hierarchische Struktur verwenden. Erfahren Sie mehr \u00fcber die <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-hierarchy.html#compatibility\" target=\"_blank\" rel=\"noopener\">Kompatibilit\u00e4t zwischen Projekten und Bibliotheken<\/a>.<\/p>\n<\/p>\n<h3 id=\"better-code-sharing-in-your-project\"><span id=\"Better_code-sharing_in_your_project\" class=\"ez-toc-section\"><\/span>Verbesserte gemeinsame Codeverwendung in Ihrem Projekt<\/h3>\n<\/p>\n<p>Ohne hierarchische Struktur gibt es keine einfache M\u00f6glichkeit, gemeinsamen Code f\u00fcr <em>einige<\/em>, aber <em>nicht alle<\/em> <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-dsl-reference.html#targets\" target=\"_blank\" rel=\"noopener\">Kotlin-Zielplattformen<\/a> zu verwenden. Ein h\u00e4ufiges Beispiel ist die gemeinsame Codeverwendung f\u00fcr alle iOS-Plattformen einschlie\u00dflich Zugriff auf iOS-spezifische <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-share-on-platforms.html#use-native-libraries-in-the-hierarchical-structure\" target=\"_blank\" rel=\"noopener\">Abh\u00e4ngigkeiten<\/a> wie <code>Foundation<\/code>.<\/p>\n<\/p>\n<p>Durch die hierarchische Projektstruktur ist dies jetzt standardm\u00e4\u00dfig m\u00f6glich. In der neuen Struktur bilden die Quellcode-Sets eine Hierarchie. Sie k\u00f6nnen plattformspezifische Sprachmerkmale und Abh\u00e4ngigkeiten verwenden, die f\u00fcr alle Zielplattformen verf\u00fcgbar sind, f\u00fcr die ein bestimmtes Quellcode-Set kompiliert wird.<\/p>\n<\/p>\n<p>Betrachten wir als Beispiel ein typisches Multiplattform-Projekt mit zwei Zielplattformen: <code>iosArm64<\/code> und <code>iosX64<\/code> f\u00fcr iOS-Ger\u00e4te und -Simulatoren. Die Kotlin-Tools erkennen, dass beide Ziele \u00fcber die gleiche Funktion verf\u00fcgen und erm\u00f6glichen Ihnen den Zugriff auf diese Funktion aus dem intermedi\u00e4ren Quellcode-Set <code>iosMain<\/code>.<\/p>\n<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/LHS-2rPAgtESE4DYL_hqh6AGQdKUC0BAmS-cGiuoaiHM5Qq4cU1Lwzur0-pjDG8WI_rgu03A-SWj9H4O2T2Y7Cze5guSSod7fEeqVGfS7EL74iTRQjuvyOGP2Uv3pPkNejYPrjJa.jpg\" width=\"624\" height=\"279\"><\/p>\n<\/p>\n<p>Die Kotlin-Toolchain stellt die korrekten Standardabh\u00e4ngigkeiten bereit, z.&nbsp;B. die Kotlin\/Native-Standardbibliothek oder native Bibliotheken. Au\u00dferdem versucht das Kotlin-Tool, den genauen API-Umfang zu ermitteln, der f\u00fcr den gemeinsamen Code verf\u00fcgbar ist. Dadurch wird zum Beispiel verhindert, dass eine macOS-spezifische Funktion in gemeinsamem Code verwendet wird, der auch auf Windows abzielt.<\/p>\n<\/p>\n<h3 id=\"more-opportunities-for-library-authors\"><span id=\"More_opportunities_for_library_authors\" class=\"ez-toc-section\"><\/span>Mehr M\u00f6glichkeiten f\u00fcr die Bibliotheksentwicklung<\/h3>\n<\/p>\n<p>Wenn eine Multiplattform-Bibliothek ver\u00f6ffentlicht wird, wird die API der intermedi\u00e4ren Quellcode-Sets jetzt ordnungsgem\u00e4\u00df mitver\u00f6ffentlicht, sodass sie verwendet werden kann. Auch hier ermittelt die Kotlin-Toolchain automatisch, welche API im Quellcode-Set des Konsumenten verf\u00fcgbar ist. Dabei wird sorgf\u00e4ltig auf unsichere Verwendungen geachtet, zum Beispiel die Verwendung einer f\u00fcr die JVM bestimmten API in JS-Code. Erfahren Sie mehr \u00fcber <a href=\"https:\/\/kotlinlang.org\/docs\/multiplatform-share-on-platforms.html#share-code-in-libraries\" target=\"_blank\" rel=\"noopener\">die gemeinsame Codeverwendung in Bibliotheken<\/a>.<\/p>\n<\/p>\n<h3 id=\"configuration-an-setup\"><span id=\"Configuration_and_setup\" class=\"ez-toc-section\"><\/span>Konfiguration und Einrichtung<\/h3>\n<\/p>\n<p>Ab Kotlin 1.6.20 werden alle Ihre neuen Multiplattform-Projekte eine hierarchische Projektstruktur haben. Eine weitere Einrichtung ist nicht erforderlich.<\/p>\n<\/p>\n<ul>\n<li>Wenn Sie diese Funktion bereits <a href=\"https:\/\/kotlinlang.org\/docs\/mpp-share-on-platforms.html#share-code-on-similar-platforms\" target=\"_blank\" rel=\"noopener\">manuell aktiviert<\/a> haben, k\u00f6nnen Sie die nunmehr veralteten Optionen aus <code>gradle.properties<\/code> entfernen:<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.mpp.enableGranularSourceSetsMetadata=true&lt;br \/&gt;\nkotlin.native.enableDependencyPropagation=true&lt;br \/&gt;\n<\/pre>\n<\/p>\n<ul>\n<li>F\u00fcr eine optimale Erfahrung empfehlen wir, Kotlin 1.6.20 mit <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio 2021.1.1<\/a> (Bumblebee) oder h\u00f6her zu verwenden.<\/li>\n<li>Sie k\u00f6nnen die Funktion auch deaktivieren. Um hierarchische Strukturen zu deaktivieren, speichern Sie die folgenden Optionen in <code>gradle.properties<\/code>:<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">&lt;br \/&gt;\nkotlin.mpp.hierarchicalStructureSupport=false&lt;br \/&gt;\n<\/pre>\n<\/p>\n<h1 id=\"complete-list-of-improvements\">Komplette Liste der Verbesserungen<\/h1>\n<\/p>\n<h2 id=\"language\"><span id=\"Language\" class=\"ez-toc-section\"><\/span>Sprache<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#prototype-of-context-receivers-for-kotlin-jvm\" target=\"_blank\" rel=\"noopener\">Kontext-Receiver f\u00fcr Kotlin\/JVM als Prototyp<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#definitely-non-nullable-types\" target=\"_blank\" rel=\"noopener\">Definitiv nicht-nullbare Typen<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-jvm\"><span id=\"KotlinJVM\" class=\"ez-toc-section\"><\/span>Kotlin\/JVM<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#new-jvmdefaultwithcompatibility-annotation-for-interfaces\" target=\"_blank\" rel=\"noopener\">Neue <code>@JvmDefaultWithCompatibility<\/code>-Annotation f\u00fcr Schnittstellen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#compatibility-changes-in-the-xjvm-default-modes\" target=\"_blank\" rel=\"noopener\">Kompatibilit\u00e4ts\u00e4nderungen in den <code>-Xjvm-default<\/code>-Modi<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-parallel-compilation-of-a-single-module-in-the-jvm-backend\" target=\"_blank\" rel=\"noopener\">Unterst\u00fctzung f\u00fcr paralleles Kompilieren eines Einzelmoduls im JVM-Backend<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-callable-references-to-function-interface-constructors\" target=\"_blank\" rel=\"noopener\">Unterst\u00fctzung f\u00fcr aufrufbare Referenzen auf Funktionsschnittstellen-Konstruktoren<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-native\"><span id=\"KotlinNative\" class=\"ez-toc-section\"><\/span>Kotlin\/Native<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#an-update-on-the-new-memory-manager\" target=\"_blank\" rel=\"noopener\">Update zum neuen Speichermanager<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#concurrent-implementation-for-the-sweep-phase-in-new-memory-manager\" target=\"_blank\" rel=\"noopener\">Nebenl\u00e4ufige Implementierung der Sweep-Phase im neuen Speichermanager<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#instantiation-of-annotation-classes\" target=\"_blank\" rel=\"noopener\">Instanziierung von Annotation-Klassen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#interop-with-swift-async-await-returning-void-instead-of-kotlinunit\" target=\"_blank\" rel=\"noopener\">Interoperabilit\u00e4t mit async\/await in Swift: R\u00fcckgabe von <code>Void<\/code> statt <code>KotlinUnit<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#better-stack-traces-with-libbacktrace\" target=\"_blank\" rel=\"noopener\">Bessere Stack-Traces mit <code>libbacktrace<\/code><\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-standalone-android-executables\" target=\"_blank\" rel=\"noopener\">Unterst\u00fctzung f\u00fcr eigenst\u00e4ndige Android-Programmdateien<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#performance-improvements\" target=\"_blank\" rel=\"noopener\">Leistungsverbesserungen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#improved-error-handling-during-cinterop-modules-import\" target=\"_blank\" rel=\"noopener\">Verbesserte Fehlerbehandlung beim Importieren von Cinterop-Modulen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#support-for-xcode-13-libraries\" target=\"_blank\" rel=\"noopener\">Unterst\u00fctzung f\u00fcr Xcode-13-Bibliotheken<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-multiplatform\"><span id=\"Kotlin_Multiplatform\" class=\"ez-toc-section\"><\/span>Kotlin Multiplatform<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#hierarchical-structure-support-for-multiplatform-projects\" target=\"_blank\" rel=\"noopener\">Hierarchische Strukturen f\u00fcr Multiplattform-Projekte<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#kotlin-cocoapods-gradle-plugin\" target=\"_blank\" rel=\"noopener\">Updates f\u00fcr das Kotlin-CocoaPods-Plugin f\u00fcr Gradle<\/a><\/li>\n<\/ul>\n<h2 id=\"kotlin-js\"><span id=\"KotlinJS\" class=\"ez-toc-section\"><\/span>Kotlin\/JS<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#incremental-compilation-for-development-binaries-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Inkrementelle Kompilierung von Entwicklungs-Binaries mit dem IR-Compiler<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#lazy-initialization-of-top-level-properties-by-default-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Lazy-Initialisierung von Top-Level-Eigenschaften bei IR-Compiler standardm\u00e4\u00dfig<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#separate-js-files-for-project-modules-by-default-with-ir-compiler\" target=\"_blank\" rel=\"noopener\">Separate JS-Dateien f\u00fcr Projektmodule bei IR-Compiler standardm\u00e4\u00dfig<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#char-class-optimization\" target=\"_blank\" rel=\"noopener\">Optimierte <code>Char<\/code>-Klasse<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#improvements-to-export-and-typescript-declaration-generation\" target=\"_blank\" rel=\"noopener\">Verbesserungen beim Export und bei der Generierung von TypeScript-Deklarationen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#aftertest-guarantees-for-asynchronous-tests\" target=\"_blank\" rel=\"noopener\"><code>@AfterTest<\/code>-Garantien f\u00fcr asynchrone Tests<\/a><\/li>\n<\/ul>\n<h2 id=\"security\"><span id=\"Security\" class=\"ez-toc-section\"><\/span>Sicherheit<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#using-relative-paths-in-klibs\" target=\"_blank\" rel=\"noopener\">Verwendung relativer Pfade in klibs<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#persisting-yarn-lock-for-kotlin-js-gradle-projects\" target=\"_blank\" rel=\"noopener\">Persistenz von <code>yarn.lock<\/code> in Kotlin\/JS-Gradle-Projekten<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#installation-of-npm-dependencies-with-ignore-scripts-by-default\" target=\"_blank\" rel=\"noopener\">Installation von npm-Abh\u00e4ngigkeiten mit <code>--ignore-scripts<\/code> standardm\u00e4\u00dfig<\/a><\/li>\n<\/ul>\n<h2 id=\"gradle\"><span id=\"Gradle%EF%BB%BF\" class=\"ez-toc-section\"><\/span>Gradle<\/h2>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#properties-for-defining-kotlin-compiler-execution-strategy\" target=\"_blank\" rel=\"noopener\">Eigenschaften zur Festlegung der Ausf\u00fchrungsstrategie des Kotlin-Compilers<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#deprecation-of-build-options-for-kapt-and-coroutines\" target=\"_blank\" rel=\"noopener\">Deprecation der Build-Optionen f\u00fcr kapt und Coroutinen<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html#removal-of-the-kotlin-parallel-tasks-in-project-build-option\" target=\"_blank\" rel=\"noopener\">Entfernung der Build-Option <code>kotlin.parallel.tasks.in.project<\/code><\/a><\/li>\n<\/ul>\n<h1 id=\"how-to-install\">Installation von Kotlin 1.6.20<\/h1>\n<\/p>\n<p>Wenn Sie <a href=\"https:\/\/www.jetbrains.com\/de-de\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> oder <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> bereits verwenden, schl\u00e4gt Ihnen die IDE automatisch die Aktualisierung auf Kotlin 1.6.20 vor. Eine manuelle Aktualisierung ist ebenfalls m\u00f6glich. Folgen Sie dazu <a href=\"https:\/\/kotlinlang.org\/docs\/releases.html#update-to-a-new-release\" target=\"_blank\" rel=\"noopener\">diesen Anweisungen<\/a>.&nbsp;<\/p>\n<\/p>\n<p>Sie k\u00f6nnen die neuesten Versionen dieser IDEs herunterladen, um eine umfassende Kotlin-Unterst\u00fctzung zu erhalten:<\/p>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/de-de\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> \u2013 zur Entwicklung von Kotlin-Anwendungen f\u00fcr verschiedene Plattformen.<\/li>\n<li><a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> \u2013 zur Entwicklung von Android-Apps und plattform\u00fcbergreifenden Mobilanwendungen.<\/li>\n<\/ul>\n<p>Achten Sie darauf, auch die kotlinx-Bibliotheken auf die <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">kompatiblen Versionen<\/a> zu aktualisieren und die Kotlin-Version 1.6.20 in den Build-Skripten Ihrer bestehenden Projekte anzugeben.<\/p>\n<\/p>\n<p>Den Befehlszeilen-Compiler k\u00f6nnen Sie bei Bedarf von der <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.6.20\" target=\"_blank\" rel=\"noopener\">GitHub-Release-Seite<\/a> herunterladen.<\/p>\n<\/p>\n<h3 id=\"if-you-run-into-any-problems\"><span id=\"If_you_run_into_any_problems\" class=\"ez-toc-section\"><\/span>Hilfe bei Problemen<\/h3>\n<\/p>\n<ul>\n<li>Holen Sie sich Unterst\u00fctzung auf <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (<a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">eine Einladung erhalten Sie hier<\/a>).<\/li>\n<li>Melden Sie Probleme in unserem Issue-Tracker, <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/li>\n<\/ul>\n<div style=\"background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; text-align: left; min-height: px;\">\n<p>Bleiben Sie stets auf dem neuesten Stand der Kotlin-Entwicklung! Abonnieren Sie unsere Kotlin-Updates, indem Sie das Formular rechts neben diesem Beitrag ausf\u00fcllen.<\/p>\n<\/div>\n<h1 id=\"what-else-to-read-and-watch\">Weitere Informationen zum Lesen und Ansehen<\/h1>\n<\/p>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/roadmap.html\" target=\"_blank\" rel=\"noopener\">Kotlin-Roadmap<\/a><\/li>\n<li><a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1620.html\" target=\"_blank\" rel=\"noopener\">Das ist neu in Kotlin 1.6.20 (Dokumentation)<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\">Kompatibilit\u00e4tsleitfaden f\u00fcr Kotlin 1.6<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/de\/kotlin\/2022\/01\/kotlin-1-6-0-is-released\/\">Kotlin 1.6.0 ist ver\u00f6ffentlicht!<\/a><\/li>\n<\/ul>\n\n\n<p>Autor des Original-Blogposts:<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":811,"featured_media":237309,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/254692"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/811"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=254692"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/254692\/revisions"}],"predecessor-version":[{"id":631848,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/254692\/revisions\/631848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/237309"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=254692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=254692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=254692"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=254692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}