Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Multiplatform: Why it is the best and wo...

Avatar for Gerard Gerard
October 27, 2025

Kotlin Multiplatform: Why it is the best and worst technology?

Kotlin Multiplatform is the best technology never built to share code across Android, iOS, and beyond. Write once, adapt everywhere is the promise of this technology... but while KMP is powerful, it's also open to debate, hailed as a game-changer by some and cursed as a productivity sink by others.

In this talk, we’ll explore the duality of KMP: why it can be the best technology for teams looking to maximize code reuse and the worst for those unprepared for its pitfalls. From seamless integration and coroutine magic to debugging nightmares and complex build setups, we’ll deep dive into real-world experiences and hard lessons learned.

You'll have a balanced view, after this, of KMP's potential, trade-offs, and situations where it really shines-or fails. If you are considering KMP for your next project, or for your company, this talk will challenge assumptions and prepare you for your journey ahead.

Avatar for Gerard

Gerard

October 27, 2025
Tweet

More Decks by Gerard

Other Decks in Technology

Transcript

  1. React Native Flutter IONIC Xamarin PhoneGap Framework 7 Cordova Titanium

    .NET MAUI Nativescript Sencha Touch JQuery Mobile THE CROSS-PLATFORM CHALLENGE
  2. Duplicate effort Inconsistent business logic Slower time-to-market Maintaining multiple codebases

    Maintaining multiple teams Duplicate code THE CROSS-PLATFORM CHALLENGE
  3. Use the Kotlin language you might already know, especially from

    Android, to write code that compiles and runs on different platforms (targets)
  4. Start small, share a specific piece of logic. Low risk,

    great for learning ✅ Networking SDK ✅ Telemetry SDK ✅ Caching database ✅ Logger ❌ JSON Serializer ❌ Linter ❌ Concurrency ❌ Dependency injection Shared library Shared library Shared library FLEXIBILITY INTEGRATION
  5. Business Logic Share your core domain/data layers. Keep UI native

    A common, balanced approach ✅ Data layer ✅ Domain layer ⚠ Presentation layer (state holder) ❌ Presentation layer (ui) Shared library FLEXIBILITY INTEGRATION
  6. Use Compose Multiplatform to share UI code across all your

    targets. Maximum reuse, but UI layer maturity varies Full Project Shared library Business logic FLEXIBILITY INTEGRATION
  7. Shared library Business logic Full project You can adopt KMP

    incrementally, matching your team's comfort and project needs. Migration is possible FLEXIBILITY INTEGRATION
  8. SOURCE SET appleMain SOURCE SET iosMain SOURCE SET watchosMain SOURCE

    SET macosMain SOURCE SET tvosMain Native actual SOURCE SET jvmMain SOURCE SET androidMain SOURCE SET commonMain SOURCE SET androidNativeMain SOURCE SET … Android NDK Android SDK New Java API Native platform expect actual actual actual actual « TRUE NATIVE » INTEROPERABILITY
  9. You aren't locked out of using specific platform features or

    SDKs when needed « TRUE NATIVE » INTEROPERABILITY
  10. Kotlin’s creators IDE support Ecosystem development Open source contributor Key

    actor in the Kotlin community Official support of KMP since 2024 Kotlin first on Android since 2017 Jetpack librairies migration to KMP Tooling support with Android Studio Used within Google’s own products STRONG BACKING & GROWING ECOSYSTEM
  11. The biggest driver is Google's AndroidX investment. If KMP becomes

    the standard way to build Android libraries/apps, adding other targets (iOS, Web, Desktop) becomes a much smaller, incremental step. STRONG BACKING & GROWING ECOSYSTEM
  12. Enhanced testing via JVM target Desktop execution via JVM target

    Deploy internal tools via Wasm target DEVELOPER EXPERIENCE FOR ANDROID ECOSYSTEM
  13. The future of Android, isn’t Android. The future of Android…

    isn’t Android. DEVELOPER EXPERIENCE FOR ANDROID ECOSYSTEM
  14. Gradle configuration for multiple targets, source sets, and plugins can

    be very complex and require knowledge in supported target. "Configuration complexity" is a common complaint. TECHNICAL COMPLEXITY TECHNICAL COMPLEXITY
  15. Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread 0 Crashed:

    0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous namespace)::terminateWithUnhandledException 7 iosApp 0x20231d8ac (anonymous namespace)::processUnhandledException 8 iosApp 0x20231f73c kotlin::ProcessUnhandledException 9 iosApp 0x202322cb4 Kotlin_ObjCExport_trapOnUndeclaredException Tracing bugs from a native crash (Swift/ObjC) back into commonMain Kotlin code can be difficult, or impossible. Requires expertise on both sides of the boundary. TECHNICAL COMPLEXITY TECHNICAL COMPLEXITY
  16. TECHNICAL COMPLEXITY Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous The default bridge between Kotlin and Swift/Objective-C can be inefficient, leading to boilerplate, awkward APIs, potential performance issues, and harder-to-maintain generated code. Interoperability isn’t perfect and can be buggy. TECHNICAL COMPLEXITY
  17. ECOSYSTEM GAPS Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous SKIE NSException KMP-NativeCoroutines xcode-kotlin Power-Assert CrashKiOS Xcode plugin allows debugging Kotlin code Facilitate the use of Kotlin coroutines from Swift code Bring back support for some Swift language feature Provide detailed failure message with contextual information Provide symbolicated crash reports for Kotlin code on iOS Improve crash reports on Apple platforms ECOSYSTEM GAPS
  18. ECOSYSTEM GAPS Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous SKIE NSException KMP-NativeCoroutines xcode-kotlin Power-Assert CrashKiOS Community dependency risk This leads to a major strategic question… Long term stability bet Fear of abandonment The lock-in & rollback problem The blocker ECOSYSTEM GAPS
  19. ECOSYSTEM GAPS Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous SKIE NSException KMP-NativeCoroutines xcode-kotlin Power-Assert CrashKiOS ECOSYSTEM GAPS
  20. ECOSYSTEM GAPS Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous SKIE NSException KMP-NativeCoroutines xcode-kotlin Power-Assert CrashKiOS ECOSYSTEM GAPS
  21. ECOSYSTEM GAPS Exception Type: EXC_CRASH (SIGABRT) Crashed Thread: 0 Thread

    0 Crashed: 0 libsystem_kernel.dylib 0x3980b2e60 __pthread_kill 1 libsystem_pthread.dylib 0x39815b3bc pthread_kill 2 libsystem_c.dylib 0x30018f3f4 abort 3 iosApp 0x20230fc2c konan::abort 4 iosApp 0x20231dca0 (anonymous namespace)::terminateWithUnhandledException::lambda::operator() 5 iosApp 0x20231db64 (anonymous namespace)::lambda::operator()<T> 6 iosApp 0x20231d924 (anonymous ECOSYSTEM GAPS It isn’t only about technology but the strategic risk of depending on non-official community tools to fix it, which makes long-term commitment a major hurdle for many organizations. SKIE NSException KMP-NativeCoroutines xcode-kotlin Power-Assert CrashKiOS
  22. HUMAN & ORGANISATION HUMAN & ORGANISATION iOS Engineer Often face

    the steepest curve, needing to learn Kotlin and adapt to a different ecosystem/tooling. Resistance is common
  23. HUMAN & ORGANISATION HUMAN & ORGANISATION Android Engineer Easier transition,

    but still need specific KMP training (Gradle, multiplatform concepts).
  24. HUMAN & ORGANISATION HUMAN & ORGANISATION Hiring/Scaling Limited pool of

    experienced Kotlin developers for iOS. It can be difficult to expand teams without specific KMP skills.
  25. HUMAN & ORGANISATION HUMAN & ORGANISATION It isn’t only about

    technology but also about people and your team internal skills
  26. IMAGINE SWIFT MULTIPLATFORM PROJECT IMAGINE SWIFT MULTIPLATFORM PROJECT Adoption requires

    empathy. Understand the impact on workflow, tooling, language familiarity, and perceived code quality for everyone involved. Dismissing concerns as "trolling" misses the point
  27. FROM DREAM TO NIGHTMARE FROM DREAM TO NIGHTMARE Architecturally sound,

    huge potential for reuse, leverages Kotlin, backed by JetBrains/Google, enables faster testing (JVM) & broader reach (Wasm). The potential future is bright Young ecosystem, real DX challenges (esp. native), reliance on community tools creating stability risks, significant learning curve for non- Kotlin teams, requires managing complexity. The current reality has sharp edges
  28. Build confidence, learn the tools, assess the real-world DX for

    your team. Smart small Before moving core logic (Level 2+), have open discussions about tooling stability, long-term support, and team readiness Shared library Shared library Shared library INTEGRATION LEVELS REVISITED
  29. VERDICT KMP is a powerful, promising technology, but not yet

    a universally "safe" or easy choice for all cross-platform needs, especially core logic involving iOS in risk-averse settings.