【问题标题】:transformClassesAndResourcesWithProguardForRelease FAILEDtransformClassesAndResourcesWithProguardForRelease 失败
【发布时间】:2017-05-18 04:07:41
【问题描述】:

我正在尝试在控制台中使用 Gradle 构建我的 Android 应用程序。 但是收到关于任务':app:transformClassesAndResourcesWithProguardForRelease'的错误:

build.gradle:

buildscript {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

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

task clean(type: Delete) {
    delete rootProject.buildDir
}

app/build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion '24.0.2'
    defaultConfig {
        applicationId "com.XXX.XXX"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 1
        versionName "0.1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile('com.squareup.retrofit2:retrofit:2.1.0') {
        exclude module: 'okhttp'
    }
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    compile 'com.squareup.retrofit2:converter-moshi:2.1.0'
    compile 'moe.banana:moshi-jsonapi:2.2.0'
    compile 'com.squareup.moshi:moshi-adapters:1.3.1'
    compile 'com.google.android.gms:play-services-maps:9.6.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.google.firebase:firebase-core:9.6.0'
    compile 'com.google.firebase:firebase-crash:9.6.0'
    testCompile 'junit:junit:4.12'
}

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

gradle-wrapper.properties

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

./gradlew build --stacktrace

这是我收到的异常:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task
':app:transformClassesAndResourcesWithProguardForRelease'.

【问题讨论】:

  • 此问题是由于应用程序的发布配置中启用了 pro-guard 所致。所以解决办法是要么去掉pro-guard,要么把指定的sn-p代码放到链接readyandroid.wordpress.com/…

标签: android gradle android-gradle-plugin build.gradle proguard


【解决方案1】:

尝试将此代码添加到您的 proGuard 规则中,它对我有用

-ignorewarnings
-keep class * {
    public private *;
}

答案张贴在这里: Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease

【讨论】:

  • 尽管这似乎可行,但最好能有一个解释。
  • 但这没有用,因为 -keep class * { public private *;将使您的所有课程免于混淆,因此在这里没有用处。
  • 在显示原始类和代码不保护我的 apk 后,您的代码用于我的 apk 反编译???
  • 警告:如果您希望将代码保密,请勿使用此答案。
  • 另外,使用它会使旧手机版本不兼容。
【解决方案2】:

将此代码添加到..your-project/app/proguard-rules.pro

 -ignorewarnings

您的签名 apk 将成功生成...

更新:

最好使用-dontwarn-keep 修复您的警告消息 proguard-rules.pro 上的键...因为如果您在代码中使用(可能是您的库)java 反射,应用程序将崩溃...

【讨论】:

  • @Richi,我没有 proguard-rules.pro 文件。我应该手动创建一个吗?看起来我正在运行时生成release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard.cfg' }
  • @AdamHurwitz 是的,您必须手动创建此文件。
  • 它在我的情况下是有效的。但我想它被声明为无关紧要的东西。我的意思是你可能会得到发布 apk,但真正的问题仍然存在。
【解决方案3】:

它对我有用,我还必须在 pro-gaurd.txt 文件中添加以下内容

#### -- Picasso --
 -dontwarn com.squareup.picasso.**

 #### -- OkHttp --

 -dontwarn com.squareup.okhttp.internal.**

 #### -- Apache Commons --

 -dontwarn org.apache.commons.logging.**

     -ignorewarnings 
-keep class * {
public private protected *;
}

【讨论】:

  • 警告:如果您想让您的代码保密/受保护,请不要使用此答案
  • 据我了解,“-keep class *”基本上会关闭混淆和删除类。如果您想这样做,您可以轻松转到 build.gradle 并将 minifyEnabled 设置为 false 并删除 proguardFiles 行。
  • 现在有没有办法在 @FrankKrumnow 版本中启用缩小?
  • Adam 我不是前卫——我自己也很亲,并且为此奋斗了很多。但是请看看我在那里的新帖子。它包含如何保护某些类组的示例 - 例如扩展 android 视图的类。也许这可以成为一个起点。
【解决方案4】:

我什么都没改变,只是评论

// shrinkResources true
// minifyEnabled true

你不想更改我在浪费 2 天后已经搜索过这个问题的任何 proguard 文件

【讨论】:

  • 其余的建议都失败了,这个可行。在我的情况下,由于包含 3rd 方库,以及升级到 SDK 27,我不得不打开 multidex。这个错误突然出现了。感谢您的回答!
  • minifyEnabled 为您的代码启动某种加密。如果您不继续这样做,黑客的工作会更轻松。在生产 apk 文件中禁用它是非常危险的!
  • 不要使用这个解决方案。这是有风险的
  • @Gibs 这有什么风险?
  • @Brijesh Tanwar:如果我需要加密怎么办??
【解决方案5】:
buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'),
                'proguard-rules.pro'
    }
}

请在您的 gradle 中删除上述代码。这对我有用。 这仅适用于给定的问题。

【讨论】:

  • 亲爱的庞。此错误发生在我生成签名的 apk 时。我的高级删除 proguard 在 gradle 然后这个错误被删除了
  • 所有提到的行
【解决方案6】:

我在安装react-native-firebase 后尝试在android 中构建发布版本时收到相同的错误消息。

这些是我遵循的步骤,

  1. 执行他们在 react-native-firebase 文档中提到的所有配置。
  2. 使用此命令构建一个 android 应用

    ./gradlew assembleRelease

  3. 收到此错误消息。

