transformClassesAndResourcesWithProguardForRelease ПОМИЛО


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
}

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

Це виняток, який я отримую:

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

Ця проблема виникає через ввімкнення функції pro-garde у конфігурації випуску програми. Тож рішення - або вилучити pro-guard, або вказати вказаний код фрагмента у посиланні readyandroid.wordpress.com/…
— Готовий Android

Відповіді:


120

Спробуйте додати цей код до своїх правил proGuard, він спрацював для мене

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

Відповідь було розміщено тут: Не вдалося виконати завдання ': app: transformClassesAndResourcesWithProguardForRelease


12
Хоча це, здається, працює, було б непогано мати пояснення.
— Дрю Шурко,

23
Але це ні до чого, оскільки клас -keep * {public private *; убереже всі ваші класи від заплутування, отже, прогард тут ніякої користі.
— Raghav Sharma

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

29
ПОПЕРЕДЖЕННЯ. Не використовуйте цю відповідь, якщо хочете залишити свій код приватним.
— daka

Крім того, використання цього зробило несумісне зі старими версіями телефону.
— 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
У моєму випадку це спрацювало. Але, мабуть, це дещо оголошено як неістотне. Я маю на увазі, що ви можете отримати реліз apk, але справжня проблема все ще є.
— Дорбанья,

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

Як я розумію, "-keep class *" в основному вимкне затухання та видалення класів. Якщо ви хочете зробити це, ви можете легко перейти до build.gradle і встановити для minifyEnabled значення false і видалити рядок proguardFiles.
— FrankKrumnow

Чи є тепер спосіб увімкнути мініфікацію у випуску @FrankKrumnow?
— Адам Гурвіц,

Адам, я не прогард - про себе, і борюся з цим досить багато. Але, будь ласка, подивіться на мій новий пост там, унизу. Він містить приклади того, як ви можете захистити певні групи класів - наприклад, класи, що розширюють перегляди Android. Можливо, це може бути відправною точкою.
— FrankKrumnow

5

Я нічого не змінив, просто коментую

// shrinkResources true
// minifyEnabled true

ви не хочете змінювати жоден файл proguard, я вже шукав цю проблему після того, як витратили 2 дні


Усі інші пропозиції були невдалими, ця спрацювала. У моєму випадку мені довелося ввімкнути мультидекс через включення сторонньої бібліотеки, а також оновлення до SDK 27. Ця помилка раптово виявилася. Дякую за цю відповідь!
— Стівен Маккормік,

5
minifyEnabled запустити якесь шифрування вашого коду. Хакер має простішу роботу, коли ви не будете тримати це. Вимкнути його у виробничому файлі apk дуже ризиковано!
— Адріан Григутіс

Не використовуйте це рішення. Це ризиковано
— Джек

@Gibs який ризик у цьому?
— Brijesh Tanwar

@Brijesh Tanwar: що, якщо мені потрібно шифрування ??
— Джек

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

Будь ласка, видаліть згаданий код у вашому gradle. Це спрацювало для мене. Це лише для даної проблеми.


Шановний Панг. Ця помилка сталася під час генерації підписаного apk. Мій старший видалив прогуар в gradle, а потім цю помилку видалив
— Аяз Мухаммед,

усі згадані рядки
— Аяз Мухаммед,

1

Я отримав те саме повідомлення про помилку, коли намагався побудувати збірку випусків в android після встановлення response-native-firebase .

Це кроки, якими я дотримувався,

  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

Я досить довго боровся з 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. Відвідайте ваші бібліотеки для отримання деталей

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.