본문 바로가기

프로그래밍/Android

안드로이드 앱 등록시 필수 체크!! 안드로이드 마켓 필터링(Android Market Filtering)



안드로이드 마켓에서는 핸드폰의 특징에 맞게 검색할 때 앱을 필터링해서 보여줍니다.
그래서 분명 안드로이드 마켓에 앱을 올렸는데도,, 어떤 사람은 받을 수 있고, 어떤 사람은 받을 수 없는 거죠.

처음에는 이게 필터링 정책인지 모르고, 안드로이드 마켓의 버그인 줄 알았습니다.^^;;;;
그런데 검색을 해보니 안드로이드 마켓 필터링이란게 있더군요..ㅎ 
그래서 제가 아무것도 모르고 고생했던 과거를 회상하며, 저처럼 고생하실 다른 분들을 위해 이 글을 씁니다.



일단 이 필터링이 힘들었던게,, 앱을 만들 때에는 절대 알 수 없습니다.;; 이 앱이 어떤 디바이스에서 필터링 될지,,;;
에러도 아니고, 워닝(warning)도 안뜨고 그냥 당연한 정책일 뿐이죠..ㅎ 그래서 모르고 넘어가기 쉽습니다.

그런데 이게 apk 파일을 마켓에 올릴 때 뭔가 알려주더군요.. 마켓에서 말이죠.ㅎ
저는 별말 아닌줄 알고 그냥 넘겼었습니다...




마켓은 앱을 검색할 때 해당 핸드폰의 하드웨어와 소프트웨어 특성에 맞는 앱만을 보여줍니다. 

예를들어, 내가 가지고 있는 핸드폰이 가속도 센서를 지원하지 않는다고 가정해 보겠습니다.
하루는 친구가 하고 있는 "레이디 버그"라는 게임이 재미있어 보이길래 마켓에서 검색을 합니다. 그런데 한글, 영문을 통틀어 검색을 해도 도저히 해당 앱을 찾을 수가 없습니다. 
이러한 결과가 나오는 이유는 "레이디 버그"라는 게임은 가속도 센서가 지원되는 폰에서만 검색이 되도록 설정이 되어 있기 때문입니다. 

그렇다면 어디에서 어떻게 설정을 해야하는 걸까요? 바로 manifest파일입니다.
안드로이드 앱을 마켓에 올릴 정도까지 개발을 하신 경험이 있다면 manifest에 대해는 모를리 없다고 생각되므로 이 파일에 대한 설명은 제외하겠습니다.



이제 본격적으로 manifest의 어떤 앨리먼트를 신경써야하는지 알아보겠습니다.


1. <supports-screens>
이 엘리먼트는 어떤 스크린 사이즈를 지원하고 또 지원하지 않는지 명시해주는 부분입니다. 
안드로이드에서 스크린 사이즈는 large, normal, small 이렇게 3개로 나뉘고 디바이스마다 이 3개 중 하나의 스크린 사이즈를 가지게 되겠죠?
마켓은 더 큰 스크린 사이즈의 디바이스에서 더 작은 스크린 레이아웃이 잘 보일거라고 가정합니다. 그래서 large 사이즈의 핸드폰에서는 당연히 large 레이아웃을 지원하는 앱이 검색되고, 뿐만아니라 normal이나 small 레이아웃을 지원하는 앱도 검색이 됩니다.

만약 <supports-screens>속성을 manifest에서 사용하지 않는다면 어떻게 될까요? 마켓은 API의 레벨에 따라서 다르게 처리한다고 합니다.(manifest파일에 <uses-sdk android:minSdkVersion = "4"/>와 같이 삽입함으로써 API 레벨을 설정할 수 있습니다.)

  • 먼저, API 레벨 3에서는 <supports-screens>속성 자체가 정의되지 않았습니다. 그래서 마켓은 자동으로 이러한 레벨의 앱을 normal 사이즈 스크린이라고 보고, 검색시에 normal이나 large 스크린 디바이스에만 노출되도록 합니다. 만약 여러분이 manifest 파일에서 android:minSdkVersion을 3 이하로 해두셨다면, 마켓은 기본적으로 해당 앱을 small 스크린 디바이스에서는 검색되지 않도록 하겠죠. 이러한 앱을 small스크린 디바이스에서도 보이게 하고 싶으시다면, manifest파일의 <uses-sdk>android:minSdkVersion을 4 이상으로 설정하셔야 합니다.
  • 다음으로, API 레벨 4에서는 기본적으로 <supports-screens>의 모든 속성이 "true"로 되어 있습니다. 따라서 이러한 레벨의 앱은 마켓에서 기본적으로 모든 디바이스에 노출이 되겠죠. 즉, 하나도 필터링이 되지 않는 것입니다. 



2. <uses-configuration>
어떤 앱은 특정 하드웨어 기능을 요구할 수 있습니다. 이럴 경우에 마켓은 해당 기능을 가진 디바이스에서만 보이도록 해줍니다. 

  • 만약 개발자가 <uses-configuration android:reqFiveWayNav="true" /> 를 manifest에 추가한 앱을 마켓에 올렸다면,  five-way navigational control이 없는 디바이스에서 해당 앱을 검색해도 사용자는 그 앱을 찾을 수가 없습니다. 
  • 만약 <uses-configuration>을 사용하지 않는다면 필터링이 일어나지 않게되고, 모든 사용자가 해당 앱을 검색 결과로 볼 수 있습니다.


