web-dev-qa-db-fra.com

Comment résoudre Android lint plainte concernant les implémentations du service de messagerie Firebase exportées?

En suivant les instructions du développeur Google sur l'implémentation de Firebase dans mon application , je remarque que Android lint se plaint.

L'idée est que nous devons implémenter deux services qui héritent des services Firebase:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { ... }

public class MyFirebaseMessagingService extends FirebaseMessagingService { ... }

puis enregistrez ces services dans le manifeste. Mais ce n'est pas tout à fait parfait. En particulier, ces deux entrées de service AndroidManifest.xml recommandées ne contiennent aucune autorisation spéciale:

<service Android:name=".MyFirebaseMessagingService">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service Android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

et donc le linter dit:

Les services exportés (les services qui définissent exporté = vrai ou contiennent un filtre d'intention et ne spécifient pas exporté = faux) doivent définir une autorisation qu'une entité doit avoir pour lancer le service ou s'y lier. Sans cela, toute application peut utiliser ce service.

Dois-je simplement ajouter cet attribut à chaque numéro de service et en finir avec

tools:ignore="ExportedService"

ou existe-t-il une meilleure approche dans cette situation? Je veux dire, est-il sûr d'exposer ces services dérivés de Firebase comme celui-ci?

39
albert c braun

Vous demandez: ... est-il sûr d'exposer ces services dérivés de Firebase comme celui-ci? C'est si vous faites confiance aux commentaires dans les fichiers manifestes de ces services.

Dans Android Studio, ouvrez le fichier AndroidManifest.xml de votre application. En bas de la fenêtre, sélectionnez l'onglet pour Manifest fusionné. Faites défiler pour trouver l'entrée pour FirebaseMessagingService. Double-cliquez sur la ligne contenant le nom du service. Le fichier manifeste du service devrait s'ouvrir et vous verrez ceci:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android" package="com.google.firebase.messaging">
    <uses-sdk Android:minSdkVersion="14"/>

    <application>

        <!-- FirebaseMessagingService performs security checks at runtime,
             no need for explicit permissions despite exported="true" -->
        <service Android:name="com.google.firebase.messaging.FirebaseMessagingService" Android:exported="true">
            <intent-filter Android:priority="-500">
                <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

    </application>
</manifest>

Notez le commentaire: FirebaseMessagingService effectue des vérifications de sécurité lors de l'exécution, pas besoin d'autorisations explicites malgré l'exportation = "true"

Vous pouvez faire de même pour FirebaseInstanceIdService et voir le même commentaire.

Si vous faites confiance aux commentaires (je le fais), vous pouvez ignorer les avertissements de peluches en toute sécurité ou désactiver les vérifications.

50
Bob Snyder