У нас есть следующие настройки:
Приложение> Framework A> Framework B
Приложение использует A и B. Framework A использует только B.
Фреймворки создаются отдельно и обслуживаются через частный репозиторий maven.
Сейчас мы провели много рефакторинга в Framework B, включая переход с gson на moshi.
При сборке приложения мы получаем следующую ошибку:
AGPBI: {"kind":"error","text":"Program type already present: moe.banana.jsonapi2.JsonApiConverterFactory$MoshiResponseBodyConverter","sources":[{}],"tool":"D8"}
> Task :app:transformDexArchiveWithDexMergerForApi18DevelopmentDebug FAILED
java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: ...
Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes.
Зависимости фреймворка B довольно "скучные":
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.squareup.moshi:moshi:1.8.0'
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.2'
implementation "com.squareup.retrofit2:converter-moshi:2.6.0"
implementation 'moe.banana:moshi-jsonapi:3.5.0'
implementation 'moe.banana:moshi-jsonapi-retrofit-converter:3.5.0'
// optional, for retrofit
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
}
Для Framework A это:
dependencies {
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.anko:anko-coroutines:$anko_version"
implementation "androidx.core:core-ktx:$ktx_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
implementation 'androidx.annotation:annotation:1.1.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
implementation 'com.squareup.wire:wire-runtime:2.2.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "com.google.android.gms:play-services-location:$play_services_version"
implementation "FrameworkB"
}
Как только мы теперь включим фреймворк A в приложение, произойдет указанное исключение.
Вещи, которые мы уже пробовали
$ ./gradlew app:dependencies
-> Существует только ОДНА запись в библиотеке jsonapi2. Все выглядит правильно.
- Попытка сборки с отключенным мультидексом: та же ошибка
- Включите обе платформы в качестве исходных модулей в приложение: все работает без изменения зависимостей.
После нескольких дней попыток решить эту ошибку, мы пришли к точке, в которой мы понятия не имеем, как ее отследить.
Есть ли другой способ узнать, откуда Gradle думает, что этот дубликат класса / зависимости появился?