2013-03-05 17 views
8

So versuche ich Guice in meinem Android-Maven-Projekt zu laufen und in einem 3rd-Party-Modul zu bündeln. Es läuft gut im normalen Junittest, der eine Testinjektion durchführt, aber auf der VM mit der unten angehängten Logcat-Nachricht fehlschlägt.VerrifyError mit Guice auf Android Maven-Projekt

Was ich nicht verstehen kann, ist, dass es zahlreiche Berichte von Guice gibt, die gut auf Android funktionieren. Trotzdem scheint mein Code auf getBeanInfo() fehlzuschlagen, das vom Guice-Injektor aufgerufen wird. Es scheint, dass ich nicht der einzige bin, der diesen Fehler hat.

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

So habe ich ein paar Fragen. Ist der Grund, warum Guice für mich nicht funktioniert, weil einige Funktionalität von meinem 3rd-Party-Modul aufgerufen wird, die überall fehlschlagen würde, aber nicht üblich ist? Gibt es eine Möglichkeit, mehr Informationen über Guice herauszufinden, was genau die anstößige getBeanInfo() auslöst? Gibt es Arbeitsumgebungen? Welche Wege stehen mir zur weiteren Fehlersuche zur Verfügung?

Die Lösung muss mavenkompatibel sein, da Antworten auf eine ähnliche Frage zum Optimieren der Eclipse-Einstellungen für ähnliche Probleme nicht zutreffen können. Getting "Caused by: java.lang.VerifyError:" (nicht, dass ich hier sowieso viel Kilometer hatte).

Ich denke, dass alle relevanten Dateien wurden von dx von der Androiden Maven Plugin verarbeitet, als Abhängigkeit: Baum zeigt alle relevanten Projekt bei Umfang "kompilieren", aber ich bin kein Experte hier.

 
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

Hey, hast du irgendeine Lösung? –

+0

Ich habe die Frage vor einer Stunde gepostet und habe sie für ein paar Stunden angegriffen ... also nein. –

+0

Hey, sieh dir das an https://code.google.com/p/google-guice/wiki/OSGi Dies ist nur möglich, wenn die beteiligten Typen nicht package-privat sind (da per Definition keine privaten Paket-Typen sichtbar sind) andere Klassenlader). Wenn Sie versuchen, AOP für package-private Typen zu verwenden, während Sie in einem OSGi-Container ausgeführt werden, wird die folgende Ausnahme angezeigt: –

Antwort

6

Der dalvik vm unterstützt keine vorausschauende Programmierung, so dass Sie die einfache JVM Guice nicht verwenden können. Sie müssen die no_aop-Version verwenden.

Mit einem Einsatz bauen Maven

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

das no_aop Glas in Ihre Build und apk zu erhalten.

Natürlich können Sie auch RoboGuice verwenden.

+0

Danke! Subra erwähnte dies in den obigen Kommentaren, schien sich aber der Lösung nicht sicher zu sein. Dachte daran, Guice durch Dolch zu ersetzen und den Vorteil der Vorkompilierung zu bekommen, aber deine Lösung ist ein einfacherer erster Schritt. Wird als korrekt markiert, sobald ich es ausprobiert habe. –

+4

Das scheint keinen Unterschied zu machen. Dies ist auch der Fall, wenn Sie Google Collections (Guava-Bibliothek) verwenden. Irgendwelche anderen Vorschläge? –

+0

Ich habe das gleiche Verhalten, aber ich habe Guice 3.0 no_aop direkt von Roboguice Website heruntergeladen – user364622