테스트 앱을 Galaxy Tab상에 올려보니 아래와 같이 귀엽게(?) 보여지고 있었습니다.






간단하게 아래와 코드(Line 5)와 같이 패니페스트 파일에  "android:minSdkVersion" 속성을 부여하여 해결했습니다.(아래 그림 참고)

     
          
           ................     
          
     
 





[테스트 1] minSdkVersion값을 3과 4를 부여해보니....
'3'인 경우 화면이 작게 나오고, '4'이상을 적용하면 정상적으로 출력됩니다.

안드로이드 1.6(API  Lv.4)부터, 다양한 스크린 사이즈 및 해상도를 지원하기 시작했습니다. (Galaxy Tab의 해상도는 600x1024입니다.) 때문에, "android:minSdkVersion" 속성을 '4' 이상으로 부여해야만 Galaxy Tab 화면에 맞게 보여집니다.

자세한 내용은 아래 링크에서 "Range of screens supported" 항목을 참고하시면 됩니다.

이 속성의 의미를 정확히 알기 위해 "uses-sdk" 속성에 대해서 좀 더 알아봤습니다.

아래는 버전과 관련된 속성들에 대한 구글개발자 페이지를 해석한 내용입니다.

android:minSdkVersion
플랫폼 버전에 따라 별도로 부여된 정수(Integer)값이다. 만약, 내가 만든 App에서 지정한 minimum SDK Level값보다 사용자의 시스템의 API Level이 낮은 경우, 사용자는 안드로이드 시스템에 의해 설치가 거부당한다.
앱을 실행하는데 요구되는 최소한의 API Level을 지정할 수 있다. API Level값은 SDK 또는 안드로이드 플랫폼버전이 아니다. 
minSdkVersion의 Default 값은 '1'입니다. 즉, 따로 지정하지 않으면 시스템은 개발한 App을 API Level을 '1'로 간주하고, 이는 안드로이드의 모든 버전에 호환된다는 의미가 됩니다. 여기서 문제가 발생할 수 있습니다. 예를 들면 API Level 7에서 최초로 소개된 API들을 사용하고 minSdkVersion 속성을 지정하지 않았을 경우입니다. 이 App을 다운받은 사용자의 시스템은 Level 7 미만이라면, 설치는 성공할 수 있으나 Run-time시 허용되지않은 API에 접근할 때 죽거나 하는 문제가 발생합니다. 이러한 이유로 안드로이드에서는 minSdkVersion 속성값은 반드시 설정하도록 권고하고 있습니다.

android:targetSdkVersion
targetSdkVersion은 API Level 4부터 추가된 속성입니다.
이 속성을 설정하면 설정한 버전에서 minSdkVersion에서 설정한 버전까지 구동이 가능하다는 것을 의미하며, 설정한 버전에서 충분히 테스트가 되었다는 의미를 갖게 됩니다.

이 설정을 사용하면, 타겟 버전에서 요구되지 않고 포워드 호환성을 유지하기 위해 활성화되는 셋팅들은 안드로이드 플랫폼에 의해서 비활성화된다. 또한, 타겟 버전 이전에서 불가능 했던 새로운 기능은 활성화된다.
결국, 타겟 버전에서 충분한 테스트를 완료했고 더불어 포워드 호환성을 위한 어떠한 추가 작업을 수행해서는 안된다는 내용을 플랫폼에 통지하는 것이다.

minSdkVersion에서 설정한 레벨에 따라 제한된 것들을 무시하고, 타겟 API Level에서 정의한 manifest요소 또는 행위를 허용하게 된다.

android:maxSdkVersion
Api Level 4부터 추가된 속성이다.
안드로이드 1.5부터 2.0.1에서는 시스템 업데이트 후, App들의 유효성 재검사를 할 때 이 값을 체크한다. 시스템은 App에 설정된 maxSdkVersion 값이 시스템의 API Level값 보다 낮으면 어떠한 경우에도 설치를 허가하지 않는다. 유효성 재검사 이후에는 사용자의 단말기에서 이 App을 삭제한다.

실제 발생할 수 있는 상황을 쉽게 설명해 보자.
maxSdkVersion 값을 5로 설정한 App이 안드로이드 마켓에 등록이 되었다. Android 1.6(Lv.4)기반의 단말기 유저는 얼마 후 Android 2.0 (Lv.5)이 출시되었다는 사실을 알고 단말기를 업데이트 했다. 업데이트가 완료되자 시스템은 maxSdkVersion 값이 5였던 App에 대해 유효성 검사를 문제없이 진행한다. 이 App은 기존과 같이 문제없이 동작한다. 그러나, 얼마 후  Android 2.0.1(Lv. 6)이 공개되었고 사용자는 다시 업데이트를 한다. 여기서 문제가 발생했다. maxSdkVersion 값이 5인 App은 시스템의 API버전이 Lv.6가 되어서 업데이트 후 유효성 검사에 통과할 수 없었다. 시스템은 이 App의 설치를 허가하지 않았으며 사용자 단말기에서 삭제를 했다.

[경고]
이 속성을 부여하는 것은 권장하지 않는다. 이유는 첫째, 새로운 버전에서 우리가 만든 App의 설치를 막을 이유가 없다는 것이다. 새로운 안드로이드 플랫폼은 백워드-호환성을 100% 보장한다. 즉, 표준 API를 사용했다면 분명히 새로운 플랫폼에서 잘 동작할 것이다.
두 번째, 이 속성을 사용하면 플랫폼 업데이트 이후, 통과하지 못한 App이 사용자의 단말기에서 삭제되기 때문이다. 우리의 APp이 설치된 대부분의 단말기의 플랫폼은 지속적으로 업데이트 될 것이다. 이 속성을 부여하기 전에 사용자가 받을 영향을 반드시 고려해야 한다.


안드로이드 2.0.1 이후의 버전부터는 maxSdkVersion를 체크하지 않을 예정이다. 하지만, 안드로이드 마켓에서는 사용자에게 다운로드 가능한 App들을 소개할 때 필터링 기능으로 사용할 것이다.


[테스트 2] android:minSdkVersion="9"을 부여하면...?
 Lv.8인  Galaxy Tab에는 설치 또는 디버깅이 불가능합니다. 이클립스에서 보여준 에러 메시지는 다음과 같습니다.

ERROR: Application requires API version 9. Device API version is 8 (Android 2.2).
Launch canceled!

[테스트 3] android:maxSdkVersion="5" 를 부여하면?
 Lv.8인 Galaxy Tab에서 설치하는데 문제가 없었습니다. 위의 해석문 마지막의 말대로 Android 2.0.1 이후 버전에는 이 속성에 따른 강제 내용이 사라진 것으로 판단됩니다. Android 1.6 버전 단말기가 없으니 정확한 테스트는 안했습니다. 귀찮기도 하고 별 중요한 내용이 아니네요.

[테스트 4] android:minSdkVersion="9" , android:targetSdkVersion="7"을 부여하면?
Lv8인 Galaxy Tab에서 테스트 2번과 같은 결과를 볼 수 있었습니다. 타겟 버전을 부여해도, minimum API Version값에 부합되지 않으면 설치가 거부되네요. (타겟 버전에 대한 정확한 의미는 좀 더 알아봐야겠네요. 쉽게 설명해 놓은 내용 없나요...? ^^)


잘못된 내용은 지적해주시면 감사하겠습니다. ^^



Posted by 데브로망스

댓글을 달아 주세요