Ressourcen sparen mit Kotlin Multiplatform


Das Problem

Wir betreuen für einen Kunden zwei kleinere native Apps. Bislang waren die Wartungsintervalle hauptsächlich von neuen Features oder Backend-Änderungen bestimmt. Zwar wurden die Apps jährlich auf neuen Betriebssystemen getestet, doch aufgrund eines knappen Kundenbudgets wurden oft nur zwingend notwendige Anpassungen vorgenommen.

Kürzlich stellte sich die Anforderung, ein neues, komplexes Login-Framework zu implementieren, das aufgrund neuer Unternehmensrichtlinien erforderlich ist.

Da eine native Implementierung dieses Frameworks sowohl für Android als auch für iOS im bestehenden Code relativ aufwändig gewesen wäre, schlugen wir dem Kunden eine alternative Lösung vor: Da wir bereits Erfahrung mit Kotlin Multiplatform (KMP) gesammelt hatten, boten wir an, die notwendige Bibliothek einmalig in KMP zu entwickeln und diese dann auf beiden Plattformen einzubinden. Dies sollte helfen, Entwicklungsressourcen einzusparen.


Was ist Kotlin Multiplatform und warum bietet es sich an?

Kotlin Multiplatform (KMP) hat sich als ein wegweisendes Cross-Platform-Framework von JetBrains etabliert und wird maßgeblich von Google unterstützt. Es nutzt die vertrauten Entwicklungsmuster und -werkzeuge, die Android-Entwicklern geläufig sind, um eine effiziente Entwicklung nativer Apps für eine Vielzahl von Zielplattformen zu ermöglichen.

Mit KMP lassen sich Android- und iOS-Anwendungen sowie Desktop-Lösungen entwickeln, wobei ein Großteil der Geschäftslogik und des Datenmodells in einer einzigen, plattformübergreifenden Code-Basis geteilt und wiederverwendet werden kann. Dies führt zu erheblichen Einsparungen bei der Entwicklungszeit und -ressourcen, während gleichzeitig eine hohe Codequalität und eine konsistente User Experience über alle Plattformen hinweg gewährleistet werden.

Unsere tiefgreifende Expertise im Android-Segment und die frühzeitige Auseinandersetzung mit verschiedenen Multiplatform-Ansätzen hat uns einen deutlichen Erfahrungsvorsprung bei der Umsetzung mit KMP verschafft. Wir haben uns intensiv mit den spezifischen Herausforderungen und Best Practices im Kontext von KMP auseinandergesetzt und konnten unsere Kompetenzen in diesem Bereich kontinuierlich ausbauen.

Im Projekt existierten bereits geteilte Android-Bibliotheken. Diese Bibliotheken, die kundenspezifische Geschäftslogik enthielten, konnten mit vergleichsweise geringem Aufwand auf Kotlin Multiplatform umgestellt werden. Die Migration dieser kritischen Komponenten in die plattformübergreifende KMP-Umgebung stieß bei den anderen Android-Entwicklern auf Kundenseite auf großes Wohlwollen.


Implementierung im Projekt

Wir starteten die Implementierung mit der Entwicklung einer neuen Authentifizierungsbibliothek in Kotlin Multiplatform. Da der Entwicklungsaufwand im Vergleich zur doppelten nativen Entwicklung geringer war, konnten wir eine vollständige Testabdeckung des KMP-Codes im Rahmen des Budgets realisieren.

Diese entstandene Bibliothek wurde anschließend in die bestehenden Android- und iOS-Apps integriert.

Als das nächste Feature mit UI-Komponenten anstand, entschieden wir uns, dieses ebenfalls nach einem ähnlichen Muster mithilfe von Compose Multiplatform umzusetzen.

Weil bereits viele Komponenten der Android-App auf Jetpack Compose basierten, bot es sich an, einen Großteil der UI mithilfe von Compose Multiplatform auf eine Multiplatform-Basis zu stellen.

Im Zuge der Code-Migration konnte die bestehende Authentifizierungs-Bibliothek direkt in das neue Projekt übernommen werden. Darüber hinaus wurde ein Großteil der iOS App verworfen und eine gemeinsame Code-Basis für beide Apps, basierend auf der bestehenden Android-App, geschaffen. Notwendige betriebssystemspezifische Anpassungen wurden über expect/actual Funktionen realisiert; einige Swift Helper und Views aus dem ursprünglichen iOS-Projekt wurden beibehalten und für Kotlin zugänglich gemacht.

Das Ergebnis war eine moderne und minimalistische Codebasis für schlanke iOS- und Android-Apps.


Zusammenfassung und Weiterentwicklung

