Multiplatform


https://developer.android.com/kotlin/multiplatform
https://developer.android.com/kotlin/multiplatform/setup
https://kotlinlang.org/docs/native-overview.html
28.07.2024https://youtu.be/6NM4Xzbficw
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.

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
JS
isMobileBrowser

Определяет открыт ли сайт в мобильном браузере.

// commonMain
expect fun isMobileBrowser(): Boolean
// jsMain
actual fun isMobileBrowser(): Boolean {
    val userAgent = js("navigator.userAgent") as String
    return userAgent.contains("Mobile") || userAgent.contains("Android") || userAgent.contains("iPhone")
}
getScreenWidth

Получение ширины экрана.

// commonMain
expect fun getScreenWidth(): Int
// jsMain
actual fun getScreenWidth(): Int {
    return js("window.innerWidth") as Int
}
Multiplatform Jetpack libraries
https://developer.android.com/kotlin/multiplatform#multiplatform-jetpack
https://developer.android.com/jetpack/androidx/releases/savedstate
Вопросы на собесе (4)
  1. Как интегрировать Kotlin Multiplatform в существующий проект?

    Добавьте Kotlin Multiplatform Plugin в build.gradle.

    Настройте общие и платформенные модули (commonMain androidMain iosMain).

    Обновите сборочные настройки для подключения новых модулей.

  1. Когда использовать expect / actual, а когда реализацию через интерфейс?

    Используйте expect/actual для платформо-специфичных реализаций одного API. Интерфейсы применяйте для обеспечения единообразного поведения при одинаковой реализации на всех платформах.

  1. Какие лучшие практики для common-модуля?

    Разделяйте код на небольшие, переиспользуемые компоненты.

    Используйте expect/actual для платформо-специфичных функций.

    Избегайте зависимости от платформенных библиотек.

  1. Разница между KMP и Kotlin Native?

    Kotlin Multiplatform (KMP) позволяет писать общий код для различных платформ (Android, iOS, JS и др.), поддерживая совместное использование логики, но требует платформенных реализаций. Kotlin Native — это часть KMP, обеспечивающая компиляцию кода в нативный код для платформ, таких как iOS, без необходимости использования JVM.