После того, как изо всех сил пытался найти помощь здесь и там, я обнаружил, что команда ./gradlew app:dependencies
предоставляет важные выходные данные для устранения ошибки.
Прежде всего, ошибка Program type already present: androidx.annotation.AnimRes
Program type already present
означает, что существует конфликт имен, и в этом случае библиотека androidx.annotation, которая используется несколькими библиотеками. То есть другие библиотеки содержат androidx.annotation library
в качестве транзитивной зависимости.Чтобы увидеть эти библиотеки, я открыл терминал из корневой папки моего проекта (моя ОС - Ubuntu) и запустил команду ./gradlew app:dependencies
.Это произвело длинный список конфигураций и их зависимостей.ниже приведен фрагмент.
debugCompileClasspath - Resolved configuration for compilation for variant: debug
+--- androidx.databinding:databinding-common:3.3.0-alpha07
+--- androidx.databinding:databinding-runtime:3.3.0-alpha07
| +--- androidx.lifecycle:lifecycle-runtime:2.0.0-alpha1 -> 2.0.0-rc01
| | +--- androidx.lifecycle:lifecycle-common:2.0.0-rc01
| | | \--- androidx.annotation:annotation:1.0.0-rc01 -> 1.0.0-rc02
| | +--- androidx.arch.core:core-common:2.0.0-rc01
| | | \--- androidx.annotation:annotation:1.0.0-rc01 -> 1.0.0-rc02
| | \--- androidx.annotation:annotation:1.0.0-rc01 -> 1.0.0-rc02
| +--- androidx.collection:collection:1.0.0-alpha1 -> 1.0.0-rc02
| | \--- androidx.annotation:annotation:1.0.0-rc02
| \--- androidx.databinding:databinding-common:3.3.0-alpha07
+--- androidx.databinding:databinding-adapters:3.3.0-alpha07
| +--- androidx.databinding:databinding-common:3.3.0-alpha07
| \--- androidx.databinding:databinding-runtime:3.3.0-alpha07 (*)
В приведенном выше фрагменте показаны некоторые зависимости для конфигурации debugCompileClasspath
. Мы можем видеть, что androidx.databinding:databinding-runtime:3.3.0-alpha07
содержит androidx.annotation:annotation:1.0.0-rc02
в качестве транзитивной зависимости.
Он также содержит androidx.lifecycle:lifecycle-runtime:2.0.0-alpha1
, который в свою очередь содержит androidx.annotation:annotation:1.0.0-rc01
.
androidx.annotation:annotation:1.0.0-rc01 -> 1.0.0-rc02
означает, что вместо версии 1.0.0-rc01
будет использоваться версия 1.0.0-rc02
.
Ниже приведен другой фрагмент того же длинного вывода, созданного ./gradlew app:dependencies
kapt
+--- androidx.lifecycle:lifecycle-compiler:2.0.0-alpha1
| +--- androidx.lifecycle:lifecycle-common:2.0.0-alpha1
| | \--- androidx.annotation:annotation:1.0.0-alpha1
| +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.41
| | \--- org.jetbrains:annotations:13.0
| +--- com.google.auto:auto-common:0.6
| | \--- com.google.guava:guava:18.0 -> 23.3-jre
| | +--- com.google.code.findbugs:jsr305:1.3.9
| | +--- com.google.errorprone:error_prone_annotations:2.0.18
| | +--- com.google.j2objc:j2objc-annotations:1.1
| | \--- org.codehaus.mojo:animal-sniffer-annotations:1.14
| \--- com.squareup:javapoet:1.8.0
Из вышесказанного видно, что androidx.lifecycle:lifecycle-compiler:2.0.0-alpha1
содержит версию 1.0.0-alpha1
из androidx.annotation:annotation
Это означает, что в конце мой модуль app
будет иметь две версии 1.0.0-alpha1
и 1.0.0-rc02
, что приводит к сбою сборки.
Чтобы устранить эту ошибку, я просто удалил транзитивные зависимости, добавив приведенный ниже блок кода в build.gradle моего приложения
configurations {
compile.exclude group: 'androidx.annotation', module: 'annotation'
}
Итак, мое приложениеbuild.gradle будет выглядеть так:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
android {
//bla bla bla
}
configurations {
compile.exclude group: 'androidx.annotation', module: 'annotation'
}
dependencies {
// bla bla bla
}
После этого я просто синхронизировал, очистил и пересобрал свой проект.