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:
- Görünüm > Araç Pencereleri > Gradle (veya Gradle tuşlarına basın.
- 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:
- Gezinme > Sınıf'ı tıklayın.
- Pop-up arama iletişim kutusunda, Proje olmayan öğeleri dahil et işaretlidir.
- Derleme hatasında görünen sınıfın adını yazın.
- 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.
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.