Ошибка Android случайно java.lang.NoClassDefFoundError: com.facebook.internal.Utility

Я использую последнюю версию Android 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;)

  • Кажется, что он завершился после вызова статического метода Utility из loadAppSettingsAsync, который является статическим методом в пределах одного класса. Итак, если класс com.facebook.internal.Utility не существует или не может быть загружен, как возможно, что com.facebook.internal.Utility.loadAppSettingsAsync выполняется на первом месте? и если он существует и загружается, почему NoClassDefFoundError загружается на com.facebook.internal.Utility? Я так потерялся...

Здесь стек из 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

Ответы

Ответ 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
}

Ответ 2

Во-первых, убедитесь, что вы проверяете правильный класс. Согласно сообщению об ошибке, "отсутствующий" класс com.facebook.internal.loadAppSettingsAsync$1. Обратите внимание на $1!! Это означает, что мы говорим об анонимном внутреннем классе, объявленном в Utility.loadAppSettingsAsync.

Во-вторых, java.lang.NoClassDefFoundError может иметь несколько причин:

  • Класс может отсутствовать.

  • По какой-то причине класс может присутствовать, но не может быть загружен.

  • Класс может быть загружаемым, но предыдущая попытка инициализировать его... или некоторый зависимый класс... не удалась.

Последний случай обычно случается, если статический инициализационный или статический блок инициализатора бросает неконтролируемое исключение при первом запуске. (Обычно для этого исключения обычно используется сообщение журнала.) Как только инициализация класса завершилась неудачно один раз, класс помечается как сломанный. Это останавливает класс и любые другие классы, которые зависят от его инициализации.