Android Studio'da Gradle nasıl yapılandırılır ve bağımlılıklar doğru şekilde nasıl yönetilir
Kısa cevap: Gradle, kök dosyalar (settings.gradle, build.gradle veya build.gradle.kts, gradle.properties) ve modül düzeyindeki build.gradle dosyaları aracılığıyla yapılandırılır; bunlarda eklentiler, android{} bloğu (compileSdk, defaultConfig), buildTypes ve productFlavors tanımlanır, bağımlılıklar ise dependencies bloğunda belirtilir; sürüm yönetimini tek bir kaynağa taşımak (version catalog, buildSrc veya constants) daha iyidir.
Projedeki Gradle yapısı ve her dosyanın sorumluluğu
- settings.gradle / settings.gradle.kts — modüllerin eklenmesi, pluginManagement ve dependencyResolutionManagement.
- Kök build.gradle — depolar, eklenti ayarları, ortak betikler (eski şemalar için bazen classpath).
- gradle.properties — performans bayrakları ve kullanıcı tanımlı özellikler (API_URL vb.).
- Modül düzeyindeki build.gradle (app) — eklentiler, android{}, buildTypes, productFlavors, dependencies.
Modülde minimal bir android bloğu örneği:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' }
android {
namespace "com.example.app"
compileSdk 34
defaultConfig {
applicationId "com.example.app"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
}
Proje büyükse modülerlik uygulayın (feature/core/library) ve tek bir sürüm kaynağı kullanın (libs.versions.toml veya buildSrc).
buildTypes, productFlavors ve derleme varyantlarının pratik yapılandırması
- buildTypes: genellikle debug ve release. Debug'da debuggable etkinleştirin, minify devre dışı bırakın; release'de minify etkinleştirin ve proguard/consumer-rules kullanın.
- productFlavors: ortamlar (dev/prod), sürümler (free/paid) veya pazarlar için kullanılır. flavorDimensions mutlaka tanımlayın.
Kombinasyon örneği:
android {
flavorDimensions "env"
productFlavors {
dev { dimension "env"; applicationIdSuffix ".dev"; buildConfigField "String","BASE_URL","\"https://dev.api\""}
prod { dimension "env"; buildConfigField "String","BASE_URL","\"https://api\""}
}
buildTypes {
debug { applicationIdSuffix ".debug"; versionNameSuffix "-debug" }
release { minifyEnabled true; proguardFiles(getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro') }
}
}
Gradle devDebug, devRelease, prodDebug, prodRelease oluşturacaktır.
CI için belirli varyantlara göre artefakt üretmek uygundur: ./gradlew assembleProdRelease veya assembleDevDebug.
Bağımlılık ve sürüm yönetimi — en iyi uygulamalar
- Konfigürasyonları kullanın: implementation, api (yalnızca bağımlılıkları "geçirmek" gerekiyorsa), compileOnly, runtimeOnly, testImplementation, androidTestImplementation.
- Kütüphane modüllerinde api kullanımından kaçının — bu, bağlamayı ve derleme süresini artırır.
- Sürümleri merkezi hale getirin: version catalog (gradle/libs.versions.toml) — modern ve önerilen yöntem; alternatifler — buildSrc veya ayrı bir dependencies.gradle dosyası.
Version Catalog kullanım örneği:
# gradle/libs.versions.toml
[versions]
core = "1.13.1"
[libraries]
androidx-core = { group="androidx.core", name="core-ktx", version.ref="core" }
Modülde: implementation libs.androidx.core
Yerel modüllerle çalışma
- Dahili modüller için implementation project(":core") kullanın. Genel API'ler için api project(":ui-common") dikkatli şekilde kullanın.
- Sürüm uyumluluğunu koruyun ve CI'da dependencyUpdates (eklenti) çalıştırın.
Sürümleri birçok modüle dağıtmayın — bu çoğunlukla çakışmalara ve zor okunan derleme hatalarına yol açar.
Derleme süresi optimizasyonu (temel adımlar)
- gradle.properties içinde şunları etkinleştirin: org.gradle.jvmargs=-Xmx4096m, org.gradle.daemon=true, org.gradle.parallel=true.
- Önbellekleme kullanın: build cache ve configuration cache (eklenti uyumluluğunu kontrol edin).
- kapt/annotation processor sayısını minimize edin veya testler için devre dışı bırakın.
- Projeyi modüllere ayırın, böylece yeniden derleme daha az kodu etkiler.
Sık yapılan hatalar
- Yanlış yapılandırılmış flavorDimensions — "All flavors must now belong to a flavor dimension" hatasına yol açar.
- implementation ile yetinebilecek yerde api kullanımı — modül bağlamasını artırır.
- Kütüphane sürümlerinin modüllere dağıtılması — runtime/compile çakışmaları ortaya çıkar.
- Doğru proguard-rules olmadan minify etkinleştirilmesi — obfuscation uygulamanın çalışmasını bozar.
SSS
- gradle.properties içindeki değişkenleri build.gradle'da nasıl kullanırım?
- Kotlin DSL'de: val apiUrl: String = project.findProperty("API_URL") as String; Groovy'de: project.property("API_URL").
- Hangisi daha iyi — libs.versions.toml mi yoksa buildSrc mi?
- libs.versions.toml daha basittir ve resmi olarak desteklenir; buildSrc esneklik sağlar (Kotlin), ancak derlemeyi karmaşıklaştırır.
- Tüm buildVariants listesini hızlıca nasıl görebilirim?
- Android Studio'da: View -> Tool Windows -> Build Variants; konsolda ./gradlew tasks --all çalıştırın ve assemble
arayın.
- Android Studio'da: View -> Tool Windows -> Build Variants; konsolda ./gradlew tasks --all çalıştırın ve assemble
Gerekirse hazır build.gradle.kts şablonları, proguard-rules örnekleri veya belirli varyantların derlenmesi için CI adımları ekleyebilirim.