Подтвердить что ты не робот

Класс исключений для одного класса на Android

У меня возникла странная проблема с ClassCastException на Android. Один класс нельзя отнести к тому же классу:

java.lang.RuntimeException: Unable to start activity ComponentInfo: java.lang.ClassCastException: com.example.model.BadeWrapper cannot be cast to com.example.model.BadgeWrapper

java.lang.ClassCastException: com.example.events.widgets.TouchyWebView cannot be cast to com.example.events.widgets.TouchyWebView

java.lang.ClassCastException: com.example.friends.widgets.FriendsTabView cannot be cast to com.example.friends.widgets.FriendsTabView

Когда я нахожу строку с ошибкой, все, что она делает, это поиск вида по id или создание фрагмента с аргументами, например:

FriendsTabView friendsTabView;
friendsTabView = (FriendsTabView) view.findViewById(R.id.friends_bottom_tab_panel);

Как говорит мой BugSense, эта проблема возникает только на Samsung Galaxy S5 с Android 5.0.0 (samsung SM-G900F). Я никогда не встречал эту проблему на других устройствах:

  • Motorola Moto G 1st gen (Android 5.0.1)
  • Samsung Galaxy S3 Mini (Android 4.1.2)
  • LG G2 Mini (Android 4.4.2)
  • Sony Xperia L (Android 4.1.2)

Кто-нибудь встретил эту проблему раньше? Есть ли способ исправить это?

4b9b3361

Ответ 1

Хорошо, где проблема. Похоже, что Samsung на Android 5.0, вероятно, по-прежнему использует старую реализацию multidex (используется в Android L Preview), поэтому, если ваше приложение превышает предел 64k, оно будет разбиваться в случайных местах вашего приложения, где вы используете (ExampleClass) object.

Дополнительную информацию по этой проблеме можно найти здесь и здесь.

Мы также видим, что этот крах случается тысячи раз в день. Crashlytics сообщает об аварии как 100% устройства Samsung (99% "SM G900F [Q]" устройство) и 100% Android 5.x. Кажется, это еще одна проблема с несколькими приложениями на устройствах Samsung + Lollipop, поскольку a.jaskev сообщает в # 3.

Похоже, нам нужно подождать, пока Samsung решит эту проблему. Сейчас все, что мы можем сделать, это наблюдать наш спам в почтовом ящике с сообщениями об ошибках:)

Ответ 2

На самом деле есть решение.

Samsung использует модифицированную версию метода makeDexElements (с дополнительными аргументами), а решение - изменить исходный код MultiDex, чтобы вызвать его только для этой модели:

    /**
     * A wrapper around
     * {@code private static final dalvik.system.DexPathList#makeDexElements}.
     */
    private static Object[] makeDexElements(
            Object dexPathList, ArrayList<File> files, File optimizedDirectory,
            ArrayList<IOException> suppressedExceptions)
            throws IllegalAccessException, InvocationTargetException,
            NoSuchMethodException {

        Method makeDexElements = findMethod(dexPathList, "makeDexElements", ArrayList.class, File.class, ArrayList.class, ClassLoader.class);
        makeDexElements.setAccessible(true);
        return (Object[]) makeDexElements.invoke(dexPathList, files, optimizedDirectory, suppressedExceptions,
                SamsungS5.class.getClassLoader());
    }