Gradle derlemesine genel bakış

Android uygulamaları genellikle Gradle derleme sistemi kullanılarak derlenir. Derlemenizi yapılandırmayla ilgili ayrıntılara geçmeden önce, sistemi bir bütün olarak görebilmeniz için derlemenin temelindeki 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şlerini çıkışlara dönüştüren komutları kapsar. Eklentiler, görevleri ve yapılandırmalarını tanımlar. Bir eklentiyi derlemenize uygulamak, eklentinin görevlerini kaydeder ve giriş ve çıkışlarını kullanarak bunları birbirine bağlar. Örneğin, derleme dosyanıza Android Gradle Eklentisi'ni (AGP) uygulamak, APK veya Android kitaplığı oluşturmak için gereken tüm görevleri kaydeder. java-library eklentisi, Java kaynak kodundan jar dosyası 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 eklentisinin amacı AGP veya java-library gibi mevcut eklentilere protobuf desteği eklemektir.

Gradle, yapılandırma yerine kuralı tercih eder. Bu nedenle, eklentiler iyi varsayılan değerlerle birlikte gelir ancak beyanı Alana Özel Dil (DSL) aracılığıyla derlemeyi daha da yapılandırabilirsiniz. DSL, nasıl oluşturacağınız yerine ne oluşturacağınızı belirtebilmeniz için tasarlanmıştır. "Nasıl" kısmını eklentilerdeki mantık yönetir. Bu yapılandırma, projenizde (ve alt projelerde) çeşitli derleme dosyalarında belirtilir.

Görev girişleri, Java türleri (tam sayı, dize veya özel sınıflar) olarak kodlanmış diğer bilgilerin yanı sıra dosya ve dizin olabilir. Çıktılar, diske yazılmaları gerektiğinden yalnızca dizin veya dosya olabilir. Bir görev çıkışını başka bir görev girişine bağlamak, görevleri birbirine bağlayarak birinin diğerinden önce çalıştırılması gerektiğini belirtir.

Gradle, derleme dosyalarınıza rastgele kod ve görev beyanları yazmayı desteklese de bu, araç takımlarının derlemenizi anlamasını ve sizin bakım yapmanızı zorlaştırabilir. Örneğin, eklentilerdeki kod için test yazabilirsiniz ancak derleme dosyalarında kod için test yazamazsınız. Bunun yerine, derleme mantığını ve görev beyanlarını, sizin veya başka birinin tanımladığı eklentilerle kısıtlamanız ve bu mantığı derleme dosyalarınızda nasıl kullanmak istediğinizi belirtmeniz gerekir.

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

Gradle derlemeleri üç aşamada çalışır. Bu aşamaların her biri, derleme dosyalarınızda tanımladığınız farklı kod parçalarını yürütür.

  • Başlatma, derlemeye hangi projelerin ve alt projelerin dahil edileceğini belirler ve derleme dosyalarınızı ve uygulanan eklentilerinizi içeren sınıf yollarını oluşturur. Bu aşamada, derlenecek projeleri ve eklentilerin ve kitaplıkların alınacağı konumları belirttiğ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 üzere derleme dosyasını yürütür. Yapılandırma kodunuzun, yürütülme sırasında oluşturulan verilere veya dosyalara erişemeyeceğini anlamanız önemlidir.
  • Yürütme, uygulamanızın gerçek "derlemesini" gerçekleştirir. Yapılandırmanın çıktısı, kullanıcı tarafından istenen tüm gerekli derleme adımlarını (komut satırında veya derleme dosyalarında varsayılan olarak sağlanan görevler) temsil eden bir görev yönlü düz ağacı (DAG) olur. Bu grafik, görevler arasındaki ilişkiyi (görev beyanında açıkça belirtilmiş veya giriş ve çıkışlarına göre) temsil eder. Bir görevin girişi başka bir görevin çıkışıysa bu görev diğer görevden sonra çalışmalıdır. Bu aşamada, güncel olmayan görevler grafikte tanımlanan sırada çalıştırılır. Bir görevin girişleri son çalıştırmasından bu yana değişmediyse Gradle bu görevi atlar.

Daha fazla bilgi için Gradle Derleme yaşam döngüsü başlıklı makaleyi inceleyin.

Yapılandırma DSL'leri

