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?
- Configuración de Robolectric, Android Studio y Gradle para tomar una aplicación de prueba
- Gradle atrapado en el proyecto de construcción en Android Studio
- Cómo inyectar la configuración de Android a cada subproyecto con Gradle?
- Gradle versión 1.8 es necesario. La versión actual es 1.9-rc-3 - Android Studio
- Añadiendo primavera para la dependencia de Android a gradle + proyecto de estudio Android
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" } } }
- Cómo evitar DEX 64K LIMIT importando la biblioteca correcta
- ConnectedAndroidTest y tipo de compilación de liberación
- JniLibs no se extienden en gradle
- Android Studio minSdkVersion no funciona
- Biblioteca ya agregada: Gradle Build
- Gradle Error: Error de ejecución para la tarea ': app: processDebugGoogleServices'
- Trabajo de Jenkins usando Gradle no puede encontrar ejecutable
- ¿Cómo puedo mantener separadas mis bibliotecas de pruebas de Android de las bibliotecas de aplicaciones de Android Studio?
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/'
- ¿Cómo puedo probar automáticamente la funcionalidad de las aplicaciones iOS y Android?
- Android: AsyncTask ProgressDialog no se abrirá en ActivityGroup