¿Es posible declarar una variable en Gradle utilizable en Java?
¿Es posible declarar una variable en Gradle utilizable en Java? Básicamente me gustaría declarar algunos vars en el build.gradle y luego conseguirlo (obviamente) en tiempo de construcción. Al igual que una macros de preprocesador en C / C ++ …
Un ejemplo de declaración sería algo así …:
- La conversión al formato de Dalvik falló con el error 1 puesto que el SDK de Facebook
- Mantenga el elemento de lista highlite con SimpleCursorAdapter
- Establecer el interpolador para las animaciones de Android en Java
- Solución automática de laberinto
- No Class Def Found Error Android-Bolts Analizar
android { debug { A_VAR_RETRIEVABLE_IN_JAVA = 42 } release { A_VAR_RETRIEVABLE_IN_JAVA = 42+52 } }
¿Hay alguna manera de hacer algo así?
- Tint Bitmap con la pintura?
- AVD no dejará de cerrar
- Análisis de RSS en Android
- AscyncTask - No en el hilo principal
- ¿Cómo puedo hacer que una aplicación para Android deje de reiniciarse cada vez que se abra?
- Localización y eliminación de valores no referenciados en strings.xml
- Icono de imagen en vista de lista expandible en android
- Ocultar clases de biblioteca - Android
Generar constantes Java
android { buildTypes { debug { buildConfigField "int", "FOO", "42" buildConfigField "String", "FOO_STRING", "\"foo\"" buildConfigField "boolean", "LOG", "true" } release { buildConfigField "int", "FOO", "52" buildConfigField "String", "FOO_STRING", "\"bar\"" buildConfigField "boolean", "LOG", "false" } } }
Puede acceder a ellos con BuildConfig.FOO
Generar recursos de Android
android { buildTypes { debug{ resValue "string", "app_name", "My App Name Debug" } release { resValue "string", "app_name", "My App Name" } } }
Puede acceder a ellos de la manera habitual con @string/app_name
o R.string.app_name
Un ejemplo de uso de una clave de aplicación Api en una aplicación de Android (Java y XML)
Gradle.properties
AppKey="XXXX-XXXX"
Construir un gradiente
buildTypes { //... buildTypes.each { it.buildConfigField 'String', 'APP_KEY_1', AppKey it.resValue 'string', 'APP_KEY_2', AppKey } }
Uso en código java
Log.d("UserActivity", "onCreate, APP_KEY: " + getString(R.string.APP_KEY_2)); BuildConfig.APP_KEY_1
Uso en código xml
<data android:scheme="@string/APP_KEY_2" />
- Enlace a un ejemplo de uso de la clave de aplicación de Api en una aplicación de Android
- Utilizar constantes de cadena generadas por configuraciones de generación de Gradle
Ejemplo de uso de las propiedades del sistema, establecidas en build.gradle, leídas desde la aplicación Java (siguiendo desde la pregunta en los comentarios):
Básicamente, utilizando la tarea de test
en build.gradle
, con el método de prueba de método systemProperty
establecer una propiedad del sistema que se pasa en tiempo de ejecución:
apply plugin: 'java' group = 'example' version = '0.0.1-SNAPSHOT' repositories { mavenCentral() // mavenLocal() // maven { url 'http://localhost/nexus/content/groups/public'; } } dependencies { testCompile 'junit:junit:4.8.2' compile 'ch.qos.logback:logback-classic:1.1.2' } test { logger.info '==test==' systemProperty 'MY-VAR1', 'VALUE-TEST' }
Y aquí está el resto del código de ejemplo (que probablemente podría inferir, pero se incluye aquí de todos modos): se obtiene una propiedad del sistema MY-VAR1
, que se espera que en tiempo de ejecución se establezca en VALUE-TEST
:
package example; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { static final Logger log=LoggerFactory.getLogger(HelloWorld.class); public static void main(String args[]) { log.info("entering main..."); final String val = System.getProperty("MY-VAR1", "UNSET (MAIN)"); System.out.println("(main.out) hello, world: " + val); log.info("main.log) MY-VAR1=" + val); } }
Testcase: si MY-VAR
está configurado, la prueba debería fallar:
package example; ... public class HelloWorldTest { static final Logger log=LoggerFactory.getLogger(HelloWorldTest.class); @Test public void testEnv() { HelloWorld.main(new String[]{}); final String val = System.getProperty("MY-VAR1", "UNSET (TEST)"); System.out.println("(test.out) var1=" + val); log.info("(test.log) MY-VAR1=" + val); assertEquals("env MY-VAR1 set.", "VALUE-TEST", val); } }
Ejecutar (nota: la prueba está pasando):
$ gradle cleanTest test :cleanTest :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test BUILD SUCCESSFUL
He encontrado que la parte difícil es realmente obtener la salida de gradle … Por lo tanto, el registro está configurado aquí (slf4j + logback), y el archivo de registro muestra los resultados (alternativamente, ejecute gradle --info cleanTest test
, hay También las propiedades que obtienen stdout a la consola, pero, ya sabes, por qué):
$ cat app.log INFO Test worker example.HelloWorld - entering main... INFO Test worker example.HelloWorld - main.log) MY-VAR1=VALUE-TEST INFO Test worker example.HelloWorldTest - (test.log) MY-VAR1=VALUE-TEST
Si comenta " systemProperty...
" (que, btw, sólo funciona en una tarea de test
), entonces:
example.HelloWorldTest > testEnv FAILED org.junit.ComparisonFailure at HelloWorldTest.java:14
Para completar, aquí está la configuración de logback ( src/test/resources/logback-test.xml
):
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>app.log</file> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d %p %t %c - %m%n</pattern> </layout> </appender> <root level="info"> <appender-ref ref="FILE"/> </root> </configuration>
Archivos:
-
build.gradle
-
src/main/java/example/HelloWorld.java
-
src/test/java/example/HelloWorldTest.java
-
src/test/resources/logback-test.xml
Puede crear el campo de configuración de compilación overrideable a través de las variables de entorno del sistema durante la compilación:
Fallback se utiliza durante el desarrollo, pero puede anular la variable cuando se ejecuta la compilación en Jenkins u otra herramienta.
En tu aplicación build.gradle :
buildTypes { def serverUrl = '\"' + (System.getenv("SERVER_URL")?: "http://default.fallback.url.com")+'\"' debug{ buildConfigField "String", "SERVER_URL", serverUrl } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' buildConfigField "String", "SEVER_URL", serverUrl } }
- Appcompat-v7: 21.0.0 ': No se encontró ningún recurso que coincida con el nombre dado: attr' android: actionModeShareDrawable '
- Android: cómo hacer que el teclado ingrese el botón diga "Buscar" y manejar su clic?