Gradle, derlemeleri yapılandırmak için Alana Özgü Dil (DSL) kullanır. Bu açıklayıcı yaklaşım, adım adım (zorunlu) talimatlar yazmak yerine verilerinizi belirtmeye odaklanır. Derleme dosyalarınızı Kotlin veya Groovy kullanarak yazabilirsiniz ancak Kotlin kullanmanızı önemle tavsiye ederiz.

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

Örneğin, derlemenizin Android bölümünü yapılandırırken aşağıdaki gibi bir yapı kullanabilirsiniz:

Kotlin

android {
    namespace = "com.example.app"
    compileSdk = 34
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 34
        // ...
    }
}

Groovy

android {
    namespace 'com.example.myapplication'
    compileSdk 34
    // ...

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        // ...
    }
}

DSL kodu, arka planda aşağıdakine benzer:

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

interface ApplicationExtension {
    var compileSdk: Int
    var namespace: String?

    val defaultConfig: DefaultConfig

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

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

Harici bağımlılıklar

Maven derleme sistemi, bağımlılık spesifikasyonu, depolama ve yönetim sistemi tanıttı. Kitaplıklar, sürümleri ve diğer kitaplıklara olan bağımlılıkları da dahil olmak üzere meta verilerle birlikte depolama alanlarında (sunucular veya dizinler) depolanır. Hangi depoların aranacağını ve kullanmak istediğiniz bağımlılıkların sürümlerini belirtirsiniz. Derleme sistemi, derleme sırasında bunları indirir.

Maven yapıları, grup adı (şirket, geliştirici vb.), yapı adı (kütüphanenin adı) ve bu yapının 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 depoların genellikle "Maven depoları" olarak adlandırıldığını duyarsınız ancak bu, yapıları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ınlayabilir). Herkese açık depolar, herkesin kullanabileceği paylaşımlara olanak tanır. Şirket depoları ise dahili bağımlılıkları şirket içinde tutar.

Projenizi alt projelere (Android Studio'da "modüller" olarak da bilinir) modüler hale getirebilirsiniz. Bu alt projeler, bağımlılık olarak da kullanılabilir. Her alt proje, alt projeler veya üst düzey projeniz tarafından kullanılabilecek çıkışlar (ör. jar dosyaları) oluşturur. Bu, hangi parçaların yeniden derlenmesi gerektiğini ayırarak derleme süresini kısaltabilir ve uygulamadaki sorumlulukları daha iyi ayırabilir.

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

Derleme varyantları

Android uygulaması oluştururken genellikle birden fazla varyant oluşturmak istersiniz. Varyantlar farklı kod içerir veya farklı seçeneklerle oluşturulur ve derleme türleri ile ürün türlerinden oluşur.

Derleme türleri, belirtilen derleme seçeneklerine göre değişiklik gösterir. AGP varsayılan olarak "sürüm" ve "hata ayıklama" derleme türlerini oluşturur ancak bunları düzenleyebilir ve daha fazlasını ekleyebilirsiniz (ör. hazırlık veya dahili test için).

Hata ayıklama derlemesi, uygulamanızı küçültmez veya karartmaz. Böylece derlemeyi hızlandırır ve tüm simgeleri olduğu gibi korur. Ayrıca uygulamayı "hata ayıklanabilir" olarak işaretleyerek genel bir hata ayıklama anahtarıyla imzalar ve cihazdaki yüklü uygulama dosyalarına erişimi etkinleştirir. Bu sayede, uygulama çalışırken dosya ve veritabanlarındaki kayıtlı verileri keşfedebilirsiniz.

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

Ürün varyantlarını kullanarak uygulama için dahil edilen kaynağı ve bağımlı varyantları değiştirebilirsiniz. Örneğin, uygulamanız için "demo" ve "tam" veya "ücretsiz" ve "ücretli" sürümler oluşturabilirsiniz. Ortak kaynağınızı "ana" bir kaynak grubu dizinine yazar ve kaynağı, lezzetin adıyla adlandırılmış bir kaynak grubuna geçersiz kılar veya eklersiniz.

AGP, her derleme türü ve ürün çeşidi kombinasyonu için varyantlar oluşturur. Lezzetleri tanımlamazsanız varyantlar, derleme türlerinden sonra adlandırılır. Her ikisini de tanımlarsanız varyantın adı <flavor><Buildtype> olur. Örneğin, release ve debug derleme türleri ve demo ve full lezzetleri ile AGP aşağıdaki varyantları oluşturur:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

Sonraki adımlar

Derleme kavramlarını gördükten sonra projenizdeki Android derleme yapısına göz atın.