Как помешать Gradle изменить версию библиотеки зависимостей на более позднюю, потому что другая библиотека требует ее в качестве транзитивной зависимости? - PullRequest
0 голосов
/ 08 ноября 2019

Контекст

Я пытаюсь включить Flipper отладочный инструмент в мое приложение с сетевым плагином. Чтобы это было полезно, мне нужно добавить перехватчик Flipper Network в мой модуль HTTP, который предоставляет клиент OkHttp для моего приложения. Я включаю только библиотеки Flipper в конфигурации отладки. Я включаю Flipper deps в мой http-модуль следующим образом:

dependencies {
[...]
    debugImplementation dep('com.facebook.flipper:flipper')
    debugImplementation dep('com.facebook.flipper:flipper-network-plugin')
}

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что Flipper транзитивно зависит от okhttp:3.14.1' и наше приложение поддерживает клиентов до уровня API 16. Теперь проблема в том, что ниже API 21 (Lolipop) Я не могу использовать любую версию okhttp выше 3.12.x.

Из-за этого, другие вещи, которые зависят от OkHttp, начинают использовать версию OkHttp выше 8.12.x, что делает инициализацию HTTP-разрыва.

11-08 13:48:28.394 E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: java.util.Objects
        at okhttp3.CertificatePinner.withCertificateChainCleaner(CertificatePinner.java:231)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:238)
        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:202)

Глядя на дерево зависимостей, оноМне кажется, что из-за того, что Flipper требует версии 3.14.1 OkHttp, другие части моего приложения, которым требуется клиент OkHttp в конфигурации отладки, также используют 3.14.1 вместо 3.13.1:

debugAndroidTest
[...]
+--- project :libs:http-retrofit
|    +--- project :libs:http (*)
|    +--- com.squareup.okhttp3:okhttp:3.12.3 -> 3.14.1 (*)
|    +--- javax.inject:javax.inject:1
|    +--- com.squareup.retrofit2:retrofit:2.5.0
|    |    \--- com.squareup.okhttp3:okhttp:3.12.0 -> 3.14.1 (*)

Как я могу заставить Gradle не изменять версию зависимости OkHTTP где-либо еще?

Если я использую только Flipper, использую версию 3.14.1, я могу легко исключить установку Flipper в коде, проверив APIуровень.

1 Ответ

0 голосов
/ 08 ноября 2019

Из ограничений зависимостей руководство по градлам:

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

И руководство Объявление расширенных версий :

строго. Любая версия, не соответствующая этой версии, будет исключена. Это самая сильная версия объявления. На объявленной зависимости строго может понизить версию. В случае транзитивной зависимости это приведет к сбою разрешения зависимости, если не будет выбрана версия, приемлемая для этого предложения. Посмотрите переопределение версии зависимости для деталей. Этот термин поддерживает динамические версии.

Когда определено, переопределяет предыдущее, требует объявления и очищает предыдущее отклонение.

Итак, собрав все это вместе, я думаю, вы сможете сделать что-то вроде этого:

dependencies {
[...]
    debugImplementation dep('com.facebook.flipper:flipper')
    debugImplementation dep('com.facebook.flipper:flipper-network-plugin')

    constraints {
        debugImplementation dep('com.squareup.okhttp3:okhttp') {
            version {
                strictly '3.12.3'
            }
    }
}

Конечно, если одна из зависимостей не может работать с версией 3.12.3, тогда она просто не сможет разрешить ограничения.

...