Für den exportierten Dienst ist keine Berechtigung erforderlich: Was bedeutet das?

143

Ich habe einen Dienst erstellt, der über AIDL an andere Anwendungen gebunden ist, und füge ihn dem Manifest wie folgt hinzu:

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

Dabei ist IService die AIDL-Schnittstelle.

Auf diese Weise zeigt Eclipse mir die Warnung Exportierter Dienst erfordert keine Berechtigung . Wenn ich das entferne intent-filter, verschwindet die Warnung, aber die Anwendungen können sich offensichtlich nicht an den Dienst binden.

Was bedeutet diese Warnung?

enzom83
quelle
31
ServiceDies bedeutet, dass andere (willkürliche) Anwendungen, die der Benutzer auf seinem Telefon hat, sich an Ihre binden und eine beliebige Methode aufrufen können, die über Ihre AIDL-Schnittstelle verfügbar gemacht wird.
Jens
25
Erstellen Sie eine neue <Berechtigung> in Ihrer AndroidManifest.xml und verwenden Sie deren Namen als android:permissionAttribut Ihrer <service>Deklaration. Oder ignorieren Sie einfach die Warnung - was soll der Dienst tun? Wenn Sie damit einverstanden sind, den Dienst "intern" zu halten, ist es viel einfacher, ihn einfach android:exported="false"auf Ihren<service>
Jens
3
Ignorieren Sie dann entweder die Warnung oder fügen Sie eine <Berechtigung> hinzu, verwenden Sie "Signatur", wenn alle Ihre eigenen Anwendungen mit demselben Zertifikat signiert sind, oder gehen Sie ansonsten einfach zu "normal".
Jens
3
Sie verwenden bereits ein (Freigabe-) Zertifikat zum Signieren Ihrer Anwendungen. Der Signaturschutz überprüft, ob die Anwendung, die die Berechtigung anfordert, dieselbe Signatur aufweist wie die Anwendung, die die Berechtigung definiert hat.
Jens
2
@Jens Danke ... es hat mir geholfen ... übrigens können Sie Ihre Kommentare als Antwort hinzufügen. Lassen Sie enzom83 es ​​akzeptieren.
Vijay C

Antworten:

128

Ich hatte das gleiche Problem, als ich das SDK auf Version 20 aktualisierte . Ich habe es entfernt und Android hinzugefügt : exportierte Eigenschaft android:exported="false"wie folgt:

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

Siehe dieses Dokument

Nam Vu
quelle
56

Wenn Sie die Verwendung Ihrer Aktivität auf Ihre eigene Anwendung beschränken möchten, sollten exported=falseSie die Manifest-Anweisung Ihrer Aktivität ergänzen .

Wenn Sie anderen Anwendungen erlauben möchten, es zu verwenden (explizit über den Klassennamen oder besser durch die Verwendung einer Absicht mit einem Datentyp oder einer Aktion), haben Sie zwei Möglichkeiten:

  • Beschränken Sie diese Anwendungen mithilfe einer Berechtigung
  • Lassen Sie alle Anwendungen es verwenden, und fügen Sie es dann tools:ignore="ExportedActivity"zur Manifest-Anweisung Ihrer Aktivität hinzu.

- -

Gleiches gilt für einen Dienst mit tools:ignore="ExportedService"und Inhaltsanbieter mit tools:ignore="ExportedContentProvider".

Snicolas
quelle
8
Das hat bei mir funktioniert, danke !! Beachten Sie jedoch, dass dies erfordert fügen eine xmlns - Deklaration an der Spitze der Manifest - Datei:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit
Danke, es wird automatisch von Eclipse hinzugefügt. Das ist eine schöne Ergänzung für andere IDEs-Benutzer.
Snicolas
Ich verwende Eclipse 4.2.1 und es fügt es nicht hinzu, was zu einem Fehler führt (zumindest mit der Standardkonfiguration?). Es heißt nur : The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not bound, und es werden keine Auswahlmöglichkeiten gegeben, um dies zu beheben.
Luis A. Florit
Es wird hinzugefügt, wenn Sie Ihre Tools entfernen: foo = bar-Anweisung. Wenn ein Fehler / eine Warnung auftritt, klicken Sie mit der rechten Maustaste und verwenden Sie eine Schnellkorrektur, um die Tools-Anweisung hinzuzufügen.
Snicolas
1
Sonderfall ist der SyncService, der exportiert werden soll, aber nur vom System verwendet werden soll. Für SyncService oder AuthenticatorService fügen Sie android hinzu: erlaubnis = "Signatur"
Entreco
4

Wie Jens sagte: "Dies bedeutet, dass andere (willkürliche) Anwendungen, die der Benutzer auf seinem Telefon hat, sich an Ihren Dienst binden und jede Methode aufrufen können, die über Ihre AIDL-Schnittstelle verfügbar gemacht wird."

JD.
quelle