Skip to Content
Mobile Apps3 - Android und KMPKotlin Multiplatform (KMP)

Kotlin Multiplatform (KMP)

Dauer: 45 Minuten

  • Infos zu KMP

Ziel: Motivation und Einstieg in KMP

Kotlin Multiplatform (KMP) ist ein Framework zur plattformübergreifenden Entwicklung von Apps mit Kotlin. Ursprünglich gedacht für die gemeinsame Nutzung von Geschäftslogik und anderen Teilen des Codes zwischen verschiedenen Plattformen wie Android und iOS, können inzwischen auch komplette Apps inklusive UI mit KMP entwickelt werden. Somit kann KMP als vollständiges Framework zur plattformübergreifenden App-Entwicklung angesehen werden.

Dahinter steckt Jetbrains aber auch Google unterstützt offiziell KMP, wie an verschiedenen Stellen in der Android-Dokumentation zu sehen ist.

Für die UI-Entwicklung wird Compose Multiplatform verwendet, das auf dem zuvor besprochenen Compose für Android aufbaut und es ermöglicht, UI-Komponenten plattformübergreifend für Android, iOS, Web und Desktop zu erstellen. Im folgenden verwenden wir die Bezeichnung KMP für Koltin Multiplatform in dem Sinne, dass Compose Multiplatform für die UI verwendet wird.

Setup in Android Studio

KMP-Projekte lassen sich ähnlich wie native Android-Projekte mit Android Studio entwickeln. Das KMP-Plugin für Android Studio ermöglicht die Erstellung von Apps basierend auf KMP-Templates, und wird auf macOS benötigt, um die App unter macOS auf einem iPhone-Simulator auszuführen

Stand Oktober 2025: das KMP-Plugin wird nur auf macOS unterstützt. Auf Windows/Linux können wir trotzdem mit Android Studio KMP-Apps entwickeln.

Webseite des KMP-Plugins: https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform 

App erstellen

Wir erstellen eine KMP-App namens TodosKMP.

  • macOS: Neues Projekt mit Template „Kotlin Multiplatform“ erstellen.
  • Windows/Linux: KMP-Projekt im Web erstellen (https://kmp.jetbrains.com ), herunterladen und in Android Studio öffnen.

Offizielle Anleitung: https://www.jetbrains.com/help/kotlin-multiplatform-dev/quickstart.html 

App starten

Die Android-Version der App kann wie gewohnt in Android Studio auf einem Emulator oder einem physischen Gerät gestartet werden.

Um die iOS-Version der App zu starten ist ein Mac mit Xcode erforderlich. → auf Wunsch vorführen.

Weitere Infos: https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-create-first-app.html#run-your-application 

Grundlegende Konzepte erklären wir an dem Code, der für uns generiert wurde. Dies ist in der Regel eine kleinere App. Vieles ist sehr ähnlich wie in der nativen Android-Entwicklung mit Kotlin und Jetpack Compose.

Projektstruktur und Ausgangscode

In einer KMP-App liegt der plattformübergreifende Code unter composeApp/src/commonMain.

Für plattformspezifischen Code gibt es entsprechend eigene Ordner.

Die MainActivity in composeApp/src/androidMain/ wird nicht angepasst, stattdessen fügen wir unsere Änderungen in der Datei App.kt in composeApp/src/commonMain/ durch.

In App.kt sehen wir u.a., dass das MaterialTheme anstatt eines eigenen Themes verwendet wird (wie es in der Android-App der Fall war).

Wir werden nun den Code der zuvor gebauten Android-App TodosAndroid in die KMP-App TodosKMP kopieren und anpassen.

Android-Code in die KMP-App kopieren

Wir kopieren den Code der zuvor gebauten Android-App TodosAndroid in die KMP-App:

  • In commonMain erstellen mir zwei Verzeichnisse bzw. data und ui.
  • Dann kopieren wir den Code aus ui von TodosAndroid (die Dateien AddTodoDialog und TodosViewModel) und data (Todo) in die entsprechenden Verzeichnisse der KMP-App unter commonMain.
  • Danach müssen wir die package-Deklarationen und die imports in den kopierten Dateien anpassen.

TODO 2026: Sollen wir zunächst Support für Room in der KMP-App einbauen oder gehen wir in der Commit-Historie zurück, um den Code noch ohne Room zu migrieren?

Orientierung an der Beispiel-App von 2025 oder neu Docs berücksichtigen? Siehe https://github.com/behrends/TodosKMP2025 

UI-Code übernehmen und anpassen

Aus der MainActivity in TodosAndroid kopieren wir die folgenden Funktionen bzw. Composables:

  • TodosApp
  • TodoItem
  • TodoList

und fügen diese in App.kt der KMP-App TodosKMP ein.

Wir löschen das bestehende App der KMP-App und ändern die kopierte TodosApp in App. Außerdem stellen wir in der kopierten App das Theme auf MaterialTheme um.

Danach müssen wir die imports anpassen bzw. mit Alt-Enter hinzufügen.

Für die Verwendung des ViewModels (TodosViewModel) ändern wir die Funktionsdeklaration von App:

@Composable fun App(vm: TodosViewModel = viewModel { TodosViewModel() }) { // Rest wie gehabt }

Ressourcen wie Vector-Drawables (Icons) müssen in KMP anders eingebunden werden. Stattdessen stellen wir die Icons im FAB um:

FloatingActionButtonExtendedFloatingActionButton um das Icon loszuwerden bzw. durch Text zu ersetzen (Text("Neues Todo")).

Infos zu Ressourcen: https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-resources.html 

TODO: was ist mit den Navigations-Icons? (siehe Navigation-Abschnitt unten)

Data

Die Beispiel-App von 2025 zeigt, wie KMP mit Room in Android und iOS verwendet werden kann: https://github.com/behrends/TodosKMP2025 

Vorgehen wie in diesem Codelab: https://developer.android.com/codelabs/kmp-migrate-room 

Ressourcen zum Selbststudium:

Todos

  • Wie in Android, sobald Navigation 3 stabil ist?
  • Code aus Android kopieren und anpassen (früher? s.o.)

Support für Navigation 3 in KMP: https://youtrack.jetbrains.com/issue/CMP-7646/Support-Navigation-3-for-Compose-Multiplatform 

KMP entwickelt sich ständig weiter und durch den Support von Google wird KMP zum echten Konkurrenten zu anderen plattformübergreifenden Frameworks wie Flutter oder React Native.

Die bisherigen Inhalte zu Android und Compose lassen sich direkt in KMP-Apps anwenden. Daher sind auch die Lernressourcen zu Kotlin und Android in den vorherigen Seiten relevant.

Einstiegsseiten zu KMP bei Jetbrains, Google und Kotlin:

Codelabs:

Sample Apps:

Wer mit KMP arbeiten möchte, sollte darauf achten, ob die benötigten Bibliotheken (z.B. für Datenbank, Netzwerk, usw.) in KMP funktionieren. Dazu eine hilfreiche Sammlung: https://github.com/terrakok/kmp-awesome