我刚刚使用AndroidStudio向导创建了一个PreferenceActivity,运行它时抛出了一个奇怪的例外:
java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid!
我看到了建议的解决方案here,但我想知道为什么我必须检查我的片段类是否有效,因为我甚至不完全理解"有效"的定义,所以我决定问社区:
PreferenceActivity有isValidFragment(String fragmentName)
方法,由于某种原因必须覆盖,为什么?片段类怎么可能无效?以及这种覆盖会出现什么问题:
@Override
protected boolean isValidFragment(String fragmentName)
{
return true;
}
答案 0 :(得分:2)
PreferenceActivity的安全性受到影响,isValidFragment(String name)
作为回复提供。
更具体地说,从漏洞披露:
任何实现和导出活动的应用程序 它扩展了PreferenceActivity类 可以颠覆为加载任意类 利用动态片段加载过程。
安全问题意味着流氓应用程序可以实例化您的PreferenceFragments,并且他们会从实际的父项中获取额外的数据。
作为补丁,isValidFragment(String name)
已创建,因此您不得不提供“安全”片段的白名单,或者如果您始终返回,则承认您的应用程序遭到入侵的风险。
只需要启动KitKat,因为它是在引入补丁的时候。
有一个与你的应用程序不同的名字。
有人可能会通过@Sree在评论中链接的this pdf中描述的方法攻击您的应用。
答案 1 :(得分:0)
我认为这是一个非常新的类,旧的sdk版本可能不支持。
正如谷歌文件所说:
对于为其构建的应用,默认实现返回true android:targetSdkVersion比KITKAT更早。对于以后的版本,它 会抛出异常。
但我不确定是否还有其他案件也会导致抛出。
答案 2 :(得分:0)
来自developer.android.com:
子类应覆盖此方法并验证给定片段是否要附加到此活动的有效类型。对于为Android构建的应用程序,默认实现返回true:比KITKAT更早的targetSdkVersion。对于更高版本,它将引发异常。
基本上在TargetSDK< = KITKAT上,你应该确保片段名称isValidFragment
通过是正确的。