android:exported=“true”真的是认证服务所必需的吗?

qncylg1j  于 2023-06-20  发布在  Android
关注(0)|答案(3)|浏览(186)

实现Android身份验证器通常涉及两个服务-返回身份验证器的身份验证服务和提供同步适配器的同步服务。这个问题是专门关于身份验证服务的,尽管在most examples * 中,两个 * 服务都在AndroidManifest.xml中被赋予了android:exported="true"属性,例如:

  1. <service
  2. android:name=".authenticator.AuthenticationService"
  3. android:exported="true">
  4. <intent-filter>
  5. <action
  6. android:name="android.accounts.AccountAuthenticator" />
  7. </intent-filter>
  8. <meta-data
  9. android:name="android.accounts.AccountAuthenticator"
  10. android:resource="@xml/authenticator" />
  11. </service>

从身份验证服务中删除属性似乎没有影响(测试过Froyo,Gingerbread)-身份验证代码继续正常工作-那么标志实际上是必要的吗?

l5tcr1uw

l5tcr1uw1#

好吧,我自己通过阅读文档来回答这个问题,exported属性的文档说:
默认值取决于服务是否包含Intent过滤器。没有任何过滤器意味着只能通过指定其确切的类名来调用它。这意味着该服务只供应用程序内部使用(因为其他人不知道类名)。因此在本例中,默认值为“false”。另一方面,至少存在一个过滤器意味着该服务旨在供外部使用,因此默认值为“true”。
所有身份验证服务都有一个意图过滤器-AbstractAccountAuthenticator的文档说:
为了成为一名认证者,必须...编写一个服务,当使用带有操作ACTION_AUTHENTICATOR_INTENT的Intent调用时,该服务将返回服务的onBind(android. content. Intent)中getIBinder()的结果。
这需要一个Intent过滤器,因此服务导出的默认值为true。所以这个问题的答案是 "No,the attribute isnotnecessary-because it's true by default"

zc0qhyus

zc0qhyus2#

虽然实际上并不需要,但这似乎会造成一些混乱。这就是为什么谷歌建议向
无论是否导出应用程序的任何组件,都要始终显式设置android:exported属性。
在他们的核心应用程序质量准则。

eoxn13cs

eoxn13cs3#

android:exported属性设置组件(activity、service、broadcast receiver等)是否可以由其他应用的组件启动:如果为true,则任何应用都可以访问Activity并按其确切的类名启动它。

相关问题