2011-04-07 56 views
5

我在優化我的android應用時遇到了一些proguard問題。似乎有一些註釋類(@ com.google.inject.Inject)對Dalvik/Harmony在運行時不滿意。ProGuard和RoboGuice帶@Inject註解問題

java.lang.annotation.IncompleteAnnotationException: 可選元素是不完整的 的註釋 com.google.inject.Inject

com.google.inject.Inject樣子這個(吉斯的部分):

@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屬性。這可能會導致異常。添加它或使用通配符的確可以解決問題。 – 2011-04-07 21:48:35

+0

謝謝,就是這樣! – 2011-04-08 00:28:04

+0

我發現使用-keepattributes * – 2012-04-17 19:19:21

3

要獲得RoboGuice 2爲我工作,我不得不添加下面的什麼,我已經有了:

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

,並與來自非優化的版本運行SDK。我的project.properties如下。請注意,它是proguard-android.txt而不是proguard-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

更安全這幾乎使我的代碼工作!添加'-dontwarn javax.inject.Singleton'後,它真的是我的工作! Thx to @Jon Adams – acntwww 2013-08-16 07:14:10

+0

@acntwww:我從來沒有'@ Singleton'爲我工作可靠,所以在我的ProGuard中我不需要這個選項。你不會想在文檔或博客上寫下你是如何獲得@Singleton的工作? – 2013-08-16 19:43:27

+0

我真的很抱歉沒有說清楚我的話。我的意思是有一個與javax.inject.Singleton相關的警告,所以我只是寫了這個。另一件事是:我是roboguice的新手。 – acntwww 2013-08-20 09:57:31