java.lang.ClassNotFoundException, возникающее только на обновленных устройствах Samsung с Android 9.0

#java #android #androidx #samsung-galaxy

#java #Android #androidx #samsung-galaxy

Вопрос:

Итак, по-видимому, приложение выходит из строя всякий раз, когда пользователь пытается открыть его на своих устройствах Samsung Galaxy с последним обновлением 9.0. Я тестировал приложение на устройствах с Android 9.0, и, похоже, оно отлично работает почти на всех устройствах, на которых я его тестировал. Я думаю, это единственная проблема Samsung?

Вот трассировки стека из Play Console:

   java.lang.NoClassDefFoundError: 
  at androidx.fragment.app.FragmentManager.b (FragmentManager.java:3)
  at androidx.fragment.app.FragmentHostCallback.a (FragmentHostCallback.java:3)
  at androidx.fragment.app.FragmentManagerImpl.a (FragmentManagerImpl.java:19)
  at com.google.android.gms.ads.internal.util.ar.a (ar.java:15)
  at androidx.core.widget.AutoSizeableTextView.a (AutoSizeableTextView.java:20)
  at androidx.core.widget.AutoSizeableTextView.run (AutoSizeableTextView.java:8)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:134)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
  at androidx.appcompat.view.StandaloneActionMode.loadClass (StandaloneActionMode.java:4)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at androidx.fragment.app.FragmentManager.b (FragmentManager.java:3)
  at androidx.fragment.app.FragmentHostCallback.a (FragmentHostCallback.java:3)
  at androidx.fragment.app.FragmentManagerImpl.a (FragmentManagerImpl.java:19)
  at com.google.android.gms.ads.internal.util.ar.a (ar.java:15)
  at androidx.core.widget.AutoSizeableTextView.a (AutoSizeableTextView.java:20)
  at androidx.core.widget.AutoSizeableTextView.run (AutoSizeableTextView.java:8)
  

Приведенные выше трассировки стека — это все, что у меня есть в моей play Console, вместе с информацией об устройствах, на которых это происходит. Меня особенно беспокоит эта ошибка, потому что все больше людей будут обновляться до последней версии One UI Samsung.
Вот скриншот с Play Console, показывающий устройства с ошибками

По моему мнению, он не может найти определенный класс? Может быть, автоматический просмотр текста? Я использую библиотеки androidx в приложении вместе с темой MaterialComponents.

Комментарии:

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

2. Да, я уже загрузил файлы деобфускации, как вы можете видеть на скриншоте. Это зависимости Google, так что, возможно, они уже запутали его? Из-за этого даже я не могу понять, в чем проблема. Кроме того, если есть какой-либо способ де-запутывания файлов, это было бы здорово? У меня нет устройства Samsung, которое действительно могло бы видеть реальную трассировку стека, я пытался ее найти. Он отлично работает на всех устройствах с Android 9.0, за исключением обновленных Samsung One UI устройств.

3. Ваша проблема в том, что в stacktrace отсутствует сообщение, содержащее информацию о том, какой класс не удалось загрузить. Кроме того, номера строк недопустимы (я предполагаю, что у вас есть Proguard, настроенный для их удаления). Поскольку у нас нет ни сообщения с именем класса, ни номера строки, практически невозможно понять, что происходит не так. Похоже, вам нужен физический телефон Samsung или один из удаленных «ферм устройств» (удаленные устройства Android как сервис для отладки).

4. есть ли у вас map sdk в вашем приложении?

5. Нет, в моем приложении нет map sdk. @Robert Я вижу другие ошибки в ANR от Google и без проблем вылетает, с номерами строк и всем остальным. Только это ошибка, которая возникает таким образом.

Ответ №1:

возможно, правила ProGuard зашли слишком далеко? пожалуйста, проверьте наличие AutoSizeableTextView зависимостей (устаревших в вашем случае) android.support.* . Это может быть проблемой. В качестве альтернативы, что не рекомендуется (и это не решение), вы можете проверить, отсутствует ли зависимость в вашем приложении во время выполнения

 private boolean hasMissingClassFoo() {

    try {
        Class.forName("com.your.domain.myClassFoo");
    } catch (ClassNotFoundException x) {
        x.printStackTrace();
        return true;
    }
    return false;
}
  

Комментарии:

1. Но как мне на самом деле проверить, устранило ли это проблему? На данный момент у меня нет ни одного устройства Samsung, я столько времени пытался его найти. Есть ли какой-либо способ, которым я могу имитировать это на эмуляторе или другом физическом устройстве? Также в трассировке стека отображаются зависимости androidx, поэтому AutoSizeableTextView в этом случае не является устаревшим. И эта проблема особенно относится только к устройствам Samsung. Я тестировал его на устройствах Android 9.0, работает абсолютно нормально. Не может быть проблемы с запутыванием, если бы это была проблема, то она бы вообще не работала.

2. вы можете отслеживать события, исключения с помощью firebase crashlytics

3. Да, но я вроде как уже делаю это с помощью Google Play Crash analytics, верно?