개발을 진행하다 보면 사용자 단말의 안드로이드 버전에 따라 지원되는 기능과 지원되지 않는 기능이 있어 이를 버전별로 달리 처리해주어야 할 때가 있다. 이러한 경우를 대비하여 안드로이드 플랫폼 버전별 AP I레벨과 버전코드를 알아보고 버전별로 다른 동작을 수행하도록 하는 방법을 정리해 두고자 한다.
1. 안드로이드 플랫폼 버전별 API 레벨 및 버전코드 (2021.5)
플랫폼 버전 | 코드 명 | API 레벨 | 버전 코드 |
Android 11 | Android 11 | 30 | R |
Android 10.0 | Android 10 | 29 | Q |
Android 9 | Pie | 28 | P |
Android 8.1 | Oreo | 27 | O_MR1 |
Android 8.0 | Oreo | 26 | O |
Android 7.1.1 | Nougat | 25 | N_MR1 |
Android 7.1 |
Android 7.0 | Nougat | 24 | N |
Android 6.0 | Marshmallow | 23 | M |
Android 5.0 | Lollipop | 22 | LOLLIPOP_MR1 |
Android 5.0 | Lollipop | 21 | LOLLIPOP |
Android 4.4W | KitKat Wear | 20 | KITKAT_WATCH |
Android 4.4 | KitKat | 19 | KITKAT |
Android 4.3 | Jelly Bean | 18 | JELLY_BEAN_MR2 |
Android 4.2, 4.2.2 | Jelly Bean | 17 | JELLY_BEAN_MR1 |
Android 4.1, 4.1.1 | Jelly Bean | 16 | JELLY_BEAN |
Android 4.0.3, 4.0.4 | IceCreamSandwich | 15 | ICE_CREAM_SANDWICH_MR1 |
Android 4.0, 4.0.1, 4.0.2 | IceCreamSandwich | 14 | ICE_CREAM_SANDWICH |
Android 3.2 | Honeycomb | 13 | HONEYCOMB_MR2 |
Android 3.1.x | Honeycomb | 12 | HONEYCOMB_MR1 |
Android 3.0.x | Honeycomb | 11 | HONEYCOMB |
Android 2.3.4 | Gingerbread | 10 | GINGERBREAD_MR1 |
Android 2.3.3 |
Android 2.3.2 | Gingerbread | 9 | GINGERBREAD |
Android 2.3.1 |
Android 2.3 |
Android 2.2.x | Froyo | 8 | FROYO |
Android 2.1.x | Eclair | 7 | ECLAIR_MR1 |
Android 2.0.1 | Eclair | 6 | ECLAIR_0_1 |
Android 2.0 | Eclair | 5 | ECLAIR |
Android 1.6 | Donut | 4 | DONUT |
Android 1.5 | Cupcake | 3 | CUPCAKE |
Android 1.1 | Base | 2 | BASE_1_1 |
Android 1.0 | Base | 1 | BASE |
2. 버전코드별 다른 동작 수행 방법
1) 조건문을 통한 처리 방법
① API레벨 숫자를 쓰는 방법
if (Build.VERSION.SDK_INT >= 26) {
// 처리해야 할 코드
}
② 버전 코드를 쓰는 방법
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 처리해야 할 코드
}
이렇게 조건을 주어 처리를 하면 minSdkVersion을 낮게 잡을 수 있고, 하위 안드로이드 버전을 쓰는 사용자들에게도 앱을 배포할 수 있다.
2) @TargetApi(version)
Lint에러를 발생시키지 않는 역할만 한다. 예를 들어 minSdkVersion에 21을 설정하고 이보다 높은 API Level 26에 선언된 API를 사용할 경우 'requires API level 26(current min is 21)' 와 같은 Lint에러가 발생하는데 아래와 같이 TargetApi annotation을 선언해주면 Lint에러는 발생하지 않는다. 따라서 버전에 상관없이 호출 및 동작은 되지만, 버전에 따라 문제가 발생하는 API가 있다면 '1. 조건문을 통한 처리 방법'을 통하여 에러를 방지해야 한다.
@TargetApi(Build.VERSION_CODES.O)
public void Func(String text, int term) {
....
}
3) @RequireApi(version)
minSdkVersion에 지정한 버전보다 낮은데 바로 호출할 경우 컴파일 에러가 발생하도록 호출조건을 강제하는 역할을 한다.
@RequiresApi(Build.VERSION_CODES.O)
private void Func() {
...
}
위와 같이 RequireApi annotation이 선언되어 있다면 아래와 같이 조건을 주고 호출해야 컴파일 에러가 발생하지 않는다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Func();
}