Android (안드로이드)

[Android] 앱 버전 · Target SDK · 빌드 날짜 표시하기 / BuildConfig import 오류 해결

Oscar:) 2024. 12. 12. 20:00
728x90

 

 

앱에 대한 간략한 정보를 화면에 표시해야하는 일이 생겼다.

이번 포스팅에서는 다음 3가지 정보를 표시해본다.

 

 

 

- 앱 버전

현재 앱이 몇 버전인지 명시한다.

이는 앱 정보 중에서 가장 기본적인 내용이다.

 

 

- Target SDK

API LEVEL의 경우, 사실 개발자 관점에서만 다루는 정보에 가깝다.

 

하지만 구글이 매년 Target SDK 업데이트 관련 압박을 넣기도 하고,

우리 앱의 Target SDK는 몇이냐는 질문을 많이 받던 와중에

그냥 앱에 명시했으면 좋겠다는 요청이 있어서 표시했다.

 

 

- 앱 빌드 날짜

우리 앱의 최근 업데이트 날짜가 언제쯤인지 궁금하다는 요청이 많았다.

업데이트가 잦다면, 사용자에게 '짧은 주기로 관리되는 앱'으로 인식되는 등

긍정적인 부분도 있다고 본다.

 

 

 


 

 

 

✅ 앱 버전

 

Gradle 파일에 명시해놓은 versionName 값을 가져온다.

 

build.gradle.kts (Module :app)

android {
  ...
  defaultConfig {
    ...
    versionName = "1.0"
  }
}

 

 

 

MainActivity.kt

override fun onCreate() {
   ...
   bind.versionTextview.text = BuildConfig.VERSION_NAME
}

 

BuildConfig 클래스에서 VERSION_NAME 상수로 값을 가져올 수 있다.

 

 

 

 

 

 

✅ 앱 빌드 날짜

 

앱 빌드 날짜의 경우, defaultConfig 내에 기본 세팅된 값이 아니다.

그렇기에 직접 정의해줘야 한다.

 

build.gradle.kts (Module :app)

android {
  ...
  defaultConfig {
    ...
    buildConfigField("String", "BUILD_DATE", "\"${SimpleDateFormat("yyyy-MM-dd").format(Date())}\"")
  }
}

 

buildConfigField() 파라미터를 대충 봐도 알겠지만,

① 타입, ② 상수 이름, ③ 반환 값

으로 이루어져 있다.

 

반환 값에는 SimpleDateFormat 사용하여 현재 날짜를 기록하도록 했다. 

 

물론 Gradle 파일을 건드렸다면 Sync 는 필수다.

 

 

 

MainActivity.kt

override fun onCreate() {
   ...
   bind.buildDateTextview.text = BuildConfig.BUILD_DATE
}

 

이제 BuildConfig 클래스에 BUILD_DATE 상수가 생성되어 사용할 수 있다.

 

참고로, Run app 등을 사용하여 앱을 빌드할 때만 BUILD_DATE가 초기화된다.

한 번 빌드한 앱을 여러번 실행할 때는 초기화되지 않는다.

 

 

 

 

 

 

✅ Target SDK

 

Target SDK 의 경우, BuildConfig 파일을 사용하지 않아도 된다.

Context로 ApplicationInfo 클래스를 호출할 수 있기 때문이다.

 

MainActivity.kt

override fun onCreate() {
   ...
   bind.targetsdkTextview.text = this.applicationInfo.targetSdkVersion.toString()
}

 

 

 

 

✅ 결과

 

 

우측에 3가지 정보가 출력되었다.

 

 

 

 

 

 

✅ 번외

 

위 3가지 정보를 출력할 때, 다음과 같이 3줄의 코드를 작성한다고 가정하자.

 

MainActivity.kt

override fun onCreate() {
   ...
   bind.versionTextview.text = BuildConfig.VERSION_NAME
   bind.targetsdkTextview.text = this.applicationInfo.targetSdkVersion.toString()
   bind.buildDateTextview.text = BuildConfig.BUILD_DATE
}

 

가운데에 Target SDK만 통일되지 않은 뭔지 모를 찝찝함이 든다.

그래서 빌드 날짜와 같이, Target SDK도 defaultConfig에 직접 정의해주고자 한다.

 

 

 

build.gradle.kts (Module :app)

android {
  ...
  defaultConfig {
    ...
    buildConfigField("String", "TARGET_SDK", "\"${targetSdk.toString()}\"")
  }
}

 

Gradle Sync 해주고, Rebuild Project 해준다.

 

 

BuildConfig 파일에 TARGET_SDK 상수가 생성된 것을 확인할 수 있다.

 

이제 MainActivity를 수정해주자.

 

 

 

MainActivity.kt

override fun onCreate() {
   ...
   bind.versionTextview.text = BuildConfig.VERSION_NAME
   bind.targetsdkTextview.text = BuildConfig.TARGET_SDK
   bind.buildDateTextview.text = BuildConfig.BUILD_DATE
}

 

BuildConfig 클래스 사용으로 깔끔하게 통일시킬 수 있다.

 

 

 

 

 

 

✅ BuildConfig 클래스가 import 안되는 오류 해결

 

간혹 BuildConfig 클래스가 import 되지 않는 현상이 발생한다.

(나도 그랬다)

 

그럴 때에는 다음 과정을 진행해보자.

 

 

1. [File] → [Invalidate Caches] → [Invalidate and Restart]

 

 

 

2. [Build] → [Clean Project] → [Rebuild Project]

 

 

위 2개 해보고 그래도 import가 안 된다면,

 

 

 

3. Gradle 파일에 buildConfig 값 명시

 

build.gradle.kts (Module :app)

android {
  ...
  buildFeatures {
    ...
    buildConfig = true
  }
}

 

당연히 Sync는 필수다.

 

 

 

4. gradle.properties 파일에 buildConfig 값 명시

 

그래들 버전에 따라 buildConfig 값을 properties 파일에서 명시해줘야 할 수도 있다.

 

gradle.properties

...
android.defaults.buildfeatures.buildconfig=true

 

이후 1, 2번을 다시 진행해주면 BuildConfig 클래스가 import 된다.

 

 

 

 

 


 

 

 

앱 정보 불러오는 내용은 어렵지 않았는데,

BuildConfig 클래스가 import 되지 않는 문제 때문에 1시간 정도 헤맸던 것 같다.

 

오늘도 고마워요...stackoverflow...

 

 

 

728x90