android {
...
compileSdk 33
defaultConfig {
minSdkVersion 23
targetSdkVersion 33
}
}
최근 minSdk, compileSdk, targetSdk 각 의미에 대해서 물어보는 질문에서 minSdk은 쉽게 대답했지만 compileSdk와 targetSdk의 차이점을 설명하지 못했던 슬픈 경험이 있어 이번 글을 준비하게 되었습니다.
이 글을 보시는 취준생분들이나 면접을 대비하시는 분들은 꼭 대답하실 수 있으면 좋겠네요
Android API Level
이번 블로그에서 알아보는 minSdk, compileSdk, targetSdk 속성의 값으로 Android API Level이 사용됩니다. 그래서 우선 Android API Level에 대해서 알아볼 필요가 있습니다.
처음 출시된 2008년부터 현재까지 아주 다양한 안드로이드 버전이 출시됨에 따라 각 버전을 구별하는 기준이 필요했을 것이라고 생각합니다. Android 3.0부터는 알파벳으로 시작하는 간식 단어가 Android 버전의 별명으로 지정이 되었지만 코드에서 각 버전을 명시할 때 문자열보다는 정수형이 더 쉽고 명확했을까요? Android API Level이라는 또 하나의 정수형 식별자가 생기게 됩니다. 맨 처음 출시된 Android 1.0은 API Level 1이며 그다음 버전이 출시될 때마다 API Level은 1씩 증가됩니다.
각 버전은 아래와 같은 요소를 포함하고 있다고 합니다.
- 핵심 패키지 및 클래스 집합
- 매니페스트 파일을 선언하는 데 사용되는 XML 요소 및 속성 집합
- 리소스를 선언 및 액세스 하는 데 사용되는 XML 요소 및 속성 집합
- 인텐트 집합
- 애플리케이션이 요청할 수 있는 권한 및 시스템에 포함된 권한 적용 집합
따라서 버전에 따라서 접근할 수 있는 클래스들이 달라질 수 있음을 인지하고 있어야 합니다.
minSdk
minSdk는 앱을 설치할 수 있는 최소 Android Level 버전을 의미합니다. 높은 Android Level 버전이 하위 버전에 대해서 호완성을 어느 정도 제공해 주지만 높은 버전에서만 사용할 수 있는 기능 또한 존재합니다. 이런 상황에서 취할 수 있는 방법은 2가지인데요.
런타임에 높은 버전에서만 원하는 동작을 수행하도록 분기처리
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
...
} else {
...
}
Build.VERSION.SDK_INT는 앱을 실행하고 있는 기기의 API Level 값을 의미하는 상수인데요. 해당 값으로 알맞은 API Level일 때 특정 동작을 수행하도록 하는 코드를 작성할 수 있습니다.
매번 이렇게 개발자가 일일이 버전 분기하는 것도 번거로운 작업일 수 있는데요. 구글은 이를 위해 Compat이라는 버전 mapping 해주는 유틸성 클래스들도 제공해 주니 참고하면 좋을 것 같습니다.
2. minSdk를 원하는 동작을 실행할 수 있는 최소 Android Level로 올리는 것
android {
...
defaultConfig {
minSdkVersion 23
...
}
}
minSdkVersion 속성은 앱을 설치할 수 있는 최소 API Level을 의미합니다. 디폴트 값은 1이라고 하며, 23으로 설정이 되어 있다면 23보다 아래인 버전의 기기들은 해당 앱을 설치할 수 없습니다. 만약 앱을 설치한 기존 유저가 minSdkVersion 보다 낮아진다면 최신 업데이트를 다운로드할 수 없게 됩니다!
compileSdk
android {
...
compileSdk 33
}
compolleSdk는 로컬에서 컴파일할 때 타깃으로 설정되는 API Level를 의미합니다. 컴파일 타임에 설정한 API Level의 프레임워크 요소들이 코드에 포함되기 때문에 직접 접근하여 테스트를 할 수 있습니다. 여러 가이드에 따르면 compileSdk를 가장 최신 API Level로 설정하라는 말이 많은데요. 최신 API Level을 하게 되면 여러 가지 장점이 있습니다.
1. 최신 API Level에서 제공해 주는 기능 등을 미리 테스트해 볼 수 있습니다.
2. 이후 버전에서 Deprecated 되는 클래스의 정보를 제공해서 미리 안전하게 migrate 할 수 있는 가이드를 제공해 줍니다.
compileSdk는 로컬 컴파일에만 영향을 주기 때문에 실제 사용자에게 전달되는 apk, aab에 포함되지 않습니다. 따라서 최신 API를 적용하기 전 로컬 테스트 용도로 사용하신다고 생각하시면 됩니다.
targetSdk
android {
...
defaultConfig {
targetSdkVersion 33
}
}
targetSdk는 앱이 정상적으로 지원해주는 API Level을 의미합니다. 기본값은 minSdkVersion에 주어진 값과 동일합니다.
targetSdk는 Android 시스템의 호환성 동작에 영향을 주는데요. 호환성 동작이란 targetSdk 버전보다 높은 기기에서 해당 앱을 설치했을 때 시스템에서 적절하게 호환성을 제공해 주는 기능입니다. 예를 들어 Android 13에 Push 권한이 추가되어 사용자에게 알림을 노출하려면 푸시 권한이 필요했습니다. 따라서 targetSdk를 Android 12인 32로 설정하고, Android 13 기기가 해당 앱을 설치하게 된다면 시스템에서는 호환성 동작이라는 명목하에 푸시 권한을 임의로 부여합니다. 여기서 만약 targetSdk를 33으로 설정하게 된다면 앞서 설명한 푸시 권한의 호환성 동작이 비활성화되므로 코드에서 푸시 권한을 요청하는 로직이 들어가야 푸시 기능이 정상 동작하게 됩니다.
이렇듯 targetSdk는 해당 API Level에 대한 테스트가 완료되었음을 시스템에 알리는 역할이며, 설정한 API Level와 하위 버전들의 호환성을 올바르게 제공해주는 지 테스트가 면밀하게 필요합니다.
'Android > Common' 카테고리의 다른 글
[Android] InAppUpdate 기능 알아보기 (1) | 2023.11.09 |
---|---|
[Android] 앱 성능 개선 - 앱 시작 시간 (1) | 2023.10.10 |
[Android] Radius 올바르게 적용하기 (0) | 2023.05.24 |
[Android] Fragment에서 데이터 외부로 전달시키는 방법 - ActivityViewModel (0) | 2022.12.06 |
[Android] Fragment에서 데이터 외부로 전달시키는 방법 - Callback (0) | 2022.12.03 |