2011-04-07 12 views
5

के साथ ProGuard और RoboGuice के साथ समस्या मेरे एंड्रॉइड ऐप को अनुकूलित करते समय मुझे प्रोजेवार्ड के साथ कुछ समस्याएं आ रही हैं। ऐसा लगता है कि एक एनोटेशन क्लास (@ com.google.inject.Inject) के साथ कुछ किया गया है जो Dalvik/Harmony रनटाइम से खुश नहीं है।@ इंजेक्शन एनोटेशन

java.lang.annotation.IncompleteAnnotationException: तत्व वैकल्पिक टिप्पणी के लिए को पूरा नहीं कर रहा है com.google.inject.Inject

com.google.inject.Inject तरह लग रहा है इस (Guice का एक हिस्सा):

@Target(value={ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) 
@Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME) 
@Documented 
public abstract @interface com.google.inject.Inject extends Annotation { 
    public abstract boolean optional() default false; 
} 

यहाँ लांच पर विफलता है:

+०१२३५१६४१०६
04-07 09:48:00.864: ERROR/AndroidRuntime(9384): FATAL EXCEPTION: main 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bitgrind.wtb/com.bitgrind.wtb.activity.Main}: com.google.inject.b.q: com.google.inject.b.q: java.lang.annotation.IncompleteAnnotationException: The element optional is not complete for the annotation com.google.inject.Inject 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.os.Looper.loop(Looper.java:123) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at dalvik.system.NativeStart.main(Native Method) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384): Caused by: com.google.inject.b.q: com.google.inject.b.q: java.lang.annotation.IncompleteAnnotationException: The element optional is not complete for the annotation com.google.inject.Inject 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:553) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:419) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.w.get(CustomConcurrentHashMap.java:2041) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.av.b(FailableCache.java:46) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.q.a(ConstructorInjectorStore.java:52) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.n.a(ConstructorBindingImpl.java:57) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.aq.a(InjectorImpl.java:375) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.g.run(BindingProcessor.java:169) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.e.a(BindingProcessor.java:224) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.an.b(InjectorBuilder.java:120) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.an.a(InjectorBuilder.java:105) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.ab.a(Guice.java:92) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.ab.a(Guice.java:69) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.bitgrind.wtb.WTBApp.a(WTBApp.java:59) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at roboguice.application.RoboApplication.a_(RoboApplication.java:84) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at roboguice.activity.RoboActivity.a_(RoboActivity.java:192) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at roboguice.activity.RoboActivity.onCreate(RoboActivity.java:70) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.bitgrind.wtb.activity.Main.onCreate(Main.java:41) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  ... 11 more 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384): Caused by: com.google.inject.b.q: java.lang.annotation.IncompleteAnnotationException: The element optional is not complete for the annotation com.google.inject.Inject 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:553) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:419) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.w.get(CustomConcurrentHashMap.java:2041) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.av.b(FailableCache.java:46) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.br.a(MembersInjectorStore.java:66) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.q.b(ConstructorInjectorStore.java:69) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.q.a(ConstructorInjectorStore.java:31) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.r.a(ConstructorInjectorStore.java:35) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.aw.a(FailableCache.java:35) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:549) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  ... 30 more 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384): Caused by: java.lang.annotation.IncompleteAnnotationException: The element optional is not complete for the annotation com.google.inject.Inject 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at org.apache.harmony.lang.annotation.AnnotationFactory.invoke(AnnotationFactory.java:312) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at $Proxy1.optional(Native Method) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.e.n.<init>(InjectionPoint.java:85) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.e.p.a(InjectionPoint.java:384) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.e.n.a(InjectionPoint.java:353) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.e.n.b(InjectionPoint.java:295) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.br.b(MembersInjectorStore.java:78) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.br.a(MembersInjectorStore.java:35) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.bs.a(MembersInjectorStore.java:40) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.aw.a(FailableCache.java:35) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  at com.google.inject.b.do.a(MapMaker.java:549) 
04-07 09:48:00.864: ERROR/AndroidRuntime(9384):  ... 39 more 

और ये मेरे (वर्तमान) proguard.cfg है: (मैं बहुत सी बातें की कोशिश की है)

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-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 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 

# Needed for RoboGuice, etc 
-keepattributes SourceFile,LineNumberTable,RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeVisibleFieldAnnotations 
-keep public class com.google.inject.Inject 
-keep,allowobfuscation public class com.google.inject.name.Named 
-keep,allowobfuscation public class * implements com.google.inject.Provider 
-keep,allowobfuscation @com.google.inject.Provides class * 
-keep,allowobfuscation @com.google.inject.Provides class * 
-keep,allowobfuscation @com.google.inject.ProvidedBy class * 
-keep,allowobfuscation @com.google.inject.Singleton class * 
-keep,allowobfuscation @com.google.inject.BindingAnnotation class * 
-keep,allowobfuscation @com.google.inject.ScopeAnnotation class * 

