为什么片段类可能无效?

时间:2015-09-25 10:46:03

标签: android android-fragments

我刚刚使用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;
    }

3 个答案:

答案 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通过是正确的。