عند إضافة تبعية، قد تواجه مشكلات مع التبعيات المطلوبة حسب التبعية الأصلية، والتعارضات بين إصدارات التبعية المختلفة. وفي ما يلي كيفية تحليل الرسم البياني للتبعية وإصلاح المشاكل الشائعة التي تنشأ.
للحصول على إرشادات حول إصلاح أخطاء حل التبعية التي تتضمن إصدارًا مخصصًا منطق، يرى استراتيجيات مخصّصة لحلّ التبعية
عرض تبعيات الوحدة
قد يكون لبعض التبعيات المباشرة تبعيات خاصة بها. وتسمى هذه التبعيات الانتقالية. بدلاً من أن تطلب منك الإفصاح يدويًا عن كل التبعية المتبادلة، فإن Gradle تجمعها وتضيفها تلقائيًا. يوفر المكوّن الإضافي Android لنظام Gradle مهمة تعرض قائمة التبعيات التي يحلها Gradle لوحدة معينة.
لكل وحدة، قد يتضمن التقرير أيضًا بتجميع التبعيات بناءً على متغير الإصدار ومجموعة مصدر الاختبار مسار الفئة. في ما يلي نموذج تقرير لوقت تشغيل وحدة التطبيق classpath لمتغير إصدار تصحيح الأخطاء الخاص به وتجميع مسار الفئة المحدد لمعرفته مجموعة مصادر الاختبار.
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
...
لتشغيل المهمة، يمكنك المتابعة كما يلي:
- حدّد عرض > نوافذ الأدوات > Gradle (أو انقر على Gradle في شريط نوافذ الأدوات).
- توسيع AppName > المهام > android و انقر مرّتين على androidDependencies. بعد تنفيذ Gradle للمهمة، يجب أن يتم فتح نافذة تشغيل لعرض الناتج.
لمزيد من المعلومات حول إدارة التبعيات في Gradle، راجع أساسيات إدارة التبعية في دليل مستخدم Gradle.
استبعاد التبعيات الانتقالية
ومع توسع التطبيق في النطاق، يمكن أن يحتوي على عدد من التبعيات بما في ذلك
والتبعيات المباشرة والتبعيات المتبادلة (المكتبات التي
المكتبات المستوردة).
لاستبعاد التبعيات المنتقلة التي لم تعد بحاجة إليها، يمكنك استخدام
كلمة رئيسية واحدة (exclude
) كما هو موضّح أدناه:
Kotlin
dependencies { implementation("some-library") { exclude(group = "com.example.imgtools", module = "native") } }
Groovy
dependencies { implementation('some-library') { exclude group: 'com.example.imgtools', module: 'native' } }
استبعاد التبعيات المتعدِّدة من إعدادات الاختبار
إذا كنت بحاجة إلى استبعاد بعض التبعيات الانتقالية من اختباراتك،
فقد لا يعمل عينة التعليمات البرمجية الموضحة أعلاه على النحو المتوقع. هذا لأن الاختبار
والتهيئة (على سبيل المثال، androidTestImplementation
) توسّع نطاق عرض
إعداد implementation
. وهذا يعني أنّه يتضمّن دائمًا implementation
.
والتبعيات عندما يحل Gradle الإعدادات.
لذلك، لاستبعاد التبعيات المتعدِّدة من اختباراتك، يجب عليك القيام بذلك في وقت التنفيذ كما هو موضّح أدناه:
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' }
ملاحظة: لا يزال بإمكانك استخدام الكلمة الرئيسية exclude
في كتلة التبعيات كما هو موضح في عينة التعليمات البرمجية الأصلية من
استبعاد التبعيات الانتقالية
لحذف التبعيات المتعدِّدة الخاصة بالاختبار
من التكوين ولا يتم تضمينها في التهيئات الأخرى.
إصلاح أخطاء تحليل التبعية
عند إضافة تبعيات متعددة إلى مشروع تطبيقك، فإن تلك التبعيات المباشرة قد تتعارض التبعيات الانتقالية مع بعضها البعض. نظام Gradle المتوافق مع Android محاولة إضافية لحل هذه التعارضات بسلاسة، إلا أن بعض التعارضات قد تؤدي لتجميع أخطاء وقت التشغيل أو وقت التشغيل.
ولمساعدتك في التحقيق في التبعيات التي تساهم في الأخطاء، ففحص شجرة تبعية تطبيقك والبحث عن التي تظهر أكثر من مرة أو بإصدارات متعارضة.
إذا لم يكن بإمكانك تحديد التبعية المكرّرة بسهولة، جرِّب استخدام Android واجهة المستخدم في Studio للبحث عن الموارد التابعة التي تتضمن الفئة المكررة على النحو التالي:
- حدد التنقل > الصف من شريط القوائم.
- في مربع حوار البحث المنبثق، تأكد من أن المربع بجوار يتم وضع علامة في المربّع تضمين العناصر التي ليست ضِمن المشروع.
- اكتب اسم الفئة الذي يظهر في خطأ الإصدار.
- قم بفحص نتائج التبعيات التي تتضمن الفئة.
تصف الأقسام التالية الأنواع المختلفة لحل التبعية الأخطاء التي قد تواجهها وكيفية إصلاحها.
إصلاح أخطاء الصفوف المكرّرة
إذا ظهرت فئة أكثر من مرة في مسار فئة بيئة التشغيل، فستحصل على بشكل مشابه لما يلي:
Program type already present com.example.MyClass
يحدث هذا الخطأ عادةً بسبب إحدى الحالات التالية:
- تتضمن التبعية الثنائية مكتبة يضمها تطبيقك أيضًا على أنها
والتبعية المباشرة. على سبيل المثال، يشير تطبيقك إلى أنّ التطبيق يعتمد بشكل مباشر على
المكتبة (أ) والمكتبة (ب)، ولكن المكتبة (أ) تتضمن بالفعل المكتبة (ب) في
النظام الثنائي.
- لحلّ هذه المشكلة، عليك إزالة المكتبة "ب" بصفتها مكتبة مستقلة.
- يعتمد تطبيقك على برنامج ثنائي محلي يعتمد على برنامج ثنائي عن بُعد
نفس المكتبة.
- لحل هذه المشكلة، أزِل إحدى التبعيات الثنائية.
إصلاح التعارضات بين مسارات الفئة
عندما تحل Gradle مسار فئة التجميع، فإنها تحل أولاً بيئة التشغيل classpath وتستخدم النتيجة لتحديد إصدارات التبعيات التي ينبغي إضافتها إلى مسار فئة التجميع. بمعنى آخر، يُظهر بيئة التشغيل classpath أرقام الإصدارات المطلوبة للتبعيات المتطابقة على مسارات الفئات أسفل الصفحة.
يحدِّد مسار فئة بيئة تشغيل تطبيقك أيضًا أرقام الإصدارات التي تطبَّق عليها منصّة Gradle يتطلب مطابقة التبعيات في مسار الفئة في بيئة التشغيل لاختبار التطبيق APK. يتم وصف التسلسل الهرمي لمسارات الفئات في الشكل 1.
يشير ذلك المصطلح إلى تعارض تظهر فيه إصدارات مختلفة من التبعية نفسها.
قد تحدث مسارات متعددة للفئات عندما يتضمن تطبيقك مثلاً إصدارًا من
تبعية باستخدام implementation
إعدادات التبعية
وتشمل وحدة المكتبة إصدارًا مختلفًا من التبعية باستخدام
إعدادات runtimeOnly
.
وعند حل التبعيات على بيئة التشغيل وتجميع مسارات فئات وقت، الإصدار 3.3.0 من المكوّن الإضافي Gradle والإصدارات الأعلى، ومحاولة إصلاح بعض عمليات النقل تلقائيًا تعارض الإصدارات. على سبيل المثال، إذا كان مسار الفئة في بيئة التشغيل يتضمن المكتبة أ 2.0 ويتضمن مسار التجميع للفئة الإصدار 1.0 من المكتبة أ، وهو المكون الإضافي يقوم تلقائيًا بتحديث التبعية على مسار تصنيف التجميع إلى المكتبة أ الإصدار 2.0 لتجنب الأخطاء.
ومع ذلك، إذا كان مسار فئة بيئة التشغيل يتضمن الإصدار 1.0 من المكتبة أ يتضمن مسار الفئة الإصدار 2.0 من المكتبة أ، فلا يمكن للمكون الإضافي الرجوع إلى إصدار سابق التبعية لمسار تصنيف التجميع إلى الإصدار 1.0 من المكتبة أ، وما زلت تحصل على خطأ مشابه لما يلي:
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.
لحلّ هذه المشكلة، يمكنك تنفيذ أحد الإجراءات التالية:
- أدرِج الإصدار المطلوب من التبعية كتبعية
api
إلى واحدة. بمعنى أن وحدة المكتبة فقط تعلن عن التبعية، لكن ستتمكن وحدة التطبيق أيضًا من الوصول إلى واجهة برمجة التطبيقات الخاصة بها بشكل متبادل. - وبدلاً من ذلك، يمكنك تعريف التبعية في كلتا الوحدتين، ولكن يجب تأكد من أن كل وحدة تستخدم نفس الإصدار من التبعية. ضع في اعتبارك ضبط المواقع على مستوى المشروع لضمان الحفاظ على اتساق إصدارات كل تبعية طوال مشروعك.