# Table of Contents

# BuildConfig

안드로이드 시스템은 앱을 빌드할 때 여러가지 파일을 자동으로 생성합니다. 그 중 하나가 BuildConfig클래스입니다. 이 클래스에는 현재 빌드와 관련된 정보가 상수 형태로 정의되어 있으며, 코드에서도 직접 참조할 수 있습니다.

# 코드에서 BuildConfig에 접근하기

자동으로 생성된 BuildConfig클래스는 다음과 같습니다.

// BuildConfig.java

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.yologger.example";
    public static final String BUILD_TYPE = "debug";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0";
}

BuildConfig클래스에 정의된 상수는 코드에서 다음과 같이 접근할 수 있습니다.

// MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val applicationId = BuildConfig.APPLICATION_ID  // "com.yologger.example"
        val versionCode = BuildConfig.VERSION_CODE      // 1
    }
}

그렇다면 이 상수는 어디에 정의되어 있을까요? 바로 모듈 수준의 build.gradle입니다. 이 파일의 defaultConfig 섹션에 상수가 정의되어 있습니다.

// 모듈 수준의 build.gradle

android {
    defaultConfig {
        applicationId "com.yologger.example"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }
    // ...
}

# 상수를 직접 정의하고 사용하기

buildConfigField를 사용하면 상수를 직접 정의하고 코드에서 참조할 수도 있습니다. 모듈 수준의 build.gradlebuildConfigField ("DATA_TYPE", "KEY", "VALUE") 형태로 선언하면 됩니다.

// 모듈 수준의 build.gradle

android {
    defaultConfig {
        applicationId "com.yologger.example"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        
        buildConfigField ("String", "AUTH_API_KEY", '"your_auth_api_key"')
        buildConfigField ("String", "AUTH_API_URL", '"your_auth_api_url"')
    }
}

TIP

추가 후 Gradle Sync를 해야만 BuildConfig 클래스가 생성됩니다.

TIP

문자열의 경우 작은 따옴표로 감싸주어야 합니다.

새로 생성된 BuildConfig클래스는 다음과 같습니다.

// BuildConfig.java

package com.example.simple_memo;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.yologger.example";
  public static final String BUILD_TYPE = "debug";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Field from default config.
  public static final String AUTH_API_KEY = "your_auth_api_key";
  // Field from default config.
  public static final String AUTH_API_URL = "your_auth_api_url";
}

생성된 상수에 접근해봅시다.

// MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val apiKey = BuildConfig.AUTH_API_KEY       // your_auth_api_key
        val apiUrl = BuildConfig.AUTH_API_URL       // your_auth_api_url
    }
}

# 상수를 xml 파일에서 사용하기

xml 파일에서 사용할 상수는 resValue를 사용하여 선언합니다.

// build.gradle

android {
    defaultConfig {
        ...
        // buildConfigField ("String", "AUTH_API_KEY", '"your_auth_api_key"')
        // buildConfigField ("String", "AUTH_API_URL", '"your_auth_api_url"')
        resValue "string", "CLIENT_ID", "your_client_id"
        resValue "string", "CLIENT_SECRET", "your_client_secret"
    }
}

다음과 같이 사용할 수 있습니다.

// activity_main.xml

<TextView android:text="@string/CLIENT_ID"/>
<TextView android:text="@string/CLIENT_SECRET"/>