如何解决 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是安全的
在 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是安全的