tgoop.com/kotlin_broadcast/1896
Create:
Last Update:
Last Update:
🤯 Как Google делает Android-библиотеки мультиплатформенными 🚀
Разбирая исходники Navigation 3 я наткнулся на необычную папку в KMP-проекте — jvmStubsMain.
src
├── commonMain
├── androidMain
└── jvmStubsMain
Внутри — только методы, которые либо возвращают значения по умолчанию, либо сразу выбрасывают исключения. Сборка под desktop из этого не получится, да и авторы такую цель не ставили. Возникает логичный вопрос: зачем тогда эта папка нужна? 🤔
В Kotlin Multiplatform папка commonMain содержит код, доступный всем таргетам.
Например:
👉 Если у проекта есть Android и iOS таргеты, в commonMain можно писать только чистый Kotlin + мультиплатформенные API.
👉 Но если оставить только Android-таргет, в commonMain внезапно станет доступен весь Android SDK 🤯 — что для меня было сюрпризом.
Добавление таких stub-таргетов в Android-библиотеках помогает искусственно ограничить доступ к платформенным API в commonMain.
Почему это работает:
👉 У JVM и Android в KMP нет общего родителя в стандартной иерархии source sets (хотя платформы имеют много общего).
👉 Stub-реализации позволяют “отсечь” случайное попадание Android API в общий код.
👉 Это помогает держать код в commonMain чистым и переиспользуемым — вдруг завтра вы захотите добавить desktop или другую платформу.
💡 jvmStubsMain — это инструмент архитектурной дисциплины. Он не предназначен для полноценной JVM-сборки, но отлично помогает не тянуть Android-зависимости в общий код и сделать чистую арзитектуру
#kotlin #kmp #android #google