-keep class com.google.inject.Binder 

#-keep public class roboguice.** 

-keepclassmembers class * { 
    @com.google.inject.Inject <init>(...); 
} 

-keepclassmembers class com.google.inject.Inject { 
    public boolean optional(); 
} 

# Annotations 
#-keepclasseswithmembernames class * { 
# public ** value(); 
#} 

-keepclassmembers class * implements java.lang.annotation.Annotation { 
    ** *(); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

# Guava primitives lexicographicalComparator() references sun.misc.Unsafe dynamically 
# which is obviously not provided in the Android Runtime 
-dontwarn sun.misc.Unsafe 

# Slf4j api is in libs for the server side stuff, not used in the app 
-dontwarn org.slf4j.* 

# Other dynamically referenced methods in Guava 
-keepclassmembers class com.google.guava.* { 
    void finalizeReferent(); 
    void startFinalizer(java.lang.Class,java.lang.Object); 
} 

# newBuilder() is referenced dynamically in generated ProtoBuf code 
-keepclassmembers class * { 
    ** newBuilder(); 
} 

उत्तर

8

की तरह आप एनोटेशन रख रहे हैं नहीं लग रही है। उन्हें पूरी तरह से हटा दिया जाएगा क्योंकि उनके कोड के निष्पादन पर कोई प्रभाव नहीं पड़ता है, और यह वास्तविक है क्योंकि पुनर्प्राप्ति का एकमात्र तरीका प्रतिबिंब के साथ है।

कोशिश

-keepattributes *Annotation* 
+0

मार्क स्पष्ट रूप से विभिन्न क्रम एनोटेशन रखते हुए किया गया है, लेकिन नहीं AnnotationDefault विशेषता। यह अपवाद पैदा कर सकता है। इसे जोड़ना या वाइल्डकार्ड का उपयोग करना वास्तव में समस्या को हल कर सकता है। –

+0

धन्यवाद, वह था! –

+0

मैंने पाया कि यह उपयोग करने के लिए भी सुरक्षित है - रखरखाव * –

3

जोड़ने RoboGuice 2 मेरे लिए काम कर पाने के लिए, मैं क्या मैं पहले से ही था के लिए निम्न जोड़ने के लिए किया था:

-keep class com.google.inject.** { *; } 
-keep class javax.inject.** { *; } 
-keep class javax.annotation.** { *; } 
-keep class roboguice.** { *; } 

और से गैर अनुकूलन संस्करण के साथ इसे चलाने एसडीके मेरा project.properties निम्नानुसार है। ध्यान दें कि यह proguard-android.txtproguard-android-optimization.txt है, इसके बाद एक कोलन चरित्र और मेरे कस्टम proguard.cfg जो मेरे प्रोजेक्ट रूट निर्देशिका में है।

/project.properties: 

# ProGuard configuration 
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard.cfg 

मेरे अंतिम, जो संभवत: सुरक्षित है की तुलना में मैं की जरूरत है:

/proguard.cfg: 

-keepattributes Signature 
-keepattributes *Annotation* 
-keep class roboguice.** 

# if not using Google Maps library, safe to ignore these 
-dontwarn roboguice.activity.RoboMapActivity 
# safe to ignore testing classes, when proguard not being run against an instrumentation testing app 
-dontwarn roboguice.test.** 

-keep class com.google.inject.** { *; } 
-keepclassmembers class * { 
    @com.google.inject.Inject <fields>; 
    @com.google.inject.Inject <init>(...); 
} 
-keep class javax.inject.** { *; } 
-keep class javax.annotation.** { *; } 

# My application classes used by injection framework 
-keep class com.myapp.RoboGuiceModule { *; } 
-keep class com.myapp.AppProvider { *; } 
-keep class com.myapp.MyInjectableSingletonExample { *; } 
# ... other classes that are referenced in my custom RoboGuiceModule.configure() bindings 
+0

यह लगभग मेरा कोड काम करता है !! 'डोंटवार्न javax.inject.Singleton' जोड़ने के बाद यह मेरे लिए असली काम है! Thx से @ जोन एडम्स – acntwww

+0

@acntwww: मुझे कभी भी मेरे लिए विश्वसनीय रूप से काम करने के लिए 'सिंगलटन' नहीं मिला, इसलिए मुझे अपने प्रोगार्ड में उस विकल्प की आवश्यकता नहीं थी। आप डॉक्स में या ब्लॉग पर लिखना नहीं चाहते हैं कि आपको @ सिंगलटन कैसे काम कर रहा है? –

+0

मैं अपने शब्दों को स्पष्ट नहीं करने के लिए वास्तव में क्षमा चाहता हूं। मेरा मतलब था कि javax.inject.Singleton से संबंधित एक चेतावनी है, इसलिए मैं इसे रोक नहीं सकता। एक और बात यह है कि: मैं roboguice के लिए नया हूँ। – acntwww

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