【问题标题】:Unable to sign release APK - :app:shrinkReleaseMultiDexComponents FAILED无法签署发布 APK - :app:shrinkReleaseMultiDexComponents FAILED
【发布时间】:2015-12-28 03:04:55
【问题描述】:

我正在尝试生成已签名的 apk,但日志一直显示以下错误:

:app:compileReleaseJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileReleaseNdk UP-TO-DATE
:app:compileReleaseSources
:app:collectReleaseMultiDexComponents
:app:proguardRelease
Warning:com.google.android.gms.internal.zzac: can't find referenced class android.net.http.AndroidHttpClient
Warning:com.google.android.gms.internal.zzw: can't find referenced method 'void addHeader(java.lang.String,java.lang.String)' in program class com.google.android.gms.internal.zzw$zza
Warning:com.google.android.gms.internal.zzw$zza: can't find referenced method 'void setURI(java.net.URI)' in program class com.google.android.gms.internal.zzw$zza
Warning:com.ironsource.mobilcore.j: can't find referenced method 'void setLatestEventInfo(android.content.Context,java.lang.CharSequence,java.lang.CharSequence,android.app.PendingIntent)' in library class android.app.Notification
Warning:com.mopub.volley.toolbox.HttpClientStack: can't find referenced method 'void addHeader(java.lang.String,java.lang.String)' in program class com.mopub.volley.toolbox.HttpClientStack$HttpPatch
Warning:com.mopub.volley.toolbox.HttpClientStack$HttpPatch: can't find referenced method 'void setURI(java.net.URI)' in program class com.mopub.volley.toolbox.HttpClientStack$HttpPatch
Warning:com.mopub.volley.toolbox.Volley: can't find referenced class android.net.http.AndroidHttpClient
Warning:there were 4 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning:there were 4 unresolved references to program class members.
         Your input classes appear to be inconsistent.
         You may need to recompile the code.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)
Warning:there were 1 unresolved references to library class members.
         You probably need to update the library versions.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
Exception while processing task 
java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:473)
    at proguard.ProGuard.initialize(ProGuard.java:233)
    at proguard.ProGuard.execute(ProGuard.java:98)
    at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074)
    at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:139)
    at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:115)
    at com.android.builder.tasks.Job.runTask(Job.java:48)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227)
    at java.lang.Thread.run(Thread.java:745)
:app:shrinkReleaseMultiDexComponents FAILED
Error:Execution failed for task ':app:shrinkReleaseMultiDexComponents'.
> java.io.IOException: The output jar [<project_path>\app\build\intermediates\multi-dex\release\componentClasses.jar] must be specified after an input jar, or it will be empty.

下面是我的应用级 build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.my.app"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 25
        versionName "2.5"

        // Enabling multidex support.
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dexOptions {
        incremental true
        javaMaxHeapSize "2048M"
    }
}

repositories {
    mavenCentral()
    maven { url "https://jitpack.io" }
}

dependencies {
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.google.android.gms:play-services:8.1.0'
    compile 'com.google.code.gson:gson:2.3.1'
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.facebook.android:facebook-android-sdk:4.2.0'
    compile 'me.dm7.barcodescanner:zxing:1.7.2'
    compile 'de.hdodenhof:circleimageview:1.3.0'
    compile 'com.scottyab:secure-preferences-lib:0.1.3'
    compile 'com.soundcloud.android:android-crop:1.0.0@aar'
    compile('com.afollestad.material-dialogs:core:0.8.1.0@aar') {
        transitive = true
    }
    compile('com.mopub:mopub-sdk:3.13.0@aar') {
        transitive = true
    }
    compile project(':android-support-v4-preferencefragment')
    compile project(':circular_progress_bar')
    compile files('libs/mobilecore_V1.1.jar')
    compile files('libs/libAdapterSDKMoPub.jar')
    compile files('libs/adcolony.jar')
}

还有我的* build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

我尝试过使用其他版本的 gradle,例如 1.4.0-beta1', 1.4.0-beta2,而 1.3.1 仍然没有运气。

【问题讨论】:

  • 显而易见:app-level build.gradle : multiDexEnabled true 中的行导致了问题。
  • 您有解决方案吗?因为超过了 65k 限制,我必须启用 multiDex
  • 我希望能帮上忙,但我对 multiDex 一无所知,抱歉。希望您能尽快找到解决方案。
  • 嘿@Lancelot 你找到解决方案了吗...我有同样的问题

标签: android gradle apk proguard


【解决方案1】:

在你的追踪中有一些信息——

警告:有 4 个未解析的类或接口引用。 您可能需要添加缺少的库 jar 或更新它们的版本。 如果您的代码在没有缺少类的情况下工作正常,则可以抑制 带有“-dontwarn”选项的警告。 (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)

您的问题至少有一部分是 AndroidHttpClient 已在 API 23 中删除,并且您的至少一个库依赖于它。你有三个选择。

1) 您可以在build.gradle 文件中包含以下内容。其中包括您的 apk 中的旧库。见Apache HTTP Client Removal

android {
    useLibrary 'org.apache.http.legacy'
}

2) 您可以降低您的目标并将 sdk 编译为 22 而不是 23。这应该允许您编译,或者至少解决 AndroidHttpClient 问题,直到库更新为不需要它。

3) 您可以将-dontwarn 命令添加到您的 proguard 文件中,以抑制警告以获取构建。如文档中所述,如果您不确定可以安全地忽略警告,这可能会很危险。我不确定忽略因删除 HttpClient 和相关类而引起的警告是否安全。在 M 上运行时可能会导致构建不稳定,但对于 L 及更低版本应该是安全的,因为这些类存在于该 API 级别的设备上。

添加: 对于遇到同样问题的人,请记住,您必须将依赖项中的 builToolsVersioncom.android.support 降低到 22.0.1

【讨论】:

  • 我遇到了这个问题。确保您使用的是更新版本的库,因为它们可能已经不使用 Apache Http。
【解决方案2】:

这是一个很容易解决的问题。当您开发应用程序并在中间某个地方更新您的 SDK 时,问题就出现了。这很好,但你不知道你项目的 gradle 配置应该是最新的。所以只需创建一个新项目并查看您的classpath,我的项目中是com.android.tools.build:gradle:1.3.1,但现在新项目的类路径是classpath 'com.android.tools.build:gradle:1.5.0'。要考虑的另一件事是compileSdkVersionbuildToolsVersiontargetSdkVersion。您还应该检查您的库版本是否是最新的。您只需打开 SDK 管理器即可找到它们的版本。 所以总结一下: 这是您的项目 gradle 应该更新的内容:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0' //update this section to the lates gradle core available
    }
}

这是 gradle 模块级文件中应该更新的部分:

android {
    compileSdkVersion 23 // update this one
    buildToolsVersion "23.0.2" // update this one

    defaultConfig {
        applicationId "ranjbar.hadi.something"
        minSdkVersion 14
        targetSdkVersion 23 // update this one
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
}

希望对你有帮助

【讨论】:

  • 请不要发帖duplicate answers。相反,请针对特定问题调整您的每个答案。如果您有必要的声誉积分,您可以在适当的情况下将问题作为重复的flagvote-to-close
  • @Kyll 好的,下次我会尝试将用户推荐给我的答案链接