Android项目中包私有scala对象的NoClassDefFoundError

时间:2013-02-01 17:49:04

标签: android scala proguard noclassdeffounderror dalvik

我试图在Android项目中使用Json4s。我的项目编译等,但我看到以下错误:

  

W / dalvikvm(24527):VFY:无法找到签名中引用的类   (Lcom / thoughtworks / paranamer / CachingParanamer;)I / dalvikvm(24527):   找不到方法   com.thoughtworks.paranamer.CachingParanamer.lookupParameterNames,   从方法中引用   org.json4s.Meta $ ParanamerReader $ .lookupParameterNames   W / dalvikvm(24527):VFY:无法解析虚方法11:   LCOM / ThoughtWorks的/ paranamer / CachingParanamer; .lookupParameterNames   (Ljava /郎/反映/的AccessibleObject;)[Ljava /郎/字符串;   D / dalvikvm(24527):VFY:将操作码0x6e替换为0x0008   E / dalvikvm(24527):找不到上课   ' com.thoughtworks.paranamer.CachingParanamer',从方法引用   org.json4s.Meta $。 W / dalvikvm(24527):VFY:无法解决   新实例15(Lcom / thoughtworks / paranamer / CachingParanamer;)in   Lorg / json4s /元$; D / dalvikvm(24527):VFY:替换操作码0x22 at   0x0013 W / dalvikvm(24527):VFY:无法找到引用的类   签名(Lcom / thoughtworks / paranamer / CachingParanamer;)   D / dalvikvm(24527):DexOpt:无法选择在0x17处直接调用0x0009   Lorg / json4s /元$ ;. D / dalvikvm(24527):DexOpt:无法选择   在Lorg / json4s / Meta $;中直接调用0x000a在0x1a。   W / dalvikvm(24527):异常Ljava / lang / NoClassDefFoundError;抛出   初始化Lorg / json4s / Meta $; W / System.err的(24527):   java.lang.ExceptionInInitializerError W / System.err(24527):at   org.json4s.Extraction $ .mkMapping $ 1(Extraction.scala:207)   W / System.err(24527):at   org.json4s.Extraction $ .ORG $ json4s $提取$$ extract0(Extraction.scala:214)   W / System.err(24527):at   org.json4s.Extraction $ .extract(Extraction.scala:47)   W / System.err(24527):at   org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)   W / System.err(24527):at   models.Metadata $$ anon $ 1.(Metadata.scala:21)W / System.err(24527):     在models.Metadata $ .fromJson(Metadata.scala:20)W / System.err(24527):     在my.last.attempt.MainActivity.doStuff(MainActivity.scala:55)   W / System.err(24527):at   my.last.attempt.MainActivity.onCreate(MainActivity.scala:18)   W / System.err(24527):at   android.app.Activity.performCreate(Activity.java:5048)   W / System.err(24527):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)   W / System.err(24527):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)   W / System.err(24527):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)   W / System.err(24527):at   android.app.ActivityThread.access $ 700(ActivityThread.java:139)   W / System.err(24527):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1224)   W / System.err(24527):at   android.os.Handler.dispatchMessage(Handler.java:99)   W / System.err(24527):在android.os.Looper.loop(Looper.java:137)   W / System.err(24527):at   android.app.ActivityThread.main(ActivityThread.java:4918)   W / System.err(24527):at java.lang.reflect.Method.invokeNative(Native   方法)W / System.err(24527):at   java.lang.reflect.Method.invoke(Method.java:511)W / System.err(24527):     在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1004)   W / System.err(24527):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)   W / System.err(24527):at dalvik.system.NativeStart.main(Native Method)   W / System.err(24527):引起:java.lang.NoClassDefFoundError:   com.thoughtworks.paranamer.CachingParanamer W / System.err(24527):at   org.json4s.Meta $。(Meta.scala:93)W / System.err(24527):at   org.json4s.Meta $。(Meta.scala)W / System.err(24527):... 22   更多I / dalvikvm(24527):在先前失败的类上拒绝重新初始化   Lorg / json4s /元$; v = 0x0 D / AndroidRuntime(24527):关闭VM   W / dalvikvm(24527):threadid = 1:线程退出未捕获的异常   (group = 0x40dc0438)E / AndroidRuntime(24527):FATAL EXCEPTION:main   E / AndroidRuntime(24527):java.lang.NoClassDefFoundError:   org / json4s / Meta $ E / AndroidRuntime(24527):at   org.json4s.Extraction $ .mkMapping $ 1(Extraction.scala:207)   E / AndroidRuntime(24527):at   org.json4s.Extraction $ .ORG $ json4s $提取$$ extract0(Extraction.scala:214)   E / AndroidRuntime(24527):at   org.json4s.Extraction $ .extract(Extraction.scala:47)   E / AndroidRuntime(24527):at   org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)   E / AndroidRuntime(24527):at   my.last.attempt.MainActivity.onCreate(MainActivity.scala:44)   E / AndroidRuntime(24527):at   android.app.Activity.performCreate(Activity.java:5048)   E / AndroidRuntime(24527):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)   E / AndroidRuntime(24527):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)   E / AndroidRuntime(24527):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)   E / AndroidRuntime(24527):at   android.app.ActivityThread.access $ 700(ActivityThread.java:139)   E / AndroidRuntime(24527):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1224)   E / AndroidRuntime(24527):at   android.os.Handler.dispatchMessage(Handler.java:99)   E / AndroidRuntime(24527):在android.os.Looper.loop(Looper.java:137)   E / AndroidRuntime(24527):at   android.app.ActivityThread.main(ActivityThread.java:4918)   E / AndroidRuntime(24527):at   java.lang.reflect.Method.invokeNative(Native Method)   E / AndroidRuntime(24527):at   java.lang.reflect.Method.invoke(Method.java:511)   E / AndroidRuntime(24527):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1004)   E / AndroidRuntime(24527):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)   E / AndroidRuntime(24527):at dalvik.system.NativeStart.main(Native   方法)

我不确定dalvikvm是否存在问题,或者只是一个问题。如果相关,Json4s.Meta的来源如下:

package org.json4s

import java.lang.reflect.{Constructor => JConstructor, Field, Type, ParameterizedType, GenericArrayType}
import java.util.Date
import java.sql.Timestamp
import com.thoughtworks.paranamer.{ParameterNamesNotFoundException, BytecodeReadingParanamer, CachingParanamer}
import scalashim._

case class TypeInfo(clazz: Class[_], parameterizedType: Option[ParameterizedType])

trait ParameterNameReader {
  def lookupParameterNames(constructor: JConstructor[_]): Traversable[String]
}

private[json4s] object Meta {
  import com.thoughtworks.paranamer._

其次是一堆案例类等。

有关如何解决此问题的想法吗?

1 个答案:

答案 0 :(得分:0)

看起来代码中缺少类com.thoughtworks.paranamer.CachingParanamer。这可能是因为库中缺少它,或者因为ProGuard已经删除或重命名它(错误地?)。

在前一种情况下,您应该确保libs目录中存在所有必需的库。如果输入中似乎缺少任何类,ProGuard应该抱怨。

在后一种情况下,您应确保在Android SDK中使用最新版本的ProGuard(此时为4.8或4.9beta)。如果这没有帮助,您可以尝试明确地保留该类:

-keep class com.thoughtworks.paranamer.CachingParanamer

这不太可能是一个合适的解决方案,因为ProGuard真的应该为你解决这个问题。