2013-12-18 10 views
14

में असंभव है मैंने अभी रिलीज के लिए ग्रैडल का उपयोग करके एपीके बनाया है (प्रोगार्ड 4.9 और हस्ताक्षरित)। जब मैं इस त्रुटि पर एप्लिकेशन यह दुर्घटना का शुभारंभ:एंड्रॉइड रिलीज एपीके क्रैश java.lang.AssertionError: 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 

इस त्रुटि की तरह लग रहा ऐसा नहीं होना चाहिए: https://android.googlesource.com/platform/libcore/+/9edf43dfcc35c761d97eb9156ac4254152ddbc55/libdvm/src/main/java/java/lang/Enum.java

मेरे build.gradle शामिल हैं:

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

मेरे ProGuard-project.txt

-useuniqueclassmembernames 
-keepattributes SourceFile,LineNumberTable 

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

जब मैं ProGuard को build.gradle से हटा देता हूं तो यह क्रैश नहीं होता है।

जब मैं एक चींटी निर्माण से प्रोगार्ड का उपयोग कर रहा था तो यह काम करता था (मैंने हाल ही में ग्रैडल में माइग्रेट किया था)।

ग्रैडल + प्रोगार्ड के साथ कोई ज्ञात समस्या?

धन्यवाद

उत्तर

24

आप कुछ enum तरीकों रखने के लिए ProGuard बताने के लिए की है।

एंड्रॉयड एसडीके उपकरण इसे प्राप्त करने के लिए इस ProGuard विन्यास का उपयोग करें:

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

आप या तो अपने ProGuard विन्यास के लिए उपर्युक्त नियम जोड़ सकते हैं या आप (मैं क्या पसंद करते हैं) डिफ़ॉल्ट Android नियम शामिल कर सकते हैं:

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

यह 'तरह runProguard' विधि चला गया है लग रहा है, तो मैं बस' proguardFiles getDefaultProguardFile ('ProGuard-android.txt'), फाइल "(ProGuard-rules.txt") ' –

+3

में अपने दो पंक्तियों संयुक्त @ DraškoKokić: 'runProguard' का नाम बदलकर' minifyEnabled 'कर दिया गया [एंड्रॉइड] ग्रैडल प्लगइन 1.0.0] (http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0)। (आपको अपने रिलीज बिल्ड प्रकार के लिए 'minifyEnabled true' निर्दिष्ट करने की आवश्यकता है, अन्यथा ProGuard * नहीं * चलाया जाएगा।) – Jonik

संबंधित मुद्दे