如何解决 android 对导出的 Firebase 消息服务实施的 lint 投诉?

How to address android lint complaint about exported Firebase Messaging service implementations?

Google developer instructions on implementing Firebase in my app 之后,我注意到 android lint 抱怨。

我们的想法是我们必须实现两个继承自 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 services (services which either set exported=true or contain an intent-filter and do not specify exported=false) should define a permission that an entity must have in order to launch the service or bind to it. Without this, any application can use this service.

我是否应该将此属性添加到每个服务标签并完成它

tools:ignore="ExportedService"

或者在这种情况下有更好的方法吗?我的意思是,像这样公开这些特定的 Firebase 派生服务是否安全?

您问:...像这样公开这些特定的 Firebase 派生服务是否安全? 如果您信任这些服务的清单文件中的注释,则安全。

在 Android Studio 中,打开应用程序的 AndroidManifest.xml 文件。 window、select 底部的 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 在运行时执行安全检查,尽管已导出="true"

,但不需要显式权限

您可以对 FirebaseInstanceIdService 执行相同的操作并查看相同的评论。

如果您相信评论(我相信),您可以安全地忽略 lint 警告或禁用检查。

<service android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

基于官方代码示例,设置exported=false是安全的