消除“导出的服务不需要权限”警告

44

我正在寻找一个解决方案来消除警告。但我甚至不明白为什么会出现这个警告。我查看了一个没有警告出现的SDK示例。

首先,这是我的清单文件,在其中我收到了警告 导出服务不需要权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8"
              android:targetSdkVersion="15" />

    <uses-feature android:name="android.hardware.camera"
                  android:required="true" />

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sherlock">
        <service
            android:name=".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>

        <activity
            android:name=".Test"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
...

Android SDK中的SampleSyncAdapter具有以下清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.samplesync"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <!-- ... -->

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/icon"
        android:label="@string/label">
        <!-- The authenticator service -->
        <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>
    ...

但是没有警告,为什么会出现警告呢?我使用Theme.Sherlock主题来使用ActionBarSherlock。但我无法想象这会导致错误。


5
这个警告是告诉你,你已经导出了(也就是公开了)一个服务,但没有使用权限进行保护。这样一来,其他应用程序可以自由地访问你的服务而没有任何限制。参考网址为https://dev59.com/5mkv5IYBdhLWcg3wnCDH。 - David Wasser
如果您的服务不需要对其他应用程序可用,那么您就不需要将其“导出”。删除它将会消除警告。 - David Wasser
3
如果你提供了一个Intent过滤器,android:export的默认值是true。如果你的服务不需要公开使用,你可以显式地将android:export="false"设置为否。 - David Wasser
@DavidWasser 能否将此作为答案添加?将其设为false对我有用。 - rekire
可能是警告:导出的活动不需要权限的重复问题。 - Sergey Glotov
显示剩余2条评论
3个回答

72
警告提示您,您已经导出(即:公开可用)了一个没有使用权限进行保护的服务。这使得您的服务对其他应用程序无限制地可用。请参见Exported service does not require permission: what does it mean?
如果您的服务不需要向其他应用程序提供访问权限,则不需要将其导出。显式设置android:exported="false"将删除警告。
注意:如果您提供了Intent过滤器,则android:exported的默认值为true

1
相反地,如果我希望导出的活动或服务对任何其他应用程序都可用,因为例如我是一个文件浏览器或Web浏览器,那该怎么办?我只需处理警告吗? - Hamid
你可以忽略警告,或者使用权限保护对该活动或服务的访问。然后,当另一个组件想要使用你的服务或活动时,只需要请求适当的权限即可。 - David Wasser
小提示:当将其设置为FALSE时,似乎不会触发APPWIDGET_DISABLED和APPWIDGET_DELETED事件,正如GSD.Aaz在此处所描述的https://dev59.com/5VnUa4cB1Zd3GeqPbpKT。 - Morfic
6
那为什么 SampleSyncAdapter 的示例代码没有这个警告呢? - Alexander Malakhov
我已经提交了一个新的Android错误报告,以修复这个虚假警告。SyncAdapter的服务不应该需要权限(或者官方培训指南应该更新以添加android:exported="false")。 - Vicky Chijwani
显示剩余2条评论

5

2
强调我的部分:“允许应用程序调用AccountAuthenticators。不适用于第三方应用程序。 - Vicky Chijwani

1

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