8

所以我试图让 Guice 在我的 android maven 项目中运行并捆绑在第 3 方模块中。它在进行测试注入的普通 junittest 中运行良好,但在 VM 上失败并附有下面的 logcat 消息。

我无法理解的是,有许多关于 Guice 在 android 上运行良好的报告。尽管如此,我的代码似乎在从 Guice 注入器调用 getBeanInfo() 时失败了。看来我不是唯一一个有这个错误的人。

Android 错误“无法解析虚拟方法 java/beans/PropertyDescriptor”是否有解决方法?

所以我有几个问题。Guice 对我不起作用的原因是因为我的 3rd 方模块正在调用某些功能,这些功能会在所有地方都失败但并不常见?有没有办法从 Guice 中获取更多关于触发有问题的 getBeanInfo() 的具体信息?有变通办法吗?我可以通过哪些途径进行进一步调试。

该解决方案必须与 maven 兼容,因为对于类似问题的有关调整 eclipse 设置以解决类似问题的类似问题的答案不适用。得到“引起:java.lang.VerifyError:” (不是说我在这里有很多里程)。

我认为所有相关文件都由 dx 由 android maven 插件处理,因为 dependency:tree 显示了“编译”范围内的所有相关项目,但我不是这里的专家。

03-05 00:57:34.529: I/dalvikvm(2295): threadid=3: 对信号 3 做出反应
03-05 00:57:34.568: I/dalvikvm(2295): 将堆栈跟踪写入“/data/anr/traces.txt”
03-05 00:57:35.059: I/dalvikvm(2295): threadid=3: 对信号 3 做出反应
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 无法在自己的类加载器中加载终结器。而是在当前类加载器中加载终结器。因此,您将无法对此类加载器进行垃圾收集。要支持回收此类加载器,请解决根本问题,或将 Google 收藏集移至您的系统类路径。
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): 在 com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.getBaseUrl(FinalizableReferenceQueue.java:269)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:253)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:175)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$FinalizableReferenceQueue.(FinalizableReferenceQueue.java:100)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$MapMaker$QueueHolder.(MapMaker.java:787)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$MapMaker$WeakEntry.(MapMaker.java:946)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$MapMaker$Strength$1.newEntry(MapMaker.java:312)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:498)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$MapMaker$StrategyImpl.newEntry(MapMaker.java:419)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2029)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.Annotations$AnnotationChecker.hasAnnotations(Annotations.java:116)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.Annotations.isScopeAnnotation(Annotations.java:124)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:40)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.ScopeBindingProcessor.visit(ScopeBindingProcessor.java:30)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.spi.ScopeBinding.acceptVisitor(ScopeBinding.java:59)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.AbstractProcessor.process(AbstractProcessor.java:55)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:165)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.Guice.createInjector(Guice.java:95)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.Guice.createInjector(Guice.java:72)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.google.inject.Guice.createInjector(Guice.java:62)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 za.co.mambo.cherrylist.android.CherryListActivity.onCreate(CherryListActivity.java:27)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.Activity.performCreate(Activity.java:4465)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.ActivityThread.access$600(ActivityThread.java:123)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.os.Handler.dispatchMessage(Handler.java:99)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.os.Looper.loop(Looper.java:137)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 android.app.ActivityThread.main(ActivityThread.java:4424)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 java.lang.reflect.Method.invokeNative(Native Method)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 java.lang.reflect.Method.invoke(Method.java:511)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-05 00:57:35.098: W/nalizableReferenceQueue(2295): 在 dalvik.system.NativeStart.main(Native Method)
03-05 00:57:35.108: I/dalvikvm(2295): 将堆栈跟踪写入“/data/anr/traces.txt”
03-05 00:57:35.338: D/dalvikvm(2295): GC_CONCURRENT 释放 391K,4% 释放 12676K/13127K,暂停 8ms+5ms
03-05 00:57:35.418: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.418: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.418: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.418: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.418: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.428: W/dalvikvm(2295): VFY: 无法找到签名中引用的类 ([Ljava/beans/PropertyDescriptor;)
03-05 00:57:35.438: I/dalvikvm(2295): 找不到方法 java.beans.Introspector.getBeanInfo,引用自方法 com.google.inject.internal.cglib.core.$ReflectUtils.getPropertiesHelper
03-05 00:57:35.438: W/dalvikvm(2295): VFY: 无法解析静态方法 8989: Ljava/beans/Introspector;.getBeanInfo (Ljava/lang/Class;Ljava/lang/Class;)Ljava/beans /豆信息;
03-05 00:57:35.438: D/dalvikvm(2295): VFY: 在 0x000c 处替换操作码 0x71
03-05 00:57:35.458: W/dalvikvm(2295): VFY: 无法解析异常类 1373 (Ljava/beans/IntrospectionException;)
03-05 00:57:35.458: W/dalvikvm(2295): VFY: 无法在地址 0x4e 找到异常处理程序
03-05 00:57:35.458: W/dalvikvm(2295): VFY: 拒绝 Lcom/google/inject/internal/cglib/core/$ReflectUtils;.getPropertiesHelper (Ljava/lang/Class;ZZ)[Ljava/beans/属性描述符;
03-05 00:57:35.458: W/dalvikvm(2295): VFY: 在 0x004e 拒绝操作码 0x0d
03-05 00:57:35.458: W/dalvikvm(2295): VFY: 拒绝 Lcom/google/inject/internal/cglib/core/$ReflectUtils;.getPropertiesHelper (Ljava/lang/Class;ZZ)[Ljava/beans/属性描述符;
03-05 00:57:35.458: W/dalvikvm(2295): 验证器拒绝类 Lcom/google/inject/internal/cglib/core/$ReflectUtils;
03-05 00:57:35.488: D/AndroidRuntime(2295): 关闭 VM
03-05 00:57:35.498: W/dalvikvm(2295): threadid=1: 线程以未捕获的异常退出 (group=0x409c01f8)
03-05 00:57:35.508: I/dalvikvm(2295): threadid=3: 对信号 3 做出反应
03-05 00:57:35.548: I/dalvikvm(2295): 将堆栈跟踪写入“/data/anr/traces.txt”
03-05 00:57:35.568:E/AndroidRuntime(2295):致命异常:主要
03-05 00:57:35.568: E/AndroidRuntime(2295): java.lang.RuntimeException: 无法启动活动 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): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.ActivityThread.access$600(ActivityThread.java:123)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.os.Handler.dispatchMessage(Handler.java:99)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.os.Looper.loop(Looper.java:137)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.ActivityThread.main(ActivityThread.java:4424)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 java.lang.reflect.Method.invokeNative(Native Method)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 java.lang.reflect.Method.invoke(Method.java:511)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 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): 由: 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): 在 com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 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): 在 com.google.inject.internal.FailableCache.get(FailableCache.java:50)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.Guice.createInjector(Guice.java:95)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.Guice.createInjector(Guice.java:72)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.Guice.createInjector(Guice.java:62)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 za.co.mambo.cherrylist.android.CherryListActivity.onCreate(CherryListActivity.java:27)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.Activity.performCreate(Activity.java:4465)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
03-05 00:57:35.568: E/AndroidRuntime(2295): ... 11 更多
03-05 00:57:35.568: E/AndroidRuntime(2295): 由: java.lang.VerifyError: com/google/inject/internal/cglib/core/$ReflectUtils
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.cglib.reflect.$FastClassEmitter.(FastClassEmitter.java:67)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:72)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 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): 在 com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:207)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:53)
03-05 00:57:35.568: E/AndroidRuntime(2295): 在 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: 对信号 3 做出反应
03-05 00:57:36.188: I/dalvikvm(2295): 将堆栈跟踪写入“/data/anr/traces.txt”
03-05 00:57:36.530: I/dalvikvm(2295): threadid=3: 对信号 3 做出反应
03-05 00:57:36.538: I/dalvikvm(2295): 将堆栈跟踪写入“/data/anr/traces.txt”

4

1 回答 1

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 jar 放入您的构建和 apk。

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

于 2013-03-05T22:14:29.930 回答