transformClassesAndResourcesWithProguardForRelease FAILED


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 활성화로 인해 발생합니다. 따라서 해결책은 pro-guard를 제거하거나 링크에 표시된
Ready Android

답변:


120

이 코드를 proGuard 규칙에 추가해보세요.

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

답변은 여기에 게시되었습니다. ': app : transformClassesAndResourcesWithProguardForRelease 작업에 대한 실행 실패


12
이것이 작동하는 것처럼 보이지만 설명이 있으면 좋을 것입니다.
Drew Szurko 2017 년

23
그러나 이것은 -keep class * {public private *; 이후로 쓸모가 없습니다. 모든 클래스가 난독 화되지 않도록 보호하므로 여기서 사용하지 마십시오.
Raghav Sharma

3
내 apk에 사용 된 코드 위에 원래 클래스를 표시하고 내 apk를 보호하지 않는 코드가 디 컴파일되었습니다. ??
Pankaj Talaviya

29
경고 : 코드를 비공개로 유지하려면이 답변을 사용하지 마십시오.
daka

또한 이것을 사용하면 이전 전화 버전과 호환되지 않습니다.
red-devil

65

이 코드를 추가 ..your-project/app/proguard-rules.pro

 -ignorewarnings

서명 된 APK가 성공적으로 생성됩니다 ...

업데이트 :

-dontwarn또는 -keep 키를 사용하여 경고 메시지를 수정하는 것이 좋습니다 proguard-rules.pro. 왜냐하면 코드에서 자바 리플렉션 을 사용하면 애플리케이션이 충돌하기 때문입니다.


@Richi, proguard-rules.pro 파일 이 없습니다 . 수동으로 만들어야합니까? 내가 런타임에 발생하고있어 것 같습니다release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard.cfg' }
아담 Hurwitz가에게

@AdamHurwitz 예,이 파일을 수동으로 만들어야합니다.
CopsOnRoad

1
내 경우에는 효과가 있었지만 관련없는 것으로 선언 된 것 같습니다. 릴리스 APK를 얻을 수 있지만 실제 문제는 여전히 존재합니다.
Dorbagna

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
경고 : / 개인 보호 코드를 유지하려는 경우이 답변을 사용하지 마십시오
비랄 아메드

내가 이해했듯이 "-keep class *"는 기본적으로 클래스의 난독 화 및 제거를 해제합니다. 이렇게하려면 쉽게 build.gradle로 이동하여 minifyEnabled를 false로 설정하고 proguardFiles 줄을 제거 할 수 있습니다.
FrankKrumnow

@FrankKrumnow 릴리스에서 축소를 활성화하는 방법이 있습니까?
Adam Hurwitz 2019

Adam 나는 프로 가드가 아닙니다. 하지만 저 아래에있는 내 새 게시물을 살펴보세요. 여기에는 Android 뷰를 확장하는 클래스와 같은 특정 클래스 그룹을 보호하는 방법에 대한 예제가 포함되어 있습니다. 아마도 이것이 시작점이 될 수 있습니다.
FrankKrumnow

5

나는 아무것도 변경하지 않았습니다.

// shrinkResources true
// minifyEnabled true

2 일을 낭비한 후이 문제를 이미 검색 한 proguard 파일을 변경하고 싶지 않습니다.


나머지 모든 제안은 실패했으며이 제안은 작동했습니다. 제 경우에는 타사 라이브러리가 포함되어 있고 SDK 27로 업그레이드하기 때문에 multidex를 켜야했습니다.이 오류가 갑자기 나타납니다. 이 답변에 감사드립니다!
Stephen McCormick

5
minifyEnabled는 코드에 대해 일종의 암호화를 시작합니다. 해커는 당신이 이것을 계속하지 않을 때 더 쉬운 일을합니다. 프로덕션 APK 파일에서 비활성화하는 것은 매우 위험합니다!
Adrian Grygutis 2018

이 솔루션을 사용하지 마십시오. 위험합니다
Jack

@Gibs 이것에 어떤 위험이 있습니까?
Brijesh Tanwar

@Brijesh Tanwar : 암호화가 필요한 경우 어떻게해야합니까 ??
Jack

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

gradle에서 위에서 언급 한 코드를 제거하십시오. 이것은 나를 위해 일했습니다. 이것은 주어진 문제에만 해당됩니다.


친애하는 팡. 이 오류는 서명 된 APK를 생성 할 때 발생했습니다. 내 선임 gradle에서 proguard를 제거한 다음이 오류가 제거되었습니다.
Ayaz Muhammad

언급 된 모든 줄
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 클래스 * {*;}


이 모든에서 난독 화를 제거하는 것과 동일 가진
cesarmax

0

Android Studio의 "Build"메뉴에서 "Rebuild Project"를 클릭합니다.


0

나는 꽤 오랫동안 proguard-rules.pro로 고생 해 왔으며 결코 여기에서 프로가 아닙니다! 나는 모든 난독 화를 해제하기 때문에 매개 변수없이 * 클래스를 유지해서는 안된다는 것을 보여주기 위해 내 파일을 게시하고 있습니다. 그러나 특정 클래스 또는 특정 인터페이스를 구현하는 모든 클래스에서 확장되는 모든 클래스를 보호 할 수 있습니다. 특정 요소가있는 생성자가있는 모든 클래스를 보호 할 수도 있습니다. 모든 것이 무엇을하는지 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 규칙을 사용하는 경우 일부 클래스를 유지하도록 제안합니다. 자세한 내용은 도서관을 방문하십시오.


0

이 줄을 gradle 속성에 추가하십시오.

android.enableR8=true

안녕하세요 Ambesh. 답변 해 주셔서 감사합니다. 일반적으로 설명이있는 답변이 더 환영받습니다. 답변에 설명을 추가 하시겠습니까? 답변의 형식도 개선 할 수 있습니다.
MaxV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.