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


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. Посетите свои библиотеки для получения подробной информации


0

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

android.enableR8=true

Привет, Амбеш. Спасибо за Ваш ответ. Обычно там более приветствуются ответы с объяснением. Хотите добавить пояснение к своему ответу? Вы также можете улучшить форматирование своего ответа.
MaxV
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.