In Zukunft können neue Features und Wartung von einem Entwickler erledigt werden und decken automatisch beide Plattformen ab. Die Einführung von Kotlin Multiplatform (KMP) in unserem Entwicklungsprozess markiert einen bedeutenden Schritt zur Steigerung der Effizienz und zur Reduzierung des Wartungsaufwands. In Zukunft können neue Features und die Wartung von einem einzigen Entwickler erledigt werden und decken automatisch beide Plattformen (iOS und Android) ab.

Dies wird durch die Möglichkeit erreicht, Geschäftslogik und wichtige App-Komponenten in einem gemeinsamen, plattformübergreifenden Modul zu bündeln. Anstatt die gleiche Funktionalität in zwei verschiedenen Sprachen (z.B. Swift und Kotlin) für jede Plattform implementieren und pflegen zu müssen, konzentriert sich das Team auf eine einzige, zentralisierte Codebasis.

Die Vorteile sind weitreichend:

  1. Reduzierte Entwicklungskosten und -zeit: Da Code nur einmal geschrieben werden muss, beschleunigt sich der gesamte Entwicklungszyklus. Die Notwendigkeit, separate Teams oder dedizierte Entwickler für jede Plattform zu beschäftigen, wird verringert.

  2. Geringere Fehleranfälligkeit: Eine einzige Codebasis bedeutet weniger Stellen, an denen Fehler auftreten können. Wenn ein Fehler behoben wird, ist er automatisch auf beiden Plattformen korrigiert, was die Konsistenz der Benutzererfahrung (User Experience, UX) gewährleistet.

  3. Vereinfachte Wartung: Updates, Sicherheits-Patches oder die Implementierung neuer APIs erfordern nur eine Anpassung im gemeinsamen Modul. Der Wartungsaufwand, insbesondere bei langfristig gepflegten Projekten, wird drastisch reduziert.

  4. Know-how-Konzentration: Entwickler können ihr Wissen über die Geschäftslogik vertiefen, ohne ständig zwischen zwei verschiedenen Ökosystemen und Sprachen wechseln zu müssen.

Diese Verschiebung ermöglicht es uns, uns schneller auf die Bereitstellung von hochwertigen Funktionen zu konzentrieren, anstatt Ressourcen für die redundante Implementierung und Synchronisierung von Code aufzuwenden. Das Ergebnis ist eine schnellere Markteinführung und eine konsistentere Produktqualität über das gesamte mobile Ökosystem hinweg.



Ressourcen sparen mit Kotlin Multiplatform


Das Problem

Wir betreuen für einen Kunden zwei kleinere native Apps. Bislang waren die Wartungsintervalle hauptsächlich von neuen Features oder Backend-Änderungen bestimmt. Zwar wurden die Apps jährlich auf neuen Betriebssystemen getestet, doch aufgrund eines knappen Kundenbudgets wurden oft nur zwingend notwendige Anpassungen vorgenommen.

Kürzlich stellte sich die Anforderung, ein neues, komplexes Login-Framework zu implementieren, das aufgrund neuer Unternehmensrichtlinien erforderlich ist.

Da eine native Implementierung dieses Frameworks sowohl für Android als auch für iOS im bestehenden Code relativ aufwändig gewesen wäre, schlugen wir dem Kunden eine alternative Lösung vor: Da wir bereits Erfahrung mit Kotlin Multiplatform (KMP) gesammelt hatten, boten wir an, die notwendige Bibliothek einmalig in KMP zu entwickeln und diese dann auf beiden Plattformen einzubinden. Dies sollte helfen, Entwicklungsressourcen einzusparen.


Was ist Kotlin Multiplatform und warum bietet es sich an?

Kotlin Multiplatform (KMP) hat sich als ein wegweisendes Cross-Platform-Framework von JetBrains etabliert und wird maßgeblich von Google unterstützt. Es nutzt die vertrauten Entwicklungsmuster und -werkzeuge, die Android-Entwicklern geläufig sind, um eine effiziente Entwicklung nativer Apps für eine Vielzahl von Zielplattformen zu ermöglichen.

Mit KMP lassen sich Android- und iOS-Anwendungen sowie Desktop-Lösungen entwickeln, wobei ein Großteil der Geschäftslogik und des Datenmodells in einer einzigen, plattformübergreifenden Code-Basis geteilt und wiederverwendet werden kann. Dies führt zu erheblichen Einsparungen bei der Entwicklungszeit und -ressourcen, während gleichzeitig eine hohe Codequalität und eine konsistente User Experience über alle Plattformen hinweg gewährleistet werden.

Unsere tiefgreifende Expertise im Android-Segment und die frühzeitige Auseinandersetzung mit verschiedenen Multiplatform-Ansätzen hat uns einen deutlichen Erfahrungsvorsprung bei der Umsetzung mit KMP verschafft. Wir haben uns intensiv mit den spezifischen Herausforderungen und Best Practices im Kontext von KMP auseinandergesetzt und konnten unsere Kompetenzen in diesem Bereich kontinuierlich ausbauen.