3. <uses-feature>
어떤 앱은 센서와 같이 디바이스의 특정 기능을 요구할 수도 있습니다. 이 기능은 Android 2.0(API 레벨 5)부터 적용됐습니다. 

<uses-feature>는 디바이스 특징과 관련된 것과 OpenGL-ES의 버전과 관련된 부분으로 나눌 수 있습니다.
먼저 디바이스의 특징과 관련된 부분을 살펴보겠습니다.
  • 만약 <uses-feature android:name="android.hardware.sensor.light" />를 manifest에 포함시켰다면, 마켓에서 검색할 때 light센서를 가지고 있는 디바이스만 해당 앱을 검색할 수 있을 겁니다.
  • <uses-feature> 를 사용하지 않는다면 모든 디바이스에서 검색에 노출됩니다.
다음으로 OpenGL-ES의 버전과 관련된 부분을 살펴보겠습니다.
  • 만약 여러개의 OpenGL-ES 버전을 지원하고 있어서 openGlEsVersion 속성을 여러번 사용했다면, 마켓에서는 사용한 버전 중 가장 높은 버전에 맞춰 검색 결과를 보여줄 것입니다.
  • 만약 openGlEsVersion 속성을 1.1로 지정한 앱이 있고, 사용자의 디바이스는 OpenGL-ES 2.0을 지원한다고 하겠습니다. 이럴 경우에 사용자가 마켓에서 해당 앱을 검색하면 당연히 필터링되지 않고 볼 수 있습니다.
  • manifest에 openGlEsVersion 속성을 지정하지 않으면, 해당 앱은 모든 유저에게 노출됩니다.
그런데 여기에서는 조금 주의해야할 부분이 있습니다! 
안드로이드의 센서같은 하드웨어적인 특징을 사용하는 앱은 manifest에 명시적으로 <uses-feature>를 적지 않아도 마켓에서 어떤 하드웨어 특징을 사용하는지 안다는 것입니다.
그래서 여러분의 앱이 모든 사용자에게 노출되게 하기 위해서는 이를 manifest에 명시할 필요가 있죠.

예를 들어 보겠습니다.
여러분의 앱이 빛 센서를 사용한다고 가정하겠습니다. 그런데 이 앱은 빛 센서가 없어도 동작하는데 큰 문제는 없습니다. 그래서 빛센서가 없는 디바이스에서도 사용할 수 있고, 그러한 사람들에게도 마켓에서 검색할 수 있도록 하고 싶습니다. 
이때 여러분은 manifest에 <uses-feature android:name="android.hardware.sensor.light" android:required="false"/>를 포함시켜야 합니다. 
만약에 이 부분을 쓰지 않거나 <uses-feature android:name="android.hardware.sensor.light" />라고만 쓴다면 빛 센서가 없는 장치에서는 마켓 검색이 안될 겁니다.




3. <uses-library>
특정 라이브러리를 사용하는 경우에 사용하는 엘리먼트입니다.
  • com.google.android.maps 라이브러리를 사용하는 앱이 있고, 어떤 사용자의 디바이스에는 com.google.android.maps가 없다고 하면, 이 사용자한테는 해당 앱이 마켓에서 검색되지 않을 것 입니다.
  • manifest에 <uses-library>엘리먼트를 포함시키지 않은 경우에는 모든 사용자들에게 해당 앱을 노출시킬 것입니다.
<uses-library>에 대한 안드로이드 문서



4. <uses-permission>
정확히 말하자면 안드로이드 마켓에서 <uses-permission> 엘리먼트에 대한 필터링은 하지 않습니다. 하지만 하드웨어적인 permission을 요구하는 경우에는 <uses-feature>에 명시하지 않은 부분이라 하더라도 필터링을 하게 됩니다.



5. <uses-sdk>
이 엘리먼트는 API 레벨이 얼마인가를 명시하는 부분입니다. 
  • manifest 파일에  <uses-sdk android:minSdkVersion="3">이라고 명시되어 있는 앱이 있고, 사용자의 디바이스는 API 레벨이 2라면 해당 유저는 그 앱을 마켓에서 검색할 수 없습니다.
  • manifest 파일에 minSdkVersion을 명시하지 않았고, 앱에서는 API 레벨 3을 라이브러리로 사용한 앱이 있다고 가정하겠습니다. API 레벨이 2인 사용자가 이 앱을 검색한다면 이 앱을 검색 결과로 볼 수 있습니다. 이렇게 되는 이유는  minSdkVersion을 명시하지 않은 경우에 마켓에서는 기본적으로  minSdkVersion에 1을 대입하게 됩니다. 그리고  minSdkVersion이 이라는 것은 모든 버전에 다 지원이 된다는 말이므로 모든 사용자가 다 볼 수 있는 겁니다. 하지만 이런 경우에는 조심해야겠죠. 사용자의 API 레벨이 앱의 API 레벨보다 낮기때문에 런타임시에 오류가 발생할 가능성이 있습니다.
<uses-sdk>에 대한 안드로이드 문서


이상 안드로이드 개발자 사이트에서 참고한 부분이구요.
저는 실제로 앱을 등록할 때 <uses-sdk>에 minSdkVersion을 명시하지 않으니까 등록이 안됐던 것 같은데,, 이 문서에는 명시하지 않아도 된다고 되어있군요.


어쨌든 이러한 필터링 규칙들을 잘 알고 manifest를 작성하시면 원하시는 사용자 층에게 보이는 앱을 제작하실 수 있을 겁니다.^^