Экспортируемый сервис не требует разрешения: что это значит?

143

Я создал службу, связанную с другими приложениями через AIDL, и добавляю ее в манифест следующим образом:

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

где IService - это интерфейс AIDL.

Таким образом, Eclipse покажет мне предупреждение. Экспортируемая служба не требует разрешения . Если я удаляю intent-filter, предупреждение исчезает, но, очевидно, приложения не могут привязать к службе.

Что означает это предупреждение?

enzom83
источник
31
Это означает, что другие (произвольные) приложения, которые пользователь имеет на своем телефоне, могут связываться с вами Serviceи вызывать любой метод, который ему нравится, доступный через ваш интерфейс AIDL.
Дженс
25
создайте новое <разрешение> в вашем AndroidManifest.xml и используйте его имя в качестве android:permissionатрибута вашего <service>объявления. Или просто проигнорируйте предупреждение - для чего предназначен сервис? Если вы штраф с сохранением службы «внутренней» это намного проще просто набор android:exported="false"на вашем<service>
Jens
3
Затем либо проигнорируйте предупреждение, либо добавьте <разрешение>, используйте «signature», если это все ваши собственные приложения, подписанные одним и тем же сертификатом, либо просто используйте «normal» в противном случае.
Дженс
3
Вы уже используете (выпуск) сертификат для подписи своих приложений - защита подписи проверяет, что приложение, запрашивающее разрешение, подписано так же, как приложение, которое определило разрешение.
Дженс
2
@Jens Спасибо ... это помогло мне .... кстати, вы можете добавить свои комментарии в качестве ответа. Пусть enzom83 примет это.
Виджай С

Ответы:

128

У меня была та же проблема, когда я обновил SDK до версии 20 . Я удалил его, добавив свойство android: exportedandroid:exported="false" так:

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

Смотрите этот документ

Нам Ву
источник
56

Если вы хотите ограничить использование вашей активности вашим собственным приложением, то вам следует добавить exported=falseв заявление манифеста вашей активности.

Если вы хотите разрешить другим приложениям использовать его (явно через имя класса или, лучше, используя намерение с типом данных или действием), тогда у вас есть два варианта:

  • ограничить эти приложения с помощью разрешения
  • разрешите всем приложениям использовать его, затем вы можете добавить tools:ignore="ExportedActivity"к заявлению манифеста вашей деятельности.

-

То же самое относится и к сервису, tools:ignore="ExportedService"и к контент-провайдерам tools:ignore="ExportedContentProvider".

Snicolas
источник
8
Это сработало для меня, спасибо! Однако обратите внимание, что для этого необходимо добавить объявление 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и нет выбора для исправления этого.
Луис А. Флорит
Он добавит его, если вы удалите свои инструменты: foo = bar Statement, затем при появлении ошибки / предупреждения щелкните правой кнопкой мыши и воспользуйтесь быстрым исправлением, чтобы добавить инструкцию tools.
Сниколас
1
Особый случай - SyncService, который следует экспортировать, но вы хотите, чтобы система использовала его только. Для SyncService или AuthenticatorService добавьте android :missions = "signature"
Entreco
4

Как сказал Дженс : «Это означает, что другие (произвольные) приложения, которые пользователь имеет на своем телефоне, могут связываться с вашей службой и вызывать любой метод, который им нравится, доступный через ваш интерфейс AIDL».

JD.
источник