Експортна послуга не потребує дозволу: що це означає?


143

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

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

де IService - інтерфейс AIDL.

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

Що означає це попередження?


31
Це означає, що інші (довільні) програми, які користувач має на своєму телефоні, можуть прив’язатись до вашого Serviceтелефону та зателефонувати будь-яким способом, який їм подобається, який відкриється через ваш інтерфейс AIDL.
Єнс

25
створіть новий <permission> у своєму AndroidManifest.xml і використовуйте його ім'я як android:permissionатрибут вашої <service>декларації. Або просто ігноруйте попередження - що призначена послуга? Якщо ви штраф зі збереженням служби «внутрішньої» це набагато простіше просто набір android:exported="false"на вашому<service>
Jens

3
Потім або ігноруйте попередження, або додайте <дозвіл>, використовуйте "підпис", якщо вони всі ваші власні програми підписані з тим самим сертифікатом, або просто перейдіть із "нормальним" в іншому випадку.
Єнс

3
Ви вже використовуєте (випуск) сертифікат для підписання ваших програм - захист підпису перевіряє, чи додаток, що вимагає дозволу, має такий самий підпис, як і програма, яка визначала дозвіл.
Єнс

2
@Jens Спасибі ... це допомогло мені .... btw Ви можете додати свої коментарі як відповідь. Нехай enzom83 приймає це.
Vijay C

Відповіді:


128

У мене була така ж проблема, коли я оновив SDK до версії 20 . Я видалив його, додавши андроїд: експортується властивість android: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".


8
Це працювало для мене, дякую !! Однак зауважте, що для цього потрібно додати декларацію xmlns у верхній частині файлу маніфесту:xmlns:tools="http://schemas.android.com/tools"
Луїс А. Флорит

Дякую, додано автоматично Eclipse. Це приємне доповнення для інших користувачів IDE.
Snicolas

Я використовую Eclipse 4.2.1, і він не додає його, надаючи помилку (принаймні, з конфігурацією за замовчуванням?). Тут просто сказано: The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundі для виправлення цього не вибирається жодного вибору.
Луїс А. Флорит

Він додасть його, якщо ви вилучите ваші інструменти: foo = bar твердження, тоді, коли з’явиться помилка / попередження, клацніть правою кнопкою миші та скористайтеся швидким виправленням, щоб додати оператор інструментів.
Snicolas

1
Особливий випадок - SyncService, який слід експортувати, але ви хочете лише, щоб система ним користувалася. Для SyncService або AuthenticatorService додайте android: дозвіл = "підпис"
Entreco

4

Як сказав Йенс , "Це означає, що інші (довільні) програми, які користувач має на своєму телефоні, можуть прив'язатись до вашої Служби та зателефонувати будь-яким способом, який їм подобається, який відкриється через ваш інтерфейс AIDL".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.