Gradle - дубликаты библиотек в зависимостях

У меня есть проект Android с gradle. Проблема в: В представлении project я вижу несколько версий библиотек support-v4, например support-v4-21.0.3 и support-v4-22.2.0.

Но в build.gradle у меня вообще нет support-v4.

Но у меня есть ~ 10 других зависимостей в build.gradle. Например appcompat-v7:22.2.0. Я могу предположить, что appcompat-v7:22.2.0 зависит от support-v4-22.2.0 в зависимостях maven и неявно тянет его. Но у меня нет идей, которые тянут support-v4-21.0.3.

Насколько я знаю, все эти библиотеки будут упакованы в мой APK и увеличат вес APK.

Итак, у меня есть следующие вопросы:

  • Как избежать дубликатов библиотек?
  • Как увидеть зависимости maven в Android Studio?
  • Как определить, какой библиотеке требуется эта библиотека? Например, какая библиотека требует support-v4-21.0.3 в моем проекте?

Ответ 1

Чтобы найти дубликаты зависимостей или необходимые зависимости, вы можете визуализировать зависимости библиотек в дереве. Выполните команду gradle, как показано ниже.

gradle -q dependencies yourProject:dependencies --configuration compile

Обратите внимание, что запустите gradlew в Windows, как показано ниже.

gradlew -q dependencies yourProject:dependencies --configuration compile

Результат команды покажет вам человеко-читаемую иерархию дерева всех зависимостей, как показано ниже.

compile - Classpath for compiling the main sources.
+--- org.androidannotations:androidannotations-api:3.2
+--- com.android.support:support-annotations:22.1.1
+--- com.squareup:otto:1.3.6
+--- in.srain.cube:grid-view-with-header-footer:1.0.10
+--- com.nostra13.universalimageloader:universal-image-loader:1.9.3
+--- com.github.chrisbanes.photoview:library:1.2.3
+--- org.simpleframework:simple-xml:2.7.1
+--- com.google.android.gms:play-services-base:6.5.+ -> 6.5.87
+--- project :yourProject
|    +--- com.loopj.android:android-async-http:1.4.6
|    +--- org.apache.httpcomponents:httpmime:4.2.5
|    |    \--- org.apache.httpcomponents:httpcore:4.2.4
|    \--- com.google.code.gson:gson:2.3.1
+--- project :facebook
|    \--- com.android.support:appcompat-v7:22.1.1
|         \--- com.android.support:support-v4:22.1.1
|              \--- com.android.support:support-annotations:22.1.1 -> 22.2.0

Вы можете видеть зависимые зависимости и принимать во внимание, какие из них следует избегать. В приведенном выше примере последняя строка com.android.support:support-annotations представляет собой внутреннюю переопределение от 22.1.1 до 22.2.0.

Чтобы избежать дублирования, вы можете добавить предложения exclude в каждый проект build.gradle.

compile('com.github.chrisbanes.photoview:library:1.2.3') {
    exclude group: 'com.android.support'
}
compile('org.simpleframework:simple-xml:2.7.1') {
    exclude module: 'stax'
    exclude module: 'stax-api'
    exclude module: 'xpp3'
}
compile('com.google.android.gms:play-services-base:6.5.+')
        {
            exclude module: 'support-v4'
        }

Для получения дополнительной информации вы можете увидеть учебник по https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies

Ответ 2

Следующий плагин для Android-студии дает вам подробную информацию о дублированных зависимостях и суммарном количестве методов для каждой зависимости. Плагин подсчета меток Android

введите описание изображения здесь