“android:exported =” true “对于身份验证服务真的是必要的吗?”

25

通常,实现 Android 身份验证器需要两个服务 - Authentication 服务返回身份验证器和提供同步适配器的 Sync 服务。这个问题特别涉及到 Authentication 服务,尽管在 大多数示例中两个服务在 AndroidManifest.xml 中都被赋予了 android:exported="true" 属性,例如:

<service
    android:name=".authenticator.AuthenticationService"
    android:exported="true">
    <intent-filter>
        <action
            android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data
        android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>

从身份验证服务中删除该属性似乎没有任何效果(在Froyo、Gingerbread上进行了测试)- 身份验证代码仍然可以正常工作 - 那么该标志是否真的是必需的?

3个回答

46
好的,通过阅读文档我自己回答这个问题,exported 属性的文档说:

默认值取决于服务是否包含意图过滤器。没有任何过滤器意味着只能通过指定其准确的类名来调用它。这意味着该服务仅用于应用程序内部使用(因为其他人不会知道类名)。所以在这种情况下,默认值为 "false"。另一方面,至少有一个过滤器的存在意味着该服务是为外部使用而设计的,因此默认值为 "true"。

所有身份验证服务都有一个意图过滤器 - AbstractAccountAuthenticator 的文档说:

要成为身份验证器,必须 ... 编写一个服务,在使用 ACTION_AUTHENTICATOR_INTENT 操作的意图调用 onBind(android.content.Intent) 方法时返回 getIBinder() 的结果。

这需要一个意图过滤器,因此服务的导出默认值为 true。因此,对于这个问题的答案是:"不,该属性是必需的 - 因为默认情况下它为真"


1
自从 Android 4.2 版本,android:exported 的默认值现在为 false。 - Sash_KP
你能提供一些证明的文档链接吗?上面链接的Android文档仍然说:“...另一方面,至少有一个过滤器的存在意味着该服务是为外部使用而设计的,因此默认值为“true”。 - Roberto Tyley
1
我看到了这份文档:https://developer.android.com/about/versions/android-4.2.html - 其中写道“内容提供者不再默认导出。” - 但这仅涉及内容提供者,而不是服务,我认为是这样的? - Roberto Tyley
1
哦,是的,你说得对。这只适用于内容提供者。 - Sash_KP
1
对于广播接收器,如果至少指定了一个<intent-filter>,则默认值为“true”,否则为“false”。 - CopsOnRoad

2

0

android:exported 属性用于设置组件(activityservicebroadcast receiver 等)是否可以被其他应用程序的组件启动:如果为 true,则任何应用都可以通过其完整类名访问并启动该活动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接