Gradle Scripts Dosyaları: Android Projelerinde Yapılandırma ve Özelleştirme -Bölüm 1

Beyzanur Akkuzu
5 min readJul 20, 2023

Herkese merhaba, bu yazımda sizlere her bir android projesinin belki de bel kemiği olan Gradle Scripts dosyasındaki yapıları uzun uzun ama anlaşılır bir şekilde ne için kullandığımızı yazmaya çalıştım.

İki makalede yazmış olduğum konunun ilk bölümünde build.gradle ve settings.gradle dosyalarını anlattım. 2. makalemde ise proguard-rules.pro , gradle.properties, gradle-wrapper.properties, local.properties dosyalarını anlattım. 2.makaleme de buradan ulaşabilirsiniz.

Umarım sizler için faydalı bir yazı olmuştur. Görüşlerinizi benimle paylaşmaktan çekinmeyin. Keyifli okumalar.

Gradle scripts dosyaları, Gradle projesinin yapılandırılması için kullanılan özel dosyalardır. Bir Gradle projesi genellikle birden çok modül veya alt proje içerir, ve her bir modülün kendi build.gradle dosyası vardır. Ayrıca, projenin kök dizininde settings.gradle dosyası da bulunur.

Gradle scripts dosyaları, projenin derleme, bağımlılıklar, testler, paketleme ve diğer inşa süreçleriyle ilgili ayarları içerir. Bu dosyalar, Groovy veya Kotlin dilleriyle yazılır ve Gradle DSL (Domain Specific Language) adı verilen özel bir yapıyı kullanır.

build.gradle dosyası, iki farklı seviyede bulunabilir:

  1. Proje düzeyinde build.gradle: Projenin kök dizininde bulunan bu dosya, tüm modüllerin (uygulama modülü, kütüphane modülleri vb.) ortak yapılandırmalarını içerir. Bu dosya, Gradle yapılandırması, Gradle eklentilerinin tanımlanması, Gradle sürümü, proje bağımlılıkları ve diğer yapılandırmalar gibi proje genelinde geçerli olan ayarları içerir.
  2. Modül düzeyinde build.gradle: Her modülün kendi build.gradle dosyası vardır. Bu dosya, ilgili modülün yapılandırmasını içerir. Modül düzeyindeki build.gradle dosyası, modülün bağımlılıkları, derleme ayarları, imzalama yapılandırmaları ve diğer modül özelindeki yapılandırmaları içerir.

Gradle Scripts Dosyalarının Temel Bileşenleri

buildscripts bloğu: Bu blok, proje yapısının derleme işlemlerini ve dış bağımlılıkları yönetmek için kullanılan araçları tanımlar. Örneğin, derleme sürümü, kullanılan eklentiler ve bağımlılıklar bu blokta belirtilir.

plugins bloğu: Projede kullanılan Gradle eklentilerini ve bunların yapılandırmasını belirtir. Örneğin, Android uygulamaları için gerekli olan com.android.application eklentisi veya Kotlin desteği için kotlin eklentisi bu blokta yer alır.

plugins {
id 'com.android.application'
id 'kotlin-android'
}

dependencies bloğu: Bu blok, projenin bağımlılıklarını belirtir. Diğer kütüphanelere veya modüllere olan bağımlılıklar bu blokta tanımlanır. Bağımlılıklar, projenin derlenmesi ve çalışması için gereken harici kütüphaneleri içerir.

dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

android bloğu: Derleme sürümü, uygulama kimliği, derleme tipleri (debug, release), ProGuard kuralları, imza yapılandırmaları ve diğer Android spesifik ayarlar bu blokta yer alır.

android {
namespace "com.xx.android"
compileSdkVersion 33
  • namespace "com.xx.android": Oluşturulan R sınıfının ve diğer kaynakların Java paket adını belirtir.
  • compileSdkVersion 33: Kullanılan SDK sürümünü belirtir.
defaultConfig {
applicationId "com.xx.android"
minSdkVersion 23
targetSdkVersion 33
versionCode 1063
versionName "1.0.6"

multiDexEnabled true
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

buildConfigField("String", "PLAY_STORE_APP_ID", "\"com.xx.android\"")

flavorDimensions "environment"
}

defaultConfig: Bu bölümde uygulama kimliği (applicationId), minimum SDK sürümü (minSdkVersion), hedef SDK sürümü (targetSdkVersion), sürüm kodu (versionCode) ve sürüm adı (versionName) gibi temel yapılandırmalar belirtilmiştir. Ayrıca, multiDexEnabled özelliği çoklu DEX dosyası desteğini etkinleştirir. vectorDrawables.useSupportLibrary özelliği, vektör çizimlerin destek kütüphanesini kullanmasını sağlar. testInstrumentationRunner, enstrümantasyon testlerinin çalıştırılacağı test runner'ı belirtir.

buildConfigField satırı, PLAY_STORE_APP_ID adında bir alan ekler ve değeri "com.xx.android" olarak ayarlar. flavorDimensions boyutu, farklı lezzet boyutlarını belirtir (örneğin, "environment" boyutu).

signingConfigs {
dev {
storeFile file("../config/demoJks")
storePassword 'demo1234'
keyAlias 'key0'
keyPassword 'demo1234'
}
prod {
storeFile file("../config/demoJks")
storePassword 'demo1234'
keyAlias 'key0'
keyPassword 'demo1234'
}
}

signingConfigs: İmzalama yapılandırmalarını tanımlar. dev ve prod adında iki yapılandırma belirtilmiştir. Her bir yapılandırma, ilgili imza dosyası (storeFile), şifreler (storePassword ve keyPassword) ve takma adı (keyAlias) belirler. Bu yapılandırmalar, uygulamanın geliştirme ve üretim sürümlerini farklı şekillerde imzalamak için kullanılır.

buildTypes {
debug {
zipAlignEnabled true
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.prod
}
}

buildTypes: Farklı derleme türlerini (debug, release vb.) belirtir. debug bölümünde zipAlignEnabled özelliği etkinleştirilir. release bölümünde minifyEnabled özelliği ve ProGuard dosyaları belirtilir. Ayrıca, uygulamayı imzalamak için signingConfigs.prod imza yapılandırması kullanılır.

“minifyEnabled” true olarak ayarlandığında, derleme sırasında küçültme işlemini etkinleştirir. Küçültme, derlenmiş kodun boyutunu azaltmak için kullanılan bir optimizasyon tekniğidir. Bu işlemde kullanılmayan kodlar, değişkenler ve fonksiyonlar kaldırılır, isimler kısaltılır ve diğer optimizasyonlar yapılır.( Kullanırken kontrol etmeyi unutmayın :) )

