개발하는 두더지

[Android] compileSdkVersion, targetSdkVersion 등 SDK 버전 설정 이해하기 본문

Java,Android

[Android] compileSdkVersion, targetSdkVersion 등 SDK 버전 설정 이해하기

덜지 2017. 12. 8. 14:42

compileSdkVersion, targetSdkVersion 등 SDK 버전 설정 알아보기



개념은 어설프게 알아와서 이번 포스팅으로 정확하게 이해하기 위해 정리했습니다.

안드로이드는 상위호환성을 중요시하기때문에 compileSdkVersion, minSdkVersion, targetSdkVersion 라는 개념이 있습니다.



본문에 들어가기 앞서 상위호환, 하위호환에 대한 개념을 알아보겠습니다.

상위호환성

예전 버전이 최신 단말기에서 실행이 잘된다면 '상위 호환'

예를들면, 최신 단말기에서 핀치 투 줌(터치로 확대/축소)인 기능이 나왔을때 예전 버전을 실행해도 핀치 투 줌이 동작하면 상위호환이 된다는 말입니다.


하위호환성

이전 버전에서 만든 입력값을 처리할 수 있다면 '하위 호환'

이전 버전에서 만든 메소드를 다음 버전에 삭제안하고 그대로 가져간다는 말입니다.


일반사용자들이 최신 버전 OS가 나올 때마다 설치를하면 개발자들은 고민없이 최신 SDK로 개발을 하면 될테지만

최신 안드로이드 버전이 나오더라도 이전 버전을 그대로 사용하는 사람들이 많습니다.


https://developer.android.com/about/dashboards/index.html


포스팅 시점으로 Marshmallow(API LEVEL 23)는 30%이고 Nougat(API LEVEL 24)은 17.6% 입니다.

그러므로 최신버전에서만 돌아가는 앱을 만들면 사용자 수는 적어질 수 밖에 없습니다.

안드로이드는 대부분 최신 버전에서는 이전 버전을 지원하므로 하위호환성 있는 앱을 만들 수 있습니다.



compileSdkVersion

  • Gradle에 어떤 안드로이드 SDK 버전으로 앱을 컴파일 할 것인지 알려줍니다 . 즉, 지원할 수 있는 가장 높은 API 버전을 의미합니다.
    해당 SDK 버전에 포함된 API를 사용할 수 있다는 것을 의미합니다.

  • 컴파일시에만 적용되므로 런타임동안에는 영향을 미치지 않습니다.

  • 항상 최신 버전의 SDK로 지정하는 것이 좋습니다.

  • import문으로참조되는 클래스나 메소드를 찾을 때 어떤 버전의 SDK에서 찾을 것인가를 결정해줍니다.


minSdkVersion

  • minSdkVersion보다 낮은 API 버전 앱은 설치할 수 없습니다.

  • minSdkVersion보다 높은 API를 사용하면 lint에서 경고를 띄워 알려줍니다.

  • Support Library나 Google Play Service는 자체 minSdkVersion을 가지므로 이 중 가장 높은 버전으로 맞춰야 합니다.



targetSdkVersion 

  • minSdkVersion 이상에서 지원하는 어떤 기능을 사용하고자 위함입니다.

  • 실제 컴파일에는 관여하지 않음. 빌드시 버전을 낮추어도 원하는 클래스의 메소드를 컴파일 할 수 있습니다.

  • 지정한 버전까지 앱을 테스트 했음을 의미합니다. 기기가 Nougat(API 24)더라도 target이 Marshmellow(API 23)이라면 Marshmellow 단말기까지는 정상동작 됨을 의미하며 Nougat기기는 정상적으로 돌아갈지 확신할 수 없습니다. 상위호환되는 API로 개발을 했다면 아마 잘 돌아갈 것 입니다. 

  • 즉 targetSdkVersion이 달라야 앱의 행동 로직이 달라지므로, 안드로이드가 상위호환성을 제공할 수 있습니다.

  • Marshmellow(API 23)에서 도입된 런타임 퍼미션(runtime permission model)은 targetSdkVersion 을 API 23으로 지정해야 적용됩니다.

    compileSdkVersion을 25로하고 targetSdkVersion을 21로하면 Marshmellow 이상 단말기에서 런타임 퍼미션이 Marshmellow 이전처럼 강제 허용되어 있습니다. 허용을 해제하려고하면 이전 버전으로 빌드된 앱이라고 메시지가 출력됩니다.

  • targetSdkVersion이 22이라면 22이후 버전에서 지원되는 기능이 제외된 앱이 만들어지므로 런타임 퍼미션을 사용 못하는 것입니다.



세 종류의 SDK 버전의 관계

minSdkVersion <= targetSdkVersion <= compileSdkVersion




안정적인 앱을 원한다면

minSdkVersion <= targetSdkVersion == compileSdkVersion



Comments