Gradle derlemesine genel bakış

Android uygulamaları genellikle Gradle derleme sistemi kullanılarak oluşturulur. Derlemenizi yapılandırma ayrıntılarına geçmeden önce, sistemi bir bütün olarak görebilmeniz için derlemenin arkasındaki kavramları inceleyeceğiz.

Derleme nedir?

Derleme sistemi, kaynak kodunuzu yürütülebilir bir uygulamaya dönüştürür. Derlemeler genellikle uygulamanızı veya kitaplığınızı analiz etmek, derlemek, bağlamak ve paketlemek için birden fazla araç içerir. Gradle, bu komutları düzenlemek ve çalıştırmak için görev tabanlı bir yaklaşım kullanır.

Görevler, girişleri çıkışlara çeviren komutları kapsar. Eklentiler, görevleri ve yapılandırmalarını tanımlar. Derlemenize bir eklenti uyguladığınızda eklentinin görevleri kaydedilir ve giriş ile çıkışları kullanılarak birbirine bağlanır. Örneğin, derleme dosyanıza Android Gradle Eklentisi'ni (AGP) uyguladığınızda APK veya Android kitaplığı oluşturmak için gereken tüm görevler kaydedilir. java-library eklentisi, Java kaynak kodundan jar oluşturmanıza olanak tanır. Kotlin ve diğer diller için benzer eklentiler mevcuttur ancak diğer eklentiler, eklentileri genişletmek için tasarlanmıştır. Örneğin, protobuf eklentisi, AGP veya java-library gibi mevcut eklentilere protobuf desteği eklemek için tasarlanmıştır.

Gradle, yapılandırma yerine kuralı tercih eder. Bu nedenle eklentiler, kutudan çıkarıldığında iyi varsayılan değerlerle birlikte gelir ancak derlemeyi bildirim temelli bir alana özgü dil (DSL) aracılığıyla daha da yapılandırabilirsiniz. DSL, nasıl oluşturulacağını değil, ne oluşturulacağını belirtebileceğiniz şekilde tasarlanmıştır. Eklentilerdeki mantık, "nasıl" sorusunun cevabını yönetir. Bu yapılandırma, projenizdeki (ve alt projelerdeki) çeşitli derleme dosyalarında belirtilir.

Görev girişleri, dosyalar ve dizinlerin yanı sıra Java türleri (tam sayı, dizeler veya özel sınıflar) olarak kodlanmış diğer bilgiler olabilir. Çıktılar yalnızca dizin veya dosya olabilir. Çünkü diske yazılmaları gerekir. Bir görev çıkışını başka bir görev girişine bağlamak, görevleri birbirine bağlar. Böylece biri diğerinden önce çalıştırılmalıdır.

Gradle, derleme dosyalarınıza rastgele kod ve görev bildirimleri yazmayı desteklese de bu durum, araçların derlemenizi anlamasını ve sizin de derlemenizi sürdürmenizi zorlaştırabilir. Örneğin, eklentilerdeki kod için testler yazabilirsiniz ancak derleme dosyalarındaki kod için yazamazsınız. Bunun yerine, derleme mantığını ve görev bildirimlerini (sizin veya başka birinin tanımladığı) eklentilerle kısıtlamalı ve bu mantığı derleme dosyalarınızda nasıl kullanmak istediğinizi bildirmelisiniz.

Gradle derlemesi çalıştırıldığında ne olur?

