services play open google gms failed basement android gradle android-gradle

android - google - failed to resolve play-services-basement open file



Reemplazar el prefijo del paquete de permiso de GCM con Gradle (3)

Tengo un proyecto Gradle Android que tiene 4 sabores de producto (cada uno tiene su propio nombre de paquete). El archivo build.gradle es 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 requeridos se fusionan, etc. Ahora estoy tratando de implementar una característica de notificación de inserción mediante 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 (solo difieren en los recursos de la aplicación y algunas configuraciones, que se colocan en la carpeta de activos).

Entonces mi pregunta es: ¿cómo puedo anular estos permisos para cada sabor de producto?


El AndroidManifest.xml ahora se fusiona correctamente a partir de Gradle 1.11, usando la configuración predeterminada.


He usado:

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

en el manifiesto de Android: parece que se ha resuelto correctamente.


Puede usar algún tipo de herencia 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 AndroidManifest todo lo demás.