2013-03-05 26 views
8

所以我想讓Guice在我的android maven項目中運行並綁定到第三方模塊中。它在測試注入的正常junittest中運行正常,但在下面附帶logcat消息的VM上失敗。在Android maven項目上使用Guice的VerrifyError

我不明白的是,有很多Guice在android上工作的報告。儘管如此,我的代碼似乎在從Guice注入器調用getBeanInfo()時失敗。看來我不是唯一有這個錯誤的人。

Is there a work around for the Android error "Unable to resolve virtual method java/beans/PropertyDescriptor"?

所以,我有幾個問題。 Guice是不是爲我工作的原因,因爲我的第三方模塊會調用某些功能,這些功能在任何地方都會失敗,但不常見?有什麼方法可以從Guice中獲得更多信息來觸發有問題的getBeanInfo()?有工作嗎?有什麼途徑可供我進一步調試。

解決方案必須與maven兼容,因爲類似問題的類似問題的解答不能應用於調整類似問題的eclipse設置。 Getting "Caused by: java.lang.VerifyError:" (不是我在這裏得到了很多里程)。

我認爲所有相關的文件都是由android maven插件通過dx處理的,因爲dependency:tree顯示了範圍「compile」的所有相關項目,但我並不是專家。

 
03-05 00:57:34.529: I/dalvikvm(2295): threadid=3: reacting to signal 3 
03-05 00:57:34.568: I/dalvikvm(2295): Wrote stack traces to '/data/anr/traces.txt' 
03-05 00:57:35.059: I/dalvikvm(2295): threadid=3: reacting to signal 3 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): Could not load Finalizer in its own class loader. Loading Finalizer in the current class loader instead. As a result, you will not be able to garbage collect this class loader. To support reclaiming this class loader, either resolve the underlying issue, or move Google Collections to your system class path. 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): java.io.FileNotFoundException: com/google/inject/internal/util/$Finalizer.class 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.getBaseUrl(FinalizableReferenceQueue.java:269) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:253) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:175) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$FinalizableReferenceQueue.(FinalizableReferenceQueue.java:100) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$MapMaker$QueueHolder.(MapMaker.java:787) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$MapMaker$WeakEntry.(MapMaker.java:946) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$MapMaker$Strength$1.newEntry(MapMaker.java:312) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:498) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:419) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2029) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.Annotations$AnnotationChecker.hasAnnotations(Annotations.java:116) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.Annotations.isScopeAnnotation(Annotations.java:124) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:40) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:30) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.spi.ScopeBinding.acceptVisitor(ScopeBinding.java:59) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.AbstractProcessor.process(AbstractProcessor.java:55) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:165) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.Guice.createInjector(Guice.java:95) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.Guice.createInjector(Guice.java:72) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.google.inject.Guice.createInjector(Guice.java:62) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at za.co.mambo.cherrylist.android.CherryListActivity.onCreate(CherryListActivity.java:27) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.Activity.performCreate(Activity.java:4465) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.os.Looper.loop(Looper.java:137) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at java.lang.reflect.Method.invoke(Method.java:511) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): at dalvik.system.NativeStart.main(Native Method) 
03-05 00:57:35.108: I/dalvikvm(2295): Wrote stack traces to '/data/anr/traces.txt' 
03-05 00:57:35.338: D/dalvikvm(2295): GC_CONCURRENT freed 391K, 4% free 12676K/13127K, paused 8ms+5ms 
03-05 00:57:35.418: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.418: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.418: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.418: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.418: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.428: W/dalvikvm(2295): VFY: unable to find class referenced in signature ([Ljava/beans/PropertyDescriptor;) 
03-05 00:57:35.438: I/dalvikvm(2295): Could not find method java.beans.Introspector.getBeanInfo, referenced from method com.google.inject.internal.cglib.core.$ReflectUtils.getPropertiesHelper 
03-05 00:57:35.438: W/dalvikvm(2295): VFY: unable to resolve static method 8989: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;Ljava/lang/Class;)Ljava/beans/BeanInfo; 
03-05 00:57:35.438: D/dalvikvm(2295): VFY: replacing opcode 0x71 at 0x000c 
03-05 00:57:35.458: W/dalvikvm(2295): VFY: unable to resolve exception class 1373 (Ljava/beans/IntrospectionException;) 
03-05 00:57:35.458: W/dalvikvm(2295): VFY: unable to find exception handler at addr 0x4e 
03-05 00:57:35.458: W/dalvikvm(2295): VFY: rejected Lcom/google/inject/internal/cglib/core/$ReflectUtils;.getPropertiesHelper (Ljava/lang/Class;ZZ)[Ljava/beans/PropertyDescriptor; 
03-05 00:57:35.458: W/dalvikvm(2295): VFY: rejecting opcode 0x0d at 0x004e 
03-05 00:57:35.458: W/dalvikvm(2295): VFY: rejected Lcom/google/inject/internal/cglib/core/$ReflectUtils;.getPropertiesHelper (Ljava/lang/Class;ZZ)[Ljava/beans/PropertyDescriptor; 
03-05 00:57:35.458: W/dalvikvm(2295): Verifier rejected class Lcom/google/inject/internal/cglib/core/$ReflectUtils; 
03-05 00:57:35.488: D/AndroidRuntime(2295): Shutting down VM 
03-05 00:57:35.498: W/dalvikvm(2295): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
03-05 00:57:35.508: I/dalvikvm(2295): threadid=3: reacting to signal 3 
03-05 00:57:35.548: I/dalvikvm(2295): Wrote stack traces to '/data/anr/traces.txt' 
03-05 00:57:35.568: E/AndroidRuntime(2295): FATAL EXCEPTION: main 
03-05 00:57:35.568: E/AndroidRuntime(2295): java.lang.RuntimeException: Unable to start activity ComponentInfo{za.co.mambo.cherrylist.android/za.co.mambo.cherrylist.android.CherryListActivity}: com.google.inject.internal.util.$ComputationException: java.lang.VerifyError: com/google/inject/internal/cglib/core/$ReflectUtils 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.os.Looper.loop(Looper.java:137) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at dalvik.system.NativeStart.main(Native Method) 
03-05 00:57:35.568: E/AndroidRuntime(2295): Caused by: com.google.inject.internal.util.$ComputationException: java.lang.VerifyError: com/google/inject/internal/cglib/core/$ReflectUtils 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.FailableCache.get(FailableCache.java:50) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.Guice.createInjector(Guice.java:95) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.Guice.createInjector(Guice.java:72) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.Guice.createInjector(Guice.java:62) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at za.co.mambo.cherrylist.android.CherryListActivity.onCreate(CherryListActivity.java:27) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.Activity.performCreate(Activity.java:4465) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  ... 11 more 
03-05 00:57:35.568: E/AndroidRuntime(2295): Caused by: java.lang.VerifyError: com/google/inject/internal/cglib/core/$ReflectUtils 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.cglib.reflect.$FastClassEmitter.(FastClassEmitter.java:67) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:72) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:216) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:64) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:207) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:53) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal.ProxyFactory.create(ProxyFactory.java:153) 
03-05 00:57:35.568: E/AndroidRuntime(2295):  at com.google.inject.internal 
03-05 00:57:36.178: I/dalvikvm(2295): threadid=3: reacting to signal 3 
03-05 00:57:36.188: I/dalvikvm(2295): Wrote stack traces to '/data/anr/traces.txt' 
03-05 00:57:36.530: I/dalvikvm(2295): threadid=3: reacting to signal 3 
03-05 00:57:36.538: I/dalvikvm(2295): Wrote stack traces to '/data/anr/traces.txt' 

