Araç ve kitaplık arasındaki bağımlılık ilişkileri

Derleme bağımlılıkları, projenizi başarılı bir şekilde derlemek için gereken harici bileşenlerdir. Derleme; kitaplıklar, eklentiler, alt projeler, Android SDK'sı, Kotlin ve Java derleyicileri gibi araçlara, Android Studio gibi geliştirme ortamlarına ve Gradle'a bağlı olabilir.

Her bağımlılık başka bağımlılıklar gerektirebilir. Bunlara geçişli bağımlılıklar denir ve uygulamanızın kullandığı genel bağımlılıkları hızla artırabilir. Kitaplık, araç veya Android SDK'sı gibi bir bağımlılığı yükseltmek istediğinizde bu yükseltme, diğer birçok bağımlılığı da yükselterek zincirleme bir etki yaratabilir.

Birçok kitaplık Anlamsal Sürümleme olarak bilinen bir şemayı kullandığından bu genellikle sorun oluşturmaz. Bu kitaplıklar, alt sürümleriyle uyumluluk sağlamak için yaptıkları değişikliklerin türlerini kısıtlar.

Anlamsal sürüm oluşturma, major.minor.patch biçimini kullanır. Örneğin, 4.8.3 sürümünde 4, major, 8, minor, 3 ise patch numarasıdır. major bölümü değiştiğinde, kitaplık API'de veya davranışta yıkıcı değişiklikler yapabilir. Bu, derleme veya uygulama davranışınızı etkileyebilir.

minor (yeni özellikler) veya patch (hata düzeltmeleri) parçaları değiştiğinde, kitaplık geliştiricileri, kitaplığın hâlâ uyumlu olduğunu ve uygulamanızı etkilememesi gerektiğini belirtir.

Bu tür değişiklikleri izlemek önemlidir. Bu konuda size yardımcı olabilecek çeşitli bağımlılık yükseltme araçları vardır.

Derlemenizdeki ilişkiler

Android derlemeleri aşağıdakiler arasında ilişkiler içerir:

  • Kaynak kod: Kontrol sahibi olduğunuz kod ve kaynaklar
  • Kitaplık bağımlılıkları: Projenizi ve alt projelerinizi oluştururken yer alan harici kitaplık veya modüller
  • Araçlar: kaynağınızı bir uygulamaya veya kitaplığa çeviren derleyiciler, eklentiler ve SDK'lar
Bağımlılıklar ve bunların ilişkileri oluşturma
Şekil 1. İlişkiler kurun

Kaynak kodu

Kaynak kodunuz, uygulamanızda veya kitaplığınızda yazdığınız Kotlin ya da Java kodudur. (C++ kullanma hakkında ayrıntılı bilgi için Android NDK başlıklı makaleyi inceleyin.)

Kaynak kod, kitaplıklara (Kotlin ve Java çalışma zamanı kitaplıkları dahil) ve Android SDK'sına bağlıdır ve ilgili Kotlin veya Java derleyicisini gerektirir.

Bazı kaynak kodlarında ek işlem gerektiren ek açıklamalar yer alır. Örneğin, Jetpack Compose kodu yazıyorsanız Compose Kotlin derleyici eklentisi tarafından işlenmesi gereken @Composable gibi ek açıklamalar eklersiniz. Diğer ek açıklamalar, bir Kotlin Sembolü İşlemci (KSP) veya ayrı ek açıklama işleme araçları tarafından işlenebilir.

Kitaplık bağımlılıkları

Kitaplıklar, uygulamanızın bir parçası olarak alınan bayt kodu içerir. Bu, Java JAR, Android kitaplığı (AAR) veya derlemenizdeki bir alt proje olabilir. Birçok kitaplık semantik sürümleme kullanır. Bu, yükseltme yapıldığında hangi kitaplıkların uyumlu kalacağını (veya kalacağını) anlamanıza yardımcı olabilir.

Kitaplıklar yeniden kullanım için geçişli bağımlılık olarak adlandırılan başka kitaplıklardan yararlanabilir. Bu sayede, açıkça yönetmeniz gereken bağımlılıkları azaltmış olursunuz. Doğrudan kullandığınız bağımlılıkları belirtirsiniz ve Gradle bunları geçişli bağımlılıklarla birlikte getirir. Doğrudan bağımlılıklarınızı yükselttikçe bu geçişli bağımlılıkların da artabileceğini unutmayın.

Bazen bir kitaplık, çalışma zamanında (minSdk) veya derleme zamanında (compileSdk) Android SDK'nın minimum sürümlerini gerektirebilir. Bu, kitaplık Android SDK'sına veya sağlanan JDK API'lerine ait işlevler kullandığında gereklidir. Uygulamanızın etkili minSdk değeri, uygulamanız ve tüm doğrudan ve geçişli kitaplık bağımlılıkları tarafından istenen en yüksek minSdk değerine sahip.

