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.