我在Android Studio中有一个模块,我用于处理GCM通知的几个应用程序(都使用不同的密钥签名)。
在GCM客户端文档中,他们说要定义包命名空间自定义权限:
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
然后再次使用GCM接收器将category
设置为包名称:
<receiver
android:name=".GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.gcm" />
</intent-filter>
</receiver>
目前我已经在模块的Manifest中定义了所有这些,并且它通过gradle合并到应用程序清单中,无论应用程序导入该模块的是该模块的通用命名空间,到目前为止这都有效。
问题在于,因为Android 5.0自定义权限与应用程序签名的密钥库匹配。如果你有一个安装了这个模块的应用程序,它将不允许你安装另一个具有相同模块的应用程序,因为权限冲突。
有没有办法在模块中声明C2D_MESSAGE
权限和BroadcastReceiver
,以便不需要在每个应用中重新定义?
[更新]
我尝试在库的清单中使用占位符,结果不一致。使用${applicationId}
会导致该库的包名被替换而不是消费应用的包名。
阅读this and its related issues让我使用${localApplicationId}
与消费应用的build.gradle中定义的内容:
defaultConfig {
manifestPlaceholders = [ localApplicationId:"com.testapp.client"]
applicationId 'com.testapp.client'
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName '1.0'
}
productFlavors {
flavor {
applicationId "com.testapp.client.flavor"
manifestPlaceholders = [ localApplicationId:"com.testapp.client.flavor"]
}
}
导致错误:
Error:(12, 22) Attribute uses-permission#${localApplicationId}.permission.C2D_MESSAGE@name at AndroidManifest.xml:12:22 requires a placeholder substitution but no value for <localApplicationId> is provided.