Bazı kitaplıkların kullanılması için belirli bir Gradle eklentisinin kullanılması gerekebilir. Bu yardımcı eklentiler genellikle, kitaplık özelliklerini kullanımınızı desteklemek için kod oluşturan veya kaynağınızın derlemesini değiştiren Kotlin Sembol İşlemcilerini veya diğer ek açıklama işlemcilerini yükler. Örneğin, Jetpack Room, bir veritabanındaki verileri almak ve değiştirmek için notlar ve bunları oluşturulan koda dönüştüren bir KSP içerir. Jetpack Compose, Compose derleyici eklentisinin, işlevin nasıl ve ne zaman yeniden çalıştırılacağını yönetmek için ek açıklamalı işlevleri değiştirmesini gerektirir.

Araçlar

Gradle

Gradle, derleme dosyalarınızı okuyan ve uygulamanızı veya kitaplığınızı oluşturan derleme aracıdır. Ayrıca, eklentilerin yeteneklerini genişletecek bir API sunar. Gradle, bir veya daha fazla Java sanal makinesinde birden çok işlem çalıştırır ve Java eklentileri, JDK'nın içindeki Java araçlarını çağırır.

Gradle eklentileri

Gradle eklentileri, yeni görevler ve yapılandırma tanımlayarak Gradle'ı genişletir. Derlemenize bir eklenti uygulamak, derleme komut dosyalarınızda veri olarak yapılandırılan belirli derleme özelliklerini etkinleştirir. Android derlemeleri için en önemli Gradle eklentisi Android Gradle Eklentisi'dir (AGP).

Derleyiciler

Kotlin veya Java derleyicisi, kaynak kodunuzu yürütülebilir bayt koduna dönüştürür. Kotlin derleyicisi, harici analiz ve kod oluşturma işlemlerinin doğrudan derleyici içinde çalıştırılmasını ve ayrıştırılmış kod yapısına erişilmesini sağlayan bir eklenti API'si sunar.

Derleyici eklentileri

Derleyici eklentileri, Kotlin derleyicisi kodunuzu analiz ederken Kotlin derleyicisinin içinde analiz ve kod oluşturma işlemi gerçekleştirir ve Gradle eklentilerini derlemeye uyguladığınızda yüklenir.

Android SDK

Android SDK'sı, Android'in belirli bir sürümüne yönelik Android Platformu ve Java API'lerini ve ilgili araçlarını içerir. Bu araçlar SDK'yı yönetmenize, uygulamalarınızı oluşturmanıza ve Android cihazlarla iletişim kurup onları taklit etmenize yardımcı olur.

Android SDK'sının her sürümü, kaynak kodunuzun erişebileceği belirli Java API'leri ve bu API'leri Android'in önceki sürümlerinde kullanmak için şekillendirme desteği sağlar.

JDK

Java kaynak kodunu derlemek ve Java uygulamalarını çalıştırmak için Java kitaplıklarını ve yürütülebilir dosyalarını içeren Java Geliştirme Kiti. Android derlemesinde birkaç JDK kullanılır. Daha fazla bilgi için Android derlemelerindeki Java sürümleri bölümüne bakın.

Gradle kapsamları

Gradle, kitaplık bağımlılıklarını farklı kapsamlara (Gradle API'de yapılandırmalar denir) gruplandırarak derlemenizin farklı bölümlerinde kullanılacak farklı kitaplık bağımlılığı grupları belirtmenizi sağlar. Örneğin, JUnit gibi test kitaplıklarını yayınlanmış uygulamanıza veya kitaplığınıza dahil etmek istemeyebilirsiniz ancak birim testlerinizi oluşturup çalıştırırken bu kitaplıkları kullanmak istersiniz. Ayrıca, kodunuzu analiz etmek için simge veya ek açıklama işleyicileri eklemek üzere kapsamları kullanırsınız.

Örneğin AGP, implementation ve api kapsamlarını tanımlar. Bu kapsam, bir bağımlılığın alt projenizin kullanıcılarına sunulup sunulmayacağını belirtmenizin bir yoludur. Android derlemesinde kullanılan bu ve diğer kapsamların açıklamaları için Bağımlılıkları yapılandırma başlıklı makaleyi inceleyin.

Kitaplık bağımlılıklarını, derleme dosyalarınızın dependencies bloğuna group:artifact:version dizeleri olarak ekleyin:

Kotlin

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation("com.example:library1:1.2.3")
    api("com.example:library2:1.1.1")
}

Eski

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation 'com.example:library1:1.2.3'
    api 'com.example:library2:1.1.1'
}

veya Sürüm Kataloğu'nda:

# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"

[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }

[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }

ve oluşturulan değişkenleri derleme dosyalarınızda belirtin:

Kotlin

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation(libs.example.library)
}

Groovy

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation libs.example.library
}