Le service exporté ne nécessite pas d'autorisation: qu'est-ce que cela signifie?

143

J'ai créé un service lié par d'autres applications via AIDL et je l'ajoute au manifeste comme suit:

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

où IService est l'interface AIDL.

De cette façon, Eclipse me montre l'avertissement Le service exporté ne nécessite pas d'autorisation . Si je supprime le intent-filter, l'avertissement disparaît, mais évidemment les applications ne peuvent pas se lier au service.

Que signifie cet avertissement?

enzom83
la source
31
Cela signifie que d'autres applications (arbitraires) que l'utilisateur a sur son téléphone peuvent se lier à votre Serviceet appeler la méthode de leur choix qui est exposée via votre interface AIDL.
Jens
25
créez un nouveau <permission> dans votre AndroidManifest.xml et utilisez le nom de celui-ci comme android:permissionattribut de votre <service>déclaration. Ou ignorez simplement l'avertissement - à quoi sert le service? Si vous êtes d'accord pour garder le service "interne", il est beaucoup plus facile de le configurer simplement android:exported="false"sur votre<service>
Jens
3
Ensuite, ignorez l'avertissement ou ajoutez une <permission>, utilisez "signature" si ce sont toutes vos propres applications signées avec le même certificat ou utilisez simplement "normal" dans le cas contraire.
Jens
3
Vous utilisez déjà un certificat (de libération) pour signer vos applications - la protection de signature vérifie que l'application demandant l'autorisation est signée de la même manière que l'application qui a défini l'autorisation.
Jens
2
@Jens Merci ... cela m'a aidé .... btw vous pouvez ajouter vos commentaires comme réponse. Laissez enzom83 l'accepter.
Vijay C

Réponses:

128

J'ai eu le même problème lorsque j'ai mis à jour le SDK vers la version 20 . Je l'ai supprimé en ajoutant android: propriété exportéeandroid:exported="false" comme ceci:

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

Voir ce document

Nam Vu
la source
56

Si vous souhaitez restreindre votre utilisation de l'activité à votre propre application, vous devez ajouter exported=falseà la déclaration de manifeste de votre activité.

Si vous souhaitez autoriser d'autres applications à l'utiliser (explicitement via son nom de classe ou, mieux, en utilisant un intent avec un type de données ou une action), vous avez deux choix:

  • restreindre ces applications en utilisant une autorisation
  • autorisez toutes les applications à l'utiliser, puis vous pouvez l'ajouter tools:ignore="ExportedActivity"à la déclaration manifeste de votre activité.

-

Le même raisonnement s'applique à un service, avec tools:ignore="ExportedService"et aux fournisseurs de contenu avec tools:ignore="ExportedContentProvider".

Snicolas
la source
8
Cela a fonctionné pour moi, merci !! Cependant, notez que cela nécessite d' ajouter une déclaration xmlns en haut du fichier manifeste:xmlns:tools="http://schemas.android.com/tools"
Luis A. Florit
Merci, il est ajouté automatiquement par Eclipse. C'est un bon complément pour les autres utilisateurs d'IDE.
Snicolas
J'utilise Eclipse 4.2.1, et il ne l'ajoute pas, ce qui donne une erreur (au moins avec la configuration par défaut?). Il dit simplement:, The prefix "tools" for attribute "tools:ignore" associated with an element type "activity" is not boundet aucun choix n'est donné pour résoudre ce problème.
Luis A. Florit
Il l'ajoutera si vous supprimez vos outils: instruction foo = bar, puis en cas d'erreur / d'avertissement, cliquez avec le bouton droit de la souris et utilisez une solution rapide pour ajouter l'instruction tools.
Snicolas
1
Le cas particulier est le SyncService, qui doit être exporté mais vous voulez seulement que le système l'utilise. Pour SyncService ou AuthenticatorService, ajoutez android: permission = "signature"
Entreco
4

Comme Jens l'a dit, "cela signifie que d'autres applications (arbitraires) que l'utilisateur a sur son téléphone peuvent se lier à votre service et appeler la méthode qui leur plaît et qui est exposée via votre interface AIDL."

JD.
la source