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.