본문 바로가기
안드로이드

[안드로이드] API 레벨 호환성 고려하기

by Bakhwee_Bug 2022. 7. 17.

https://bakwhee-bug.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1-%EA%B5%AC%EC%84%B1-%ED%8C%8C%EC%9D%BC-%EB%B6%84%EC%84%9D2-%EA%B7%B8%EB%9E%98%EB%93%A4-%EB%B9%8C%EB%93%9C-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC

이 글에서 살펴보았듯이, build.gradle 파일에 SDK 버전을 설정하는 

targetSdk와 minSdk가 존재한다.

 

 

minSdk 30
targetSdk 32

 

위와 같이 설정했다면

1. targetSdk에 설정한 32버전의 API로 앱을 개발한다는 것이다.

2. minSdk를 30으로 지정했으므로 이 앱은 30버전 기기부터 설치할 수 있다.

 

이 앱은 32버전의 API로 개발하지만 30버전의 기기에서도 오류가 발생하지 않고 동작해야한다.

 

따라서 앱을 개발할 때 minSdk 설정값보다 상위 버전에서 제공하는 API를 사용한다면

호환성을 고려해야한다.

 

만약 Notification이라는 클래스가 API 레벨 1에 추가되었다면

Notification클래스는 minSdk를 30으로 설정한 앱에서 API 레벨 호환성 문제가 발생하지 않는다.

 

 

그런데 Notification.Callstyle이라는 클래스는 API레벨이 31이다.

즉 31버전에서 추가된 클래스라는 의미이다.

 

Notification.Callstyle 클래스는 31버전 하위에서는 제공하지 않으므로 이 클래스를 사용해

앱을 개발하면 31버전 하위 기기에서 오류가 발생한다.

 

즉, 사용할 API가 추가된 상위 버전에서는 문제가 없지만 하위 버전에서는 오류가 발생한다.

이처럼 API 레벨 호환성 문제가 발생하는 클래스나 함수를 사용하면 안드로이드 스튜디오에서도

경고나 오류메세지를 표시한다.

 

이처럼 API 레벨 호환성에 문제가 있는 API를 사용할 때는

@기호로 시작하는 애너테이션을 추가해 오류를 해결할 수 있다.

@RequiresApi(Build.VERSION_CODES.S)
//API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부

 

API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부위에 @RequiresApi 에너테이션을 추가하면

안드로이드 스튜디오에서 오류가 발생하지 않는다.

@RequiresApi 에너테이션 대신에 @TargetApi 애너테이션을 이용해도 된다.

 

@TargetApi(Build.VERSION_CODES.S)
//API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부

 

그런데 API 호환성 애너테이션은 안드로이드 스튜디오에서 오류를 무시하는 설정일 뿐이며

앱이 실행될 때 API 레벨 호환성 문제를 막으려면 직접 코드로 처리해 줘야 한다.

 

if(Build.VERSION.SDK_INT >= Build.VERSION.S){
//API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부
}

Build.VERSION.SDK_INT는 앱이 실행되는 기기의 API 레벨이다.

위의 코드는 S 버전에서만 실행되게 해준다.

 

댓글