Android随机错误java.lang.NoClassDefFoundError:com.facebook.internal.Utility

时间:2014-12-09 13:46:49

标签: java android eclipse facebook facebook-graph-api

我正在使用最新的Facebook Android SDK,并在我最新发布的apk中从我的远程崩溃控制应用程序中的数十个用户那里获得该错误。我在这里看到了这样的错误,但是大多数答案对于最后一个FB SDK来说已经过时了,在这种情况下有两种奇怪的情况:

a)错误似乎是随机发生的。在我的所有设备上,我都无法重现它。

b)该版本与前一版本之间的FB逻辑没有任何变化,在之前的版本中我从未遇到过这样的错误。

由于我无法在这些版本之间的代码中找到任何相关的差异,我认为问题是Android Tools在生成最后一个apk时可能发生的错误,但是给出的事实是同样的apk是一个我正在使用并且无法重现问题,尽管有数十个或用户受到影响,数百个使用相同的apk并不是,我也放弃了这样的假设。

欢迎任何有关如何解决或调试此事的想法。

更多可能相关的信息:

  • 所有崩溃都发生在Android 4.0.3或更早版本中。最高百分比为2.3.6,占所有崩溃的48%。
  • 该类实际上是在APK 中导出的。我通过解压缩apk并使用dexdump查看classes.dex内部的内容来检查它。我无法预料到其他的事情,因为它在我的所有设备中都能完美运行,如果课程不在那里,那就不会。

    $〜/ android-sdks / build-tools / 21.1.1 / dexdump classes.dex | grep' com.facebook.internal.Utility $ 1'   类描述符:' Lcom / facebook / internal / Utility $ 1;'     #0 :(在Lcom / facebook / internal / Utility $ 1;)     #1 :(在Lcom / facebook / internal / Utility $ 1;)     #2 :(在Lcom / facebook / internal / Utility $ 1;)     #0 :(在Lcom / facebook / internal / Utility $ 1;)     #0 :(在Lcom / facebook / internal / Utility $ 1;)     #1 :(在Lcom / facebook / internal / Utility $ 1;)     #2 :(在Lcom / facebook / internal / Utility $ 1;)     #3 :(在Lcom / facebook / internal / Utility $ 1;)

  • 从loadAppSettingsAsync调用实用程序的静态方法后,它似乎失败,恰好是同一类中的静态方法。因此,如果com.facebook.internal.Utility类不存在或无法加载,那么首先如何执行com.facebook.internal.Utility.loadAppSettingsAsync?如果它存在并加载,为什么在com.facebook.internal.Utility上抛出NoClassDefFoundError?我很失落......

这里是splunk mint(以前称为bugsense)的堆栈,我刚刚更改了应用程序的名称。我用proguard地图文件回溯了它,但它似乎错过了一些行号:

java.lang.NoClassDefFoundError: com.facebook.internal.Utility$1
    at com.facebook.internal.Utility.void loadAppSettingsAsync(android.content.Context,java.lang.String)(Unknown Source)
    at com.facebook.Settings.void sdkInitialize(android.content.Context)(Unknown Source)
    at com.facebook.UiLifecycleHelper.<init>(Unknown Source)
    at net.iberdroid.androidgames.framework.impl.AndroidGame.void onCreate(android.os.Bundle)(Unknown Source)
    at com.marzoa.ruletafree.xmas2012.RuletaAfortunadaGame.void onCreate(android.os.Bundle)(Unknown Source)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3770)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.facebook.internal.Utility$1 in loader dalvik.system.PathClassLoader[/data/app/com.marzoa.ruletafree.xmas2012-2.apk]
    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    ... 18 more

2 个答案:

答案 0 :(得分:5)

由于在AsyncTask的匿名实现中的loadAppSettingsAsync中发生NoClassDefFoundError,它似乎是同样的问题,如NoClassDefFoundError - Android 2.3.X

这是谷歌播放服务中的一个错误。 (https://code.google.com/p/android/issues/detail?id=81083

尝试将以下内容添加到Application#onCreate()方法中,如所引用问题的答案中所述。

try {
    Class.forName("android.os.AsyncTask");
}
catch(Throwable ignore) {
    // ignored
}

答案 1 :(得分:3)

首先,请确保您正在检查合适的班级。根据错误消息,&#34;缺失&#34; class是com.facebook.internal.loadAppSettingsAsync$1。注意$1 !!这意味着我们正在谈论在Utility.loadAppSettingsAsync中声明的匿名内部类。

其次,java.lang.NoClassDefFoundError可能有多种原因:

  • 课程可能会丢失。

  • 该课程可能存在但由于某种原因无法加载。

  • 该类可以加载,但先前尝试初始化它...或某些依赖类...失败。

如果静态初始化或静态初始化程序块在第一次运行时抛出未经检查的异常,则通常会发生最后一种情况。 (您通常会为此异常发送一条日志消息。)一旦类初始化失败一次,该类就会被标记为已损坏。这会阻止类和任何其他依赖它的类被初始化。