0Pricing
Kotlin Academy · Ders

KMP Proje Yapısı: commonMain, androidMain, iosMain

Kaynak kümesi hiyerarşisini ve kodun hedefler arasında nasıl paylaşıldığını anlayın.

KMP Proje Yapısı: commonMain, androidMain, iosMain, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

KMP Nedir

Kotlin Multiplatform (KMP), JVM, Android, iOS (Kotlin/Native aracılığıyla) ve JS için derlenen ortak Kotlin kodu yazmanıza olanak tanır. Platforma özgü kod, ayrı kaynak kümelerinde bulunur.

// Typical KMP module structure:
// shared/
//   src/
//     commonMain/kotlin/   <- shared code
//     androidMain/kotlin/  <- Android-only
//     iosMain/kotlin/      <- iOS-only
//     commonTest/kotlin/   <- shared tests
fun main() { println("KMP: one codebase, many targets") }

Kaynak Kümesi Hiyerarşisi

Kaynak kümeleri bir hiyerarşi oluşturur. Kök commonMain'dir; androidMain ve iosMain ona bağlıdır. commonMain içindeki kod tüm hedefler tarafından görülebilir.

// build.gradle.kts (Kotlin DSL)
kotlin {
    androidTarget()
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        val commonMain by getting {
            dependencies { /* shared deps */ }
        }
        val androidMain by getting
        val iosMain by getting
    }
}

commonMain: Paylaşılan Mantık

İş mantığını, alan modellerini, depoları ve kullanım senaryolarını commonMain içine koyun. Bu kod tüm hedefler için derlenir.

// commonMain/kotlin/com/example/domain/User.kt
data class User(val id: String, val name: String, val email: String)

// commonMain/kotlin/com/example/repository/UserRepository.kt
interface UserRepository {
    suspend fun getUser(id: String): User?
    suspend fun saveUser(user: User)
}

androidMain: Android'e Özgü

androidMain, Android SDK sınıflarını kullanabilir. Yaygın kullanım alanı, expect/actual bildirimlerinin Android'e özgü uygulamalarını sağlamaktır.

// androidMain/kotlin/com/example/platform/PlatformLogger.kt
import android.util.Log
class AndroidLogger : Logger {
    override fun log(msg: String) = Log.d("App", msg)
}
// androidMain/kotlin/com/example/di/PlatformModule.kt
// Koin or Hilt module that binds AndroidLogger to Logger

iosMain: iOS'a Özgü

iosMain, Kotlin/Native birlikte çalışabilirliği aracılığıyla Apple çatılarından yararlanabilir. Bunu, expect/actual API'lerinin iOS uygulamaları için kullanın.

// iosMain/kotlin/com/example/platform/PlatformLogger.kt
import platform.Foundation.NSLog
class IosLogger : Logger {
    override fun log(msg: String) = NSLog(msg)
}
// iOS uses Kotlin/Native runtime; no JVM here

iOS Hedefleri için Gradle Yapılandırması

iOS için genellikle üç hedef tanımlarsınız: x64 (Intel üzerindeki simülatör), arm64 (cihaz) ve simulatorArm64 (Apple Silicon üzerindeki simülatör).

// build.gradle.kts
kotlin {
    iosX64()
    iosArm64()
    iosSimulatorArm64()
    sourceSets {
        val iosMain by creating {
            dependsOn(commonMain.get())
        }
        val iosX64Main by getting { dependsOn(iosMain) }
        val iosArm64Main by getting { dependsOn(iosMain) }
        val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
    }
}

commonMain'de Paylaşılan Bağımlılıklar

Paylaşılan bağımlılıkları (Ktor, SQLDelight, kotlinx.serialization, Koin) commonMain'e ekleyin. Platforma özgü sürücüler platform kaynak kümelerine konur.

// commonMain dependencies example:
// implementation("io.ktor:ktor-client-core:2.3.0")
// implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
// implementation("io.insert-koin:koin-core:3.4.0")

// androidMain:
// implementation("io.ktor:ktor-client-okhttp:2.3.0")
// iosMain:
// implementation("io.ktor:ktor-client-darwin:2.3.0")

commonTest: Paylaşılan Testler

commonTest içindeki testler tüm hedeflerde çalışır. Kotlin test kitaplığını kullanın ve paylaşılan iş mantığı için hedeften bağımsız birim testleri yazın.

// commonTest/kotlin/UserRepositoryTest.kt
import kotlin.test.Test
import kotlin.test.assertEquals
class UserRepositoryTest {
    @Test
    fun testUserCreation() {
        val user = User("1", "Alice", "alice@example.com")
        assertEquals("Alice", user.name)
    }
}

Ara Kaynak Kümeleri

Hedeflerin bir alt kümesi arasında paylaşılan ara kaynak kümeleri oluşturabilirsiniz; örneğin tüm yerel hedefler için nativeMain veya iOS ile macOS için appleMain.

// Create appleMain shared between iOS and macOS:
sourceSets {
    val appleMain by creating { dependsOn(commonMain.get()) }
    val iosMain by getting { dependsOn(appleMain) }
    val macosMain by getting { dependsOn(appleMain) }
}

Proje Dosya Düzeni

İlgileri açıkça ayıran tipik bir KMP paylaşılan modül dizin ağacı.

// shared/
//   build.gradle.kts
//   src/
//     commonMain/kotlin/
//       domain/           User.kt, Post.kt
//       repository/       UserRepository.kt
//       usecase/          GetUserUseCase.kt
//     androidMain/kotlin/
//       repository/       RoomUserRepository.kt
//     iosMain/kotlin/
//       repository/       CoreDataUserRepository.kt
//     commonTest/kotlin/  GetUserUseCaseTest.kt

CocoaPods / SPM Tümleştirmesi

KMP Gradle eklentisi, Xcode projenize eklediğiniz bir XCFramework (veya CocoaPods pod'u) oluşturur ve paylaşılan Kotlin kodunu yerel bir çatı olarak dışa açar.

// build.gradle.kts for CocoaPods:
kotlin {
    cocoapods {
        name = "Shared"
        version = "1.0"
        ios.deploymentTarget = "14.0"
        framework { baseName = "Shared" }
    }
}
// Run: ./gradlew :shared:podPublishReleaseXCFramework

Hızlı Kontrol

Paylaşılan iş mantığı (alan modelleri, kullanım senaryoları) bir KMP projesinde nereye yerleştirilmelidir?

Özet

commonMain, paylaşılan mantığı (alan, depolar, kullanım senaryoları) barındırır. androidMain/iosMain, platform uygulamalarını barındırır. commonTest, testleri tüm hedeflerde çalıştırır. Bağımlılıklar ayrılır: paylaşılan API'ler commonMain'de, platform sürücüleri ise platform kaynak kümelerinde bulunur.

Sıkça Sorulan Sorular

“KMP Proje Yapısı: commonMain, androidMain, iosMain” dersi ücretsiz mi?

Evet — “KMP Proje Yapısı: commonMain, androidMain, iosMain” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“KMP Proje Yapısı: commonMain, androidMain, iosMain” dersinde ne öğreneceğim?

Kaynak kümesi hiyerarşisini ve kodun hedefler arasında nasıl paylaşıldığını anlayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“KMP Proje Yapısı: commonMain, androidMain, iosMain” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. KMP Proje Yapısı: commonMain, androidMain, iosMain
  2. Platform API'leri için expect/actual Mekanizması
  3. Repository ve Use Case Katmanlarını Paylaşma
  4. KMP'de Koin ile Bağımlılık Enjeksiyonu
← Kotlin Academy Sayfasına Dön