¿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í …:

android { debug { A_VAR_RETRIEVABLE_IN_JAVA = 42 } release { A_VAR_RETRIEVABLE_IN_JAVA = 42+52 } } 

¿Hay alguna manera de hacer algo así?

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 } } 
  • Android Gradle compilar commons-io crea duplicado en el árbol de la biblioteca
  • Lo que se mata con el hilo de la interfaz de usuario de Android
  • ¿Hay un reemplazo para el RequestInterceptor en Retrofit 2?
  • Android: Reproductor de video como la aplicación de Dailymotion
  • Clave de String en Java RSA
  • Error sobre el contexto FLAG_ACTIVITY_NEW_TASK
  • OkHttpClient roto después de actualizado Retrofit to Retrofit 2
  • Android: No se llama a solicitud de petición de cadena de volea
  • Retrolambda en Travis CI
  • AVD Manager no puede encontrar herramientas \ android.bat aunque esté allí
  • NetBeans y parada / interrupción en todas las excepciones?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.