Ошибка [DuplicatePlatformClasses] конфликт класса при сборке релиза на сохранении комнаты

Я использовал это руководство для обеспечения постоянства с помощью Room в своем приложении для Android: https://developer.android.com/training/data-storage/room/index.html

и добавлены зависимости, как показано здесь: https://developer.android.com/topic/libraries/architecture/adding-components.html

когда я создаю отладочную версию и отправляю ее на телефон, все работает нормально.

Когда я создаю APK с подписанным релизом, я получаю это сообщение об ошибке:

Error:Error: json defines classes that conflict with classes now provided by Android. Solutions include finding newer versions or alternative libraries that don't have the same problem (for example, for httpclient use HttpUrlConnection or okhttp instead), or repackaging the library using something like jarjar. [DuplicatePlatformClasses]

мой app.gradle:

apply plugin: 'com.android.application'

android {
    signingConfigs {
        /* TODO(developer): Configure to sign app with a release key for testing.
        release {
            storeFile file('path/to/release/signing/key')
            keyAlias 'release_key_alias'
            keyPassword "${password}"
            storePassword "${password}"
        }*/
    }
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "myappid"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 10
        versionName "1.8"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // TODO(developer): uncomment below once config above is complete and uncommented.
            //signingConfig signingConfigs.release

        }
    }
}
configurations {
    all {
        exclude module: 'httpclient'
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.1.0'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.volley:volley:1.0.0'
    compile 'com.github.nkzawa:socket.io-client:0.3.0'
    compile 'io.socket:socket.io-client:0.8.3'
    compile 'com.android.support:design:26.1.0'
    compile 'android.arch.persistence.room:runtime:1.0.0'
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
}

мой проект.градле

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        //classpath 'io.socket:socket.io-client:0.8.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
ext{
    roomVersion = '1.0.0'
}
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

Кто-нибудь может помочь или подсказать?


person Romeo    schedule 16.11.2017    source источник
comment
Вы проверили это? stackoverflow.com/a/47023811/2910520. Опубликуйте свое приложение и проект build.gradle, если не можете найти решение   -  person MatPag    schedule 16.11.2017
comment
я сделал это, но это не работает.   -  person Romeo    schedule 17.11.2017
comment
добавлены файлы градиента   -  person Romeo    schedule 17.11.2017


Ответы (4)


Наконец я обнаружил, что проблема заключается в подмодуле JSON:

compile 'com.github.nkzawa:socket.io-client:0.3.0'

эта библиотека имеет подмодуль:

org.json:json

который теперь конфликтует с собственным модулем Android, потому что в других моих зависимостях я не могу найти этот модуль. 10 дней назад работал нормально. Мне также пришлось убить это:

compile 'io.socket:socket.io-client:0.8.3'

окончательное решение состояло в том, чтобы добавить исключение для модуля и изменить строку следующим образом:

    implementation ('com.github.nkzawa:socket.io-client:0.3.0',{
         exclude group:'org.json', module:'json'
    })

Я также заметил ПОСЛЕ того, как я решил проблему, что в журнале ошибок мне предлагался модуль, который был в конфликте, но даже если я прочитал его сто раз, я не заметил раньше: введите здесь описание изображения

так что, возможно, Google или Intellij могли бы улучшить написание этих ошибок...

Чтобы обнаружить этот модуль ошибки дублирования конфликта класса, я обнаружил, что лучший способ продолжить - создать новый проект и вставить зависимости в app build.gradle и проверить их одну за другой или с помощью «dividi et impera», возможно, это очевидное предложение для кого-то, но я хотел бы иметь его раньше.

person Romeo    schedule 18.11.2017
comment
Как вы обнаружили, что проблема связана с подмодулем JSON? - person Sergio Magoo Quintero; 23.02.2018
comment
Просто столкнулся с той же проблемой, чтобы найти проблемную библиотеку, вы можете запустить ./gradlew app:dependencies, после чего это решение сработало для меня. - person rotemitz; 01.03.2018
comment
@SergioMagooQuintero json было именем подмодуля (в моем случае), ошибка предлагала это, но я не заметил, потому что он говорит ... Ошибка: json определяет ... вместо «... Ошибка: json определяет ... ' - person Romeo; 12.03.2018
comment
Спасибо 4 ответ, действительно полезный, потому что я был в такой же ситуации. Вы нашли какую-либо команду gradlew или аналогичную, которая дает вам все конфликты ClassName? (Я пытался использовать зависимости gradlew, но это просто дает вам 10 тысяч зависимостей без конфликтов и имен классов зависимостей). Спасибо, LOL. В любом случае, иногда Android заставляет меня скучать только по back-end/front-end разработке. Я имею в виду, чувак... Так много ошибок напрасно и так много изменений в каждом выпуске Android :/ (и иногда очень мало информации об отладке сборки) - person Z3R0; 27.01.2020

У меня была та же проблема, и я искал конфликт через дерево зависимостей gradle:

gradlew app:dependencies

Затем я исключил модуль json для конфликтующей библиотеки:

implementation ('<conflicting-library>',{
     exclude group:'org.json', module:'json'
})
person Manuel Schmitzberger    schedule 15.11.2019

Как найти дубликат библиотеки.

откройте окно запуска gradle и выполните такую ​​команду:

gradle module-name:dependencies

«имя модуля» должно быть именем модуля вашего приложения, для меня это «osmunda-demo».

Скриншот

затем используйте Ctrl+F для поиска "commons-logging", вы его найдете.

введите здесь описание изображения

person Sun Jiao    schedule 04.05.2020

@Romeo предложил действительно отличный момент. Не мог отлаживать код часами. Проблема заключается в зависимостях, которые импортируются в build.gradle. Это может быть ваш собственный sdk/artifact. У меня были проблемы с моей собственной библиотекой, которая использует jjwt. Я добавил исключение в свой SDK, но вам придется добавлять его снова при каждом использовании SDK. Обязательно добавьте exclude group: 'org.json', module: 'json' в свою реализацию артефакта.

person Kunal Yelne    schedule 17.05.2021
comment
Он не отвечает на вопрос, поэтому его не следует публиковать как вопрос. Я понимаю, что вы дополняете ответ полезной информацией, но это просто дополнение, поэтому его следует добавить в качестве комментария к принятому ответу. Пожалуйста, ознакомьтесь с этим, чтобы узнать больше о том, как написать хороший ответ. - person Iogui; 17.05.2021