transformClassesAndResourcesWithProguardForRelease失败


83

我正在尝试在控制台中使用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构建--stacktrace

这是我收到的异常:

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

该问题的出现是由于该应用的发布配置中启用了pro-guard。因此,解决方案是删除专业防护人员或将指示的代码段放入链接readyandroid.wordpress.com/…中
准备就绪,Android

Answers:


120

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

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

答案发布在这里: 任务':app:transformClassesAndResourcesWithProguardForRelease的执行失败


12
即使这似乎可行,但最好有一个解释。
Drew Szurko '17

23
但这自-keep类* {public private *;以来没有用。会避免混淆您的所有班级,因此在这里请不要使用。
Raghav Sharma

3
上面的代码用于显示原始类后反编译我的apk,而代码无法保护我的apk?
Pankaj Talaviya

29
警告:如果您希望保持代码的私密性,请不要使用此答案。
达卡

另外,使用此功能与旧手机版本不兼容。
red-devil

66

将此代码添加到 ..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是的,您将必须手动创建此文件。
CopsOnRoad

1
就我而言,它确实有效。但我想它被声明为无关紧要的东西。
Dorbag​​na

8

它对我有用,我还必须在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 *;
}

9
警告:如果您想保持自己的代码私密/受保护,请不要使用此答案
Bilal Ahmed'Oct

据我了解,“-keep class *”将基本上关闭混淆和类的删除。如果要执行此操作,您可以轻松地转到build.gradle并将minifyEnabled设置为false并删除proguardFiles行。
FrankKrumnow

现在有没有办法在版本@FrankKrumnow中启用缩小功能?
亚当·赫维兹

亚当我不是捍卫者-捍卫自己,并为此付出很多努力。但是请看看我在那儿的新帖子。它包含一些示例,说明了如何保护某些类组-例如扩展android Views的类。也许这可能是一个起点。
FrankKrumnow

5

我什么都没改变只是评论

// shrinkResources true
// minifyEnabled true

您不想更改浪费了2天后我已经搜索过的所有proguard文件


所有其他建议都失败了,这个建议奏效了。就我而言,由于包含第3方库以及升级到SDK 27,我不得不打开multidex。突然出现此错误。感谢您的回答!
斯蒂芬·麦考密克,

5
minifyEnabled为您的代码启动某种加密。如果您不这么做,黑客的工作将变得更加轻松。在production-apk文件上禁用它很有风险!
Adrian Grygutis

不要使用此解决方案。这是有风险的
杰克

@Gibs有什么风险?
Brijesh Tanwar '18

@Brijesh Tanwar:如果我需要加密怎么办?
杰克

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

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


亲爱的庞 当我生成签名的apk时发生此错误。在我的gradle资深删除的ProGuard那么这个错误删除
阿亚兹·穆罕默德

所有提及的行
Ayaz Muhammad

1

在安装react-native-firebase后尝试在android中构建发布版本时,出现了相同的错误消息。

这些是我遵循的步骤,

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

    ./gradlew assembleRelease

  3. 得到此错误信息。

失败:生成失败,发生异常。

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

    作业失败,请参阅日志以获取详细信息

通过更改android / app / build.gradle中的此代码行解决了此问题

minifyEnabled true

对此

minifyEnabled enableProguardInReleaseBuilds

这是我所做的唯一更改。这个对我有用。



0

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

-keep class * {
public private protected *;
}

要么

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

  • 可以在上面使用它代替保存模糊状态

    -keepnames类* {*;}


拥有这与完全删除proguard相同
cesarmax

0

在Android Studio中,单击“构建”菜单中的“重建项目”。


0

我在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.** { *; }


0

在proguard文件中添加 -ignorewarnings,并仅保留那些不想混淆的类。如果您使用proguard规则,则某些库建议保留其某些类。访问您的图书馆以了解详细信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.