
Multiplatform
| https://developer.android.com/kotlin/multiplatform |
| https://developer.android.com/kotlin/multiplatform/setup |
| https://kotlinlang.org/docs/native-overview.html |
28.07.2024 | https://youtu.be/6NM4Xzbficw |
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.
expect
Уведомляет компилятор что код ожидает реализации для конкретной платформы.
expect fun randomUUID(): Stringactual
Уведомляет компилятор о предоставленной реализацию для конкретной платформы.
import platform.Foundation.NSUUID
actual fun randomUUID(): String = NSUUID().UUIDString() // iOSimport java.util.UUID
actual fun randomUUID(): String = UUID.randomUUID().toString() // AndroidJS
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)
- Как интегрировать Kotlin Multiplatform в существующий проект?
• Добавьте Kotlin Multiplatform Plugin в
build.gradle.• Настройте общие и платформенные модули (
commonMainandroidMainiosMain).• Обновите сборочные настройки для подключения новых модулей.
- Когда использовать expect / actual, а когда реализацию через интерфейс?
Используйте
expect/actualдля платформо-специфичных реализаций одного API. Интерфейсы применяйте для обеспечения единообразного поведения при одинаковой реализации на всех платформах.
- Какие лучшие практики для common-модуля?
• Разделяйте код на небольшие, переиспользуемые компоненты.
• Используйте expect/actual для платформо-специфичных функций.
• Избегайте зависимости от платформенных библиотек.
- Разница между KMP и Kotlin Native?
Kotlin Multiplatform (KMP) позволяет писать общий код для различных платформ (Android, iOS, JS и др.), поддерживая совместное использование логики, но требует платформенных реализаций. Kotlin Native — это часть KMP, обеспечивающая компиляцию кода в нативный код для платформ, таких как iOS, без необходимости использования JVM.