Multiplatform


https://developer.android.com/kotlin/multiplatform
https://kotlinlang.org/docs/native-overview.html
11.04.2024https://youtu.be/pTyWagI8G5g
21.09.2023https://youtu.be/i45sp7O_RUc
https://kmp.jetbrains.com/#newProject
30.04.2024https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-samples.html
16.04.2024https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html
https://klibs.io/

Kotlin Multiplatform (KMP)

Это SDK, предназначенный для упрощения разработки кроссплатформенных мобильных приложений. Вы можете использовать общий код между приложениями iOS и Android и писать код для конкретной платформы только там, где это необходимо. Например, для реализации собственного пользовательского интерфейса или при работе с API для конкретной платформы.
• не поддерживаются resources в разных модулях. все ресурсы должны лежать в 1 модуле.

Kotlin Native

Технология компиляции Kotlin-кода в нативные двоичные файлы которые могут запускаться без виртуальной машины. В первую очередь предназначен для платформ на которых виртуальные машины невозможны или нежелательны, например на iOS. Kotlin Native поддерживает macOS, iOS, tvOS, watchOS, Linux, Windows (MinGW), Android NDK.

Best Practices

• следить за совместимостью библиотек. многие библиотеки используют compose под капотом. обновил версию и в runtime что-то падает из-за отсутствия бинарной совместимости.

• отделять общую логику от платформенных деталей. ограничивать использование Сontext и Application.

Совместимость с Java

UUID. В KMP делать реализацию через expect/actual.

TimeUnit. В KMP использовать kotlin.time.Duration.

AtomicInteger AtomicBoolean AtomicReference. B KMP использовать библиотеку atomicfu от JetBrains.

TreeMap PriorityQueue CopyOnWriteArrayList BlockingQueue. В KMP использовать свои обертки над структурами данных. использовать готовые реализации этих структур на kotlin. использовать kotlin.cuncurrent в kotlin native и библиотеку atomicfu.

IOException TimeoutException UnknownHostException. В KMP не использовать эти исключения напрямую, написать свои экстеншены. использовать expect/actual. библиотека moko-network.

WeakReference SoftReference. В KMP пишем свои обертки. используем expect/actual и WeakReference в kotlin native.

java.util.Date java.time. В KMP использовать библиотеку kotlinx-datetime.

DecimalFormat. В KMP использовать expect/actual.

Uri. В KMP пишем expect/actual. используем класс Url в Ktor.

java.io.File java.io.InputStream. В KMP библиотека okio. библиотека kotlinx-io.

commonMain

Код для всех платформ. Вызовы expect.

androidMain

Код специфичный для Android. Вызовы actual.

iosMain

Код специфичный для iOS. Вызовы actual.

desktopMain

Код специфичный для Desktop JVM. Вызовы actual.

ktor

Фреймворк который может выступать в роли HTTP-клиента.
• под капотом OkHttp для Android. Darvin для iOS.

expect

Уведомляет компилятор что код ожидает реализации для конкретной платформы.

expect fun randomUUID(): String

actual

Уведомляет компилятор о предоставленной реализацию для конкретной платформы.

import platform.Foundation.NSUUID

actual fun randomUUID(): String = NSUUID().UUIDString() // iOS
import java.util.UUID

actual fun randomUUID(): String = UUID.randomUUID().toString() // Android

Какие androidx-библиотеки уже multiplatform?

DataStore
Room
Lifecycle
Navigation
ViewModel
Kotlin Multiplatform. Вопросы на собесе
  1. Как интегрировать Kotlin Multiplatform в существующий проект?
  1. Когда использовать expect / actual, а когда реализацию через интерфейс?
  1. Какие лучшие практики для common-модуля?
  1. Разница между KMP и Kotlin Native?