Bağımlılık çözümleme hatalarını ayıklama

Bağımlılık eklediğinizde, orijinal bağımlılığın gerektirdiği bağımlılıklarla ilgili sorunlar ve farklı bağımlılık sürümleri arasındaki çatışmalarla karşılaşabilirsiniz. Bağımlılık grafiğinizi nasıl analiz edebileceğinizi ve ortaya çıkan yaygın sorunları nasıl giderebileceğinizi aşağıda bulabilirsiniz.

Özel derleme mantığını içeren bağımlılık çözümleme hatalarını düzeltmeyle ilgili yardım için Özel bağımlılık çözümleme stratejileri başlıklı makaleyi inceleyin.

Bağımlılık çözümleme hatalarımı ayıklama

Bu istemde, bağımlılık çakışmaları ile ilgili hata ayıklama konusunda yardım istenmektedir.

build.gradle dosyanız açıkken Android Studio'da bu istemi çalıştırın.

I'm getting the following error in my build: Conflict with dependency. Resolved versions for runtime classpath and compile classpath differ. What changes do I need to make to my dependencies to resolve this error.

Yapay zeka istemlerini kullanma

AI istemleri, Android Studio'daki Gemini'de (en son Canary sürümü gereklidir) kullanılmak üzere tasarlanmıştır

Studio'da Gemini hakkında daha fazla bilgiyi https://developer.android.com/studio/preview/gemini adresinde bulabilirsiniz.

Modül bağımlılıklarını görüntüleme

Bazı doğrudan bağımlılıkların kendi bağımlılıkları olabilir. Bunlara geçişli bağımlılık denir. Gradle, her geçişli bağımlılığı manuel olarak belirtmenizi gerektirmek yerine bunları sizin için otomatik olarak toplar ve ekler. Gradle için Android eklentisi, Gradle'in belirli bir modül için çözdüğü bağımlılıkların listesini gösteren bir görev sağlar.

Rapor, her modül için bağımlılıkları derleme varyantına, test kaynak grubuna ve sınıf yoluna göre de gruplandırır. Aşağıda, bir uygulama modülünün hata ayıklama derleme varyantının çalışma zamanındaki sınıf yolu ve enstrümante edilmiş test kaynak kümesinin derleme sınıf yolu için örnek rapor verilmiştir.

debugRuntimeClasspath - Dependencies for runtime/packaging
+--- :mylibrary (variant: debug)
+--- com.google.android.material:material:1.0.0@aar
+--- androidx.appcompat:appcompat:1.0.2@aar
+--- androidx.constraintlayout:constraintlayout:1.1.3@aar
+--- androidx.fragment:fragment:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable-animated:1.0.0@aar
+--- androidx.recyclerview:recyclerview:1.0.0@aar
+--- androidx.legacy:legacy-support-core-ui:1.0.0@aar
...

debugAndroidTest
debugAndroidTestCompileClasspath - Dependencies for compilation
+--- androidx.test.ext:junit:1.1.0@aar
+--- androidx.test.espresso:espresso-core:3.1.1@aar
+--- androidx.test:runner:1.1.1@aar
+--- junit:junit:4.12@jar
...

Görevi çalıştırmak için aşağıdaki adımları uygulayın:

  1. Görünüm > Araç Pencereleri > Gradle'i seçin (veya araç pencereleri çubuğunda Gradle simgesini tıklayın).
  2. AppName > Görevler > android'i genişletin ve androidDependencies'e çift tıklayın. Gradle görevi yürüttükten sonra, çıkışı görüntülemek için Çalıştır penceresi açılır.

Gradle'de bağımlılıkları yönetme hakkında daha fazla bilgi için Gradle Kullanıcı Kılavuzu'ndaki Bağımlılıkları yönetmeyle ilgili temel bilgiler bölümüne bakın.

Geçiş bağımlılıkları hariç tutma

Kapsamı genişleyen uygulamalar, doğrudan bağımlılıklar ve geçişli bağımlılıklar (uygulamanızın içe aktarılan kitaplıklarının bağlı olduğu kitaplıklar) dahil olmak üzere çeşitli bağımlılıklar içerebilir. Artık ihtiyaç duymadığınız geçişli bağımlılıkları hariç tutmak için aşağıdaki gibi exclude anahtar kelimesini kullanabilirsiniz:

Kotlin

dependencies {
    implementation("some-library") {
        exclude(group = "com.example.imgtools", module = "native")
    }
}

Groovy

dependencies {
    implementation('some-library') {
        exclude group: 'com.example.imgtools', module: 'native'
    }
}

Geçişli bağımlılıkları test yapılandırmalarından hariç tutma

Belirli geçişli bağımlılıkları testlerinizden hariç tutmanız gerekiyorsa yukarıda gösterilen kod örneği beklendiği gibi çalışmayabilir. Bunun nedeni, test yapılandırmasının (ör. androidTestImplementation) modülün implementation yapılandırmasını genişletir. Yani Gradle yapılandırmayı çözdüğünde her zaman implementation bağımlılıklarını içerir.

Bu nedenle, geçişli bağımlılıkları testlerinizden hariç tutmak için aşağıdaki gibi yürütme zamanında bunu yapmanız gerekir:

Kotlin

android.testVariants.all {
    compileConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp")
    runtimeConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp")
}

Groovy

android.testVariants.all { variant ->
    variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
    variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp'
}

Not: Test yapılandırmasına özgü olan ve diğer yapılandırmalara dahil edilmeyen geçişli bağımlılıkları çıkarmak için Geçişli bağımlılıkları hariç tut bölümündeki orijinal kod örneğinde gösterildiği gibi bağımlılıklar bloğunda exclude anahtar kelimesini kullanmaya devam edebilirsiniz.

Bağımlılık çözümleme hatalarını düzeltme

Uygulama projenize birden fazla bağımlılık eklediğinizde bu doğrudan ve geçişli bağımlılıklar birbiriyle çakışabilir. Android Gradle eklentisi bu çakışmaları sorunsuz bir şekilde çözmeye çalışır ancak bazı çakışmalar derleme zamanı veya çalışma zamanı hatalarına neden olabilir.

Hatalara hangi bağımlılıkların neden olduğunu incelemenize yardımcı olması için uygulamanızın bağımlılık ağacını inceleyin ve birden fazla kez veya çakışan sürümlerle görünen bağımlılıkları arayın.

Yinelenen bağımlılığı kolayca belirleyemiyorsanız yinelenen sınıfı içeren bağımlılıkları aramak için Android Studio'nun kullanıcı arayüzünü aşağıdaki gibi kullanmayı deneyin:

  1. Menü çubuğundan Gezin > Sınıf'ı seçin.
  2. Pop-up arama iletişim kutusunda, Proje dışı öğeleri dahil et seçeneğinin yanındaki kutunun işaretli olduğundan emin olun.
  3. Derleme hatasında görünen sınıfın adını yazın.
  4. Sınıfı içeren bağımlılıklar için sonuçları inceleyin.

Aşağıdaki bölümlerde, karşılaşabileceğiniz farklı bağımlılık çözümleme hataları ve bunların nasıl düzeltileceği açıklanmaktadır.

Yinelenen sınıf hatalarını düzeltme

Bir sınıf, çalışma zamanı sınıf yolu üzerinde birden fazla kez görünüyorsa aşağıdakine benzer bir hata alırsınız:

Program type already present com.example.MyClass

Bu hata genellikle aşağıdaki durumlardan birinden kaynaklanır:

  • İkili bağımlılık, uygulamanızın doğrudan bağımlılık olarak da dahil ettiği bir kitaplığı içerir. Örneğin, uygulamanız A Kitaplığı ve B Kitaplığı'na doğrudan bağımlı olduğunu beyan ediyor ancak A Kitaplığı, B Kitaplığı'nı zaten ikili dosyasında barındırıyor.
    • Bu sorunu çözmek için B kitaplığını doğrudan bağımlılık olarak kaldırın.
  • Uygulamanız, aynı kitaplıkta yerel ve uzak ikili bağımlılığa sahiptir.
    • Bu sorunu çözmek için ikili bağımlılıklardan birini kaldırın.

Classpath'ler arasındaki çakışmaları düzeltme

Gradle, derleme sınıf yolunu çözerken önce çalışma zamanı sınıf yolunu çözer ve bu sonucu kullanarak bağımlılıkların hangi sürümlerinin derleme sınıf yoluna ekleneceğini belirler. Diğer bir deyişle, çalışma zamanındaki sınıf yolu, alt sınıf yollarındaki aynı bağımlılıklara yönelik gerekli sürüm numaralarını belirler.

Uygulamanızın çalışma zamanı sınıf yolu, Gradle'in uygulamanın test APK'sindeki çalışma zamanı sınıf yolunda bağımlılıkları eşleştirmek için ihtiyaç duyduğu sürüm numaralarını da belirler. Classpath hiyerarşisi Şekil 1'de açıklanmaktadır.

Şekil 1. Birden çok sınıf yolu boyunca görünen bağımlılıkların sürüm numaraları bu hiyerarşiye göre eşleşmelidir.

Örneğin, uygulamanız implementation bağımlılık yapılandırmasını kullanan bir bağımlılık sürümünü içerirken bir kitaplık modülü runtimeOnly yapılandırmasını kullanan bağımlılık sürümünün farklı bir sürümünü içerdiğinde aynı bağımlığın farklı sürümlerinin birden fazla sınıf yolu boyunca göründüğü bir çakışma oluşabilir.

Android Gradle eklentisi 3.3.0 ve sonraki sürümler, çalışma zamanındaki ve derleme zamanındaki sınıf yolu bağımlılıklarını çözerken belirli yayın sonrası sürüm çakışmalarını otomatik olarak düzeltmeye çalışır. Örneğin, çalışma zamanı sınıf yolu A Kitaplığı 2.0 sürümünü ve derleme sınıf yolu A Kitaplığı 1.0 sürümünü içeriyorsa eklenti, hataları önlemek için derleme sınıf yolundaki bağımlılığı A Kitaplığı 2.0 sürümüne otomatik olarak günceller.

Ancak çalışma zamanı sınıf yolu A Kitaplığı 1.0 sürümünü ve derleme sınıf yolu A Kitaplığı 2.0 sürümünü içeriyorsa eklenti, derleme sınıf yolundaki bağımlılığı A Kitaplığı 1.0 sürümüne düşürmez ve aşağıdakine benzer bir hata almaya devam edersiniz:

Conflict with dependency 'com.example.library:some-lib:2.0' in project 'my-library'.
Resolved versions for runtime classpath (1.0) and compile classpath (2.0) differ.

Bu sorunu çözmek için aşağıdakilerden birini yapın:

  • Bağımlılığın istediğiniz sürümünü kitaplık modülünüze api bağımlılığı olarak ekleyin. Yani bağımlılık yalnızca kitaplık modülünüzde belirtilir ancak uygulama modülü de API'sine geçişli olarak erişebilir.
  • Alternatif olarak, bağımlılığı her iki modülde de belirtebilirsiniz ancak her modülün bağımlılığın aynı sürümünü kullandığından emin olmanız gerekir. Her bağımlılığın sürümlerinin projeniz genelinde tutarlı kalmasını sağlamak için proje genelinde mülkleri yapılandırabilirsiniz.