【问题标题】:Exported service does not require permission: what does it mean?导出服务不需要许可:这是什么意思?
【发布时间】:2012-05-15 11:48:11
【问题描述】:

我创建了一个通过AIDL被其他应用绑定的服务,我把它添加到manifest中如下:

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

其中 IService 是 AIDL 接口。

这样,Eclipse 向我显示警告导出的服务不需要权限。如果我删除intent-filter,警告就会消失,但显然应用程序无法绑定到服务。

这个警告是什么意思?

【问题讨论】:

  • 这意味着用户在他的手机上拥有的其他(任意)应用程序可以绑定到您的Service 并调用通过您的 AIDL 接口公开的任何方法。
  • 在您的 AndroidManifest.xml 中创建一个新的 <permission> 并将其名称用作您的 &lt;service&gt; 声明的 android:permission 属性。或者只是忽略警告 - 服务的目的是什么?如果您可以将服务保持为“内部”,那么只需在您的 &lt;service&gt; 上设置 android:exported="false" 会更容易
  • 然后忽略警告或添加 ,如果它们都是您自己使用相同证书签名的应用程序,则使用“签名”,否则使用“正常”。
  • 您已经在使用(发布)证书对您的应用程序进行签名 - 签名保护会检查请求权限的应用程序是否与定义权限的应用程序具有相同的签名。
  • @Jens 谢谢......它帮助了我......顺便说一句,你可以添加你的 cmets 作为答案。让 enzom83 接受它。

标签: android android-service


【解决方案1】:

当我将 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>

看到这个doc

【讨论】:

    【解决方案2】:

    如果您想将 Activity 使用限制在您自己的应用程序中,则应将 exported=false 添加到您的 Activity 清单语句中。

    如果您想允许其他应用程序使用它(明确地通过其类名,或者更好的是,通过使用具有数据类型或操作的意图),那么您有两种选择:

    • 使用权限限制这些应用程序
    • 允许所有应用程序使用它,然后您可以将tools:ignore="ExportedActivity" 添加到您的活动清单声明中。

    --

    同样的推理适用于服务,tools:ignore="ExportedService" 和内容提供者tools:ignore="ExportedContentProvider"

    【讨论】:

    • 这对我有用,谢谢!!但是,请注意,这需要在清单文件顶部添加 xmlns 声明:xmlns:tools="http://schemas.android.com/tools"
    • 谢谢,它是由 Eclipse 自动添加的。这对其他 IDE 用户来说是一个很好的补充。
    • 我使用 Eclipse 4.2.1,它没有添加它,给出一个错误(至少使用默认配置?)。它只是说:The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not bound,并且没有提供解决此问题的选择。
    • 如果你删除你的 tools:foo=bar 语句,它会添加它,然后当出现错误/警告时,右键单击并使用快速修复来添加 tools 语句。
    • 特殊情况是SyncService,它应该被导出但你只希望系统使用它。对于 SyncService 或 AuthenticatorService 添加 android:permission="signature"
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 2020-05-28
      • 2018-07-17
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多