导出的服务不需要权限:这是什么意思?

160

我创建了一个通过AIDL由其他应用程序绑定的服务,并将其添加到清单文件中,如下所示:

<service android:name=".MyService">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

这里的IService是AIDL接口。

这种情况下,Eclipse会显示一个警告:导出的服务不需要权限。如果我移除intent-filter,警告会消失,但显然应用程序将无法绑定到该服务。

这个警告是什么意思?


36
它的意思是,用户手机上的其他(任意)应用程序可以绑定到您的“Service”,并调用通过您的AIDL接口公开的任何方法。 - Jens
25
在你的AndroidManifest.xml文件中创建一个新的<permission>,并将其名称用作<service>声明的android:permission属性。或者忽略该警告-该服务的目的是什么?如果您希望保持服务“内部”,则只需在<service>上设置android:exported="false"即可轻松实现。 - Jens
3
如果收到警告,你可以选择忽略它或添加一个<permission>。如果所有应用都使用相同的证书签名,就使用“signature”,否则就使用“normal”。请注意,翻译后的内容必须和原文意思相同,只需让内容更加通俗易懂。 - Jens
3
您已经在使用(发布)证书对应用程序进行签名-签名保护检查申请权限的应用程序与定义权限的应用程序具有相同的签名。 - Jens
2
@Jens 谢谢...这对我很有帮助...顺便说一下,你可以把你的评论添加为答案。让 enzom83 接受它。 - Vijay C
显示剩余5条评论
3个回答

136

当我将SDK更新到版本20时,我遇到了相同的问题。我通过添加android:exported属性 android:exported="false"来移除它,如下所示:

<service android:name=".MyService"
    android:exported="false">
    <intent-filter>
        <action android:name="org.example.android.myservicedemo.IService" />
    </intent-filter>
</service>

请参考这个文档


63
如果您想将活动的使用限制在自己的应用程序中,则应将exported=false添加到活动的清单声明中。
如果您希望其他应用程序使用它(通过其类名明确地使用或更好地使用具有数据类型或操作的意图),则有两个选择:
- 通过使用权限来限制这些应用程序 - 允许所有应用程序使用它,然后可以将tools:ignore="ExportedActivity"添加到活动的清单声明中。
相同的推理适用于服务,使用tools:ignore="ExportedService",以及内容提供程序,使用tools:ignore="ExportedContentProvider"

8
谢谢!这个方法对我很有用。但是,请注意需要在清单文件顶部“添加”一个xmlns声明:xmlns:tools="http://schemas.android.com/tools" - Luis A. Florit
我使用Eclipse 4.2.1,但它没有添加成功,出现了一个错误(至少在默认配置下是这样的)。它只是说:“与元素类型“activity”相关联的属性“tools:ignore”的前缀“tools”未绑定”,并且没有给出任何修复选项。 - Luis A. Florit
如果您删除了“tools:foo = bar”语句,它将添加它,然后当出现错误/警告时,右键单击并使用快速修复来添加工具语句。 - Snicolas
@Snicolas,你的答案应该被接受,该死的!这会节省我很多时间,因为我查看了许多不同的答案。这是完美的,但我强烈建议包括添加 xmlns:tools="http://schemas.android.com/tools" 的部分,因为 Eclipse 也不会为我添加这个。这真是令人头疼。另外,我有点傻,但我不知道它实际上是 tools:ignore="ExportedActivity",所以我试图放入我的 Activity 标识符。糟糕!;) 不管怎样,谢谢! - RileyE
1
特殊情况是SyncService,它应该被导出,但您只希望系统使用它。对于SyncService或AuthenticatorService,请添加android:permission="signature"。 - Entreco
显示剩余3条评论

4

正如Jens所说:"这意味着用户手机上的其他(任意)应用程序可以绑定到您的服务,并调用通过您的AIDL接口公开的任何方法。"


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