Anulación del prefijo del paquete de permisos GCM con Gradle

Tengo un proyecto de Gradle Android que tiene 4 sabores de producto (cada uno tiene su propio nombre de paquete único). El archivo build.gradle es prity muy sencillo:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.6.+' } } apply plugin: 'android' repositories { mavenCentral() } dependencies { // All dependencies here // ... } android { // Usual stuff goes here productFlavors { flav1 { packageName 'com.company.flav1' versionName calcVersion() } flav2 { packageName 'com.company.flav2' versionName calcVersion() } flav3 { packageName 'com.company.flav3' versionName calcVersion() } flav4 { packageName 'com.company.flav4' versionName calcVersion() } } // Other configurations // ... } 

Todo va bien, y los recursos necesarios se combinan, etc Ahora estoy tratando de implementar una función de Notificación de Push con GCM. Y de acuerdo con la documentación, debo declarar un permiso para mi aplicación, así:

 <permission android:name="com.company.flav.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.company.flav.permission.C2D_MESSAGE" /> 

Pero estoy usando un único archivo de manifiesto, para las 4 aplicaciones (sólo difieren en los recursos de la aplicación y algunos ajustes, que se ponen en la carpeta de activos).

Así que mi pregunta es: ¿Cómo puedo anular estos permisos para cada sabor del producto?

He utilizado:

 <permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

En el manifiesto de Android – esto parece estar resuelto correctamente.

Puedes usar algún tipo de herencia de AndroidManifest.

 The following rules are used when dealing with all the sourcesets used to build a single APK: - All source code (src/*/java) are used together as multiple folders generating a single output. - *Manifests are all merged together into a single manifest. This allows Product Flavors to have different components and/or permissions, similarly to Build Types.* - All resources (Android res and assets) are used using overlay priority where the Build Type overrides the Product Flavor, which overrides the main sourceSet. - Each Build Variant generates its own R class (or other generated source code) from the resources. Nothing is shared between variants. 

código:

  productFlavors { flav1 { packageName 'com.company.flav1' versionName calcVersion() } flav2 { packageName 'com.company.flav2' versionName calcVersion() } flav3 { packageName 'com.company.flav3' versionName calcVersion() } flav4 { packageName 'com.company.flav4' versionName calcVersion() } } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aild.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } flav1 { manifest.srcFile 'flavor1/AndroidManifest.xml' } flav2 { manifest.srcFile 'flavor2/AndroidManifest.xml' } ... } 

Donde flavor1 y flavor2 son carpetas en la carpeta del proyecto raíz.

En flavor1/AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.someapp" android:versionCode="1" android:versionName="1.0"> <permission android:name="com.company.flav1.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.company.flav1.permission.C2D_MESSAGE" /> </manifest> 

En flavor2/AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample.someapp" android:versionCode="1" android:versionName="1.0"> <permission android:name="com.company.flav2.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.company.flav2.permission.C2D_MESSAGE" /> </manifest> 

Y en la raíz de AndroidManifest todo lo demás.

El archivo AndroidManifest.xml ahora se fusiona correctamente desde gradle 1.11, usando la configuración predeterminada.

  • Tener un sabor de producto ser un hijo de otro
  • Tarea de Gradle de Android para copiar archivos después de la compilación
  • No se pudo notificar al oyente de evaluación del proyecto en Android gradle
  • Copiar archivos antes de resolver dependencias para crear una aplicación de Android
  • No se pudo encontrar com.google.android.gms: play-services: 3.1.59 3.2.25 4.0.30 4.1.32 4.2.40 4.2.42 4.3.23 4.4.52 5.0.77 5.0.89 5.2.08 6.1. 11 6.1.71 6.5.87
  • Dependencias de Gradle: compilar el proyecto por ruta relativa
  • Cuando aplico AspectJ al proyecto de Android con Androidannotations no funciona
  • Configuración de la firma de depuración en los sabores de producto de Gradle
  • Twitter Tela no se instala en Android Studio debido a las dependencias que faltan
  • La aplicación no se ejecutará en el dispositivo: DELETE_FAILED_INTERNAL_ERROR?
  • ¿Cómo emular a los productFlavors de Android en un módulo de Java gradle puro?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.