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

我正在使用最新的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内部的内容来检查它。 我无法想到其他的东西,因为它在我的所有设备中都能完美运行,如果class级不在那里,它就不会。

    $〜/ 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调用Utility的静态方法后,它似乎失败了,这恰好是同一个类中的静态方法 。 因此,如果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.(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 

由于NoClassDefFoundError发生在AsyncTask的匿名实现的loadAppSettingsAsync中,它似乎是同样的问题,如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 } 

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

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

  • 课程可能会丢失。

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

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

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