build.gradle 파일을 설명하면서 SDK 버전을 설정하는 targetSdk
와 minSdk
에 관해 살펴봤다. 두 항목에 설정하는 값은 API 레벨을 의미하며 앱 개발에 큰 영향을 주는 중요한 정보이다.
- API 레벨 설정
minSdk 21
targetSdk 31
만약 위와 같이 설정했다면 targetSdk
에 설정한 31 버전의 API로 앱을 개발한다는 의미이다. 그런데 minSdk
를 21로 지정했으므로 이 앱은 21 버전 (안드로이드 5.0 롤리팝) 기기부터 설치할 수 있다. 결국 이 앱은 31 버전의 API로 개발하지만 21 버전 기기에서도 오류가 발생하지 않고 동작해야 한다.
따라서 앱을 개발할 때 minSdk
설정값보다 상위 버전에서 제공하는 API를 사용한다면 호환성(compatibility)를 고려해야 한다. 예를 들어 안드로이드 API 문서 에서 Notification 이라는 클래스를 찾으면 밑 그림처럼 소개하고 있다.
클래스 이름 위에 'Added in API level 1'이라고 표시된 정보는 이 클래스가 API 레벨 1에 추가되었다는 것을 나타낸다. 따라서 Notification
클래스는 minSdk
를 21로 설정한 앱에서 API 레벨 호환성 문제가 발생하지 않는다.
그런데 Notification.CallStyle
이라는 클래스는 API 레벨이 31이다. 즉, 31 버전에서 추가된 클래스
Notification.CallStyle
클래스는 31 버전 하위에서는 제공하지 않으므로 이 클래스를 사용해 입을 개발하면 31 버전 하위 기기에서는 오류가 발생한다.
즉, 사용할 API가 추가된 상위 버전에서는 문제가 없지만 하위 버전에서는 오류가 발생한다. 이처럼 API 레벨 호환성 문제가 발생하는 클래스나 함수를 사용하면 안드로이드 스튜디오에서 경고나 오류 메시지를 표시한다.
메시지를 보면 앱의 minSdk
가 21로 지정되었으므로 Notification.CallStyle
클래스를 사용하면 문제가 발생한다는 의미다. 이처럼 API 레벨 호환성에 문제가 있는 API를 사용할 때는 @
기호로 시작하는 애너테이션(annotation)을 추가해 오류를 해결할 수 있다.
-API 호환성 애너테이션 1
@RequiresApi(Build.VERSION_CODES.S) fun noti(){ (...생략...) val builder : Notification.Builder = Notification.Builder(this, "1") .setStyle(Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent) ) (...생략...) }
@RequiresApi
애너테이션 또는 @TargetApi
애너테이션을, API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부 위에 추가하면 오류가 발생하지 않는다.
-API 호환성 애너테이션 2
@TargetApi(Build.VERSION_CODES.S) fun noti(){ (...생략...) val builder : Notification.Builder = Notification.Builder(this, "1") .setStyle(Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent) ) (...생략...) }