Gradle derlemesine genel bakış

Android uygulamaları genellikle Gradle derleme sistemi kullanılarak oluşturulur. Derlemenizi nasıl yapılandıracağınızın ayrıntılarına girmeden ö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öreve dayalı 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. Derlemenize bir eklenti uyguladığınızda eklentinin görevleri kaydedilir ve girişleri ile çıkışları kullanılarak birbirine bağlanır. Ö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 oluşturmanıza olanak tanır. Kotlin ve diğer diller için benzer eklentiler vardır 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 kullanıma hazır iyi varsayılan değerlerle birlikte gelir ancak derlemeyi, açıklayıcı bir alana özgü dil (DSL) aracılığıyla daha ayrıntılı şekilde yapılandırabilirsiniz. DSL, nasıl oluşturacağınızı değil, ne oluşturacağınızı belirtebileceğiniz şekilde tasarlanmıştır. Eklentilerdeki mantık, "nasıl" sorusunu yönetir. Bu yapılandırma, projenizdeki (ve alt projelerinizdeki) birkaç derleme dosyasında belirtilir.

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

Gradle, derleme dosyalarınızda 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 kodlar için test yazabilirsiniz ancak derleme dosyalarındaki kodlar için yazamazsınız. Bunun yerine, derleme mantığını ve görev bildirimlerini eklentilerle (sizin veya başkasının tanımladığı) sınırlamanı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 kodun farklı bölümlerini 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ı ayarlar. Bu aşamada, derlenecek projeleri ve eklentiler ile kitaplıkların alınacağı konumları bildirdiğiniz bir ayar 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 üretilen verilere veya dosyalara erişemeyeceğini bilmeniz önemlidir.
  • Yürütme, uygulamanızın gerçek "derleme" işlemini gerçekleştirir. Yapılandırmanın çıkışı, 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 görevlerin yönlendirilmiş asiklik grafiğidir (DAG). Bu grafik, görevler arasındaki ilişkiyi temsil eder. Bu ilişki, bir görevin bildiriminde açıkça belirtilir veya giriş ve çıkışlarına dayalıdır. 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, güncel olmayan görevleri grafikte tanımlanan sırayla çalıştırır. Bir görevin girişleri son yürütülmesinden bu yana değişmediyse Gradle bu görevi atlar.

Daha fazla bilgi için Gradle Derleme yaşam döngüsü bölümüne bakın.

Yapılandırma DSL'leri

Gradle, derlemeleri yapılandırmak için alana özgü bir 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 dahil herkesin bir projeye katkıda bulunmasını kolaylaştırmaya çalışır. 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 şöyle 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)
        }
        // ...
    }
}

Modern

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

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

Arka planda 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 lambda alan bir işlev ve erişmek için aynı ada sahip bir özellik ile temsil edilir. Bu sayede, derleme dosyalarınızdaki kodlar 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 sistemi sunar. Kitaplıklar, sürümleri ve diğer kitaplıklara bağımlılıkları gibi meta verilerle birlikte depolarda (sunucular veya dizinler) saklanı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ı (kitaplığın adı) ve bu yapının sürümüyle 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 genellikle "Maven depoları" olarak adlandırılır 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ın yapabilir). Herkese açık depolar, herkesin kullanabileceği şekilde paylaşım yapılmasına 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. Bunlar bağımlılık olarak da kullanılabilir. Her alt proje, alt projeler veya üst düzey projeniz tarafından kullanılabilecek çıktılar (ör. jar dosyaları) üretir. Bu sayede, yeniden oluşturulması gereken parçalar izole edilerek derleme süresi kısaltılabilir ve uygulamadaki sorumluluklar daha iyi ayrılabilir.

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 değişkenleri

Bir 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 türlerinden oluşur.

Derleme türleri, bildirilen derleme seçeneklerini değiştirir. AGP varsayılan olarak "sürüm" ve "hata ayıklama" derleme türlerini ayarlar ancak bunları düzenleyebilir ve daha fazlasını ekleyebilirsiniz (ör. hazırlık veya dahili test için).

Hata ayıklama derlemesi, uygulamanızı sadeleştirmez veya kodunu gizlemez. Bu sayede derleme işlemi hızlanır ve tüm simgeler olduğu gibi korunur. Ayrıca uygulamayı "hata ayıklanabilir" olarak işaretler, genel bir hata ayıklama anahtarıyla imzalar ve cihazdaki yüklü uygulama dosyalarına erişimi etkinleştirir. Bu sayede, uygulama çalışırken dosyalara ve veritabanlarına kaydedilen verileri inceleyebilirsiniz.

Yayınlanan derleme, uygulamayı optimize eder, yayın anahtarınızla imzalar ve yüklü uygulama dosyalarını korur.

Ürün türlerini kullanarak uygulamanın dahil edilen kaynak ve bağımlılık varyantlarını değiştirebilirsiniz. Örneğin, uygulamanız için "demo" ve "tam" varyantlar veya "ücretsiz" ve "ücretli" varyantlar oluşturmak isteyebilirsiniz. Ortak kaynağınızı "main" kaynak grubu dizinine yazarsınız ve varyantın adını taşıyan bir kaynak grubunda kaynağı geçersiz kılar veya kaynak eklersiniz.

AGP, her derleme türü ve ürün türü kombinasyonu için varyantlar oluşturur. Varyantlar, varyantları tanımlamazsanız 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 varyantları için AGP şu 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.