안드로이드 공부 노트

[Android] 안드로이드 중요 값 숨기기 - local.properties를 사용하여 키 관리하기 예제(Kotlin) / Unresolved reference: BuildConfig 해결 방법

지게요 2024. 8. 31. 20:32
728x90
반응형

개발을 하다 보면 API키 값이나 중요 값등을 숨기고 싶을 때가 있다. 

그럴 때는 local.properties를 사용하면 간단하게 숨김이 가능하다. 이제 차근차근 알아보자!

 

✅ 깃을 사용한다면. gitignore에 /build , /local.properties 이 두 가지가 들어가 있다고 가정하고 시작해 보겠다!

# 사용방법

아래 예제에서는 API_KEY값을 숨기는 예제를 해보겠다.

## local.properties 변수 값 설정

우선 가장 먼저 해야 할 것은 local.properties파일에 숨기고 싶은 값을 키 - 값 형식으로 작성해 준다.

 

<local.properties>

API_KEY = "12345678910"

 

## build.gradle.kts(app) 키 값 불러오기

앱 수준의 gradle에서 방금 위에서 키 - 값 형식으로 등록한 변수를 불러올 차례이다.

본 예제에서는 kts 파일로 Kotlin DSL을 사용한다.

### properties 선언 후 local.properties 파일 읽기

먼저 gradle에 Properties 타입의 변수 선언 후 local.properties 파일을 읽어와야 한다.

선언 위치는 최상단에 해도 상관없다!

// properties 선언 후 local.properties 파일을 읽어온다
val properties = Properties()
properties.load(project.rootProject.file("local.properties").inputStream())

 

### buildConfigField 함수를 이용해 local.properties 파일에서 키-값으로 선언한 값을 가져온다.

위에서 local.properties 파일을 읽어왔다면 이제 local.properties 파일 안에 있는 값을 불러올 차례이다.

android {
    namespace = "com.sub.buildtest"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.sub.buildtest"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
        // buildConfigField를 사용해 값 가져오기
        buildConfigField("String", "API_KEY", properties["API_KEY"].toString())
    }
  }

 

위처럼 buildConfigField에서 저장한 API 키와 이어주고, 그래 들을 빌드해 주면 BuildConfig에 저장되어 프로젝트 내에서 언제든 사용할 수 있게 된다.

buildConfigField함수의 속성은 buildConfigField("타입", "키", "값" )으로 사용한다.

 

잘 저장되어 있는 확인하고 싶으면 싱크 후 빌드한다. 그다음 BuildConfig 검색하면 아래 코드처럼 java로 된 파일이 보일 것이다. 거기서 설정해 준 값이 잘 나오면 90%는 성공이다! (왜 90% 인지는 아래에서 설명..)

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.sub.buildtest";
  public static final String BUILD_TYPE = "debug";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // 설정 해준 API_KEY 값이 보인다
  public static final String API_KEY = "12345678910";
}

 

## 사용하고자 하는 곳에서 BuildConfig로 가져오기

이제 설정은 다 했고 해당 값이 필요한 곳에서 가져와 사용하기만 하면 된다.

이번예제는 간단하게 MainActivity에서 해당 키 값을 Text로 보여주는 예제이다.

 

값을 가져오기 위해 "BuildConfig. 설정한" 이름 으로 값을 가져온다.

예를 들어 위에 같은 경우 buildConfigField("String", "API_KEY", properties ["API_KEY"]. toString())에서 두 번째 속성인 API_KEY로 지정해줬기 때문에 BuildConfig.API_KEY로 접근하면 된다!

BuildConfig.API_KEY

 

 

❗️잠깐 혹시 BuildConfig를 못 찾는 오류가 난다고요?? (Unresolved reference: BuildConfig)
그 이유는 AGP(Android gradle plugin) 8.0부터 buildconfig는 기본적으로 비활성화하도록 바뀌었기 때문이다.

해결을 위해 build.gradle.kts(:app)에 아래와 같이
buildFeatures = true를 해줘야 한다.
android {
 
    ... 
    buildFeatures {
        compose = true
        // buildConfig를 활성화 해준다
        buildConfig = true
    }
    
   ...
}

바로 이 부분이 아까 90%만 완료됐다고 한 이유이다. 이제 진짜 100% 설정 끝이다!

 

 

<MainActivity>

 

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            BuildtestTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Text(
                        text = "API KEY : ${BuildConfig.API_KEY}"
                    )
                }
            }
        }
    }
}

반응형