Intereting Posts
Как я могу использовать сообщение Cloud Firebase в проекте eclipse? Отредактируйте или удалите разрешение со страницы информации о приложении во время установки приложения Как программно изменить список слоев в Android? База данных Android SQLite с многопоточным Android скачать pdf от url, затем открыть его с помощью PDF-ридера Андроида студия 1.2 град очень медленная Android HttpResponse всегда умирает во второй раз, когда он называется Использование объектов Buffer Buffer (PBO) на Android Обновление Eclipse не работает Android – невозможно уничтожить активность после завершения, вызванное IllegalStateException: не удается выполнить это действие после onSaveInstanceState NullPointerException на ViewPager с Recyclerview Хорошая практика заключается в разработке вспомогательного сетевого класса, который отвечает за все сетевые задачи? Получите оба сим-номера в двойном сим-телефоне для Android Добавить водяной знак маленькое изображение в большое изображение opencv4android Размеры виджета Android?

Почему класс фрагмента может быть недействительным?

Я только что создал PreferenceActivity, используя мастер AndroidStudio, запустив его, возникло странное исключение:

java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! 

Я видел предлагаемые решения здесь, но мне было интересно, почему я должен проверить, действительно ли мои классы фрагментов действительны, поскольку я даже не полностью понимаю, что означает «действительный», поэтому я решил задать вопрос сообществу:

isValidFragment(String fragmentName) PreferenceActivity имеет isValidFragment(String fragmentName) который по какой-то причине должен быть переоценен, почему? Как класс фрагмента недействителен? И что может пойти не так с таким переопределением:

  @Override protected boolean isValidFragment(String fragmentName) { return true; } 

Зачем?

В PreferenceActivity была скомпрометирована его безопасность, а isValidFragment(String name) было предоставлено в качестве ответа.

В частности, из раскрытия уязвимости:

Любое приложение, которое реализует и экспортирует действие, которое расширяет класс PreferenceActivity, может быть подорвано для загрузки произвольного класса, используя процесс загрузки динамического фрагмента.

Проблема безопасности означала, что приложение-изгоя может создать экземпляр вашего PreferenceFragments, и они получат свои дополнительные данные от фактического родителя, утечки данных.

В качестве патча было создано isValidFragment(String name) поэтому вы вынуждены либо предоставлять белый список «безопасных» фрагментов, либо если вы всегда возвращаете true, подтвердите риск взлома вашего приложения.

Это необходимо только для запуска KitKat, потому что когда был введен патч.

Как класс фрагмента недействителен?

Наличие имени, чуждого вашему приложению.

Что может пойти не так?

Кто-то может атаковать ваше приложение с помощью метода, описанного в этом документе, связанного с @Sree в комментариях.

Я думаю, что это совершенно новый класс, который может не поддерживаться старой версией sdk.

Как говорится в документе Google:

Реализация по умолчанию возвращает true для приложений, созданных для android: targetSdkVersion старше KITKAT. Для более поздних версий это вызовет исключение.

Но я не совсем уверен, есть ли другие случаи, также вызывающие бросок.

С сайта developer.android.com:

Подклассы должны переопределить этот метод и убедиться, что данный фрагмент является допустимым типом, который должен быть присоединен к этому действию. Реализация по умолчанию возвращает true для приложений, созданных для android: targetSdkVersion старше KITKAT. Для более поздних версий это вызовет исключение.

В основном на TargetSDK <= KITKAT, вы должны убедиться, что имя фрагмента isValidFragment является правильным.