Обходной путь для использования разных версий библиотек поддержки Android

Это относится к предупреждающему сообщению, появляющемуся в файле build.gradle:

Все библиотеки com.android.support должны использовать одну и ту же спецификацию версии (смешение версий может привести к сбоям во время выполнения).

Я прекрасно знаю об этом и использую идентичные версии в своем собственном коде/сборке. Однако это не так, когда речь идет о некоторых сторонних библиотеках, которые я использую.

Иногда сторонние библиотеки используют более старые версии, а некоторые другие используют более новые версии, поэтому обновление вашей версии библиотек поддержки не решит проблему.

Существуют также сценарии, в которых вы можете не захотеть обновлять версии используемых вами библиотек поддержки.

Перекомпиляция сторонних библиотек с различными версиями библиотек поддержки также невозможна, поскольку в моем случае код недоступен.

Каков обходной путь или рекомендуемый подход для решения этой проблемы, когда другие сторонние библиотеки, на которые ссылаются, используют разные версии библиотек поддержки?


person AlexVPerl    schedule 19.09.2017    source источник


Ответы (1)


Вы можете исключить все транзитивные зависимости или только одну за другой, а затем включить нужную версию в свой файл build.gradle.

Способ 1 — исключение всех зависимостей библиотеки

Используйте поле transitive, чтобы указать Gradle, что вы не хотите разрешать транзитивные зависимости. В документации transitive говорится:

Устанавливает, должна ли эта зависимость быть разрешена, включая или исключая ее транзитивные зависимости. Артефакты, принадлежащие этой зависимости, могут сами иметь зависимости от других артефактов. Последние называются транзитивными зависимостями.

Пример:

compile('com.super.lib:awesome@aar') {
    transitive = false
}

Способ 2. Выберите, какие зависимости вы не хотите включать

Используйте метод exclude, который:

Добавляет правило исключения для исключения транзитивных зависимостей этой зависимости.

Пример:

compile('com.super.lib:awesome@aar') {
    exclude group: 'com.dont.want.this', module: 'old-artifact'
}

Обратите внимание, однако, что это не гарантирует, что исключенная зависимость не будет подтянута другой зависимостью. Если вы хотите исключить зависимость отовсюду, используйте стратегию исключения для всей конфигурации:

configurations.all {
    exclude group: 'com.dont.want.this', module: 'old-artifact'
}

Кроме того, вам необходимо указывать имена group и module одновременно. Этот пример взят из JavaDoc gradle:

dependencies {
     compile('org.hibernate:hibernate:3.1') {
         //excluding a particular transitive dependency:
         exclude module: 'cglib' //by artifact name
         exclude group: 'org.jmock' //by group
         exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
     }
}

ПРЕДУПРЕЖДЕНИЕ

Просто дружеское напоминание об опасностях изменения номеров версий зависимостей.

Когда вы меняете версии зависимостей с помощью этого метода, вы должны тщательно протестировать приложение, потому что в более новых/старых версиях зависимостей могут быть критические изменения или неожиданное поведение. Совершенно очевидно, что скачок основного номера версии, скорее всего, приведет к сбоям / неожиданному поведению, но вы должны обращать внимание даже на часть patch номера версии, поскольку создатель библиотеки можно было ожидать, что используемая версия зависимости содержала некоторые ошибки и включала некоторые исправления, которые могли сломать библиотеку после исправления ошибки.

person Gergely Kőrössy    schedule 19.09.2017