2013-03-05 5 views
8

Итак, я пытаюсь заставить Guice работать в проекте android maven и комплекте в стороннем модуле. Он отлично работает в обычном junittest, который выполняет тестовую инъекцию, но не работает на виртуальной машине с сообщением logcat, приведенным ниже.VerrifyError с Guice на Android maven project

Что я не могу понять, так это многочисленные сообщения о том, что Guice отлично работает на Android. Несмотря на это, мой код, похоже, терпит неудачу при вызове getBeanInfo() из инжектора Guice. Кажется, я не единственный, у кого эта ошибка.

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:" (не так, чтобы у меня было много пробега здесь).

Я думаю, что все соответствующие файлы были обработаны dx плагином android maven, так как зависимость: дерево показывает весь соответствующий проект в области «компиляция», но я не эксперт здесь.

 
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

Эй, какое-то решение? –

+0

Я отправил вопрос час назад и нападал на него в течение нескольких часов ... так что нет. –

+0

Эй Просто посмотрите на https://code.google.com/p/google-guice/wiki/OSGi. Это возможно только в том случае, если задействованные типы не являются закрытыми для пакета (потому что по определению пакет - частные типы не видны из другие загрузчики классов). Если вы попытаетесь использовать AOP в типах пакетов-приватов во время работы внутри контейнера OSGi, вы увидите следующее исключение: –

ответ

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 упомянул об этом в комментариях выше, но, похоже, не был уверен в этом решении. Думал о замене Guice кинжалом и получении выгоды от предварительной компиляции, но ваше решение является более легким первым шагом. Отметьте как можно скорее, как только я попробовал. –

+4

Это, похоже, не имеет значения. Это также происходит при использовании Google Collections (библиотека guava). Любые другие предложения? –

+0

У меня такое же поведение, но я загрузил guice 3.0 no_aop прямо с сайта roboguice – user364622