Im Projekt existierten bereits geteilte Android-Bibliotheken. Diese Bibliotheken, die kundenspezifische Geschäftslogik enthielten, konnten mit vergleichsweise geringem Aufwand auf Kotlin Multiplatform umgestellt werden. Die Migration dieser kritischen Komponenten in die plattformübergreifende KMP-Umgebung stieß bei den anderen Android-Entwicklern auf Kundenseite auf großes Wohlwollen.


Implementierung im Projekt

Wir starteten die Implementierung mit der Entwicklung einer neuen Authentifizierungsbibliothek in Kotlin Multiplatform. Da der Entwicklungsaufwand im Vergleich zur doppelten nativen Entwicklung geringer war, konnten wir eine vollständige Testabdeckung des KMP-Codes im Rahmen des Budgets realisieren.

Diese entstandene Bibliothek wurde anschließend in die bestehenden Android- und iOS-Apps integriert.

Als das nächste Feature mit UI-Komponenten anstand, entschieden wir uns, dieses ebenfalls nach einem ähnlichen Muster mithilfe von Compose Multiplatform umzusetzen.

Weil bereits viele Komponenten der Android-App auf Jetpack Compose basierten, bot es sich an, einen Großteil der UI mithilfe von Compose Multiplatform auf eine Multiplatform-Basis zu stellen.

Im Zuge der Code-Migration konnte die bestehende Authentifizierungs-Bibliothek direkt in das neue Projekt übernommen werden. Darüber hinaus wurde ein Großteil der iOS App verworfen und eine gemeinsame Code-Basis für beide Apps, basierend auf der bestehenden Android-App, geschaffen. Notwendige betriebssystemspezifische Anpassungen wurden über expect/actual Funktionen realisiert; einige Swift Helper und Views aus dem ursprünglichen iOS-Projekt wurden beibehalten und für Kotlin zugänglich gemacht.

Das Ergebnis war eine moderne und minimalistische Codebasis für schlanke iOS- und Android-Apps.


Zusammenfassung und Weiterentwicklung

In Zukunft können neue Features und Wartung von einem Entwickler erledigt werden und decken automatisch beide Plattformen ab. Die Einführung von Kotlin Multiplatform (KMP) in unserem Entwicklungsprozess markiert einen bedeutenden Schritt zur Steigerung der Effizienz und zur Reduzierung des Wartungsaufwands. In Zukunft können neue Features und die Wartung von einem einzigen Entwickler erledigt werden und decken automatisch beide Plattformen (iOS und Android) ab.

Dies wird durch die Möglichkeit erreicht, Geschäftslogik und wichtige App-Komponenten in einem gemeinsamen, plattformübergreifenden Modul zu bündeln. Anstatt die gleiche Funktionalität in zwei verschiedenen Sprachen (z.B. Swift und Kotlin) für jede Plattform implementieren und pflegen zu müssen, konzentriert sich das Team auf eine einzige, zentralisierte Codebasis.

Die Vorteile sind weitreichend:

  1. Reduzierte Entwicklungskosten und -zeit: Da Code nur einmal geschrieben werden muss, beschleunigt sich der gesamte Entwicklungszyklus. Die Notwendigkeit, separate Teams oder dedizierte Entwickler für jede Plattform zu beschäftigen, wird verringert.

  2. Geringere Fehleranfälligkeit: Eine einzige Codebasis bedeutet weniger Stellen, an denen Fehler auftreten können. Wenn ein Fehler behoben wird, ist er automatisch auf beiden Plattformen korrigiert, was die Konsistenz der Benutzererfahrung (User Experience, UX) gewährleistet.

  3. Vereinfachte Wartung: Updates, Sicherheits-Patches oder die Implementierung neuer APIs erfordern nur eine Anpassung im gemeinsamen Modul. Der Wartungsaufwand, insbesondere bei langfristig gepflegten Projekten, wird drastisch reduziert.

  4. Know-how-Konzentration: Entwickler können ihr Wissen über die Geschäftslogik vertiefen, ohne ständig zwischen zwei verschiedenen Ökosystemen und Sprachen wechseln zu müssen.

Diese Verschiebung ermöglicht es uns, uns schneller auf die Bereitstellung von hochwertigen Funktionen zu konzentrieren, anstatt Ressourcen für die redundante Implementierung und Synchronisierung von Code aufzuwenden. Das Ergebnis ist eine schnellere Markteinführung und eine konsistentere Produktqualität über das gesamte mobile Ökosystem hinweg.