如何解决有关导出的Firebase Messaging服务实现的android lint投诉?

alb*_*aun 40 android android-service android-lint firebase firebase-cloud-messaging

根据Google开发人员在我的应用中实施Firebase的说明,我注意到android lint抱怨.

我们的想法是,我们必须实现两个从Firebase服务继承的服务:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { ... }

public class MyFirebaseMessagingService extends FirebaseMessagingService { ... }
Run Code Online (Sandbox Code Playgroud)

然后在清单中注册这些服务.但是,它并不完美.特别是,这两个推荐的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>
Run Code Online (Sandbox Code Playgroud)

所以linter说:

导出的服务(设置为exported = true或包含intent-filter且未指定exported = false的服务)应定义实体必须具有的权限才能启动服务或绑定到该服务.没有这个,任何应用程序都可以使用此服务.

我应该只将此属性添加到每个服务标记并完成它

tools:ignore="ExportedService"
Run Code Online (Sandbox Code Playgroud)

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

Bob*_*der 52

您问: ......公开这些特定的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>
Run Code Online (Sandbox Code Playgroud)

请注意注释:FirebaseMessagingService在运行时执行安全检查,尽管exports ="true",也不需要显式权限

你也可以这样做FirebaseInstanceIdService并看到相同的评论.

如果您信任评论(我这样做),您可以安全地忽略lint警告或禁用检查.

  • 我不知道"Merged Manifest"按钮!谢谢! (4认同)
  • 有没有任何实际的解释来证明这些评论的合理性?你可能会相信它,但我们为什么要相信呢? (2认同)

小智 7

<service android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

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