productFlavors {
dev {
applicationId "com.xx.android"
applicationIdSuffix ".dev"
dimension "environment"
resValue "string", "env_name", Dev
manifestPlaceholders = [appLabel: Dev]

buildConfigField 'String', 'BASE_URL', "\"https://\""
}
prod {
applicationId "com.xx.android"
resValue "string", "env_name", Prod
manifestPlaceholders = [appLabel: Prod]

buildConfigField 'String', 'BASE_URL', "\"https://\""
}
}

productFlavors: Farklı ortamları (dev, prod vb.) belirtir. dev ortamı için uygulama kimliği, uygulama kimliği eki, boyutu ve diğer özel yapılandırmalar belirtilir.

appId’leri aynı verip applicationIdSuffix kullanarak, dev mi yoksa prod mu olduğunu ayırmak için kullanabilirsiniz. Bu sayede iki ortamda da çalışma imkanınız olur.

resValue satırı, kaynak dosyalarında kullanılmak üzere env_name adında bir kaynak değeri ekler. manifestPlaceholders satırı, manifest dosyasında kullanılmak üzere appLabel adında bir yer tutucusu ekler.

buildConfigField satırları, BASE_URL ve PROCTOR_BASE_URL adlarında iki alan ekler ve ilgili URL değerlerini belirtir.

packagingOptions {
resources {
excludes += ['META-INF/services/javax.annotation.processing.Processor']
}
}

packagingOptions: Paketleme seçeneklerini belirtir. Bu bölümde, javax.annotation.processing.Processor dosyasının kaynaklardan hariç tutulması sağlanır.

buildFeatures {
viewBinding true
dataBinding true
}

buildFeatures: Derleme özelliklerini etkinleştirir. Bu bölümde, viewBinding ve dataBinding özellikleri etkinleştirilmiştir.

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = '1.8'
}
  • compileOptions: Derleme seçeneklerini belirtir. Kaynak uyumluluğu (sourceCompatibility) ve hedef uyumluluğu (targetCompatibility) Java 8 olarak projeyi açtığımızda default olarak gelir.
  • kotlinOptions: Kotlin derleme seçeneklerini belirtir. Bu bölümde, JVM hedef sürümü 1.8 olarak ayarlanmıştır.

repositories bloğu: Projenin bağımlılıklarının indirileceği depoların tanımlandığı yerdir. setting.gradle dosyası içerisinde yer alır.

pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
  • google(): Bu, Google tarafından sağlanan Maven deposunu ekler. Android Support Library, AndroidX ve diğer Google tarafından sağlanan kütüphanelere erişim sağlar.
  • mavenCentral(): Maven Central deposunu ekler. Maven Central, açık kaynaklı ve üçüncü parti kütüphanelerini barındıran en büyük Maven deposudur.
  • gradlePluginPortal: Gradle projesinde kullanılan eklentilerin ve kütüphanelerin JCenter ve Maven Central gibi depolardan indirilmesini sağlayan özel bir yöntemdir. Bu yöntem, projede kullandığımız Gradle eklentilerini ve kütüphanelerini Gradle Plugin Portal'dan çevrimiçi olarak almak için kullanılır.

Özetleyecek olursak bu bileşenler, Gradle scripts dosyalarının temel yapılarını oluşturuyor. Her bir modülün veya projenin kendi build.gradle dosyası, proje yapılandırmasının belirli bir bölümünü yönetiyor. Bu dosyalardaki ayarlar ve yapılandırmalar, proje derlendiğinde ve inşa edildiğinde kullanılmaktadır.

Yazmış olduğum modül düzeyindeki gradle dosyasına buradan ulaşabilirsiniz.

Devamı 2.makalemde ->

--

--