minSdkVersion은 설치 가능한 최하 버전, maxSdkVersion은 최대 버전을 가리키는 것 같다. 그럼, targetSdk는 주요 타겟으로 하는 sdk 버전인건가?
얼추 맞는 말이다.
확인해 보자.
Android API 10과 Android API 19 단말을 준비한 후에 테스트 해보자.그리고 안드로이드 앱의 <uses-sdk> 부분을 <uses-sdk minSdkVersion=”11″, maxSdkVersion=”18″> 와 같이 설정을 한 후에 테스트해보자. minSdkVersion=”11″이니 Android API가 v10 단말에는 아래와 같은 에러가 나면서 설치가 되지 않는다.
1562 KB/s (4547883 bytes in 2.842s) pkg: /data/local/tmp/example.apk Failure [INSTALL_FAILED_OLDER_SDK]
오호 역시~ 그럼 이번에는 위의 앱을 Android API가 v19인 단말에 설치해보자.설치가 된다?! 이상하다!!
1201 KB/s (4547889 bytes in 3.696s) pkg: /data/local/tmp/example.apk Success
minSdkVersion(Minimum required SDK)
앱에서 지원하는 최소 SDK 버전을 말한다. minSdkVersion을 확인하여, 이 숫자보다 낮은 버전의 안드로이드 프레임워크가 설치된 단말에는 설치되지 않는다. 앱 개발자에게는 (가능하다면) 많은 단말을 지원하는 것이 당연히 좋다. 그러기 위해서는 minSdkVersion을 낮게 써야 할 것이다. 하지만, 버전이 높은 SDK일 수록 더 안정적이고 좋은 기능을 제공하기 때문에, 낮은 버전을 지원하려 무리하기 보다는 자신이 서비스를 제공하고자 하는 단말군과 기능을 보고 결정하면 되겠다.
글을 쓰는 현재 API 10 (Ginger Bread 2.3.x)이상의 단말이 현재 98.9%이므로, API 10 이상의 단말만 지원한다면 (거의) 모든 안드로이드 버전을 지원한다고 생각해도 좋다. 이 수치는 구글에서 (매 달) 통계를 내고 있다.
주의할 점은, minSdkVersion 속성은 꼭 선언해야 한다. 선언하지 않은 경우, 구글 플레이 스토어에서 기본 값을 ‘1’로 판단한다. 그래서 지원하려 하지 않았던 단말(예를 들면, Android API 버전이 매우 낮은 단말)에서도 노출이 될 수 있다.
targetSdkVersion(Target SDK)
targetSdkVersion에는 개발자가 앱을 만들 때 테스트 해본 버전의 가장 높은 숫자를 일반적으로 적으라 한다. minSdkVersion과 maxSdkVersion은 단말에 설치될 때 영향을 미치는 속성이라면, targetSdkVersion은 앱이 실행될 때 영향을 미친다.
만약 단말의 안드로이드 버전이 target SDK과 같다면 이미 테스트가 완료되었으니, 호환성 검사를 할 필요가 없다고 프레임워크가 판단한다. 만약 안드로이드 프레임워크의 버전이 targetSdkVersion보다 높다면, 앱을 만든 개발자가 테스트할 당시 예상했던 대로 움직이도록 호환성(compatibility) 모드로 동작한다. (호환성 모드로 동작하는 예는 이 글을 참고하자.)
그럼 필요에 따라 TargetSdkVersion을 마음대로 적으면 되는 것 아닐까? 개발 시 최대한 최신 버전까지 테스트를 한 후에 가장 큰 값을 적는 것이 좋다. 처음에 말 했듯이 TargetSdkVersion은 앱의 실행에 영향을 미치고, 대부분 높을 수록 안전하다. 또한, 실행에 큰 영향을 미치는 기능 위주로 하위호환성이 보장되지 모든 기능에 보장되는 것은 아니다.
참고로, targetSdkVersion을 작성하지 않을 경우 minSdkVersion과 같은 값이라고 판단한다.
maxSdkVersion(Maximum required SDK)
이 값은 처음에 예상했던 대로 설치가능한 프레임워크의 최대 버전을 표기하는 기능을 위한 값이다(정확히는 값이었다). 하지만, 요즘 나오는 안드로이드 프레임워크는 하위호환성을 지원하므로, 표준 API를 사용해 만든 앱이라면 새 안드로이드 프레임워크 버전이 나와도 동작한다. 그래서 지금의 maxSdkVersion은 앱이 설치되는데 영향을 미치지 않는다.
한발 더 나가, Android 2.1 이후 버전부터는 프레임워크에서부터 maxSdkVersion을 확인하거나 강요하지 않는다. 사실, 사용자 입장에서는 단말의 안드로이드 버전이 곧 사용자가 실행할 수 있는 최대 버전이다. 그러므로, 구글 플레이 스토어에서는 사용자 단말의 버전만 체크한 후에 이를 믿고 설치 가능한 앱을 노출하도록 바뀌었다.
이 속성은 deprecated되었고 선언을 권장하지 않으며, 구글 플레이 스토어의 필터링에서도 더이상 사용되지 않는다.
결론
- targetSdkVersion은 가능한한 최신 버전으로 적자.
- minSdkVersion가 낮을 수록 하위 모델 지원에 대한 고민이 필요하다.
- minSdkVersion을 높일 수록 지원하는 모델이 적어진다.
참고
- http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
- http://stackoverflow.com/questions/2160048/forward-or-backward-compatibility-in-android
- http://www.quora.com/How-does-Android-Platform-guarantee-forward-compatibility
- http://www.phonesdevelopers.com/1743990/
- http://developer.android.com/google/play/filters.html
핑백: 하위호환성은 어떻게 지원하나? | Dog발자
핑백: 안드로이드의 상위 호환성 | Dog발자
감사합니다. 애매하게 기억하고 있었는데..
도움이 되었다니 기쁘네요.
minsdk버전을 가능한 최신버전으로하자는 결론은 유저수를 적게할 가능성이 있다는 얘기 같은데 제가 작성 글을 잘 못 이해한 걸까요??
minsdk를 높이면 그 sdk 미만의 OS가 설치된 사용자는 다운로드 받을 수 없거나 업데이트가 중단 됩니다. 이는 서비스 제작자 입장에서 쉽게 결정하기 어려운 문제지요. 이 때 구글에서 제공하는 안드로이드 배포 대시보드(https://developer.android.com/about/dashboards)를 많이 참고합니다.
핑백: 앱의 targetSdk 별 대표적인 차이점들 – Dog발자