biến đổiClassesAndResourcesWithProguardForRelease FAILED


83

Tôi đang cố tạo ứng dụng Android của mình bằng Gradle trong bảng điều khiển. Nhưng gặp lỗi bên dưới về tác vụ ': app :formationClassesAndResourcesWithProguardForRelease':

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 bản dựng --stacktrace

Đây là ngoại lệ mà tôi đang nhận được:

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

Sự cố này sắp xảy ra do bật tính năng bảo vệ chuyên nghiệp trong cấu hình phát hành của ứng dụng. Vì vậy, giải pháp là loại bỏ bảo vệ chuyên nghiệp hoặc đặt đoạn mã được chỉ định trong liên kết readyandroid.wordpress.com/…
Android Ready

Câu trả lời:


120

Hãy thử thêm mã này vào quy tắc proGuard của bạn, nó phù hợp với tôi

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

Câu trả lời đã được đăng ở đây: Không thực thi được tác vụ ': app: transformClassesAndResourcesWithProguardForRelease


12
Mặc dù điều này có vẻ hiệu quả, nhưng sẽ rất tốt nếu có một lời giải thích.
Drew Szurko

23
Nhưng điều này không có ích lợi gì vì -keep class * {public private *; sẽ giữ cho tất cả các lớp của bạn không bị xáo trộn, do đó bảo vệ không sử dụng ở đây.
Raghav Sharma

3
ở trên mã của bạn được sử dụng cho apk của tôi được dịch ngược sau khi hiển thị lớp gốc và mã không bảo mật apk của tôi ???
Pankaj Talaviya

29
CẢNH BÁO: Không sử dụng câu trả lời này nếu bạn muốn giữ mã của mình ở chế độ riêng tư.
daka

Ngoài ra, việc sử dụng điều này làm cho không tương thích với các phiên bản điện thoại cũ hơn.
red-devil

66

thêm mã này vào ..your-project/app/proguard-rules.pro

 -ignorewarnings

apk đã ký của bạn sẽ được tạo thành công ...

Cập nhật:

Tốt hơn là bạn nên sửa các thông báo cảnh báo bằng cách sử dụng -dontwarnhoặc -keep các phím trên proguard-rules.pro... Bởi vì nếu bạn sử dụng (có thể là thư viện của bạn) phản chiếu java trong mã của bạn, ứng dụng sẽ bị treo ...


@Richi, tôi không có tệp proguard-rules.pro . Tôi có nên tạo một cái thủ công không? Có vẻ như tôi đang tạo ra trong thời gian chạyrelease { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard.cfg' }
Adam Hurwitz

@AdamHurwitz Có, bạn sẽ phải tạo tệp này theo cách thủ công.
CopsOnRoad

1
Nó hoạt động trong trường hợp của tôi, nhưng tôi đoán nó được khai báo với một cái gì đó là không liên quan, nghĩa là bạn có thể nhận được apk phát hành, nhưng vấn đề thực sự vẫn còn đó.
Dorbagna

8

Nó hoạt động với tôi, tôi cũng phải thêm theo dõi vào tệp 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
Chú ý: Vui lòng không dùng câu trả lời này nếu bạn muốn giữ lại mã của bạn tin / bảo vệ
Bilal Ahmed

Theo tôi hiểu thì "-keep class *" về cơ bản sẽ tắt tính năng xáo trộn và loại bỏ các lớp. Nếu bạn muốn làm điều này, bạn có thể dễ dàng truy cập build.gradle và đặt minifyEnabled thành false và xóa dòng proguardFiles.
FrankKrumnow 21/12/18

Hiện có cách nào để kích hoạt tính năng thu nhỏ trong bản phát hành @FrankKrumnow không?
Adam Hurwitz

Adam Tôi không phải là người ủng hộ - ủng hộ bản thân và đấu tranh với nó khá nhiều. Nhưng hãy xem bài viết mới của tôi dưới đó. Nó chứa các ví dụ về cách bạn có thể bảo vệ các nhóm lớp nhất định - như các lớp mở rộng Chế độ xem android. Có lẽ đây có thể là một điểm khởi đầu.
FrankKrumnow

5

Tôi không có gì thay đổi chỉ cần bình luận

// shrinkResources true
// minifyEnabled true

bạn không muốn thay đổi bất kỳ tệp proguard nào mà tôi đã tìm kiếm vấn đề này sau 2 ngày lãng phí


Tất cả các đề xuất còn lại đều thất bại, đề xuất này đã hoạt động. Trong trường hợp của tôi, tôi đã phải bật multidex do bao gồm thư viện của bên thứ 3, cũng như nâng cấp lên SDK 27. Lỗi này đột nhiên xuất hiện. Cảm ơn câu trả lời này!
Stephen McCormick,

5
minifyEnabled khởi chạy một số loại mã hóa cho mã của bạn. Hacker có công việc dễ dàng hơn khi bạn không tiếp tục điều này. Rất rủi ro nếu vô hiệu hóa nó trên tệp production-apk!
Adrian Grygutis

Không sử dụng giải pháp này. Nó là rủi ro
Jack

@Gibs rủi ro gì trong việc này?
Brijesh Tanwar

@Brijesh Tanwar: nếu tôi cần mã hóa thì sao ??
Jack

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

Vui lòng xóa mã được đề cập ở trên trong gradle của bạn. Điều này đã làm việc cho tôi. Điều này chỉ dành cho vấn đề nhất định.


Pang thân mến. Lỗi này xảy ra khi tôi tạo apk đã ký. Proguard remove cấp cao của tôi trong gradle sau đó loại bỏ lỗi này
Ayaz Muhammad

tất cả các dòng được đề cập
Ayaz Muhammad

1

Tôi nhận được thông báo lỗi tương tự khi cố gắng xây dựng phiên bản phát hành trong Android sau khi cài đặt react-native-firebase .

Đây là các bước tôi đã làm theo,

  1. Thực hiện tất cả các cấu hình mà họ đề cập trong tài liệu react-native-firebase.
  2. Xây dựng ứng dụng Android bằng lệnh này

    ./gradlew assemblyRelease

  3. Có thông báo lỗi này.

THẤT ​​BẠI: Xây dựng không thành công với một ngoại lệ.

  • Đã xảy ra sự cố: Không thực thi được tác vụ ': app :formationClassesAndResourcesWithProguardForRelease'.

    Công việc không thành công, xem nhật ký để biết chi tiết

Giải quyết vấn đề này bằng cách thay đổi dòng mã này trong android / app / build.gradle

minifyEnabled true

đến cái này

minifyEnabled enableProguardInReleaseBuilds

Đây là thay đổi duy nhất tôi đã làm. Nó làm việc cho tôi.



0

Sử dụng mã này trong 'proguard-rules.pro' có thể được giải quyết.

-keep class * {
public private protected *;
}

hoặc là

-keep class * {*;}
  • lưu ý: các lệnh trên bỏ qua obfuscates

  • có thể sử dụng điều này thay thế ở trên để lưu trạng thái obfuscates

    -lớp lưu tên * {*;}


có này cũng giống như loại bỏ Proguard ở tất cả
cesarmax

0

Trong Android Studio, nhấp vào "Xây dựng lại dự án" trong menu "Xây dựng".


0

Tôi đã vật lộn với proguard-rules.pro trong một thời gian khá dài và tôi không phải là một chuyên gia ở đây! Tôi đăng tệp của mình để cho thấy rằng bạn không nên giữ lớp * mà không có bất kỳ tham số nào vì điều này sẽ tắt tất cả sự xáo trộn. Tuy nhiên, bạn có thể bảo vệ mọi lớp mở rộng từ một lớp nhất định hoặc bất kỳ lớp nào triển khai một giao diện nhất định. Bạn cũng có thể bảo vệ bất kỳ lớp nào có hàm tạo có các phần tử cụ thể. Xin lưu ý rằng tôi đã không bình luận từng dòng vì tôi không chắc chắn 100% về những gì mọi thứ diễn ra - nó giống như một phỏng đoán có học thức hơn. Dự án của tôi bao gồm ksoap2 (okhttp3, okio, XmlPull), đó là những gì nhiều quy tắc dành cho.

Có thể đây có thể là một điểm khởi đầu cho bạn - bạn vẫn có thể cần đặt một số quy tắc bổ sung cho các lớp học của mình.

-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

thêm -ignorewarnings trong tệp proguard của bạn và chỉ giữ lại những lớp mà bạn không muốn xáo trộn. Một số thư viện đề nghị giữ một số lớp của họ nếu bạn đang sử dụng các quy tắc proguard. Ghé thăm thư viện của bạn để biết chi tiết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.