Skip to content

2 Grundlagen

Fabian Heck edited this page Nov 25, 2020 · 3 revisions

2.1 Native App-Entwicklung

Native Entwicklung bezeichnet die Entwicklung von Anwendungen mit plattformspezifischen Technologien. In der nativen Entwicklung von Apps wird für die Betriebssysteme Android und iOS getrennt entwickelt. Verwendet werden hier die Programmiersprachen und Werkzeuge, die der Hersteller der jeweiligen Plattform dafür bereitstellt. Android Apps werden mit den Sprachen Java und Kotlin sowie der Entwicklungsumgebung (IDE) Android Studio entwickelt. Die Installationsdatei wird als Android Package (APK) bezeichnet. Sie wird mit dem Build-System Gradle sowie den Android Plugins erstellt und in der Regel im Google Play Store angeboten. Im Gegensatz dazu werden iOS Apps mit Objective-C und Swift sowie der IDE Xcode entwickelt. Die Installationsdatei wird als iOS App Store Package (IPA) bezeichnet. Sie wird mit Xcode sowie dessen integriertem Build- System erzeugt und im Apple App Store bereitgestellt. Die Betriebssysteme Android und iOS sind nicht miteinander kompatibel. Eine Android-App kann nicht auf einem Apple-Smartphone verwendet werden oder umgekehrt.

2.2 Kotlin Multiplatform

2.2.1 Kotlin

Die Programmiersprache Kotlin wurde von der Firma JetBrains entwickelt, die erste Version erschien im Jahr 2016 (Breslav, 2016). Eine vorläufige Unterstützung für Multiplatform Projekte, auch Kotlin Multiplatform genannt, ist seit Version 1.2 Bestandteil der Sprache und befindet sich zurzeit in der Entwicklung (Jemerov, 2017). Sie ermöglicht es, die Sprache für plattformübergreifende Anwendungen einzusetzen. Code kann einmal geschrieben und zum Beispiel zwischen Android, iOS, Web, Desktop oder Backend geteilt werden (JetBrains, o.J.a, Abschnitt Use Cases). Die Anwendungen nutzen diesen Code als gemeinsame Business-Logik, die Benutzeroberflächen werden weiterhin separat entwickelt. Grundlage für den Cross-Plattform-Einsatz von Kotlin ist, dass die Sprache zu Java Virtual Machine (JVM) Bytecode und mit der Technologie Kotlin/Native zu nativen Binärdateien kompiliert werden kann (JetBrains, o.J.b). Auch das Transpilieren von Kotlin zu JavaScript ist möglich (JetBrains, o.J.c).

2.2.2 Einsatz in der App-Entwicklung

Dieser Abschnitt beschreibt die Funktionsweise von Kotlin Multiplatform genauer. Abbildung 1 zeigt die Struktur eines Multiplatform App Projekts.

Abbildung 1 – Komponenten eines Kotlin Multiplatform App Projekts

Der gesamte Quellcode befindet sich in einem gemeinsamen Repository. Plattformabhängige Komponenten wie die Benutzeroberfläche werden nativ für Android bzw. iOS mit den jeweiligen Sprachen, SDKs und Werkzeugen entwickelt. Die Business-Logik ist in Kotlin geschrieben und dadurch übergreifend nutzbar. Es besteht die Möglichkeit, auch hier auf plattformspezifische Application-Programming Interfaces (APIs) zuzugreifen oder Unterschiede bei der Implementierung zu machen, diese ist dazu in drei Bereiche "commonMain", "iosMain", "androidMain" unterteilt (JetBrains, 2019).

// commonMain
expect fun currentTimeInMillis(): Long

// androidMain
actual fun currentTImeInMillis(): Long {
    return Date().time
}

// iosMain
actual fun currentTimeInMillis(): Long {
    return (NSDate().timeIntervalSince1970() * 1000).toLong()
}

Listing 1 – Code-Beispiel für die Verwendung von expect und actual (Quelle: In Anlehnung an https://kotlin- lang.org/docs/reference/platform-specific-declarations.html, Abgerufen 02.01.2020)

Der gemeinsame Code ist in "commonMain" enthalten, plattformspezifische Funktionen oder Klassen können hier mit "expect" beschrieben werden (ähnlich zu Interfaces in Java). Die spezifische Implementierung befindet sich mit "actual" gekennzeichnet jeweils in "iosMain" und "androidMain" (JetBrains, o.J.d). Ein Code-Beispiel ist in Listing 1 zu sehen. Der geteilte Kotlin Code wird für beide Betriebssysteme unterschiedlich kompiliert.

Abbildung 2 – Kompilieren einer Android-App in einem Kotlin Multiplatform Projekt

Abbildung 2 zeigt die Erzeugung einer Android App. Dafür wird der Quellcode aus „commonMain“ und „androidMain“ mit dem Kotlin JVM-Compiler Kotlinc zu Bytecode kompiliert und in ein Java Archive (JAR) gepackt (Howard, 2019). Diese wird bei der Erstellung der APK mit eingebunden.

Abbildung 3 – Kompilieren einer iOS-App in einem Kotlin Multiplatform Projekt

Abbildung 3 zeigt die Erzeugung einer iOS-App. Der Quellcode aus „commonMain“ und „iosMain“ wird mit dem Kotlin/Native Compiler Konan zu einer plattformunabhängigen Repräsentation (Intermediate Representation) kompiliert (Howard, 2019). Der LLVM Compiler kann diese lesen und erzeugt daraus plattformspezifischen nativen Code (Howard, 2019). Dieser wird zu einem Apple Framework zusammengefasst und kann von Xcode als Abhängigkeit in die IPA eingebunden werden.

Alles in allem ist Kotlin Multiplatform eine Ergänzung zur nativen Entwicklung, bei der eine Library entwickelt, jeweils für Android und iOS kompiliert und in beiden Apps verwendet wird.

2.2.3 Abgrenzung zu anderen App-Technologien

Tabelle 1 zeigt, wie sich Kotlin Multiplatform von bisher eingesetzten Technologien unterscheidet. Cross-Plattform und hybride Frameworks wie z.B. Flutter, React Native oder Xamarin bieten in der Regel die Möglichkeit die gesamte Anwendung, d.h. auch die Benutzeroberfläche zu teilen. Dabei werden grundlegend andere Programmiersprachen als in der nativen Entwicklung verwendet. Bei dem Werkzeug Djinni4 wird die plattformübergreifende Business-Logik mit C++ entwickelt und die Benutzeroberflächen werden jeweils nativ umgesetzt. Dieses Konzept ist sehr ähnlich zu Kotlin Multiplatform, ein wesentlicher Unterschied ist jedoch die verwendete Programmiersprache. Dropbox hat die Weiterentwicklung von Djinni vor allem auf Grund von C++ eingestellt, deren Einsatz in der App-Entwicklung untypisch ist (Guthmann, 2019). Es war schwierig entsprechende Entwickler zu finden, auch war der Entwicklungsaufwand groß, da keine Unterstützung, z.B. in Form von Libraries, zur Verfügung stand (Guthmann, 2019).

 Nativ Android iOS Kotlin Multiplatform Djinni Flutter, React Native, Xamarin
Programmiersprachen JAva, Kotlin, Objective-C, Swift Java, Kotlin, Objective-C, Swift Java, Kotlin, Objective-C, Swift, C++ Dart, JavaScript, Css, HTML, C#, C++
Teilen der UI möglich Nein Nein Nein Ja
Teilen von Logik möglich Nein Ja Ja Ja

Tabelle 1 – Gegenüberstellung von Technologien zur Entwicklung von Apps