written scripts ext buildscript are java android android-studio android-gradle

java - scripts - groovy gradle



¿Es posible declarar una variable en Gradle utilizable en Java? (7)

Generar constantes de 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" } } }

Puedes 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 forma habitual con @string/app_name o R.string.app_name

¿Es posible declarar una variable en Gradle utilizable en Java? Básicamente, me gustaría declarar algunas variables en build.gradle y luego obtenerlas (obviamente) en el momento de la compilación. Al igual que las 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í?


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.gradle

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" />


Ejemplo de uso de las propiedades del sistema, establecido en build.gradle, leído desde la aplicación Java (seguimiento de la pregunta en los comentarios):

Básicamente, usando la tarea de test en build.gradle , con el método de tarea de prueba systemProperty estableciendo 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 muestra (que probablemente podría inferir, pero se incluye aquí de todos modos): obtiene una propiedad del sistema MY-VAR1 , que se espera que se establezca en tiempo de ejecución 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

Descubrí que la parte difícil en realidad es obtener la salida de gradle ... Entonces, el registro se configura aquí (slf4j + logback), y el archivo de registro muestra los resultados (alternativamente, ejecute gradle --info cleanTest test ; también las propiedades que llegan 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, por cierto, solo 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

Estoy usando

buildTypes.each { it.buildConfigField ''String'', ''GoogleMapsApiKey'', "/"$System.env.GoogleMapsApiKey/"" }

Se basa en share pero la toma de una variable de entorno.


Estoy usando este código y estoy trabajando muy bien.

def baseUrl = ''/"http://patelwala.com/myapi/"'' def googleServerKey = ''/"87171841097-opu71rk2ps35ibv96ud57g3ktto6ioio.apps.googleusercontent.com"'' android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' buildConfigField ''String'', ''BASE_URL'', baseUrl buildConfigField ''String'', ''web_client_id'', googleServerKey } releasedebug { initWith debug buildConfigField ''String'', ''BASE_URL'', baseUrl buildConfigField ''String'', ''web_client_id'' ,googleServerKey } debug { buildConfigField ''String'', ''BASE_URL'', baseUrl buildConfigField ''String'', ''web_client_id'', googleServerKey } } }

}


La respuesta de rciovati es totalmente correcta. Solo quería agregar un dato más para que también pueda crear variables para cada tipo de compilación dentro de la parte de configuración predeterminada de su build.gradle. Esto se vería así:

android { defaultConfig { buildConfigField "String", "APP_NAME", "/"APP_NAME/"" } }

Esto le permitirá tener acceso a través de

BuildConfig.App_NAME

Solo quería tomar nota de este escenario también si desea una configuración común.


Puede crear un campo de configuración de compilación reemplazable mediante las variables de entorno del sistema durante la compilación:

El respaldo se usa durante el desarrollo, pero puede anular la variable cuando 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 true proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' buildConfigField "String", "SERVER_URL", serverUrl } }

La variable estará disponible como BuildConfig.SERVER_URL .