Android API Level 및 버전 코드와 다양한 SDK 버전
1. Android API Level & Version Code
플랫폼 버전 | API Level | 출시일 | Version Code (Platform Name) |
Android 12 | 31 | Oct 4, 2021 | S (Snow Cone) |
Android 11 | 30 | Sep 8, 2020 | R (Red Velvet Cake) |
Android 10.0 | 29 | Sep 3, 2019 | Q (Quince Tart) |
Android 9 | 28 | Aug 6, 2018 | P (Pie) |
Android 8.1 | 27 | Dec 5, 2017 | O_MR1 (Oreo) |
Android 8.0 | 26 | Aug 21, 2017 | O (Oreo) |
Android 7.1 Android 7.1.1 Android 7.1.2 |
25 | Oct 4, 2016 | N_MR1 (Nougat) |
Android 7.0 | 24 | Aug 22, 2016 | N (Nougat) |
Android 6.0 Android 6.0.1 |
23 | Oct 2, 2015 | M (Marshmallow) |
Android 5.1 Android 5.1.1 |
22 | Mar 2, 2015 | LOLLIPOP_MR1 (Lollipop) |
Android 5.0 Android 5.0.1 Android 5.0.2 |
21 | Nov 4, 2014 | LOLLIPOP (Lollipop) |
Android 4.4W Android 4.4W.2 |
20 | June 25, 2014 | KITKAT_WATCH (Kitkat Wear) |
Android 4.4 | 19 | Oct 31, 2013 | KITKAT (Kitkat) |
Android 4.3 | 18 | July 24, 2013 | JELLY_BEAN_MR2 (Jelly Bean) |
Android 4.2 Android 4.2.2 |
17 | Nov 13, 2012 | JELLY_BEAN_MR1 (Jelly Bean) |
Android 4.1 Android 4.1.1 |
16 | July 9, 2012 | JELLY_BEAN (Jelly Bean) |
Android 4.0.3 Android 4.0.4 |
15 | Dec 16, 2011 | ICE_CREAM_SANDWICH_MR1 (IceCreamSandwich) |
Android 4.0 Android 4.0.1 Android 4.0.2 |
14 | Oct 18, 2011 | ICE_CREAM_SANDWICH (IceCreamSandwich) |
Android 3.2 | 13 | July 15, 2011 | HONEYCOMB_MR2 (Honeycomb) |
Android 3.1 | 12 | May 10, 2011 | HONEYCOMB_MR1 (Honeycomb) |
Android 3.0 | 11 | Feb 22, 2011 | HONEYCOMB (Honeycomb) |
아래와 같이 버전에 따른 처리가 가능하다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.xxx) {
// Version에 맞는 처리
}
2. API 버전 디바이스 점유율 (2021.11.05 기준)
3. 다양한 SDK Version
Android 어플리케이션은 일반적으로 Android 플랫폼의 가장 새로운 버전과 호환된다.
API 버전에 대한 거의 모든 변경사항은 이전 버전에서 추가된 것이므로 이후 버전 및 상위 API 레벨과 호환된다.
상위 호환성
이전 버전이 가장 최신 디바이스에서 실행이 잘 된다면 '상위 호환'이라고 한다. 예를 들어, 어떤 기능이 새롭게 나왔을 때 예전 버전을 실행해도 잘 작동한다면 상위 호환된다고 말한다.
하위 호환성
이전 버전에서 만든 것을 처리할 수 있다면 '하위 호환'이라고 한다. 예를 들어, 이전 버전에서 만든 Method를 다음 버전 혹은 최신 버전에서 사용 가능하다면 하위 호환된다고 말한다.
Android의 대부분 최신 버전에서는 이전 버전을 지원하기 때문에 하위 호환성 있는 어플리케이션을 만들 수 있다.
compileSdkVersion
어플리케이션 컴파일 시 사용되는 Android API Version을 의미한다. 즉, 실제 개발에 사용할 수 있는 Android API의 범위는 compileSdkVersion에 의해 결정된다. 일반적으로, 새로운 API Version이 배포될 때마다 compileSdkVersion의 값은 최신으로 유지하기를 권장하고 있다. 이는 targetSdkVersion을 변경하지 않는 한 실제 배포되는 어플리케이션에 대한 Side-Effect가 없기 때문이다.
예를 들어, 가장 최근에 발표된 Android 12 (API Level 31)에서는 Splash Screen을 쉽게 생성하는 API가 소개되었다. 이 기능을 사용하려면 Android Studio에 Android 12를 설치하고 compileSdkVersion을 31로 설정해야 한다. 만약, 이전 버전의 기기들에서 이 API를 사용하게 하려면 Splash Screen을 제공할 수 있는 대안을 마련해야 할 것이다.
이와 유사하게 몇몇 메소드가 deprecated 되어있는 경우에는 compile 시 warning을 만날 수도 있는데, compilesdkversion만 업데이트하는 경우 앱의 기능에는 영향을 미치지는 않고 새로운 API에 대한 접근만 할 수 있게 한다.
일반적으로 최신 API가 배포되면 compileSdkVersion을 먼저 올려 최신 API에 대한 대응이 완료된 후 targetSdkVersion을 올리게 된다. 또한, gradle에 buildToolVersion이 있는데, 정상적인 빌드를 수행하기 위해 compileSdkVersion을 올리면서 같이 최신 버전으로 맞춰주는 것을 권장하고 있다.
targetSdkVersion
어플리케이션이 디바이스에서 동작할 때 사용되는 Android API 버전을 의미한다. targetSdkVersion은 실제 어플리케이션 동작에 영향을 준다. 즉, 어플리케이션은 targetSdkVersion에 명시된 API 버전을 기준으로 동작하게 된다. 아래 세 가지 케이스로 분류할 수 있다.
Ex 1. 디바이스 OS Version (API 26) > targetSdkVersion (API 24)
디바이스는 API 버젼 26에서 제공하는 기능을 모두 사용할 수 있는 기기이다. 만약 어플리케이션의 targetSkVersion이 24일 경우, 이 디바이스는 API 26에서 제공하는 기능을 모두 사용할 수 있겠지만, 어플리케이션은 API 24를 기반으로 동작한다.
Ex 2. 디바이스 OS Version (API 26) == targetSdkVersion (API 26)
디바이스의 OS Version과 targetSdkVersion이 동일하기 때문에 어플리케이션은 API 26을 기반하여 정상적으로 동작한다.
Ex 3. 디바이스 OS Version (API 26) < targetSdkVersion (API 28)
targetSdkVersion이 디바이스 OS Version보다 높다 하여도 어플리케이션은 OS Version (API 26)을 기반으로 동작하게 된다.
minSdkVersion
어플리케이션이 지원할 수 있는 가장 낮은 API Version을 의미한다. Google Play에 어플리케이션 배포 시 사용자의 디바이스에 어플리케이션이 설치될 수 있는지를 결정하는 요소이다.
일반적인 SdkVersion의 관계
minSdkVersion <= targetSdkVersion <= compileSdkVerseion 을 따른다.
안정적인 어플리케이션 운영을 원한다면?
minSdkVersion <= targetSdkVersion == compileSdkVerseion을 따른다.
References
https://vagabond95.me/posts/android-api-version-manage/
https://duzi077.tistory.com/141