[Android] Gradle에서 외부 파일을 문자열로 읽고 변수로 만들어 소스 코드에서 사용하는 방법

Joy·2022년 1월 22일
0

android studio arctic fox | 2020.3.1 Patch 4

프로젝트 .env 파일 안에 있는 SECRET_KEYAPP_ID를 Groovy 파일로 가져와서 변수로 저장한 후 안드로이드 소스 코드에서 사용하는 방법입니다.

build.gradle(:app)에서 .env 파일을 불러온 다음 필요한 정보를 아래 Map 변수에 key-value 형식으로 저장합니다.

def mapValue = [:]
new File('/.env').getText('UTF-8').splitEachLine(/=/){
    if (it[0] == "APP_ID" || it[0] == "SECRET_KEY"){
        mapValue[it[0]] = it[1]
    }
}
...
  • File('/.env') : 루트 경로에 있는 .env 파일을 가져옵니다.
  • .getText('UTF-8') : 'UTF-8' 형식으로 가져옵니다.
  • .splitEachLine(/=/) : 한 줄씩 읽어오는데 .env 파일의 문자 형식이 APP_ID="1234567890"으로 되어있기 때문에 '='에서 문자열을 쪼개달라는 명령어 입니다.

📌 참고로 해당 변수가 잘 들어갔는지 확인하고 싶으면 println을 사용하여 확인하면 됩니다. 아래 코드를 작성한 후 빌드를 하거나, 터미널을 켜고 프로젝트 파일 위치에서 ./gradlew clean을 실행해보면 아래 결과가 잘 프린트되어 나오는 것을 볼 수 있습니다.

for (i in mapValue){
    println i.key
    println i.value
}

다음은 mapValue변수에 담아둔 key-value를 source code에서 사용할 수 있도록 BuildConfig에 변수로 저장하는 방법입니다.

설정 상태나 필요한 상황에 따라 다른 블럭안에서 변수에 담아도 되겠지만 지금은 android{} 안에 있는 defaultConfig{} 안에서 변수로 담아두도록 하겠습니다.

android {
    compileSdk 31

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 28
        targetSdk 31
       ...
       
       // xml에 저장을 원하면 buildConfigField가 아닌 resValue를 사용하면 됨
        for (i in mapValue){ buildConfigField "String", i.key, i.value }
    }
    .....
  • buildConfigField에 담고, 빌드를 하면 아래와 같이 해당 패키지안에 있는 BuildConfig 소스 코드 안에 변수와 값이 생깁니다.
  • resValue를 사용하실 경우는 for (i in mapValue){ resValue "string", i.key, i.value }로 넣으면 됩니다. 빌드 후 아래 코드처럼 사용할 수 있습니다.
<TextView
        android:text="@string/APP_ID" />

📌 참고로 i.value는 ""가 있는 String 형식이므로 저렇게 써도 되지만, 변수를 사용하지 않고 문자열을 직접 작성할 경우 아래와 같이 써야 합니다.
buildConfigField "String", "APP_ID", '"1234567890"'

📌 만약 추가한 변수가 생성이 안되었다면, Build -> Clean Project 후 다시 빌드 해보시거나, File -> Invalid Caches / Restart.. 를 한 후에 다시 빌드 해보시기 바랍니다.

package com.example.myapplication;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.example.myapplication";
  ....
  
  // Field from default config.
  public static final String APP_ID = "1234567890";
  // Field from default config.
  public static final String SECRET_KEY = "1234567890";
}

그럼 위와 같이 BuildConfig 클래스 안에 변수가 들어가게 되고, 소스코드에서 호출하여 사용할 수 있습니다.

import com.example.myapplication.BuildConfig

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

        val appId = BuildConfig.APP_ID           
        val secretKey = BuildConfig.SECRET_KEY    

    }
}
profile
어떤 것이든 그것이 지닌 특별한 속성이나 가치를 간과해서는 안 된다.

0개의 댓글