Как обратиться к жалобе на андроид-линт об экспортных реализациях Firebase Messaging?

Следуя инструкциям разработчика Google по внедрению Firebase в моем приложении, я замечаю, что андроид-линт жалуется.

Идея состоит в том, что нам нужно реализовать две службы, которые наследуют службы Firebase:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { ... }

public class MyFirebaseMessagingService extends FirebaseMessagingService { ... }

а затем зарегистрируйте эти службы в манифесте. Но это не совсем прекрасно. В частности, эти две рекомендуемые записи службы 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>

и поэтому linter говорит:

Экспортированные службы (службы, которые либо устанавливают exported = true, либо содержат фильтр намерений и не указывают exported = false), должны определять разрешение, которое должен иметь объект для запуска службы или привязки к ней. Без этого любое приложение может использовать эту службу.

Должен ли я просто добавить этот атрибут к каждому тегу службы и сделать с ним

tools:ignore="ExportedService"

или есть лучший подход в этой ситуации? Я имею в виду, безопасно ли выставлять эти специфические сервисы Firebase таким образом?

Ответы

Ответ 1

Вы спрашиваете:... безопасно ли выставлять эти специфические сервисы Firebase, подобные этому? Это если вы доверяете комментариям в файлах манифеста для этих служб.

В Android Studio откройте файл AndroidManifest.xml приложения. В нижней части окна выберите вкладку "Объединенный манифест". Прокрутите, чтобы найти запись для 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 и посмотреть тот же комментарий.

Если вы доверяете комментариям (я делаю), вы можете смело игнорировать предупреждения линта или отключать проверки.