Как исправить ошибку типа программы, которая уже присутствует, когда динамическая функция использует внешнюю зависимость AR

У нас есть сторонний файл aar, который из соображений размера мы решили выделить в отдельную динамическую функцию (модуль). И основное приложение, и динамический модуль используют com.google.code.gson:gson, когда они были в одном модуле, мы удалили нашу зависимость от gson, но теперь нашему основному модулю это нужно.

Сборка проекта в порядке, но когда мы пытаемся собрать пакет (-ы), мы получаем

Ошибка "Тип программы уже присутствует: com.google.gson.FieldNamingPolicy $ 5"

Мы пытались исключить gson из модуля gradle: как в разделах dependencies, так и в android, но безуспешно. это сторонний aar, поэтому у нас нет доступа к его коду или зависимостям.

Главный градиент приложения:

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/ksoap2-android-releases/' }
    mavenCentral()
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 91
        versionName "1.1.91"
        multiDexEnabled true
    }
    buildTypes {
        debug {
            versionNameSuffix "-D"
            matchingFallbacks = ['debug']

        }
        release {
            matchingFallbacks = ['release']
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    packagingOptions {
        pickFirst 'META-INF/license.txt'
        pickFirst 'META-INF/DEPENDENCIES'
    }

    dexOptions {
        javaMaxHeapSize "2g"
    }
    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
        targetCompatibility JavaVersion.VERSION_1_8
    }
    flavorDimensions "permissions"
    productFlavors {
    }
    dynamicFeatures = [":dynamic_feature"]
}

dependencies {
    implementation files('libs/gcm.jar')
    //...
    implementation 'com.google.code.gson:gson:2.8.2'
    //...
}

apply plugin: 'com.google.gms.google-services'

градиент динамической функции:

apply plugin: 'com.android.dynamic-feature'

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }    
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
    }

    configurations {
        //DOES NOT RESOLVE THE PROBLEM
        all*.exclude group: 'com.google.gson'
        all*.exclude group: 'com.google.code.gson'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':myapp')
    //...
    implementation files('libs/sdk.3rd-party.aar')
    configurations {
        //DOES NOT RESOLVE THE PROBLEM
        all*.exclude group: 'com.google.gson'
        all*.exclude group: 'com.google.code.gson'
    }
}

Ошибка:

org.gradle.execution.MultipleBuildFailures: сборка завершена с 1 ошибкой. ... Вызвано: java.lang.RuntimeException: com.android.build.api.transform.TransformException: ошибка при создании основного списка dex: ошибка при слиянии архивов dex: тип программы уже присутствует: com.google.gson.FieldNamingPolicy 5 долларов


comment
Вы должны полагаться на jar / aars? Не могли бы вы заменить эти зависимости зависимостями maven?   -  person Pierre    schedule 21.06.2019
comment
@ Пьер, к сожалению, нет. 'libs/sdk.3rd-party.aar' - это внешняя третья сторона, предоставленная «как есть», которая недоступна в maven. Мы можем построить его вместе или по отдельности. все работает нормально. но мы не можем собрать его как пакет, поэтому мы не можем опубликовать его в Google Play.   -  person Snufkin    schedule 22.06.2019
comment
Вы можете попробовать удалить зависимость gson, поскольку она, кажется, уже включена в этот сторонний файл aar.   -  person Pierre    schedule 22.06.2019
comment
@Pierre, когда две модели были вместе (как один базовый модуль), это именно то, что я сделал. Но поскольку мы разделили его на 2 модуля: базовый (основное приложение) и динамическая функция, базовому модулю нужен gson, и он не может использовать «необязательную» функцию. Проект не будет «построен», если я удалю зависимость gson от базового модуля. Спасибо за помощь!! Я действительно застрял больше чем на неделю ...   -  person Snufkin    schedule 23.06.2019
comment
У вас есть только два варианта: либо поместить этот aar как зависимость базового модуля, либо исключить gson из aar (и вместо этого пометить его как зависимость времени выполнения).   -  person Pierre    schedule 23.06.2019
comment
Еще один вариант на самом деле - защитить библиотеку gson в aar, чтобы имена классов были запутаны и не конфликтовали с другой библиотекой gson в вашем базовом модуле.   -  person Pierre    schedule 23.06.2019
comment
@Pierre, мы создали новый модуль, чтобы удалить этот aar из нашего основного приложения, поскольку он относительно большой и большинство наших пользователей не используют его функции. Что касается двух других вариантов: runtime files('libs/sdk.3rd-party.aar') дает нам ошибку (Не удалось найти метод runtime () для аргументов [сборник файлов]) относительно защиты: как мы защищаем конкретную библиотеку в aar? Спасибо!!   -  person Snufkin    schedule 26.06.2019
comment
Это совсем другой вопрос о синтаксисе Gradle, на который, к сожалению, я не могу ответить.   -  person Pierre    schedule 26.06.2019