DexArchiveMergerException仅在发布时发布

Ben*_*aci 8 android build gradle swagger android-studio

我开发了一个使用swagger生成的Java客户端的应用程序.客户端位于名为"api"的项目中,而应用程序位于名为"app"的项目中.

当我通过Build/Make Project一切正常建立应用程序.此外,当我尝试在模拟或物理设备上运行应用程序时Run/Run 'app'.运行调试器也可以.即使我通过构建项目Buid/Generate Signed Bundle/APK并选择调试选项,它也可以工作.

现在.当我尝试创建签名版本构建时,构建失败.以下消息显示:

引起:java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:合并dex存档时出错:[...]\app\build\intermediates\transforms\dexBuilder\release\54,[...]\app\build\intermediates\transforms\externalLibsDexMerger\release\0,[...]\app\build\intermediates\transforms\dexBuilder\release\52.jar,[...]\app\build\intermediates\transforms\dexBuilder \发布\ 53.jar


引起:com.android.builder.dexing.DexArchiveMergerException:合并dex存档时出错:[...]\app\build\intermediates\transforms\dexBuilder\release\54,[...]\app\build\intermediates\transforms\externalLibsDexMerger\release\0,[...]\app\build\intermediates\transforms\dexBuilder\release\52.jar,[...]\app\build\intermediates\transforms\dexBuilder\release\53 .罐


引起:com.android.tools.r8.CompilationFailedException:编译未能完成


引起:com.android.tools.r8.utils.AbortException:错误:程序类型已存在:io.swagger.client.ApiCallback

我很擅长使用android-studio和gradle进行开发,所以可以在这里随意期待初学者的错误.我在Stackoverflow上尝试了一些已经建议添加一些库的解决方案,但到目前为止,它们都没有解决我的问题.

对我来说,它特别怀疑最后一条错误消息指向io.swagger.client.ApiCallback.

这与settings.gradle"api"和"app"都具有相同内容的事实有什么关系吗?两者都是这样的: rootProject.name = "swagger-java-client".这是文件中唯一的一行,但据我所知,settings.gradle"app"已经说明了该内容.我不记得改变它,这对我来说很奇怪它显示"swagger-java-client".这是正常的吗?

更新1: 评论中提到ProGuard可能是个问题.这是我能找到的唯一发现,引用它.在我build.gradle的"app"项目中,有这一部分:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,删除它并没有改变任何东西.

更新2:

搜索"io.swagger"时AS只发现这个: 只找到一场比赛

搜索"io.swagger.client.ApiCallback"AS时,只发现这个: 只找到一场比赛

更新3:

正如所建议的,我尝试添加

android {
    defaultConfig {
        multiDexEnabled true
    }
}
Run Code Online (Sandbox Code Playgroud)

并添加,android.enableD8 = false但也没有帮助.

这是我的build.gradle-Files(第一个引起问题的文件,没有我迄今为止尝试过的建议更正.)

build.gradle(Module:api)(由swagger生成):

apply plugin: 'idea'
apply plugin: 'eclipse'

group = 'io.swagger'
version = '1.0.0'

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}

repositories {
    jcenter()
}


if(hasProperty('target') && target == 'android') {

    apply plugin: 'com.android.library'
    apply plugin: 'com.github.dcendents.android-maven'

    android {
        compileSdkVersion 25
        buildToolsVersion '25.0.2'
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 25
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }

        // Rename the aar correctly
        libraryVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.aar')) {
                    def fileName = "${project.name}-${variant.baseName}-${version}.aar"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }

        dependencies {
            provided 'javax.annotation:jsr250-api:1.0'
        }
    }

    afterEvaluate {
        android.libraryVariants.all { variant ->
            def task = project.tasks.create "jar${variant.name.capitalize()}", Jar
            task.description = "Create jar artifact for ${variant.name}"
            task.dependsOn variant.javaCompile
            task.from variant.javaCompile.destinationDir
            task.destinationDir = project.file("${project.buildDir}/outputs/jar")
            task.archiveName = "${project.name}-${variant.baseName}-${version}.jar"
            artifacts.add('archives', task);
        }
    }

    task sourcesJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
        classifier = 'sources'
    }

    artifacts {
        archives sourcesJar
    }

} else {

    apply plugin: 'java'
    apply plugin: 'maven'

    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7

    install {
        repositories.mavenInstaller {
            pom.artifactId = 'swagger-java-client'
        }
    }

    task execute(type:JavaExec) {
       main = System.getProperty('mainClass')
       classpath = sourceSets.main.runtimeClasspath
    }
}

dependencies {
    compile 'io.swagger:swagger-annotations:1.5.21'
    compile 'com.squareup.okhttp:okhttp:2.7.5'
    compile 'com.squareup.okhttp:logging-interceptor:2.7.5'
    compile 'com.google.code.gson:gson:2.8.2'
    compile 'org.threeten:threetenbp:1.3.5'
    testCompile 'junit:junit:4.12'
}
Run Code Online (Sandbox Code Playgroud)

build.gradle(模块:app):

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "projectName"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "0.1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation fileTree(dir: '../api/build/libs', include: ['*.jar'])
    implementation 'com.google.code.gson:gson:2.8.2'
    implementation 'com.squareup.okhttp:okhttp:2.7.5'
    api project(path: ':api')
    implementation 'com.crashlytics.sdk.android:crashlytics:2.9.8'
    implementation 'org.jetbrains:annotations-java5:15.0'
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*aci 0

我找到了我的问题的答案:

\n\n

我所做的是创建 swagger 客户端,将创建的文件夹移动到我的项目中,相应地调整settings.gradle文件和build.gradle文件。

\n\n
\n\n

什么地方出了错

\n\n

按照我配置的方式,gradle 将构建 \xc2\xb4api\xc2\xb4 项目,然后构建该app项目。\n出于某种原因,当我将其配置为 时release,该app项目引用了该项目的代码api以及生成的.jar文件。Program type already present那就是来自的地方。

\n\n
\n\n

我是如何修复它的

\n\n
    \n
  • apiapp项目中排除该项目
  • \n
  • api单独构建
  • \n
  • 获取生成的.jar文件并将其放入app名为的文件夹内的文件夹中libs
  • \n
  • 将此行放入您gradle dependenciesbuild.gradle (Module: app)implementation fileTree(dir: 'libs', include: ['*.jar'])
  • \n
\n\n

.jar这包括项目中的完成文件app,现在我可以构建版本。无论如何都应该这样做,因为无论如何都不应该编辑 swagger 客户端,因为它是生成的代码。因此,即使只是不总是构建项目的这一部分,也应该这样做。

\n\n

release但是,我仍然不完全理解为什么构建和构建之间存在这种差异debug。如果对此有任何见解,我会很高兴。

\n\n
\n\n

编辑:附加信息

\n\n

我刚刚发现:如果出于某种原因,我想将 保留在我的项目中,我可以通过删除 my 中以 开头的Module: api两个依赖项来实现。\napi 项目已包含在依赖项中。文件树行是导致这里问题的原因,因为它们是多余的。Module: appimplementation fileTreeapi project(path: ':api')

\n\n

debug但是,仍然不知道为什么和之间存在差异release

\n