Gradle 构建失败

Gradle Build Failure

我的项目在调试模式下编译和执行良好,但当我尝试生成签名的 apk 时,出现错误。这出现在消息日志中:

:app:proguardRelease
Warning:android.support.v4.app.DialogFragment: can't find referenced class android.support.v4.app.DialogFragment$DialogStyle
Warning:android.support.v4.app.FragmentTransaction: can't find referenced class android.support.v4.app.FragmentTransaction$Transit
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$ResolvedLayoutDirectionMode
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$LayoutDirectionMode
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$LayerType
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$AccessibilityLiveRegion
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$ImportantForAccessibility
Warning:android.support.v4.view.ViewCompat: can't find referenced class android.support.v4.view.ViewCompat$OverScroll
Warning:android.support.v4.widget.DrawerLayout: can't find referenced class android.support.v4.widget.DrawerLayout$EdgeGravity
Warning:android.support.v4.widget.DrawerLayout: can't find referenced class android.support.v4.widget.DrawerLayout$LockMode
Warning:android.support.v4.widget.DrawerLayout: can't find referenced class android.support.v4.widget.DrawerLayout$State
Warning:there were 11 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)
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.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:dexRelease UP-TO-DATE
:app:crashlyticsStoreDeobsRelease
:app:crashlyticsUploadDeobsRelease
:app:validateExternalOverrideSigning
:app:packageRelease FAILED
Error:Execution failed for task ':app:packageRelease'.
> Unable to compute hash of /home/kombo/RAL/Mpasho/app/build/intermediates/classes-proguard/release/classes.jar

我已经尝试了所有可能的补救方法,方法是更新我的构建工具,使用最新的 gradle 版本,检查所有依赖项,但错误仍然出现。

我很确定项目中存在 v4 支持库,因为在调试模式下不会出现错误。

默认的 ProGuard 文件已经有一个忽略支持库警告的规则。如果你没有它,你可以添加到你的文件

-dontwarn android.support.**

但最好添加默认的。参见 Proguard configuration@Android Developers

原来我省略了 proguard 文件中的 getDefaultProguardFile('proguard-android.txt') 行,只是使用了 proguard-rules.pro

我在升级与 23 相关的所有内容(Android 库、SDK 等)时也遇到了这个问题。

这个 proguard 配置为我修复了它:

-dontwarn org.apache.http.**
-dontwarn android.net.http.AndroidHttpClient
-dontwarn com.google.android.gms.**
-dontwarn com.android.volley.toolbox.**

Source

在混淆器中添加了这两行

-dontwarn android.net.http.AndroidHttpClient
-dontwarn com.google.android.gms.**

而且有效..

与项目中使用的库有关

这也可能是由于 errors/warnings 与包含的 .jar 文件相关 检查 proguard warnings/errors 的构建输出。

我遇到了与 opencsv jar 文件相关的问题。 Lakedaemon 在上述评论中的提示帮助了我并解决了问题。

我认为你的应用程序 build.gradle buildTypes > release > minifyEnabled is true

这导致您收到此错误消息。

避免此错误消息,设置buildTypes > release > minifyEnabled is false


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

尝试在整个错误消息中查找。它可能包含您两次包含库的信息。这是我的问题,在删除重复的包含后已修复。

尝试在您的 proguard-rules.pro 中添加此代码:

-ignorewarnings 

它解决了我的问题。