Kotlin Multiplatform (KMP) একটি JetBrains প্রযুক্তি যা শেয়ার্ড Kotlin কোডকে iOS, Android, Web এবং Desktop-এর জন্য কম্পাইল করে। Flutter এবং React Native-এর বিপরীতে, KMP নেটিভ UI প্রতিস্থাপন করে না — শেয়ার্ড লজিক একটি shared module-এ স্থানান্তরিত হয়, যখন প্রতিটি অ্যাপের ইন্টারফেস নেটিভ থাকে। Kotlin Multiplatform documentation — মডিউল কনফিগারেশন এবং expect/actual মেকানিজমের জন্য প্রধান রেফারেন্স।
মূল পয়েন্ট
Kotlin Multiplatform একটি ক্রস-কম্পাইলেশন প্রযুক্তি যা Kotlin-এ শেয়ার্ড কোড লেখার এবং বিভিন্ন প্ল্যাটফর্মের জন্য কম্পাইল করার অনুমতি দেয়: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) এবং নেটিভ বাইনারি (Linux, Windows)। KMP একটি UI ফ্রেমওয়ার্ক নয় — এটি ইন্টারফেস নয়, বরং বিজনেস লজিক পুনরায় ব্যবহারের সমস্যা সমাধান করে।
KMP আর্কিটেকচার একটি shared module-এর চারপাশে নির্মিত — একটি Gradle মডিউল যা প্ল্যাটফর্ম-স্বাধীন কোড সহ commonMain এবং প্রতিটি লক্ষ্যের জন্য source sets (androidMain, iosMain, desktopMain) ধারণ করে। 2025 সালের JetBrains তথ্য অনুসারে, 40%-এর বেশি নতুন Kotlin প্রকল্প প্ল্যাটফর্মের মধ্যে কোড শেয়ার করতে KMP ব্যবহার করে।
Kotlin Multiplatform Mobile (KMM) — iOS+Android মোবাইল পরিস্থিতির জন্য পূর্ববর্তী নাম। Kotlin 2.1+ থেকে, KMM শব্দটি Kotlin Multiplatform দ্বারা প্রতিস্থাপিত হয়েছে, কারণ প্রযুক্তি মোবাইল ডেভেলপমেন্টের বাইরে চলে গেছে। Netflix, McDonald's এবং VMware মোবাইল অ্যাপ্লিকেশনের মধ্যে কোড শেয়ার করতে প্রোডাকশনে KMP ব্যবহার করে।
Expect/actual — প্ল্যাটফর্ম-নির্দিষ্ট কোডের সাথে কাজ করার জন্য KMP-এর মূল প্রক্রিয়া। commonMain-এ একটি expect ঘোষণা (ফাংশন, ক্লাস, প্রপার্টি) ঘোষণা করা হয়, এবং প্রতিটি প্ল্যাটফর্ম-নির্দিষ্ট source set-এ (androidMain, iosMain) একটি actual বাস্তবায়ন প্রদান করা হয়। কম্পাইলার পরীক্ষা করে যে প্রতিটি expect-এর জন্য প্রতিটি লক্ষ্য প্ল্যাটফর্মে actual বিদ্যমান।
// commonMain — প্ল্যাটফর্ম API ঘোষণা
expect fun getPlatformName(): String
expect class PlatformContext(val appVersion: String)
// androidMain — Android-এর জন্য actual
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"
// iosMain — iOS-এর জন্য actual
actual fun getPlatformName(): String =
UIDevice.currentDevice.systemNameKMP-তে source sets শ্রেণিবিন্যাস মধ্যবর্তী স্তর তৈরি করার অনুমতি দেয়: উদাহরণস্বরূপ, iosArm64Main (শারীরিক iOS ডিভাইস) এবং iosSimulatorArm64Main (সিমুলেটর) শেয়ার্ড iosMain সহ। commonMain-এর কোড সমস্ত প্ল্যাটফর্মের জন্য উপলব্ধ, যখন iosMain-এর কোড শুধুমাত্র iOS লক্ষ্যগুলির জন্য উপলব্ধ। এটি পুনরাবৃত্তি হ্রাস করে যখন বাস্তবায়ন প্রতিটি প্ল্যাটফর্মের জন্য নয় বরং প্ল্যাটফর্মের একটি গ্রুপের জন্য ভিন্ন হয়।
অনুশীলনে, expect/actual ব্যবহার করা হয়: স্থানীয় স্টোরেজ অ্যাক্সেস (SharedPreferences vs NSUserDefaults), নেটওয়ার্কিং (প্রতি প্ল্যাটফর্মে HttpEngine), ফাইল সিস্টেম অ্যাক্সেস, ক্রিপ্টোগ্রাফি এবং অ্যানালিটিক্সের জন্য। JetBrains expect/actual ঘোষণার সংখ্যা হ্রাস করার এবং যতটা সম্ভব কোড commonMain-এ স্থানান্তর করার পরামর্শ দেয়।
Shared module — org.jetbrains.kotlin.multiplatform প্লাগইন সহ একটি স্ট্যান্ডার্ড Gradle মডিউল। এতে src/commonMain/kotlin/-এ শেয়ার্ড কোড এবং src/androidMain/kotlin/ এবং src/iosMain/kotlin/-এ প্ল্যাটফর্ম-নির্দিষ্ট বাস্তবায়ন রয়েছে। একটি KMP প্রকল্পে androidApp এবং iosApp-ও অন্তর্ভুক্ত থাকে, যা shared module-এর উপর নির্ভর করে।
// build.gradle.kts — shared module
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
androidTarget()
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
it.binaries.framework {
baseName = "shared"
isStatic = true
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:3.1.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}
}
val androidMain by getting {
dependencies {
implementation("io.ktor:ktor-client-okhttp:3.1.0")
}
}
val iosMain by creating {
dependencies {
implementation("io.ktor:ktor-client-darwin:3.1.0")
}
}
}
}KMP-র জন্য Gradle কনফিগারেশন-এ iOS লক্ষ্যগুলির স্পষ্ট ঘোষণা প্রয়োজন — x64 (Intel সিমুলেটর), arm64 (শারীরিক ডিভাইস) এবং simulatorArm64 (Apple Silicon সিমুলেটর)। প্রতিটি লক্ষ্যের জন্য একটি পৃথক Apple ফ্রেমওয়ার্ক জেনারেট করা হয়। kotlin("multiplatform") প্লাগইন ঘোষিত লক্ষ্যগুলির উপর ভিত্তি করে JVM এবং LLVM-এর জন্য স্বয়ংক্রিয়ভাবে কম্পাইলেশন কনফিগার করে।
Ktor এবং kotlinx.serialization — স্ট্যান্ডার্ড KMP লাইব্রেরি যা শেয়ার্ড কোড সমর্থন করে। Ktor প্রতিটি প্ল্যাটফর্মের জন্য ইঞ্জিন সহ একটি HTTP ক্লায়েন্ট প্রদান করে (Android-এর জন্য OkHttp, iOS-এর জন্য Darwin)। kotlinx.serialization commonMain-এ তার মাল্টিপ্ল্যাটফর্ম বাস্তবায়নের কারণে expect/actual ছাড়াই সমস্ত প্ল্যাটফর্মে কাজ করে।
Kotlin/Native — LLVM-এর মাধ্যমে নেটিভ কোডের জন্য একটি Kotlin কম্পাইলার। iOS-এর জন্য, shared module একটি Apple ফ্রেমওয়ার্কে (.framework) কম্পাইল করা হয় যা Xcode-এর মাধ্যমে সংযুক্ত হয়। Swift/Objective-C থেকে শেয়ার্ড কোড কল করা জেনারেটেড Objective-C হেডারের মাধ্যমে ঘটে, তাই shared module API-কে Objective-C-এর সাথে সামঞ্জস্যপূর্ণ হতে হবে।
iOS ইন্টিগ্রেশন সীমাবদ্ধতা: Kotlin কালেকশন (List, Map) NSArray/NSDictionary-তে রূপান্তরিত হয়। ডিফল্ট প্যারামিটার সহ ফাংশন এক্সপোর্ট হয় না — overloads প্রয়োজন। সাসপেন্ড ফাংশনের জন্য, @ObjCName এবং Kotlin 2.0+ থেকে async/await সমর্থন সহ callback-ভিত্তিক পদ্ধতি জেনারেট করা হয়।
// iOS অ্যাপ: Swift থেকে shared module কল করা
import shared
class ViewModel: ObservableObject {
let repository = UserRepository()
func loadUsers() {
repository.fetchUsers(completionHandler: { result, error in
if let users = result as? [User] {
print("Users: \(users.count)")
}
})
}
}Xcode-এ shared module ইন্টিগ্রেশন embed-and-framework-এর মাধ্যমে ঘটে — জেনারেটেড .xcframework Xcode প্রকল্পে যোগ করা হয়। Gradle প্লাগইন embedAndSignAppleFrameworkForXcode-এর মাধ্যমে বিল্ডের সময় স্বয়ংক্রিয়ভাবে ফ্রেমওয়ার্ক আপডেট করতে পারে। সিমুলেটরে পরীক্ষার জন্য, iosSimulatorArm64 বা iosX64 বাইনারি যথেষ্ট।
KMP, Flutter এবং React Native-এর মধ্যে পছন্দ অগ্রাধিকারের উপর নির্ভর করে: কোড পুনরায় ব্যবহার বা সম্পূর্ণ ক্রস-প্ল্যাটফর্ম। KMP প্রতিটি প্ল্যাটফর্মে নেটিভ UI প্রদান করে কিন্তু ইন্টারফেসের জন্য দুটি কোড বেস প্রয়োজন। Flutter এবং React Native একটি একক UI ব্যবহার করে কিন্তু নেটিভিটি ত্যাগ করে।
| বৈশিষ্ট্য | KMP | Flutter | React Native |
|---|---|---|---|
| UI ফ্রেমওয়ার্ক | নেটিভ (Android XML/Jetpack Compose + SwiftUI) | Dart + নিজস্ব Skia রেন্ডারার | React + নেটিভ কম্পোনেন্ট |
| শেয়ার্ড কোড | বিজনেস লজিক, নেটওয়ার্কিং, DB, ভ্যালিডেশন | নেটিভ প্লাগইন ছাড়া 100% | নেটিভ মডিউল ছাড়া 100% |
| পারফরম্যান্স | নেটিভ (কোনো মিডলওয়্যার নেই) | উচ্চ (Skia Engine) | মাঝারি (JSI Bridge) |
| iOS সমর্থন | Kotlin/Native (চমৎকার) | চমৎকার | ভাল |
| প্রবেশের স্তর | মধ্যম (Kotlin + নেটিভ প্ল্যাটফর্ম) | নিম্ন (একটি ভাষা + একটি UI) | নিম্ন (JS/TS + React) |
কখন KMP নির্বাচন করবেন: প্রকল্পের উচ্চ-পারফরম্যান্স UI (গেম, ম্যাপ, অ্যানিমেশন) প্রয়োজন, বিদ্যমান নেটিভ কোড পুনরায় ব্যবহার করতে হবে, টিম ইতিমধ্যে Kotlin এবং নেটিভ প্ল্যাটফর্ম জানে। কখন Flutter/RN নির্বাচন করবেন: সীমিত বাজেটের MVP বা স্টার্টআপ, একক-প্রোফাইল টিম, UI-তে গভীর নেটিভ কাস্টমাইজেশনের প্রয়োজন নেই।
KMP টুলস ইকোসিস্টেম-এ অ্যাপ্লিকেশনের সমস্ত স্তরের জন্য লাইব্রেরি অন্তর্ভুক্ত: নেটওয়ার্কিং (Ktor), সিরিয়ালাইজেশন (kotlinx.serialization), ডেটাবেস (SQLDelight), নেভিগেশন (Decompose), DI (Koin) এবং ডেটা স্টোরেজ (multiplatform-settings)। JetBrains Compose Multiplatform সমর্থন করে — একটি Kotlin UI ফ্রেমওয়ার্ক যা সমস্ত প্ল্যাটফর্মে চলে।
// SQLDelight + Ktor সহ KMP রিপোজিটরি
class UserRepository(
private val httpClient: HttpClient,
private val db: AppDatabase
) {
suspend fun syncUsers(): List<User> {
val remote = httpClient.get("https://api.example.com/users")
.body<List<UserDto>>()
db.userQueries.replaceAll(remote.map { it.toDomain() })
return db.userQueries.selectAll().executeAsList()
}
}Compose Multiplatform — Jetpack Compose-এর উপর ভিত্তি করে KMP-র জন্য একটি UI ফ্রেমওয়ার্ক। এটি Android, iOS, Desktop এবং Web-এর জন্য Kotlin-এ ইন্টারফেস লেখার অনুমতি দেয়। 2025 সালে, Compose Multiplatform Android এবং Desktop-এর জন্য স্থিতিশীল অবস্থায় পৌঁছেছে; iOS লক্ষ্য beta-তে রয়েছে। নেটিভ UI সহ প্রোডাকশন প্রকল্পের জন্য, KMP-র সুবিধা Flutter-এর থেকে মূল পার্থক্য রয়ে গেছে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
KMM — iOS এবং Android-এর জন্য KMP-র মোবাইল পরিস্থিতি। Kotlin 2.1+ থেকে, JetBrains উভয় শব্দকে Kotlin Multiplatform-এ একীভূত করেছে, কারণ প্রযুক্তি শুধুমাত্র মোবাইল প্ল্যাটফর্ম নয়, Desktop এবং Web-ও সমর্থন করে। KMM প্রকল্পগুলি কাজ চালিয়ে যায়, কিন্তু এখন তারা সামগ্রিক KMP-র অংশ।
হ্যাঁ। KMP Objective-C হেডার সহ Kotlin/Native-এর মাধ্যমে Apple ফ্রেমওয়ার্কে কম্পাইল হয়। SwiftUI এই ফ্রেমওয়ার্ককে যেকোনো সাধারণ লাইব্রেরির মতো ইম্পোর্ট করে। Shared module Kotlin ক্লাস এবং ফাংশন এক্সপোর্ট করে যা কিছু সীমাবদ্ধতা সহ Swift থেকে কল করা হয় (উদাহরণস্বরূপ, Kotlin কালেকশন Foundation টাইপে রূপান্তরিত হয়)।
iOS-এ, shared module iosTest source set-এ Kotlin/Native টেস্টের মাধ্যমে পরীক্ষা করা হয়। UI টেস্টের জন্য, ইম্পোর্টেড ফ্রেমওয়ার্ক সহ Xcode-এ XCTest ব্যবহার করা হয়। Kotlin টেস্ট commonTest-এ kotlin.test দিয়ে লেখা হয় এবং iosSimulatorArm64Test Gradle টাস্কের মাধ্যমে iOS সিমুলেটরে চালানো হয়।
প্রধান KMP লাইব্রেরি: Ktor (নেটওয়ার্কিং), kotlinx.serialization (JSON), SQLDelight (DB), Koin (DI), Decompose (নেভিগেশন), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (KMP-NativeCoroutines-এর মাধ্যমে)। Compose Multiplatform সমস্ত প্ল্যাটফর্মের জন্য UI প্রদান করে।
হ্যাঁ। KMP Gradle 8.5+-এর সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ। Kotlin 2.1 থেকে, অফিসিয়াল প্লাগইনগুলি Gradle 8 সমর্থন করে। build.gradle.kts-এর মাধ্যমে kotlin("multiplatform") সহ কনফিগারেশনের জন্য Gradle 7.6+ প্রয়োজন, তবে সর্বোত্তম বিল্ড পারফরম্যান্সের জন্য সংস্করণ 8.5 সুপারিশ করা হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন