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

Bağımlılık eklediğinizde, gerekli bağımlılıklarla ilgili sorunlarla karşılaşabilirsiniz ve farklı bağımlılık sürümleri arasındaki çakışmaları dikkate alır. Bağımlılık grafiğinizi nasıl analiz edeceğiniz ve ortaya çıkan yaygın sorunları nasıl düzelteceğinizi burada bulabilirsiniz.

Özel derleme içeren bağımlılık çözümü hatalarını düzeltme konusunda rehberlik için bkz. Özel bağımlılık çözümü stratejileri.

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ıklar. Sadece dönüşüm verilerini manuel olarak geçişli bağımlılığa sahip Gradle, bunları otomatik olarak toplayıp sizin için ekler. Gradle için Android eklentisi, aşağıdakilerin listesini görüntüleyen bir görev sağlar: ve Gradle'ın belirli bir modül için çözümlediği bağımlılıkları ifade eder.

Her modülde, bağımlılıkları derleme varyantı, test kaynağı kümesi ve sınıf yolu. Aşağıda, bir uygulama modülünün çalışma zamanına ilişkin örnek rapor verilmiştir hata ayıklama derleme varyantının classpath'ı ve araçları kullanılan sınıf yolunu derler test kaynağı kümesi.

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 (veya Gradle tuşlarına basın.
  2. Genişlet AppName > Görevler > android ve androidDependencies'i çift tıklayın. Gradle yürütüldüğünde çıktıyı görüntülemek için Çalıştır penceresi açılacaktır.

Gradle'da bağımlılıkları yönetme hakkında daha fazla bilgi için bkz. Bağımlılık yönetimiyle ilgili temel bilgiler hakkındaki makalemizi incelemenizi öneririz.

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

Bir uygulama, kapsamı büyüdükçe aşağıdakileri de içeren bir dizi bağımlılığa sahip olabilir. doğrudan bağımlılıklar ve geçişli bağımlılıklar (uygulamanızın bağımlı olarak ayarlanır). Artık ihtiyaç duymadığınız geçişli bağımlılıkları hariç tutmak için Aşağıda gösterildiği gibi exclude anahtar kelime:

Kotlin

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

Eski

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

Bazı geçişli bağımlılıkları testlerinizden hariç tutmanız gerekiyorsa yukarıda gösterilen kod örneği beklendiği gibi çalışmayabilir. Çünkü test amaçlı yapılandırma (ör. androidTestImplementation), modülün implementation yapılandırması. Yani her zaman implementation içerir bağımlılıklarını görebilirsiniz.

Bu nedenle, geçişli bağımlılıkları testlerinizden hariç tutmak için bunu aşağıda gösterildiği gibi yürütme süresi:

Kotlin

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

Eski

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

Not: exclude anahtar kelimesini kullanmaya devam edebilirsiniz kodundaki orijinal kod örneğinde gösterildiği gibi, Geçişli bağımlılıkları hariç tutun bölümüne bakarak teste özgü geçişli bağımlılıkları ve diğer yapılandırmalara dahil edilmez.

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

Uygulama projenize birden çok bağımlılık eklediğinizde, bu bağımlılıklar doğrudan birbiriyle çelişebilir. Android Gradle eklentisi bu çakışmaları incelikle çözmeye çalışır ancak bazı çakışmalar derleme zamanı.

Hangi bağımlılıkların hatalara katkıda bulunduğunu araştırmanıza yardımcı olması için uygulamanızın bağımlılık ağacını inceleyin ve birden fazla kez görünen veya çakışan versiyonları olan bağımlılıklar.

Yinelenen bağımlılığı kolayca belirleyemiyorsanız Android'i kullanmayı deneyin. Kopya sınıfı içeren bağımlılıkları aramak için Studio'nun kullanıcı arayüzü şu şekilde:

  1. Gezinme > Sınıf'ı tıklayın.
  2. Pop-up arama iletişim kutusunda, Proje olmayan öğeleri dahil et işaretlidir.
  3. Derleme hatasında görünen sınıfın adını yazın.
  4. Sonuçlarda, sınıfı içeren bağımlılıkları inceleyin.

Aşağıdaki bölümlerde farklı bağımlılık çözümü türleri açıklanmıştır hatalar ve bunların nasıl düzeltileceği.

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

Bir sınıf, çalışma zamanı sınıf yolunda birden çok kez görünüyorsa şuna benzer bir hata oluştu:

Program type already present com.example.MyClass

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

  • İkili bağımlılık, uygulamanızın aynı zamanda doğrudan bağımlılık. Örneğin, uygulamanız A Kitaplığı ve B Kütüphanesi, ancak A Kütüphanesi, ikilik.
    • Bu sorunu çözmek için doğrudan bağımlılık olarak B Kitaplığı'nı kaldırın.
  • Uygulamanızın yerel ikili bağımlılığı ve aynı kitaplıktır.
    • Bu sorunu çözmek için ikili bağımlılıklardan birini kaldırın.

Sınıf yolları arasındaki çakışmaları düzeltme

Gradle, derleme sınıf yolunu çözümlediğinde önce çalışma zamanını çözümler. sınıfını tanımlar ve sonucu kullanarak bağımlılıkların hangi sürümlerinin derleme sınıf yoluna eklenebilir. Başka bir deyişle, classpath, HTML’deki özdeş bağımlılıklar için gereken sürüm numaralarını yardımcı olur.

Uygulamanızın çalışma zamanı sınıf yolu, Gradle'ın uygulamanın testinin çalışma zamanı sınıf yolunda bağımlılıkların eşleştirilmesini gerektirir APK'ya dokunun. Sınıf yollarının hiyerarşisi Şekil 1'de açıklanmıştır.

Şekil 1. Bağımlılıkların sürüm numaraları birden çok sınıf yolunda görünen reklamlar bu hiyerarşik olarak düzenlenmiştir.

Aynı bağımlılığın farklı sürümlerinin birden fazla sınıf yolu, örneğin uygulamanızda implementation kullanan bir bağımlılık bağımlılık yapılandırması Bir kitaplık modülü, runtimeOnly yapılandırması.

Android, çalışma zamanınızdaki bağımlılıkları çözümlerken ve zamanı sınıf yollarını derlerken Gradle eklentisi 3.3.0 ve daha yeni sürümler, belirli aşağı akış sorunlarını otomatik olarak düzeltmeye çalışır sürüm çakışması. Örneğin, çalışma zamanı sınıf yolu Kitaplık A'yı içeriyorsa sürüm 2.0'da bulabilirsiniz ve derleme sınıf yolu, derleme sınıf yolu üzerindeki bağımlılığı otomatik olarak A Kitaplığı ile günceller 2.0 sürümünü kullanmanız gerekir.

Bununla birlikte, çalışma zamanı sınıf yolu Kitaplık A sürüm 1.0'ı ve classpath Kitaplık A sürüm 2.0 içerir, eklenti bağımlılığınız varsa ve yine de şuna benzer bir hata:

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:

  • Uygulamanıza bir api bağımlılığı olarak bağımlılığın istediğiniz sürümünü dahil edin kitaplık modülünü kullanabilirsiniz. Yani, yalnızca kitaplık modülünüz bağımlılığı tanımlar, ancak uygulama modülü de kendi API'sine geçişli olarak erişebilir.
  • Alternatif olarak, bağımlılığı her iki modülde de belirtebilirsiniz ancak her modülün aynı bağımlı sürümünü kullandığından emin olun. Dikkatlice proje genelinde mülkleri yapılandırma her bağımlılığın sürümlerinin projeniz boyunca tutarlı kalmasını sağlamak açısından gerçekten önemlidir.