답변:
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"
}
}
}
당신은 그들에게 액세스 할 수 있습니다 BuildConfig.FOO
android {
buildTypes {
debug{
resValue "string", "app_name", "My App Name Debug"
}
release {
resValue "string", "app_name", "My App Name"
}
}
}
당신이 일반적인 방법으로 액세스 할 수 있습니다 @string/app_name
또는R.string.app_name
<project>/src/
이 파일 만들 경우, debug/res/values/strings.xml
다른 파일을 release/res/values/strings.xml
, 당신은 디버깅을위한 자원을 설정할 수 있습니다 및 릴리스는 약간 클리너 방식으로 구축뿐만 아니라.
android
플러그인 없이도 동일한 결과를 얻을 수 있습니까? 즉 apply plugin java
? 감사!
gradle.properties
AppKey="XXXX-XXXX"
build.gradle
buildTypes {
//...
buildTypes.each {
it.buildConfigField 'String', 'APP_KEY_1', AppKey
it.resValue 'string', 'APP_KEY_2', AppKey
}
}
자바 코드에서의 사용법
Log.d("UserActivity", "onCreate, APP_KEY: " + getString(R.string.APP_KEY_2));
BuildConfig.APP_KEY_1
XML 코드에서의 사용법
<data android:scheme="@string/APP_KEY_2" />
./gradlew -PAppKey="1234" testdebug
defaultConfig
블록을 사용할 수도 있습니다 . stackoverflow.com/a/51521146/321354
@string/APP_KEY_2
build.gradle에 설정된 시스템 속성을 사용하는 예제는 Java 응용 프로그램에서 읽습니다 (의견에서 질문에 이어).
기본적으로 테스트 태스크 메소드를 사용하여의 test
태스크를 사용하여 런타임시 전달되는 시스템 특성을 설정하십시오.build.gradle
systemProperty
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'
}
그리고 나머지 샘플 코드는 다음과 같습니다 (어쩌면 유추 할 수 있지만 어쨌든 여기에 포함되어 있습니다) : 시스템 속성을 얻 MY-VAR1
습니다 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);
}
}
테스트 케이스 : MY-VAR
설정되어 있지 않으면 테스트가 실패합니다.
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);
}
}
실행 (참고 : 테스트 통과) :
$ 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
까다로운 부분이 실제로 gradle에서 출력을 얻는다는 것을 알았습니다 ... 그래서 로깅이 여기에 구성되고 (slf4j + logback) 로그 파일에 결과가 표시됩니다 (또는 실행 gradle --info cleanTest test
; stdout을 얻는 속성도 있습니다) 콘솔, 그러나 당신은 알고 있습니다)) :
$ 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
" systemProperty...
"(btw, test
작업 에서만 작동) 을 주석 처리 한 경우 :
example.HelloWorldTest > testEnv FAILED
org.junit.ComparisonFailure at HelloWorldTest.java:14
완성을 위해 다음은 로그 백 구성 ( 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>
파일 :
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
version = '0.0.1-SNAPSHOT'
Java 코드를 통해 얻을 수 있습니까 ?
systemProperty
실제로 테스트에 대해서만 의미가 있으므로, 그들이 왜 이런 식으로했는지 (감독이 아님) 알지만 동시에 의도하지 않은 것들 (응용 프로그램 DSL과 같은)에 gradle을 사용하려고했습니다. )를 식별 할 수 있습니다. 대안으로, 속성 파일 (또는 구성 서비스 등)에서 속성을로드하는 것이 좋습니다. "테스트"모드가 아닌 경우 "제작"모드이고 응용 프로그램 논리가 필요하기 때문입니다. (어쨌든 그것은 이론이다.)
빌드하는 동안 시스템 환경 변수를 통해 대체 가능한 빌드 구성 필드를 작성할 수 있습니다.
폴백은 개발 중에 사용되지만 Jenkins 또는 다른 도구에서 빌드를 실행할 때 변수를 대체 할 수 있습니다.
앱에서 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
}
}
변수는로 사용할 수 있습니다 BuildConfig.SERVER_URL
.
이 코드를 사용하고 있으며 잘 작동합니다.
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
}
}
}
}
나는 사용하고있다
buildTypes.each {
it.buildConfigField 'String', 'GoogleMapsApiKey', "\"$System.env.GoogleMapsApiKey\""
}
Dennis의 답변을 기반으로 하지만 환경 변수에서 가져옵니다.
위의 답변 중 어느 것도 나에게 지침을 제공하지 않았으므로 Groovy Methods에 대해 배우는 데 2 시간을 소비해야했습니다.
프로덕션, 샌드 박스 및 로컬 환경에 맞서고 싶었습니다. 게으 르기 때문에 한 곳에서만 URL을 변경하고 싶었습니다. 다음은 내가 생각해 낸 것입니다.
flavorDimensions 'environment'
productFlavors {
production {
def SERVER_HOST = "evil-company.com"
buildConfigField 'String', 'API_HOST', "\"${SERVER_HOST}\""
buildConfigField 'String', 'API_URL', "\"https://${SERVER_HOST}/api/v1/\""
buildConfigField 'String', 'WEB_URL', "\"https://${SERVER_HOST}/\""
dimension 'environment'
}
rickard {
def LOCAL_HOST = "192.168.1.107"
buildConfigField 'String', 'API_HOST', "\"${LOCAL_HOST}\""
buildConfigField 'String', 'API_URL', "\"https://${LOCAL_HOST}/api/v1/\""
buildConfigField 'String', 'WEB_URL', "\"https://${LOCAL_HOST}/\""
applicationIdSuffix ".dev"
}
}
${variable}
Groovy Methods에서는 큰 따옴표 만 사용할 수 있으므로 대체 구문 .
rickard {
def LOCAL_HOST = "192.168.1.107"
buildConfigField 'String', 'API_HOST', '"' + LOCAL_HOST + '"'
buildConfigField 'String', 'API_URL', '"https://' + LOCAL_HOST + '/api/v1/"'
buildConfigField 'String', 'WEB_URL', '"https://' + LOCAL_HOST + '"'
applicationIdSuffix ".dev"
}
이해하기 어려운 것은 문자열을 따옴표로 묶은 문자열로 선언해야한다는 것입니다. 이러한 제한으로 인해 참조를 API_HOST
직접 사용할 수 없었 습니다.