Класс исключений для одного класса на 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)
Кто-нибудь встретил эту проблему раньше? Есть ли способ исправить это?
Ответы
Ответ 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());
}