Android 5.0 - 在模块

时间:2015-05-07 23:17:32

标签: android android-studio module android-manifest android-permissions

我在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.

0 个答案:

没有答案