Cómo reemplazar recursos de cadenas con Android Gradle

Hice una nueva aplicación con gradle en Android Studio, y ahora necesito hacer alrededor de 10 versiones con diferentes nombres de paquetes y valores en recursos. Hice los sabores de encargo como en el ejemplo y quiero substituir algunas secuencias en estos sabores de encargo con valores de encargo. He encontrado un ejemplo como este:

filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: ['version': '2.2']) 

Pero no sé dónde ponerlo. Como entiendo necesito ponerlo en una tarea separada, pero ¿cómo hacer que esta tarea sea llamada por IDE?

También necesito substituir algunas variables dentro de las clases de Java y la autentificación del Proveedor de Contenido, tal vez necesito hacer esto copiando los archivos en la carpeta flavor1 y dejando gradle para fusionarla, pero parece una solución incorrecta almacenar muchas copias de archivos con diferencia en uno Línea … Tal vez necesito para el usuario alguna otra solución para todo esto?

Aquí está build.gradle:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile project(':JazzyListView') compile project(':ABS') compile project(':Volley') } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { versionCode 5 versionName "3.0" minSdkVersion 8 targetSdkVersion 17 } sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' java.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] } } productFlavors { flavor1 { packageName "com.example.flavor1" } flavor2 { packageName "com.example.flavor2" } } } 

Tuve un problema similar. Quería agregar el número de construcción Jenkins a las cadenas que se fusionan de strings.xml. Aquí está mi solución como de Android Gradle plugin 0.12. +.

 // Insert the build number into strings.xml android.applicationVariants.all{ variant -> variant.mergeResources.doLast{ ext.env = System.getenv() def buildNumber = env.BUILD_NUMBER if (buildNumber != null) { File valuesFile = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml") println("Replacing revision number in " + valuesFile) println("Build number = " + buildNumber) String content = valuesFile.getText('UTF-8') content = content.replaceAll(/devBuild/, buildNumber) valuesFile.write(content, 'UTF-8') } } } 

Es posible que desee conectarse a una tarea diferente de Gradle en función de lo que desee hacer. Echa un vistazo a las tareas que forman parte de la compilación de Android para averiguarlo.

http://tools.android.com/tech-docs/new-build-system/user-guide

ACTUALIZACIÓN : En algún momento, el complemento Android Gradle cambió la forma de iterar a través de las variantes de aplicación de cada palabra. Mi respuesta se ha actualizado para reflejar el cambio, pero intente cambiar a cada uno si este código no imprime nada a la consola.

Yo estaba tratando de obtener funcionalidad similar como Maven recurso de filtrado. Esto es lo que me ocurrió. Mi solución podría utilizar algunos cambios para ser más robusto (es decir, tirando de un archivo de propiedades, etc).

Mi ejemplo sólo muestra cómo reemplazar un solo valor, que es todo lo que necesitaba. Las variables siguen la convención ${some.property} . Esta solución también funciona con sabores de productos que tienen sus propios archivos de recursos.

 import org.apache.tools.ant.filters.* ... android.applicationVariants.all{ variant -> // Perform resource filtering variant.mergeResources.doLast { filterResources(variant) } } def filterResources(buildVariant) { //Setup temp directory to filter the resources File resFiltered = file("${buildDir}/res/all/filtered/${buildVariant.dirName}") if(resFiltered.exists()){ resFiltered.delete() } //Copy and filter the resources. copy { from(buildVariant.processResources.resDir) { include '**/*.xml' //Could be improved upon to pull from a properties file, etc. ant.properties['app.version'] = project.version filter(ExpandProperties, project: ant.project) } from(buildVariant.processResources.resDir) { exclude '**/*.xml' } into resFiltered } //Delete all the original resource files file(buildVariant.processResources.resDir).deleteDir() //Replace with the filtered ones. resFiltered.renameTo(file(buildVariant.processResources.resDir)) //Delete the original 'filtered' directory file( "${buildDir}/res/all/filtered").deleteDir() } 

Ejemplo en strings.xml

  ... <string name="app_version">${app.version}</string> ... 

En su carpeta "src", cree las carpetas "flavor1" y "flavor2" con la misma jerarquía que su carpeta "main". Si tiene strings.xml en sus valores main / res /, también puede hacerlo en los valores de flavor1 / res / y tener los valores de reemplazo allí. Puede mostrar errores en el IDE, pero todavía debe construir y ejecutar.

Estos enlaces pueden ser útiles:

  • Uso de Gradle para crear aplicaciones de Android
  • Gradle Plugin Guía del usuario

Y mi definición de filtro utilizando regex para reemplazar algo:

 from('res/') { include '**/*.xml' filter { line -> line.replaceAll(/YOUR_REGEX_TO_REPLACE_SOMETHING/, 'REPLACED_RESULT_EXPRESSION') } } into 'build/path/to/your/filtered/resources/' 
  • Android Studio: Excluya el archivo de recursos bajo recursos sourceSets
  • No se pudo encontrar el método android () para los argumentos en el proyecto de Android Studio
  • ¿Están gradle tools: selector for permissions works ever?
  • Cómo agregar .aar dependencia en el módulo de la biblioteca?
  • Auto incremento de código de versión sólo en versiones
  • Usa android-maps-utils en Android Studio
  • No se puede ejecutar gradle
  • No se puede ver la tarea del archivo de asignación de carga de Firebase
  • Android Gradle No se pudo reservar espacio suficiente para el montón de objetos
  • Prueba de unidades de Android de las categorías
  • ¿Es posible definir un recurso de array de cadenas Android en Gradle?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.