С тех пор, как был выпущен KitKat, я заметил целую кучу обновлений моих приложений с помощью "Fixing crash in Kit Kat". Недавно, когда я выпустил собственное приложение, я понял, что вероятным источником этого является новое требование isValidFragment для использования действий с предпочтениями. Однако я не смог заставить кого-то объяснить, почему этот новый класс внезапно необходим для проверки фрагментов. Может ли кто-нибудь предложить мне объяснение, почему это требуется?
Почему Kit Kat требует использования isValidFragment?
Ответ 1
Подклассы должны переопределить этот метод и убедиться, что данный фрагмент является допустимым типом, который должен быть присоединен к этому действию. Реализация по умолчанию возвращает true для приложений, созданных для android: targetSdkVersion старше KITKAT. Для более поздних версий он генерирует исключение.
Новая уязвимость в Android Framework: инъекция фрагментов
Недавно мы раскрыли новую уязвимость для Android Security Команда. Уязвимость затронула многие приложения, включая "Настройки" ( тот, который находится на каждом устройстве Android), Gmail, Google Now, DropBox и Evernote. Чтобы быть более точным, любое приложение, которое расширяет Класс PreferenceActivity с использованием экспортированной активности автоматически уязвима. Патч был предоставлен в Android KitKat. если ты почему ваш код сейчас сломан, это связано с Android KitKat patch, который требует, чтобы приложения перекрывали новый метод, PreferenceActivity.isValidFragment, который был добавлен в Android Framework.
http://securityintelligence.com/new-vulnerability-android-framework-fragment-injection/ http://securityintelligence.com/wp-content/uploads/2013/12/android-collapses-into-fragments.pdf
Ответ 2
Здесь: http://commonsware.com/blog/2013/12/13/sanitize-all-the-extras.html предлагается, чтобы это было введено как исправление безопасности:
PreferenceActivity поддерживает дополнительные функции для загрузки определенных PreferenceFragments в действие. Это сильно используется Приложение настроек, чтобы приложения могли ездить прямо на определенные экраны (фактически фрагменты). К сожалению, в PreferenceActivity, чтобы гарантировать, что только те фрагменты, которые были которые, как предполагается, были доступны извне, были загружены через эти дополнительные услуги - следовательно, добавление isValidFragment(). Итак, правильно созданный Intent может открыть любую экспортированную PreferenceActivity и запустить любой PreferenceFragment от него, при отсутствии такой защиты.
(полужирный текст, добавленный мной)
Ответ 3
Взято из блога commonsware.
Как только вы нацелитесь на уровень API 19 или выше, вам необходимо переопределить isValidFragment() в вашей PreferenceActivity, чтобы проверить, что указанное имя класса фрагмента - это действительно то, что должно отображаться. С манжетой это похоже на хак, чтобы справиться с недостатком безопасности.
Документация говорит
protected boolean isValidFragment (String имя_файла)
Подклассы должны переопределить этот метод и убедиться, что данный фрагмент является допустимым типом, который должен быть присоединен к этому действию. Реализация по умолчанию возвращает true для приложений, созданных для android: targetSdkVersion старше KITKAT. Для более поздних версий он генерирует исключение.
Ответ 4
У вас есть документально:
Подклассы должны переопределить этот метод и убедиться, что данный фрагмент является допустимым типом, который должен быть присоединен к этой активности. По умолчанию реализация верна для приложений, созданных для android: targetSdkVersion старше, чем KITKAT. Для более поздних версий это выдает исключение.
пока ваш targetSdk окажется ниже 19, вам не нужно заботиться. Если это 19, ваше приложение выйдет из строя из-за исключения, если вы не реализуете isValidFragment()
..