アプリにFirebaseを実装するGoogle開発者の指示 に従って、Android lintが文句を言います。
その考え方は、Firebaseサービスから継承する2つのサービスを実装する必要があるということです。
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { ... }
public class MyFirebaseMessagingService extends FirebaseMessagingService { ... }
そして、それらのサービスをマニフェストに登録します。しかし、それは完全ではありません。特に、これら2つの推奨AndroidManifest.xmlサービスエントリには、特別な権限は含まれていません。
<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>
そして、リンターは言う:
エクスポートされたサービス(exported = trueを設定するか、intent-filterを含み、exported = falseを指定しないサービス)は、サービスを起動またはバインドするためにエンティティに必要な許可を定義する必要があります。これがなければ、どのアプリケーションでもこのサービスを使用できます。
この属性を各サービスタグに追加して、それで完了する必要があります
tools:ignore="ExportedService"
またはこの状況でより良いアプローチがありますか?つまり、このような特定のFirebase派生サービスを公開しても安全ですか?
...これらの特定のFirebase派生サービスをこのように公開しても安全ですか?これらのサービスのマニフェストファイル内のコメントを信頼する場合です。
Android Studioで、アプリのAndroidManifest.xmlファイルを開きます。ウィンドウの下部で、Merged Manifestのタブを選択します。FirebaseMessagingService
のエントリを見つけます。サービス名を含む行をダブルクリックすると、サービスのマニフェストファイルが開き、次のように表示されます。
<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>
コメントに注意してください:FirebaseMessagingServiceは実行時にセキュリティチェックを実行します。exported= "true"にもかかわらず明示的な権限は不要です
FirebaseInstanceIdService
についても同じことができ、同じコメントを見ることができます。
コメントを信頼する場合(私はそうします)、リントの警告を安全に無視するか、チェックを無効にすることができます。