Gradle derlemeleri üç aşamada çalışır. Bu aşamaların her birinde, derleme dosyalarınızda tanımladığınız kodun farklı bölümleri yürütülür.

  • Başlatma, derlemeye hangi projelerin ve alt projelerin dahil edileceğini belirler, derleme dosyalarınızı ve uygulanan eklentileri içeren sınıf yollarını ayarlar. Bu aşamada, oluşturulacak projeleri ve eklentiler ile kitaplıkların getirileceği konumları bildirdiğiniz bir ayarlar dosyasına odaklanılır.
  • Yapılandırma, her proje için görevleri kaydeder ve kullanıcının derleme spesifikasyonunu uygulamak için derleme dosyasını yürütür. Yapılandırma kodunuzun, yürütme sırasında oluşturulan verilere veya dosyalara erişemeyeceğini anlamanız önemlidir.
  • Execution (Yürütme), uygulamanızın gerçek "derleme" işlemini gerçekleştirir. Yapılandırmanın çıktısı, kullanıcının istediği tüm gerekli derleme adımlarını (komut satırında sağlanan veya derleme dosyalarındaki varsayılan görevler) temsil eden bir Yönlü Düz Ağaç (DAG) görevleridir. Bu grafik, görevler arasındaki ilişkiyi gösterir. Bu ilişki, görev bildiriminde açıkça belirtilmiş veya görevlerin giriş ve çıkışlarına göre belirlenmiş olabilir. Bir görevin girişi başka bir görevin çıkışıysa bu görev, diğer görevden sonra çalıştırılmalıdır. Bu aşama, grafikte tanımlanan sırayla güncel olmayan görevleri çalıştırır. Bir görevin girişleri son çalıştırılmasından bu yana değişmediyse Gradle bu görevi atlar.

Daha fazla bilgi için Gradle Build lifecycle (Derleme yaşam döngüsü) konusuna bakın.

Yapılandırma DSL'leri

Gradle, derlemeleri yapılandırmak için alana özgü bir dil (DSL) kullanır. Bu bildirimsel yaklaşımda, adım adım (zorunlu) talimatlar yazmak yerine verilerinizi belirtmeye odaklanılır. Derleme dosyalarınızı Kotlin veya Groovy kullanarak yazabilirsiniz ancak Kotlin kullanmanızı önemle tavsiye ederiz.

DS'ler, alan uzmanlarının ve programcıların projeye katkıda bulunmasını kolaylaştırmak için verileri daha doğal bir şekilde temsil eden küçük bir dil tanımlar. Gradle eklentileri, görevleri için ihtiyaç duydukları verileri yapılandırmak üzere DSL'yi genişletebilir.

Örneğin, derlemenizin Android bölümünü yapılandırmak şu şekilde görünebilir:

Kotlin

android {
    namespace = "com.example.app"
    compileSdk {
        version = release(36) {
            minorApiLevel = 1
        }
    }
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk {
            version = release(23)
        }
        targetSdk {
            version = release(36)
        }
        // ...
    }
}

Groovy

android {
    namespace = 'com.example.app'
    compileSdk {
        version = release(36) {
            minorApiLevel = 1
        }
    }
    // ...

    defaultConfig {
        applicationId = 'com.example.app'
        minSdk {
            version = release(23)
        }
        targetSdk {
            version = release(36)
        }
        // ...
    }
}

Kamera arkasında DSL kodu şuna benzer:

fun Project.android(configure: ApplicationExtension.() -> Unit) {
    ...
}

interface ApplicationExtension {
    var namespace: String?

    fun compileSdk(configure: CompileSdkSpec.() -> Unit) {
        ...
    }

    val defaultConfig: DefaultConfig

    fun defaultConfig(configure: DefaultConfig.() -> Unit) {
        ...
    }
}

DSL'deki her blok, yapılandırmak için bir lambda alan bir işlev ve erişmek için aynı ada sahip bir özellik ile temsil edilir. Bu sayede derleme dosyalarınızdaki kod, daha çok bir veri spesifikasyonu gibi görünür.

Harici bağımlılıklar

Maven derleme sistemi, bağımlılık spesifikasyonu, depolama ve yönetim sistemini kullanıma sundu. Kitaplıklar, depolarda (sunucular veya dizinler) depolanır. Bu depolarda, kitaplıkların sürümü ve diğer kitaplıklara olan bağımlılıkları gibi meta veriler bulunur. Hangi depoların aranacağını, kullanmak istediğiniz bağımlılıkların sürümlerini belirtirsiniz ve derleme sistemi, derleme sırasında bunları indirir.

