![](https://t1.daumcdn.net/cfile/tistory/99F8FA355BCA01B133)
안녕하세요. Simple& Happy Dev입니다.
Google Play에 있는 앱이 자신의 폰에서는 검색이 되는데, 다른 사람 폰에서는 검색되지 않는 경우가 있습니다.
드물지만 같은 종류 폰임에도 이런 경우가 있습니다.
이 글에서는 이런 현상이 발생하는 이유에 대해서 설명해 드리며 앱 개발자분들을 위한 솔루션을 제시하고자 합니다.
앱 개발해서 Google Play에 등록하시려고 하는 분들은 꼭 알고 계셔야 하는 내용입니다.
만약 내 폰에 나침반 센서(Compass sensor)가 있는데, 이것을 이용해서 응용 앱을 개발하였고, 이것을 다른 사람과 공유를 하기 위해서 Google Play에 등록했습니다. 등록된 것도 확인하였고, 다른 사람 폰에서도 검색이 되고 다운로드도 가능합니다.
그런데, 아무런 문제가 없을까요?
같은 폰을 가지고 있는 경우에게는 문제가 없을 것입니다. 나침반 센서가 있는 다른 폰에서도 문제가 없을 것입니다.
하지만, 나침반 센서가 없는 폰은 어떨까요? 아마 동작을 하지 않거나, 오류가 발생할 수도 있습니다.
그러면, 어떻게 하면 될까요?
네, 나침반 센서가 있는 사람들만 다운받을 수 있게 하면 되는 겁니다. Google Play에서 나침반 센서를 가진 폰에 나침반 센서 기능이 있는 앱을 매칭시켜주면 되는 것이죠.
정리하면 앱 매칭을 위해서 단말기 회사와 앱 개발자는 아래와 같이 해주면 됩니다.
- 단말기 회사: 해당 폰이 가진 기능(Feature)을 Google Play에 알려준다.
- 앱개발자: 해당 앱에 사용할 기능(Feature)를 Google Play에 알려준다.
Google Play에서 앱을 필터링할 수 있게 앱의 매니페스트 화일(AndroidManifest.xml)에 몇 가지 element가 존재합니다.
<uses-feature>, <uses-configuration>, <uses-sdk>, <uses-library>, <supports-screens> 등이 여기에 해당됩니다.
그럼, 위에 언급한 나침반 센서의 경우 아래와 같이 넣어주면 나침반 센서가 없는 폰에는 더 이상 검색되지 않고, 있는 폰에서만 검색됩니다.
<uses-feature android:name="android.hardware.sensor.compass" />
그러면, 특정 기기에서 검색되지 않는 이유는 앱과 단말기 간의 매칭이 되지 않았기 때문입니다.
드물지만 같은 폰인데, 검색되지 않는 경우는 어떤 경우일까요?
이런 현상이 발생한 가능성이 높은 것은 같은 폰인데 안드로이드 버전이 틀릴 경우입니다.
A폰은 안드로이드 5.0이고, B폰은 OS 업그레이드를 해서 안드로이드 6.0이라고 하면 아래와 같이 앱의 element가 추가된 경우에 이런 현상이 발생할 수 있습니다. 아래 API 레벨 23을 실행할 수 있는 최소 레벨로 정했기 때문에 API 레벨 21인 A폰에서는 검색이 되지 않습니다.
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="23" />
앱의 기능을 지원하지 않는 폰에서 검색되지 않는 것은 당연합니다.
하지만, 위에 있는 sdk 경우처럼 특별한 사유가 없이 필터링하는 경우에 기능을 지원함에도 검색되지 않습니다.
문제가 되는 기능이 앱 일부에 해당하는 경우에 조건에 따른 기능 동작 설정 및 UI 변경작업을 하는 것도 한가지 방법입니다.
만약 조깅앱을 만들었는데, 주기능이 걸음 카운터랑 GPS로 이동한 궤적을 보여주는 것이고, 보조 기능으로 이동한 방위를 표시해주는 것이라고 하면 나침반 센서가 없는 폰에서는 보조 기능이 나오지 않도록 UI 변경을 해주면 되는 것입니다.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
detachCompass();
}
그리고, 아래와 같이 해주면 나침반 센서가 없는 폰에서도 검색이 됩니다.
<uses-feature android:name="android.hardware.sensor.compass" android:required="false" />
여기서 질문이 나올 수 있는 게 "이렇게 feature 여부를 앱에서 처리하는 거라면 위에 android:required="false"를 하지 않고, 위의 <uses-feature> element를 삭제해도 되지 않는가?"라는 것인데요.
맞습니다. 이럴 경우에는 삭제해도 무방합니다.
하지만, Permission이 필요한 feature는 삭제할 경우(예: 카메라)에 검색에서 나오지 않아서 꼭 명시를 해줘야 합니다.
위의 나침반 센서의 경우 Permission이 필요하지 않기 때문에 저렇게 하더라도 검색되어서 나옵니다.
필터링 element를 많이 사용하게 되면 앱이 요구하는 기능과 그것을 지원하는 폰의 매칭이 더 잘 맞게 될 겁니다.
내가 만든 앱의 화면이 원하는 모양대로 보이는 폰에서만 검색되게 하려고 <supports-screens>를 사용하거나 <compatible-screens>를 사용할 수도 있습니다.
아이폰과 달리 안드로이드 폰은 여러 해상도 및 화면크기에 따른 화면비율이 차이가 나고 이를 고려한 해상도별 이미지 추가 및 Layout 처리를 해줘야 합니다.
이로 인하여 UI 구성상 저해상도는 힘들 것 같다고 생각되면, 저해상도를 가진 단말에서는 검색 안 되게 필터링하면 됩니다.
<supports-screens
android:smallScreens="false"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
주의하셔야 할 것은 매칭을 위해서 필터링 element를 여러 개 사용하다보면 특정 기기에서 검색이 되지 않는 경우가 발생합니다. 특히, screen 관련한 element를 잘못하게 되면 기능을 지원하는데도 검색이 안 되는 경우가 있으니 주의가 필요합니다.
특정 기기에서 검색되지 않는 것을 해결하는 방법은 지원하지 않는 폰을 PC에 연결 후 아래와 같은 명령을 실행해 봅니다.
adb shell dumpsys package f > features.txt
adb shell dumpsys package l > libraries.txt
그러면, 그 폰에서 지원하는 Feature와 Library 목록이 나옵니다. 아래는 가지고 있는 폰에서 위의 명령을 실행한 결과입니다.
Features:
android.hardware.sensor.proximity
com.samsung.android.sdk.camera.processor
com.sec.feature.motionrecognition_service
android.hardware.sensor.accelerometer
android.hardware.faketouch
com.samsung.feature.virtualscreen
android.hardware.usb.accessory
android.software.backup
android.hardware.touchscreen
android.hardware.touchscreen.multitouch
android.software.print
com.samsung.feature.device_category_phone_low_end
android.software.voice_recognizers
android.hardware.fingerprint
com.samsung.android.knox.knoxsdk
com.sec.feature.slocation version=3
com.samsung.android.sdk.camera.processor.haze
android.hardware.opengles.aep
com.sec.feature.fingerprint_manager_service
com.sec.feature.overlaymagnifier
android.hardware.bluetooth
android.hardware.camera.autofocus
android.hardware.telephony.gsm
android.software.sip.voip
com.samsung.feature.samsung_experience_mobile
android.hardware.usb.host
android.hardware.audio.output
android.software.verified_boot
android.hardware.camera.flash
android.hardware.camera.front
android.hardware.screen.portrait
android.hardware.nfc
com.sec.android.mdm
android.software.home_screen
com.samsung.android.sdk.camera.processor.panorama
android.hardware.microphone
com.samsung.android.sdk.camera.processor.effect
android.software.vr.mode
android.hardware.bluetooth_le
android.hardware.touchscreen.multitouch.jazzhand
android.software.app_widgets
android.software.input_methods
android.hardware.vulkan.version version=4194307
android.software.device_admin
android.hardware.camera
android.hardware.screen.landscape
com.samsung.android.authfw
com.samsung.android.api.version.2402
com.samsung.android.api.version.2403
com.sec.feature.cover
com.sec.feature.findo
android.software.managed_users
android.software.webview
android.hardware.camera.any
com.samsung.android.sdk.camera.processor.dof
com.samsung.android.sdk.camera.processor.gif
com.samsung.android.sdk.camera.processor.hdr
com.samsung.android.sdk.camera.processor.lls
android.software.connectionservice
android.hardware.touchscreen.multitouch.distinct
android.hardware.location.network
com.sec.android.secimaging
android.software.sip
android.hardware.wifi.direct
android.software.live_wallpaper
android.software.freeform_window_management
android.hardware.nfc.hcef
android.hardware.location.gps
com.sec.feature.fingerprint_ui version=3
android.software.midi
android.hardware.nfc.hce
android.hardware.wifi
android.hardware.location
android.hardware.vulkan.level version=1
android.hardware.telephony
Libraries:
smatlib -> (jar) /system/framework/smatlib.jar
sec_platform_library -> (jar) /system/framework/sec_platform_library.jar
com.samsung.device -> (jar) /system/framework/com.samsung.device.jar
SemAudioThumbnail -> (jar) /system/framework/SemAudioThumbnail.jar
com.sec.esecomm -> (jar) /system/framework/esecomm.jar
com.sec.android.mdm.gearpolicymanager -> (jar) /system/framework/sagearpolicymanager.jar
vsimmanager -> (jar) /system/framework/vsimmanager.jar
sechardware -> (jar) /system/framework/sechardware.jar
com.google.android.media.effects -> (jar) /system/framework/com.google.android.media.effects.jar
com.samsung.android.knox.knoxsdk -> (jar) /system/framework/knoxsdk.jar
com.sec.android.app.multiwindow -> (jar) /system/framework/com.sec.android.app.multiwindow.jar
seccamera -> (jar) /system/framework/seccamera.jar
com.gsma.services.nfc -> (jar) /system/framework/com.gsma.services.nfc.jar
secdmb -> (jar) /system/framework/secdmb.jar
semcamera -> (jar) /system/framework/semcamera.jar
com.samsung.bbc -> (jar) /system/framework/com.samsung.bbccommon.jar
touchwiz -> (jar) /system/framework/touchwiz.jar
com.android.location.provider -> (jar) /system/framework/com.android.location.provider.jar
secimaging -> (jar) /system/framework/secimaging.jar
secvision -> (jar) /system/framework/secvision.jar
semextendedformat -> (jar) /system/framework/semextendedformat.jar
sec_feature -> (jar) /system/framework/sec_feature.jar
com.sec.android.mdm -> (jar) /system/framework/sec_edm.jar
com.samsung.android.nfc.mpos -> (jar) /system/framework/com.samsung.android.nfc.mpos.jar
com.android.future.usb.accessory -> (jar) /system/framework/com.android.future.usb.accessory.jar
sws -> (jar) /system/framework/sws.jar
saiv -> (jar) /system/framework/saiv.jar
android.ext.shared -> (apk) com.google.android.ext.shared
javax.obex -> (jar) /system/framework/javax.obex.jar
secmediarecorder -> (jar) /system/framework/secmediarecorder.jar
com.google.android.gms -> (apk) com.google.android.gms
android.ext.services -> (apk) com.google.android.ext.services
simageis -> (jar) /system/framework/simageis.jar
seclvbmanager -> (jar) /system/framework/seclvbmanager.jar
com.sec.android.app.minimode -> (jar) /system/framework/com.sec.android.app.minimode.jar
device_api -> (jar) /system/framework/device_api.jar
imsmanager -> (jar) /system/framework/imsmanager.jar
scamera_sdk_util -> (jar) /system/framework/scamera_sdk_util.jar
com.publicnfc -> (jar) /system/framework/com.publicnfc.jar
com.dsi.ant.antradio_library -> (jar) /system/framework/com.dsi.ant.antradio_library.jar
svemanager -> (jar) /system/framework/svemanager.jar
org.simalliance.openmobileapi -> (jar) /system/framework/org.simalliance.openmobileapi.jar
android.test.runner -> (jar) /system/framework/android.test.runner.jar
sercsapi -> (jar) /system/framework/sercsapi.jar
com.google.android.maps -> (jar) /system/framework/com.google.android.maps.jar
com.sec.android.visualeffect -> (jar) /system/framework/com.sec.android.visualeffect.jar
com.broadcom.nfc -> (jar) /system/framework/com.broadcom.nfc.jar
org.apache.http.legacy -> (jar) /system/framework/org.apache.http.legacy.jar
com.android.nfc_extras -> (jar) /system/framework/com.android.nfc_extras.jar
com.android.media.remotedisplay -> (jar) /system/framework/com.android.media.remotedisplay.jar
allshare -> (jar) /system/framework/allshare.jar
com.sec.smartcard.auth -> (jar) /system/framework/secsmartcard.jar
secimshttpclient -> (jar) /system/framework/secimshttpclient.jar
com.android.mediadrm.signer -> (jar) /system/framework/com.android.mediadrm.signer.jar
libvtmanagerjar -> (jar) /system/framework/libvtmanagerjar.jar
rcsopenapi -> (jar) /system/framework/rcsopenapi.jar
Feature의 경우 android로 시작하는 것을 확인하시면 되고, Library의 경우 폰 내부적으로만 사용하는 것도 포함되어 있습니다.
앱에서 필터링한 기능이 위의 목록에 존재하는지 확인 후 해당 element를 제거 또는 수정을 해주시면 됩니다.
위에 해당하지 않는 경우에는 screen 관련한 element의 영향일 가능성이 큽니다.
특별한 경우가 아니면 compatible-screens는 사용하지 말고, supports-screens의 경우 requiresSmallestWidthDp, compatibleWidthLimitDp, largestWidthLimitDp 속성 사용 시 필터링되어서 검색되지 않는 경우가 있으니 제외하고 확인해보시길 바랍니다.
앱이 검색되지 않는 폰을 구하기 어려우면 "Google Play Console - 출시 관리 - 기기 카탈로그"에 들어가서 해당하는 기기를 찾아서 Feature와 Library를 확인할 수 있지만, 실제 기기에서 확인하는 것을 권장해 드립니다.
참고로 Google Play Console에서 폰과 앱이 매칭되지만, 검색되지 않고 제외하도록 만들 수도 있습니다.
기기 카탈로그에 해당 폰을 선택해서 "제외"를 누르시면 됩니다.
이상으로 Google Play에 등록한 앱이 특정 기기에서 검색되지 않는 이유 및 해결방법에 대해서 알아보았습니다.
![](https://i1.daumcdn.net/deco/contents/emoticon/things_11.gif?v=2)
![](https://i1.daumcdn.net/deco/contents/emoticon/things_13.gif?v=2)
조금이나마 도움이 되셨으면 아래 ♡공감 버튼을 눌러주세요. ![](http://i1.daumcdn.net/deco/contents/emoticon/things_11.gif?v=2)
![](http://i1.daumcdn.net/deco/contents/emoticon/things_13.gif?v=2)
![](http://i1.daumcdn.net/deco/contents/emoticon/things_14.gif?v=2)
(If this article helps you, please press the ♡button below.)