2013-12-18 15 views
14

Tôi vừa tạo APK bằng Gradle để phát hành (ProGuard 4.9 và đã ký). Khi tôi khởi động ứng dụng nó sụp đổ về lỗi này:Lỗi Android phát hành Android với java.lang.AssertionError: không thể trong java.lang.Enum

E/AndroidRuntime(8662): java.lang.AssertionError: impossible 
E/AndroidRuntime(8662): at java.lang.Enum$1.create(Enum.java:44) 
E/AndroidRuntime(8662): at java.lang.Enum$1.create(Enum.java:35) 
E/AndroidRuntime(8662): at libcore.util.BasicLruCache.get(BasicLruCache.java:54) 
E/AndroidRuntime(8662): at java.lang.Enum.getSharedConstants(Enum.java:210) 
E/AndroidRuntime(8662): at java.lang.Enum.valueOf(Enum.java:190) 
E/AndroidRuntime(8662): at kr.infli.s.Z(Inflikr.java:390) 
E/AndroidRuntime(8662): at kr.infli.a.ev(Inflikr.java:409) 
E/AndroidRuntime(8662): at kr.infli.activity.InflikrActivity.onResume(InflikrActivity.java:231) 
E/AndroidRuntime(8662): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192) 
E/AndroidRuntime(8662): at android.app.Activity.performResume(Activity.java:5310) 
E/AndroidRuntime(8662): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2778) 
E/AndroidRuntime(8662): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2817) 
E/AndroidRuntime(8662): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250) 
E/AndroidRuntime(8662): at android.app.ActivityThread.access$800(ActivityThread.java:135) 
E/AndroidRuntime(8662): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
E/AndroidRuntime(8662): at android.os.Handler.dispatchMessage(Handler.java:102) 
E/AndroidRuntime(8662): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(8662): at android.app.ActivityThread.main(ActivityThread.java:5017) 
E/AndroidRuntime(8662): at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime(8662): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
E/AndroidRuntime(8662): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
E/AndroidRuntime(8662): Caused by: java.lang.NoSuchMethodException: values [] 
E/AndroidRuntime(8662): at java.lang.Class.getMethod(Class.java:661) 
E/AndroidRuntime(8662): at java.lang.Class.getDeclaredMethod(Class.java:623) 
E/AndroidRuntime(8662): at java.lang.Enum$1.create(Enum.java:41) 
E/AndroidRuntime(8662): ... 20 more 

Hình như lỗi này không nên xảy ra: https://android.googlesource.com/platform/libcore/+/9edf43dfcc35c761d97eb9156ac4254152ddbc55/libdvm/src/main/java/java/lang/Enum.java

build.gradle My chứa:

buildTypes { 
    release { 
     runProguard true 
     proguardFile file('./proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

My Proguard-project.txt chứa

-useuniqueclassmembernames 
-keepattributes SourceFile,LineNumberTable 

+ a bunch of keep class, dontnote, dontwarn,... 

Khi tôi xóa ProGuard khỏi build.gradle nó không bị hỏng.

Khi tôi đang sử dụng ProGuard từ bản dựng Ant, nó hoạt động (gần đây tôi đã di chuyển sang Gradle).

Mọi sự cố đã biết với Gradle + ProGuard?

Cảm ơn

Trả lời

24

Bạn phải nói với ProGuard để giữ một số phương pháp enum.

Các công cụ SDK Android đều sử dụng cấu hình ProGuard này để đạt được nó:

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

Bạn có thể thêm các quy tắc trên để cấu hình ProGuard của bạn hoặc bạn có thể (những gì tôi muốn) bao gồm các quy tắc Android mặc định:

runProguard true 
proguardFile getDefaultProguardFile('proguard-android.txt') 
proguardFile file('./proguard-project.txt') 
+0

nó trông giống như 'phương pháp runProguard' đã biến mất, vì vậy tôi chỉ kết hợp hai dòng của bạn vào 'proguardFiles getDefaultProguardFile ('Proguard-android.txt'), tập tin ("Proguard-rules.txt")' –

+3

@ DraškoKokić: 'runProguard' được đổi tên thành' minifyEnabled' trong [Android Gradle plugin 1.0.0] (http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0). (Bạn cần phải chỉ định 'minifyEnabled true' cho kiểu xây dựng phát hành của bạn; nếu không ProGuard sẽ * không * được chạy.) – Jonik

Các vấn đề liên quan