【问题标题】:Android error randomly java.lang.NoClassDefFoundError: com.facebook.internal.UtilityAndroid 随机错误 java.lang.NoClassDefFoundError: com.facebook.internal.Utility
【发布时间】:2014-12-09 13:46:48
【问题描述】:

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

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

b) 在那个版本和之前的版本之间,FB 逻辑完全没有变化,在之前的版本中我从来没有遇到过这样的错误。

由于我在这些版本之间的代码中找不到任何相关差异,我认为问题是在生成最后一个 apk 时 Android 工具可能发生了问题,但事实上我使用的是相同的 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

【问题讨论】:

  • 你为 facebook 类使用了什么 proguard 配置?
  • -保留类 com.facebook.** { *; } -keepattributes 签名

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 这似乎有些道理。让我尝试使用该解决方法发布一个新版本,看看会发生什么。反正不会有副作用吗?我的意思是,忽略异常不会改变需要此类且不可下载的事实......
  • 应该没有副作用。此解决方法只是确保类加载器将此类显式加载到内存中以避免播放服务错误。 AsyncTask 是 android 系统的一个组件,绝对可以在每台设备上使用。
  • 您好,由于 FacebookSdk,我遇到了问题。我应该怎么做才能解决这个问题?我尝试了上述方法,但它不起作用。
  • @Fran 你好,结果如何?你修好了吗?我遇到了同样的问题,因为它不是 AsyncTask 找不到,所以我认为可能不是“Udo”所说的情况。
【解决方案2】:

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

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

  • 可能缺少该类。

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

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

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

【讨论】:

  • 其实这不是“缺失”类,而是 com.facebook.internal.Utility$1,我确信已经检查过了(我已经编辑了问题以添加 dexdump 的结果一个grep)。
  • 就我能够重现崩溃而言,无论出于何种原因,该类可能无法加载都超出了我的调试器范围。我也无权远程访问我的用户日志... :-|
  • 请您的一位用户向您发送日志文件。或者购买旧的 Android 手机并尝试自己重现问题。
  • 其实我有一个比我祖父年长的 Galaxy Y,但它并没有失败。不是那部手机,不是我运行的每个模拟器。另一方面,我不从我的用户那里收集信息,所以我无法将崩溃与用户联系起来,以便我可以联系他/她。不管怎样,我现在正在看那个库的代码。
  • 在“就我能够重现崩溃”之前所说的地方,我实际上的意思是“就我无法重现崩溃而言”,尽管我认为这很清楚上下文。
猜你喜欢
  • 2016-01-19
  • 2017-09-21
  • 1970-01-01
  • 2014-04-29
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2013-05-14
相关资源
最近更新 更多