React Native Error: несколько файлов dex определяют Lcom / facebook / binaryresource / BinaryResource при создании рабочего apk - PullRequest
0 голосов
/ 21 мая 2018

Я получаю следующее исключение при попытке упаковать проект React Native в рабочий apk (работает gradlew assemblyRelease с конфигурацией, взятой из здесь ):

* What went wrong:
Execution failed for task ':app:transformDexWithDexForRelease'.
> com.android.build.api.transform.TransformException: 
com.android.ide.common.process.ProcessException: 
java.util.concurrent.ExecutionException: com.android.dex.DexException: 
Multiple dex files define Lcom/facebook/binaryresource/BinaryResource;

ПокаПри попытке упаковать пакет для отладки приложение, кажется, отлично работает на эмуляторе (либо запустив программный реактив run-android, либо запустив gradlew assemblyDebug).

Это происходит в проекте, который используется для правильной упаковки (также и apk), но он не был собран некоторое время из-за iOS-ориентированной разработки (мы время от времени запускали только реактивный run-android, чтобы убедиться, что ничего не сломано, по-видимому, этого недостаточно).За это время конфигурация Android не была затронута или изменена вообще, все изменения были внесены либо в приложение iOS, либо в код Javascript (было установлено несколько новых пакетов npm, но все они являются чистым JS и не требуют каких-либо ссылок).

Я загрузил полную трассировку стека Gradle здесь .

Я использую последнюю версию реакции-нативную (0.55.4) и версию реакции 16.3.2.Также пытался обновить различные пакеты и запустить gradlew clean.

Буду признателен за любую помощь в этом вопросе.Я рад предоставить любые сегменты конфигурации, которые могут иметь отношение к делу, я просто не знал, что предоставить, поскольку ни один из связанных с Android конфигураций / кодов не был изменен с момента последней работы.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 марта 2019

Ошибка Определение нескольких файлов dex ... происходит, когда у вас есть MultiDex и Дублирование библиотек ..

Допустим, выдобавили библиотеку support-v4 через файл aar, а также с помощью Gradle.

Это заставит Gradle добавить оба, и эта ошибка произойдет.

Вы должны посмотретьдля библиотеки, которая могла быть добавлена ​​дважды.

В моем случае aar и classes.jar были добавлены в то время, когда мультидекс был включен, поэтому это произошло.

0 голосов
/ 18 июня 2019

Вот метод, который может помочь с диагностикой проблемы.

Незадолго до последнего сообщения об ошибке вы получите список файлов 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-файла и найти подсказки в журнале.

0 голосов
/ 21 мая 2018

Я разрешу это здесь для всех, кому может понадобиться помощь.

На android / app / build.gradle, в объекте defaultConfig поместите этот тег: multiDexEnabled true, если это начинает вызывать ошибку zip, поместите это в конец файла

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '27.1.0'
            }
        }
    }
}   

Это сработало для меня, когда у меня была проблема с multiDex, может не работать для всех

...