FAILURE:构建失败并出现异常。

  • 出了什么问题:任务 ':app:transformClassesAndResourcesWithProguardForRelease' 执行失败。

    作业失败,查看日志了解详情

通过在 android/app/build.gradle

中更改此代码行解决了这个问题
minifyEnabled true

到这里

minifyEnabled enableProguardInReleaseBuilds

这是我做的唯一改变。它对我有用。

【讨论】:

    【解决方案7】:

    由于来自 Android 的警告而遇到此问题
    见评论: https://github.com/flutter/flutter/issues/40218#issuecomment-531047713

    将以下规则添加到 /android/app/proguard-rules.pro:
    -dontwarn android.**

    【讨论】:

      【解决方案8】:

      在“proguard-rules.pro”中使用此代码可能会得到解决。

      -keep class * {
      public private protected *;
      }
      

      -keep class * {*;}
      
      • 注意:以上命令忽略混淆

      • 可以在上面使用它来保存混淆状态

        -keepnames 类 * {*;}

      【讨论】:

      • 拥有这个就等同于完全移除proguard
      【解决方案9】:

      在 Android Studio 中,点击“Build”菜单中的“Rebuild Project”。

      【讨论】:

        【解决方案10】:

        我已经在 proguard-rules.pro 上苦苦挣扎了很长一段时间,但我绝不是专业人士! 我发布我的文件是为了表明你不应该 -keep class * 没有任何参数,因为这会关闭所有混淆。但是,您可以保护从某个类或实现某个接口的任何类扩展的每个类。您还可以保护任何具有具有特定元素的构造函数的类。 请注意,我没有评论每一行,因为我不是 100% 确定一切都做了什么——这更像是一个有根据的猜测。 我的项目包括 ksoap2(okhttp3、okio、XmlPull),这就是许多规则的用途。

        也许这可以成为您的起点 - 您可能仍需要为您的课程添加一些额外的规则。

        -android
        -dontpreverify
        -repackageclasses ''
        -allowaccessmodification
        -optimizations !code/simplification/arithmetic
        -keepattributes *Annotation*
        -renamesourcefileattribute SourceFile
        -keepattributes SourceFile,LineNumberTable
        
        -keep public class * extends android.app.Activity
        -keepclasseswithmembers class * extends com.way4net.oner.lifa.plugin.ThemedFragment
        -keepclasseswithmembers class * extends com.way4net.oner.lifa.plugin.ThemedActivity
        -keep public class * extends android.app.Application
        -keep public class * extends android.app.Service
        -keep public class * extends android.content.BroadcastReceiver
        -keep public class * extends android.content.ContentProvider
        -keepattributes Signature #there were 1 classes trying to access generic signatures using reflection emfehlung von proguard selbst
        
        -keep public class * extends android.view.View {
              public <init>(android.content.Context);
              public <init>(android.content.Context, android.util.AttributeSet);
              public <init>(android.content.Context, android.util.AttributeSet, int);
              public void set*(...);
        }
        
        -keepclasseswithmembers class * {
             public <init>(android.content.Context, android.util.AttributeSet);
         }
        
        -keepclasseswithmembers class * {
            public <init>(android.content.Context, android.util.AttributeSet, int);
        }
        
        -keepclassmembers class * extends android.content.Context {
            public void *(android.view.View);
            public void *(android.view.MenuItem);
        }
        
        -keepclassmembers class * implements android.os.Parcelable {
            static ** CREATOR;
        }
        
        -keepclassmembers class **.R$* {
            public static <fields>;
        }
        
        -keepclassmembers class * {
            @android.webkit.JavascriptInterface <methods>;
        }
        
        -dontwarn okhttp3.**
        -dontwarn okio.**
        -dontwarn android.support.v4.**
        #-dontwarn javax.annotation.**
        #-dontwarn org.xmlpull.v1.**
        -dontnote android.net.http.*
        -dontnote org.apache.commons.codec.**
        -dontnote org.apache.http.**
        -dontnote okhttp3.**
        -dontnote org.kobjects.util.**
        -dontnote org.xmlpull.v1.**
        -keep class okhttp3.** {
              *;
         }
        
        -keep class org.xmlpull.v1.XmlSerializer {
            *;
        }
        -keep class org.xmlpull.v1.XmlPullParser{
            *;
        }
        -dontwarn org.xmlpull.v1.XmlPullParser
        
        -keep class org.xmlpull.v1.XmlSerializer {
            *;
        }
        -dontwarn org.xmlpull.v1.XmlSerializer
        
        -keep class org.kobjects.** { *; }
        -keep class org.ksoap2.** { *; }
        -keep class okio.** { *; }
        -keep class org.kxml2.** { *; }
        -keep class org.xmlpull.** { *; }

        【讨论】:

          【解决方案11】:

          添加 -忽略警告 在你的 proguard 文件中,只保留那些你不想混淆的类。 如果您正在使用,一些库建议保留他们的一些类 保护规则。访问您的图书馆了解详情

          【讨论】:

            【解决方案12】:

            将此行添加到 gradle 属性中

            android.enableR8=true
            

            【讨论】:

            • 嗨,安贝什。感谢您的回答。通常那里更欢迎带有解释的答案。您想为您的答案添加解释吗?您也可以改进答案的格式。
            猜你喜欢
            • 2019-09-29
            • 2017-08-29
            • 2016-06-16
            • 2016-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多