¿Cómo puedo cambiar el archivo AndroidManifest.xml basado en variantes de construcción?

Tengo una aplicación con múltiples variantes de construcción. Las variantes se utilizan para crear versiones de la misma aplicación para diferentes empresas. Por lo tanto, tengo varias variantes diferentes que construyen diferentes aplicaciones:

  • Com.acme.app1
  • Com.schmoe.app2
  • Com.yop.app3
  • Etc …

El archivo build.gradle maneja esto muy bien:

productFlavors { app1 { applicationId "com.acme.app1" } app2 { applicationId "com.schmoe.app2" } app3 { applicationId "com.yop.app3" } } 

Aquí está mi problema. Estoy integrando Dropbox en mis aplicaciones. El archivo AndroidManifest.xml debe cambiarse para cada variante para incluir la clave de la aplicación apropiada (almacenada en mi archivo de cadena). Dropbox tiene la siguiente adición al archivo de manifiesto:

  <activity android:name="com.dropbox.client2.android.AuthActivity" android:launchMode="singleTask" android:configChanges="orientation|keyboard"> <intent-filter> <!-- Change this to be db- followed by your app key --> <data android:scheme="db-abcdef" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Cada variante de construcción debe cambiar la siguiente línea:

  <data android:scheme="db-abcdef" /> 

Al valor apropiado para cada variante de la aplicación. En otras palabras, necesito reemplazar parte de la cadena anterior basada en la variante de construcción. Por ejemplo

App1

  <data android:scheme="db-111111" /> 

App2

  <data android:scheme="db-222222" /> 

App3

  <data android:scheme="db-333333" /> 

La línea es la misma para cada variante hasta el texto "db-".

Lo que necesito es reemplazar dinámicamente la parte variable de la cadena (los valores x) "db-xxxxxx" con una cadena de mi archivo de cadena.

Creo que esto se puede hacer con scripts gradle pero soy un newb completo con gradle. ¡AYUDA!

Si usted puede ayudar, por favor sea muy específico sobre lo que va donde ya que SUCK en los archivos gradle y scripting. ¡Gracias por adelantado!

Puede hacerlo de la misma manera que modificará el nombre de la aplicación, utilizando un recurso de cadena. En su manifiesto, incluya:

 <data android:scheme="@string/db_scheme" /> 

A continuación, agregue las carpetas de recursos para los distintos tipos de compilación y, en cada uno, coloque una copia personalizada de un archivo de recursos, diga res/values/flavor.xml :

 <?xml version="1.0" encoding="utf-8" standalone="no"?> <resources> <string name="app_name">Customer 1 App</string> <string name="db_scheme">db-111111</string> </resources> 

Esto le permitirá tener diferentes claves API, esquemas, app-nombres, iconos, etc. para sus diferentes sabores.

También puede guardar la cadena en build.gradle :

 productFlavors { app1 { applicationId "com.acme.app1" resValue "string", "my_app_key", "db-abc" } app2 { applicationId "com.schmoe.app2" resValue "string", "my_app_key", "db-def" } app3 { applicationId "com.yop.app3" resValue "string", "my_app_key", "db-ghi" } } 

Y luego utilizarlo como:

 <data android:scheme="@string/my_app_key" /> 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.