Maven Artifact'leri grup adına (şirket, geliştirici vb.), artifact adına (kitaplığın adı) ve artifact'in sürümüne göre tanımlanır. Bu genellikle group:artifact:version olarak gösterilir.

Bu yaklaşım, derleme yönetimini önemli ölçüde iyileştirir. Bu tür depolara genellikle "Maven depoları" denir ancak bu, tamamen yapıtların paketlenme ve yayınlanma şekliyle ilgilidir. Bu depolar ve meta veriler, Gradle dahil olmak üzere çeşitli derleme sistemlerinde yeniden kullanılmıştır (Gradle, bu depolarda yayınlama yapabilir). Herkese açık depolar, herkesin kullanması için paylaşmaya olanak tanır. Şirket depoları ise dahili bağımlılıkları şirket içinde tutar.

Projenizi modülerleştirerek alt projelere (Android Studio'da "modüller" olarak da bilinir) ayırabilirsiniz. Bu alt projeler bağımlılık olarak da kullanılabilir. Her alt proje, alt projeler veya üst düzey projeniz tarafından kullanılabilen çıktılar (ör. JAR dosyaları) üretir. Bu, hangi bölümlerin yeniden oluşturulması gerektiğini belirleyerek derleme süresini kısaltabilir ve uygulamadaki sorumlulukları daha iyi ayırabilir.

Bağımlılıkların nasıl belirtileceği hakkında daha ayrıntılı bilgiyi Derleme bağımlılıkları ekleme bölümünde bulabilirsiniz.

Derleme varyantları

Android uygulaması oluşturduğunuzda genellikle birden fazla varyant oluşturmak istersiniz. Varyantlar farklı kodlar içerir veya farklı seçeneklerle oluşturulur ve derleme türleri ile ürün çeşitlerinden oluşur.

Derleme türleri, bildirilen derleme seçeneklerine göre değişir. AGP, varsayılan olarak "release" ve "debug" derleme türlerini ayarlar ancak bunları düzenleyebilir ve daha fazla derleme türü ekleyebilirsiniz (ör. hazırlama veya dahili test için).

Hata ayıklama derlemesi, uygulamanızı küçültmez veya karartmaz. Bu sayede uygulamanın derlenmesi hızlanır ve tüm semboller olduğu gibi korunur. Ayrıca, uygulamayı genel bir hata ayıklama anahtarıyla imzalayarak ve cihazda yüklü uygulama dosyalarına erişimi etkinleştirerek "hata ayıklanabilir" olarak işaretler. Bu sayede, uygulama çalışırken dosyalardaki ve veritabanlarındaki kayıtlı verileri keşfetmek mümkün olur.

Sürüm derlemesi, uygulamayı optimize eder, sürüm anahtarınızla imzalar ve yüklenen uygulama dosyalarını korur.

Ürün çeşitlerini kullanarak uygulamaya dahil edilen kaynağı ve bağımlılık varyantlarını değiştirebilirsiniz. Örneğin, uygulamanız için "demo" ve "tam" sürümler veya "ücretsiz" ve "ücretli" sürümler oluşturmak isteyebilirsiniz. Ortak kaynağınızı "ana" kaynak grubu dizinine yazarsınız ve kaynağı, lezzete göre adlandırılmış bir kaynak grubunda geçersiz kılar veya ekleyebilirsiniz.

AGP, derleme türü ve ürün aroması kombinasyonlarının her biri için varyantlar oluşturur. Lezzetleri tanımlamazsanız varyantlar derleme türlerine göre adlandırılır. Her ikisini de tanımlarsanız varyant <flavor><Buildtype> olarak adlandırılır. Örneğin, release ve debug derleme türleri ile demo ve full aromalarıyla AGP, aşağıdaki varyantları oluşturur:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

Sonraki adımlar

Derleme kavramlarını öğrendiğinize göre projenizdeki Android derleme yapısına göz atın.