Multiplatform
https://developer.android.com/kotlin/multiplatform |
https://kotlinlang.org/docs/native-overview.html |
11.04.2024 | https://youtu.be/pTyWagI8G5g |
21.09.2023 | https://youtu.be/i45sp7O_RUc |
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. Вопросы на собесе
- Как интегрировать Kotlin Multiplatform в существующий проект?
- Когда использовать expect / actual, а когда реализацию через интерфейс?
- Какие лучшие практики для common-модуля?
- Разница между KMP и Kotlin Native?