본문 바로가기
안드로이드 공부 노트

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

by 지게요 2024. 8. 31.
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}"
                    )
                }
            }
        }
    }
}

반응형