Android error random java.lang.NoClassDefFoundError: com.facebook.internal.Utility

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

a)错误似乎是随机发生的。我无法在我的任何设备上重现它。

b)该版本和上一个版本之间的FB逻辑没有任何变化,并且在以前的版本中,我从未出现过这样的错误。

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

欢迎任何关于如何解决或调试这件事的想法。

可能相关的更多信息:

  • 所有崩溃都发生在Android 4.0.3或更早版本中。最高的百分比是2.3.6,占所有崩溃的48%。
  • 该类实际上是在APK中导出的。我已经通过解压缩apk并使用dexdump来检查它,以查看classs.dex中的内容。我不能指望其他东西,因为它在我所有的设备上都能完美地工作,如果课程不在那里,它就不会。

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

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

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

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

答案 1

由于NoClassDefFoundError发生在adloadAppSettingsAsync中,在AsyncTask的匿名实现中,它似乎与此类似的问题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
}

答案 2

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

二、可能有很多原因:java.lang.NoClassDefFoundError

  • 该类可能丢失。

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

  • 该类可能是可加载的,但是之前尝试初始化它...或一些依赖类...已失败。

如果静态初始化或静态初始值设定项块在首次运行时引发未经检查的异常,则通常发生最后一种情况。(您通常会收到此异常的日志消息。一旦类初始化失败一次,该类就会被标记为已损坏。这将阻止初始化该类以及依赖于该类的任何其他类