我在我的主应用和配套Wear应用中都实现了WearableListenerService
。在清单中,服务需要声明为android:exported="true"
(或根本不声明,并保留为默认为true
),因为它是由Google Play服务启动的。系统上的任何应用程序都可以调用没有权限的导出服务,但是我找不到添加到服务声明中以保护它的正确权限。我已经通过pm list permissions
查看了手机和Wear设备上的权限,但我看不到任何看起来像我需要的内容。
答案 0 :(得分:10)
了解如何在Android Wear上实现WearableListenerService的最佳方法是查看SDK提供的现有示例之一。如果您查看$ SDK / samples / android-20 / wearable / DataLayer中包含的DataLayer示例,它可以完全实现您想要做的事情。
如果你在AndroidManifest.xml中查看可穿戴方面,你可以看到它有以下内容:
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<service
android:name=".DataLayerListenerService" >
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
出于安全考虑......当我们在清单中声明服务并为其添加过滤器时,它会自动成为导出的服务。因此,通常,其他应用程序可以绑定到该服务。对于WearableListenerService,在框架中进行安全检查以确保绑定到该代理的代理是Google Play服务,因此没有其他人可以真正绑定到该服务,除非应用开发者公开其他意图过滤器,在这种情况下目的是让其他人访问它。
因此,如果您以与Wear SDK示例相同的方式实现代码,那么您的应用应该是安全的,您无需担心任何额外的权限等。
答案 1 :(得分:2)
- 是否有我可以/应该添加的权限来保护我的服务?
- 如果没有,通过检查来电者的包名来手动保护服务是个好主意吗?
醇>
您无需担心使用权限或调用程序包检查来保护WearableListenerService
实现。正如@Wayne指出他的answer:there is a security check that happens in the framework
。此检查在WearableListenerService
基类中完成。您可以在以下文章中找到可穿戴SDK的进一步安全性分析:
https://labs.mwrinfosecurity.com/blog/android-wear-security-analysis。以下是它的引用:
方法
pr()
首先检查com.google.android.gms
是否为Google 签名然后调用cU()
来检查调用进程UID是否适用 包com.google.android.gms
(Google Play服务包)。 如果该类被进一步反编译,则可以看出这种安全性 检查在WearableListenerService
中公开的每种方法中都会发生。
不幸的是,当可穿戴式侦听器服务声明不包含BIND_LISTENER
过滤器时,当前Lint检查器会产生误报警告(由于它现在已被弃用且应该避免,因此包含会产生其他警告):
导出的服务应定义实体必须具有的权限才能启动服务或绑定到该服务。没有这个,任何应用程序都可以使用此服务。
这肯定是security detector code中的一个错误(当BIND_LISTENER
意图被弃用时,它才被更新。我在Android错误跟踪器上打开了an issue。同时为了摆脱警告,需要将tools:ignore="ExportedService"
添加到其可穿戴侦听器服务声明中。