研究员!
我的应用中有一个同步适配器和相应的同步服务。根据{{3}},我已经宣布了所有内容,包括同步服务。更大的图片看起来像这样:
<service
android:name="com.myapp.SyncService"
android:exported="true"
android:process=":sync">
<intent-filter>
<action
android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
虽然在服务上将android:exported
属性设置为true
是有意义的(让Android系统能够到达它),但我对如何将其绑定在一起感到困惑访问权限。除了我的应用程序和Android系统之外,我不希望任何其他人访问该服务。
我可能有点天真地为此创建了自己的许可:
<permission
android:name="com.myapp.permission.SYNC_ADAPTER"
android:protectionLevel="signatureOrSystem" />
但是在protectionLevel
上读一点让我更加惊讶。 Google example code:
请避免使用此选项[...]“signatureOrSystem”权限用于某些特殊情况,其中多个供应商将应用程序内置到系统映像中,并且需要明确共享特定功能,因为它们是一起构建的。
描述的场景远非我的用例。那么问题仍然存在:
如何保护我的同步服务,以便Android系统(但没有第三方应用)可以访问它?
非常感谢任何澄清!
答案 0 :(得分:3)
beworker是对的。我使用了签名权限,系统可以毫无困难地同步。
答案 1 :(得分:0)
我有同样的问题。在此处查看此示例源代码作为指南https://android.googlesource.com/platform/packages/apps/Exchange/+/ics-mr0/AndroidManifest.xml,似乎同步适配器已明确导出=“true”而没有任何权限。
答案 2 :(得分:0)
看起来没有SyncAdapter权限。我猜我们可以安全地忽略错误。请参阅此处提交的错误:https://code.google.com/p/android/issues/detail?id=37280
答案 3 :(得分:0)
对于您的用例,“签名”保护级别应该足够,该用例授予对系统程序包的访问权限。 'signatureOrSystem'还授予对内置在系统映像中的应用的访问权限。
源代码:请参见grantSignaturePermission()
方法
https://android.googlesource.com/platform/frameworks/base/+/a029ea1/services/java/com/android/server/pm/PackageManagerService.java
答案 4 :(得分:0)
为两个服务设置 exported=false
SyncAdapter
,另一个注册到 AccountAuthenticator
意图系统通过意图can still call SyncAdapter 服务!
所以似乎没有必要为exported=true而烦恼
以下(对我而言)与上述作品无关。
我是这样解释这个帖子里的回复的:
在 exported
服务(见下文)中请求此权限(见示例)应仅允许使用您的签名(以及系统)签名的应用调用此服务。
如果您使用 exported=false
,则系统无法调用您的服务,即如果您的应用程序关闭,同步将不会启动(?)
<permission
android:name="com.myapp.USE_SYNC_AND_AUTHENTICATOR"
android:protectionLevel="signature" />
<application>
<!-- Export sync and auth to allow the Android System to call them. -->
<!-- Protect it using a signature permission. -->
<service
android:name="com.myapp.SyncService"
android:exported="true"
android:process=":sync"
android:permission="com.myapp.USE_SYNC_AND_AUTHENTICATOR">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/sync_adapter" />
</service>
<service>..authenticator..</service>
</application>