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(): 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)
- Как интегрировать Kotlin Multiplatform в существующий проект?
• Добавьте Kotlin Multiplatform Plugin в
build.gradle
.• Настройте общие и платформенные модули (
commonMain
androidMain
iosMain
).• Обновите сборочные настройки для подключения новых модулей.
- Когда использовать expect / actual, а когда реализацию через интерфейс?
Используйте
expect
/actual
для платформо-специфичных реализаций одного API. Интерфейсы применяйте для обеспечения единообразного поведения при одинаковой реализации на всех платформах.
- Какие лучшие практики для common-модуля?
• Разделяйте код на небольшие, переиспользуемые компоненты.
• Используйте expect/actual для платформо-специфичных функций.
• Избегайте зависимости от платформенных библиотек.
- Разница между KMP и Kotlin Native?
Kotlin Multiplatform (KMP) позволяет писать общий код для различных платформ (Android, iOS, JS и др.), поддерживая совместное использование логики, но требует платформенных реализаций. Kotlin Native — это часть KMP, обеспечивающая компиляцию кода в нативный код для платформ, таких как iOS, без необходимости использования JVM.