Android 버전과 버전별 코드실행

Heathcliff·2022년 8월 8일
0

Android SDK 버전

목록 보기
1/2
post-custom-banner

Android 버전

안드로이드의 OS의 일반적인 버전의 표현방식은 아래의 세가지로 표현한다.

  • 버전
  • 코드명
  • API Level

버전은 말 그대로 숫자를 사용해 버전을 표시하는 방법이다.
정식 버전 1.0을 시작으로 포스팅을 하는 현재 기준 Android 12.0 버전까지 출시가 되었다.

코드명(별칭)은 알파벳 A부터 순서대로 표현하는 방법이다.
그리고 디저트명에서 영감을 받아 알파벳 순으로 시작하는 디저트명을 코드명의 별칭으로 사용한다.

(축약형으로 앞자리 알파벳만 표현 10버전 이후로는 알파벳만 사용)
(L)ollipop, (M)arshmallow, (N)ugat, (O)reo.. 등

10.0 이전까지는 1.0을 제외한 버전별 코드명이 전부 캔디나 과자 등 디저트명을 코드명으로 사용했지만 10.0에서는 Q로 시작하는 디저트 이름을 OS 네이밍에 사용하지 않게 되었고, 버전 10.0은 안드로이드 10이라고 공식적으로 명명되었다. 앞으로 구글은 차후의 버전들도 숫자를 이용하여 네이밍을 하기로 하였다.

API Level은 안드로이드 버전이 업데이트 될 때마다 그 버전에 맞는 API버전을 고유하게 식별할 수 있는 정수값이다.

안드로이드 버전은 다양한 major, minor, patch 등을 포함 버전이 올라갈때마다 정수값 1씩 증가하여 버전별 구분이 가능하도록 고유 정수값을 갖게된다.

에를 들자면

  • Android 7.0은 24 API / N / Nugat
  • Android 7.1은 25 API / N_MR1 / Nugat
  • Android 8.0은 26 API / O / Oreo
  • Android 12.0은 31 API / S / 해당없음

아래의 AndroidDeveloper 사이트에서 SDK 버전별 Android API정보를 확인할 수 있다.

Developer Android SDK버전

Android SDK 버전별로 코드분기를 해야하는 이유

Android 버전별로 코드를 분기 해야하는 이유는 해당 버전마다 지원되는 기능이나 필요한 권한들이 다르기 때문이다.

쉽게 생각하면 현재 최신버전이 Android 12 인데 14버전에서 새로운 기능이 나왔다. 상식적으로 Android 12에서는 14의 새로운 기능을 사용할 수 없기에 14에서만 해당 기능을 사용할 수 있도록 코드분기를 해서 제한을 둬야한다.


// 가상의 Android 14 버전의 API Level이 40이라고 가정
if (Build.VERSION.SDK_INT >= 40) {

    // 새로운 기능 사용가능

} else {

	// 새로운 기능 사용 불가
}

기능 제한과 별개로 같은 기능이라도 버전에 따라 기능을 사용하기 위한 퍼미션이 다를 경우 코드로 분기를 해야한다.

아래 코드는 블루투스 스캐너를 사용하기 전에 기기에 버전별로 BLE Scan관련 권한이 설정되었는지 확인하는 코드이다.


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

	checkBlueToothPermissions()

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

	checkLocationPermissions()

} else {

	scanBLE()
}

위 조건문을 순서대로 정리하여 BLE 스캔 시 필요한 버전별 퍼미션 확인해보자.

  • API 31(S) 이상 - Bluetooth 관련 런타임 퍼미션 체크
    • android.permission.BLUETOOTH_CONNECT
    • android.permission.BLUETOOTH_SCAN

  • API 31(S) 미만 23(M)이상 - 위치 관련 런타임 퍼미션 체크
    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_COARSE_LOCATION

  • 23(M) 미만 - 유명한 Marshmellow '미만' 에서는 런타임 퍼미션 체크할 필요 없이 AndroidManifest에 permission 정의만 해도 기능 사용가능

위와 같이 버전별로 필요한 퍼미션 및 체크여부도 다르기 때문에 SDK버전별 코드분기가 필요하다.

@TargetApi, @RequiresApi 사용

두 어노테이션을 사용하는 경우는 minSdkVersion(최소 SDK 버전)보다 높은 레벨의 API기능을 사용하려는 경우로 가정한다.

ex) minSDKVersion은 23이지만 사용하려는 API는 31(S)

@TargetApi

	@TargetApi(Build.VERSION_CODES.S)
    fun checkBLEPermission() {
    	...
    }
  • Lint 에러가 발생하지 않음 (minSdkVersion 보다 높은 version의 API 사용 시 Lint에러 발생)
  • 컴파일 및 빌드에 영향이 없지만 명시한 API 레벨보다 낮은 기기에서 실행 시 런타임에러 발생

@RequiresApi

	@RequiresApi(Build.VERSION_CODES.S)
    fun checkBLEPermission() {
    	...
    }
  • 해당 어노테이션이 있는 메소드 호출 시 최소 API 버전 보다 해당 API 버전이 높다는 경고(Warning) 가 표시되지만 컴파일 및 빌드는 중단되지 않는다.
  • 즉 주어진 API 레벨 이상에서만 호출되어야 함을 알리는 역할을 한다.



profile
Android Developer
post-custom-banner

0개의 댓글