transformClassesAndResourcesWithProguardForRelease FAILED

83

Я пытаюсь создать приложение для Android с помощью Gradle в консоли. Но ниже ошибка о задаче ': 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
}

приложение / 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, либо поместить указанный код фрагмента в ссылку readyandroid.wordpress.com/…
Готовый Android

Ответы:

120

Попробуйте добавить этот код в свои правила proGuard, у меня это сработало

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

Ответ был размещен здесь: Выполнение не выполнено для задачи ': app: transformClassesAndResourcesWithProguardForRelease

Джон Спакс
источник
12
Хотя кажется, что это работает, было бы неплохо получить объяснение.
Дрю Сурко 02
23
Но это бесполезно, так как -keep class * {public private *; сохранит все ваши классы от обфускации, поэтому здесь proguard бесполезен.
Raghav Sharma

3
над вашим кодом, используемым для моего apk, декомпилированным после отображения исходного класса и кода, не защищающего мой apk ???
Панкадж Талавия

29
ВНИМАНИЕ! Не используйте этот ответ, если хотите, чтобы код оставался конфиденциальным.
daka

Кроме того, это сделало несовместимым со старыми версиями телефона.
Red-Devil

65

добавить этот код в ..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
В моем случае это сработало, но я предполагаю, что это объявлено чем-то несущественным. Я имею в виду, что вы можете получить 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?
Адам Гурвиц

Адам: Я не гвардеец - про себя и борюсь с этим довольно много. Но, пожалуйста, посмотрите мой новый пост там. Он содержит примеры того, как вы можете защитить определенные группы классов - например, классы, расширяющие представления Android. Может быть, это может быть отправной точкой.
FrankKrumnow

5

Я ничего не изменил просто комментарий

// shrinkResources true
// minifyEnabled true

вы не хотите изменять какой-либо файл proguard, который я уже искал для этой проблемы после 2 дней потраченных впустую


Все остальные предложения провалились, это сработало. В моем случае мне пришлось включить multidex из-за включения сторонней библиотеки, а также обновления до SDK 27. Эта ошибка внезапно появилась. Спасибо за этот ответ!
Стивен МакКормик

5
minifyEnabled запускает какое-то шифрование для вашего кода. Хакеру легче работать, когда ты этого не будешь. Отключать его в файле production-apk очень рискованно!
Адриан Григутис 08

Не используйте это решение. Это рискованно
Джек

@Gibs какой в ​​этом риск?
Brijesh Tanwar

@Brijesh Tanwar: что, если мне нужно шифрование ??
Джек

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

Удалите вышеупомянутый код в своем градиенте. Это сработало для меня. Это только для данной проблемы.


Дорогой Пан. Эта ошибка возникла при создании подписанного apk. Мой старший удалил прогард в градиенте, затем эта ошибка была удалена
Аяз Мухаммад

все упомянутые строки
Аяз Мухаммад

1

Я получил такое же сообщение об ошибке, когда пытался создать сборку релиза в Android после установки response-native-firebase .

Вот шаги, которым я следовал,

  1. Выполните все конфигурации, которые они упоминают в документации react-native-firebase.
  2. Создайте приложение для Android с помощью этой команды

    ./gradlew assemblyRelease

  3. Получил это сообщение об ошибке.

ОШИБКА: сбой при сборке за исключением.

  • Что пошло не так: не удалось выполнить задачу ': app: transformClassesAndResourcesWithProguardForRelease'.

    Не удалось выполнить задание, подробности см. В журналах.

Решил эту проблему, изменив эту строку кода в android / app / build.gradle

minifyEnabled true

к этому

minifyEnabled enableProguardInReleaseBuilds

Это было единственное изменение, которое я сделал. Меня устраивает.



0

Использование этого кода в proguard-rules.pro может быть разрешено.

-keep class * {
public private protected *;
}

или же

-keep class * {*;}
  • примечание: приведенные выше команды игнорируют обфускации

  • можно использовать это вместо вышеупомянутого для сохранения состояния обфускации

    -keepnames класс * {*;}

cesarmax
иметь это то же самое, что вообще удалить прогард
cesarmax
0

В Android Studio нажмите «Rebuild Project» в меню «Build».

Никлин
источник
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

добавьте -ignorewarnings в свой файл proguard и оставьте только тот класс, который вы не хотите скрывать. Некоторые библиотеки предлагают сохранить некоторые из своих классов, если вы используете правила proguard. Посетите свои библиотеки для получения подробной информации

user3135923
источник
0

добавить эту строку в свойства Gradle

android.enableR8=true
Амбеш Тивари
источник
Привет, Амбеш. Спасибо за Ваш ответ. Обычно там более приветствуются ответы с объяснением. Хотите добавить пояснение к своему ответу? Вы также можете улучшить форматирование своего ответа.
MaxV