+0

嘿,有什麼解決辦法嗎? – 2013-03-05 09:47:31

+0

我在一個小時前發佈了這個問題,並且已經攻擊了好幾個小時......所以沒有。 – 2013-03-05 09:54:54

+0

嘿,看看這個https://code.google.com/p/google-guice/wiki/OSGi這隻有在涉及的類型不是包私有的時候纔有可能(因爲根據定義,包 - 私有類型不可見其他類加載器)。如果您嘗試在OSGi容器內運行時在包專用類型上使用AOP,則會看到以下異常: – 2013-03-05 10:14:29

回答

6

dalvik vm不支持面向對象的編程,因此您不能使用普通的JVM Guice。你必須使用no_aop版本。

隨着Maven構建使用

<dependency> 
    <groupId>com.google.inject</groupId> 
    <artifactId>guice</artifactId> 
    <version>3.0</version> 
    <classifier>no_aop</classifier> 
</dependency> 

得到no_aop罐子到您的構建和APK。

當然你也可以看看使用RoboGuice。

+0

Thanx! Subra在上面的評論中提到了這一點,但似乎不確定解決方案。正在考慮用Dagger取代Guice並獲得預編譯的好處,但您的解決方案是更輕鬆的第一步。一旦我嘗試過,就會標記爲正確。 – 2013-03-06 09:25:22

+4

這似乎沒有區別。使用Google Collections(番石榴圖書館)時也是如此。還有其他建議嗎? – 2013-09-25 21:52:04

+0

我有同樣的行爲,但我已經從roboguice網站直接下載了guice 3.0 no_aop – user364622 2014-01-16 19:57:44