transformClassesAndResourcesWithProguardForRelease FAILED

83

Próbuję zbudować moją aplikację na Androida za pomocą Gradle w konsoli. Ale wyświetlenie poniżej błędu dotyczącego zadania ': 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

Oto wyjątek, który otrzymuję:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task
':app:transformClassesAndResourcesWithProguardForRelease'.
Mo. Mirmousavi
źródło
Ten problem pojawia się z powodu włączenia pro-guard w konfiguracji wydania aplikacji. Więc rozwiązaniem jest albo usunięcie pro-guarda, albo umieszczenie wskazanego kodu fragmentu w linku readyandroid.wordpress.com/ ...
Gotowy Android

Odpowiedzi:

120

Spróbuj dodać ten kod do swoich reguł proGuard, u mnie zadziałał

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

Odpowiedź została opublikowana tutaj: Wykonanie nie powiodło się dla zadania ': app: transformClassesAndResourcesWithProguardForRelease

John Spax
źródło
12
Chociaż wydaje się, że to działa, dobrze byłoby mieć wyjaśnienie.
Drew Szurko
23
Ale to nie ma sensu, ponieważ -keep class * {public private *; uchroni wszystkie twoje klasy przed zaciemnianiem, stąd też nie ma tu sensu.
Raghav Sharma

3
powyżej kod używany do dekompilacji mojego apk po wyświetleniu oryginalnej klasy i kodu nie zabezpiecza mojego apk ???
Pankaj Talaviya

29
OSTRZEŻENIE: Nie używaj tej odpowiedzi, jeśli chcesz zachować swój kod w tajemnicy.
daka

Ponadto użycie tego spowodowało, że był niekompatybilny ze starszymi wersjami telefonów.
red-devil,

65

dodaj ten kod do ..your-project/app/proguard-rules.pro

 -ignorewarnings

Twój podpisany plik APK zostanie pomyślnie wygenerowany ...

Aktualizacja :

Lepiej jest naprawić komunikaty ostrzegawcze za pomocą klawiszy -dontwarnlub -keepna swoim proguard-rules.pro... Ponieważ jeśli użyjesz (być może swoich bibliotek) odbicia java w swoim kodzie, aplikacja zostanie zawieszona ...


@Richi, nie mam pliku proguard-rules.pro . Czy powinienem utworzyć go ręcznie? Wygląda na to, że generuję w czasie wykonywaniarelease { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard.cfg' }
Adam Hurwitz,

@AdamHurwitz Tak, będziesz musiał stworzyć ten plik ręcznie.
CopsOnRoad

1
W moim przypadku to zadziałało, ale myślę, że zostało to zadeklarowane jako nieistotne.Oznacza to, że możesz pobrać apk wydania, ale prawdziwy problem nadal istnieje.
Dorbagna

8

U mnie zadziałało, musiałem również dodać następujące elementy w pliku 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
OSTRZEŻENIE: Nie używaj tej odpowiedzi, jeśli chcesz, aby Twój kod był prywatny / chroniony
Bilal Ahmed

Jak rozumiem, „-keep class *” zasadniczo wyłączy zaciemnianie i usuwanie klas. Jeśli chcesz to zrobić, możesz łatwo przejść do build.gradle i ustawić minifyEnabled na false i usunąć linię proguardFiles.
FrankKrumnow,

Czy jest teraz sposób na włączenie minify w wersji @FrankKrumnow?
Adam Hurwitz

Adam nie jestem proguardem - sam jestem zawodowcem i bardzo się z tym zmagam. Ale proszę spojrzeć na mój nowy post. Zawiera przykłady, w jaki sposób można chronić określone grupy klas - na przykład klasy rozszerzające widoki systemu Android. Może to może być punkt wyjścia.
FrankKrumnow,

5

Nic nie zmieniłem, tylko komentarz

// shrinkResources true
// minifyEnabled true

nie chcesz zmieniać żadnego pliku proguard. Szukałem już tego problemu po zmarnowaniu 2 dni


Wszystkie pozostałe sugestie zawiodły, ta zadziałała. W moim przypadku musiałem włączyć multidex ze względu na włączenie biblioteki innej firmy, a także aktualizację do SDK 27. Ten błąd nagle się pojawił. Dzięki za tę odpowiedź!
Stephen McCormick

5
minifyEnabled uruchom jakiś rodzaj szyfrowania dla twojego kodu. Haker ma łatwiejszą pracę, gdy nie będziesz tego robić. Wyłączenie go w pliku produkcyjnym apk jest wysoce ryzykowne!
Adrian Grygutis

Nie używaj tego rozwiązania. To jest ryzykowne
Jack

@Gibs jakie ryzyko w tym?
Brijesh Tanwar

@Brijesh Tanwar: co jeśli potrzebuję szyfrowania?
Jack

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

Usuń powyższy kod w swoim gradle. To zadziałało dla mnie. Dotyczy to tylko danego problemu.


Drogi Pang. Ten błąd wystąpił podczas generowania podpisanego pliku APK. Mój starszy usuń PROGUARD w Gradle następnie usuwa ten błąd
Ayaz Muhammad

wszystkie wymienione linie
Ayaz Muhammad

1

Otrzymałem ten sam komunikat o błędzie, gdy próbowałem zbudować wersję wydania w systemie Android po instalacji reaguj-natywny-firebase .

Oto kroki, które podążyłem

  1. Wykonaj wszystkie konfiguracje, o których wspominają w dokumentacji React-native-firebase.
  2. Zbuduj aplikację na Androida za pomocą tego polecenia

    ./gradlew assembleRelease

  3. Otrzymałem ten komunikat o błędzie.

BŁĄD: kompilacja nie powiodła się z wyjątkiem.

  • Co poszło nie tak: wykonanie nie powiodło się dla zadania „: app: transformClassesAndResourcesWithProguardForRelease”.

    Zadanie nie powiodło się, szczegóły w dziennikach

Rozwiązano ten problem, zmieniając tę ​​linię kodu w android / app / build.gradle

minifyEnabled true

do tego

minifyEnabled enableProguardInReleaseBuilds

To była jedyna zmiana, jaką zrobiłem. Mi to pasuje.



0

Użyj tego kodu w „proguard-rules.pro” może zostać rozwiązane.

-keep class * {
public private protected *;
}

lub

-keep class * {*;}
  • uwaga: powyższe polecenia ignorują zaciemnienia

  • może użyć tego zamiast tego powyżej, aby zapisać stan zaciemniania

    -keepnames, klasa * {*;}

cesarmax
posiadanie tego jest tym samym, co usunięcie proguarda w ogóle
cesarmax
0

W Android Studio kliknij „Przebuduj projekt” w menu „Kompiluj”.

Niclin
źródło
0

Od dłuższego czasu zmagam się z proguard-rules.pro i nie jestem tutaj zawodowcem! Wysyłam swój plik, aby pokazać, że nie należy -przechowywać klasy * bez żadnych parametrów, ponieważ wyłącza to wszelkie zaciemnianie. Możesz jednak chronić każdą klasę, która pochodzi od określonej klasy lub dowolnej klasy implementującej określony interfejs. Możesz także zabezpieczyć każdą klasę, która ma konstruktora mającego określone elementy. Zwróć uwagę, że nie skomentowałem każdego wiersza, ponieważ nie jestem w 100% pewien, do czego wszystko służy - to raczej zgadywanie. Mój projekt zawiera ksoap2 (okhttp3, okio, XmlPull), do tego służy wiele reguł.

Może to może być dla Ciebie punkt wyjścia - nadal być może będziesz musiał wprowadzić dodatkowe zasady dla swoich zajęć.

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

FrankKrumnow
źródło
0

dodaj -ignorewarnings do swojego pliku proguard i zachowaj tylko te klasy, których nie chcesz zaciemniać. Niektóre biblioteki sugerują zachowanie niektórych swoich klas, jeśli używasz reguł proguard. Odwiedź swoje biblioteki, aby uzyskać szczegółowe informacje

user3135923
źródło
0

dodaj tę linię do właściwości gradle

android.enableR8=true
Ambesh Tiwari
źródło
Cześć Ambesh. Dzięki za odpowiedź. Zwykle odpowiedzi z wyjaśnieniem są tam bardziej mile widziane. Czy chcesz dodać wyjaśnienie do swojej odpowiedzi? Możesz również poprawić formatowanie swojej odpowiedzi.
MaxV