Вот метод, который может помочь с диагностикой проблемы.
Незадолго до последнего сообщения об ошибке вы получите список файлов JAR, которые Gradle пытается объединить (обычно в android\app\build\intermediates\transforms\preDex\release
).Каждый из этих файлов JAR происходит из какой-то зависимости вашего проекта.
Вы можете разархивировать файлы JAR и найти имя класса, вызывающего конфликт.В моем случае это было INotificationSideChannel
, у аскера - BinaryResource
.
! grep INotificationSideChannel * -irl
50/classes.dex
80/classes.dex
Так что конфликт между 50.jar
и 80.jar
.Если заглянуть внутрь извлеченных каталогов, есть файлы 50/META-INF/com.android.support_support-compat.version
и 80/META-INF/androidx.core_core.version
, которые указывают, что эти файлы представляют зависимости com.android.support:support-compat
и androidx.core:core
соответственно.
Для записи AndroidX предназначен для заменыв библиотеку поддержки Android, поэтому имеет смысл, что наличие их обоих в сборке вызовет конфликт.Время для проверки дерева зависимостей проекта:
! gradlew app:dependencies
Просматривая список, я вижу, что androidx
требуется только один раз, через зависимость com.google.android.gms:play-services-gcm:17.0.0
, которая, в свою очередь, являетсяссылка на react-native-device-info
.
Небольшое прибегание к поиску указывает, что play-services-gcm
использовался для ссылки com.android.support
в 16.1.0
, что привело меня к следующему фрагменту в android / build.gradle, который решил проблему для меня:
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
// normalize com.android.support library versions
if (details.requested.group == 'com.android.support'
&& !details.requested.name.contains('multidex') ) {
details.useVersion "28.0.0"
}
// downgrade play-services-gcm version to avoid referencing androidx
if (details.requested.group == 'com.google.android.gms' &&
details.requested.name == 'play-services-gcm') {
details.useVersion "16.1.0"
}
}
}
...
Если у ваших конфликтующих файлов JAR нет файлов .version, вы можете попытаться идентифицировать их по структуре папок классов в jar-файле (например, okhttp3 / internal приведет вас к okhttp3),имя конфликтующего класса в журнале Gradle, или вы можете удалить два JAR-файла и найти подсказки в журнале.