lightbulb_outline Please take our October 2018 developer survey. Start survey

구문:
<uses-feature
  android:name="string"
  android:required=["true" | "false"]
  android:glEsVersion="integer" />
포함된 위치:
<manifest>
설명:
애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 선언합니다.

<uses-feature> 선언의 목적은 외부 엔터티에 애플리케이션이 의존하는 하드웨어 및 소프트웨어 기능 집합을 알려주는 것입니다. 이 요소는 required 특성을 제공합니다. 이 특성을 통해 애플리케이션이 선언된 기능을 필요로 하고 해당 기능 없이는 작동할 수 없음을 지정하거나, 해당 기능을 가지는 것을 선호하지만 해당 기능 없이도 작동할 수 있음을 지정할 수 있는 Android 기기에 따라 기능 지원이 다를 수 있으므로 <uses-feature> 요소는 애플리케이션이 사용하는 기기별 가변 기능을 설명하는 중요한 역할을 합니다.

애플리케이션이 선언하는 사용 가능한 기능 집합은 Android PackageManager를 통해 사용 가능한 기능 상수 집합에 해당하며, 편의상 이 문서 아래쪽의 기능 참조 섹션에 나열되어 있습니다.

각 기능을 개별 <uses-feature> 요소에 지정해야 하므로 애플리케이션이 여러 기능을 필요로 하는 경우 여러 <uses-feature> 요소를 선언합니다. 예를 들어, 기기에서 블루투스 기능과 카메라 기능을 모두 필요로 하는 애플리케이션은 다음 두 요소를 선언합니다.

<uses-feature android:name="android.hardware.bluetooth" />
<uses-feature android:name="android.hardware.camera" />

일반적으로 애플리케이션이 필요로 하는 모든 기능에 대해 항상 <uses-feature> 요소를 선언해야 합니다.

선언된 <uses-feature> 요소는 정보만 제공하므로 Android 시스템은 애플리케이션 설치 전에 기기에서 해당 기능 지원 여부를 확인하지 않습니다. 그러나 다른 서비스(예: Google Play)나 애플리케이션은 애플리케이션 처리 또는 상호작용의 일환으로 애플리케이션의 <uses-feature> 선언을 확인할 수 있습니다. 따라서 애플리케이션이 사용하는 모든 기능(아래 목록 참조)을 선언하는 것은 매우 중요합니다.

어떤 기능의 경우 사용 중인 Open GL 버전(glEsVersion을 사용하여 선언함)과 같은 기능 버전을 정의할 수 있는 특정 특성이 있을 수 있습니다. 카메라와 같은 기기에 있거나 없는 다른 기능은 name 특성을 사용하여 선언합니다.

<uses-feature> 요소는 API 레벨 4 이상을 실행 중인 기기에만 활성화되지만 minSdkVersion이 "3" 이하인 경우에도 모든 애플리케이션에 대해 해당 요소를 포함하는 것이 좋습니다. 이전 플랫폼 버전을 실행 중인 기기는 해당 요소를 무시합니다.

참고: 기능을 선언할 때 적절한 권한도 요청해야 합니다. 예를 들어, 애플리케이션이 카메라 API에 액세스하려면 먼저 CAMERA 권한을 요청해야 합니다. 권한 요청은 애플리케이션에 적절한 하드웨어 및 소프트웨어에 대한 액세스 권한을 부여하며, 애플리케이션이 사용하는 기능을 선언하는 것은 적절한 기기 호환성을 보장합니다.

특성:
android:name
애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 설명자 문자열로 지정합니다. 유효한 특성 값은 하드웨어 기능소프트웨어 기능 섹션에 나열되어 있습니다. 특성 값은 대/소문자를 구별합니다.
android:required
android:name에 지정된 기능을 애플리케이션이 요청하는지 여부를 나타내는 부울 값입니다.
  • 기능에 대해 android:required="true"을 선언하는 것은 기기에 지정된 기능이 없는 경우 애플리케이션이 기능을 작동할 수 없거나 작동하도록 고안되지 않았음을 지정합니다.
  • 기능에 대해 android:required="false"를 선언하는 것은 기기에 지정된 기능이 있는 경우에는 애플리케이션이 기능을 사용하는 것을 선호하지만 필요한 경우 지정된 기능 없이 작동하도록 고안되었음을 의미합니다.

선언하지 않은 경우 android:required의 기본값은 "true"입니다.

android:glEsVersion
애플리케이션이 필요로 하는 OpenGL ES 버전입니다. 상위 16비트는 주 번호를 나타내고, 하위 16비트는 부 번호를 나타냅니다. 예를 들어, OpenGL ES 버전 2.0을 지정하려면 해당 값을 "0x00020000"으로 설정하고 OpenGL ES 3.2을 지정하려면 해당 값을 "0x00030002"로 설정합니다.

애플리케이션은 매니페스트에 최대 한 개의 android:glEsVersion 특성을 지정해야 합니다. 두 개 이상을 지정한 경우 가장 높은 숫자 값을 갖는 android:glEsVersion이 사용되며 다른 값은 무시됩니다.

애플리케이션이 android:glEsVersion 특성을 지정하지 않은 경우 애플리케이션이 모든 Android 기기가 지원하는 OpenGL ES 1.0만 필요로 하는 것으로 가정합니다.

애플리케이션은 지정된 OpenGL ES 버전을 지원하는 플랫폼이 모든 하위 OpenGL ES 버전도 지원하는 것으로 가정할 수 있습니다. 따라서 OpenGL ES 1.0과 OpenGL ES 2.0을 모두 필요로 하는 애플리케이션은 OpenGL ES 2.0을 필요로 한다고 지정해야 합니다.

몇몇 OpenGL ES 버전과 작업할 수 있는 애플리케이션은 필요로 하는 최하위 OpenGL ES만 지정해야 합니다. (상위 OpenGL ES 레벨이 사용 가능한지 여부는 런타임에 확인할 수 있습니다.)

지원되는 OpenGL ES 버전을 런타임에 확인하는 방법을 비롯한 OpenGL ES 사용에 대한 자세한 내용은 OpenGL ES API 가이드를 참조하세요.

도입:
API 레벨 4
참고 항목:

Google Play 및 기능 기반 필터링

Google Play는 사용자가 기기와 호환되는 애플리케이션만 보고 다운로드할 수 있도록 사용자에게 표시되는 애플리케이션을 필터링합니다. Google Play는 기능 호환성을 기준으로 애플리케이션을 필터링합니다.

지정된 사용자 기기와 애플리케이션의 기능 호환성을 결정하기 위해 Google Play가 다음을 비교합니다.

  • 애플리케이션이 필요로 하는 기능 — 애플리케이션이 매니페스트의 <uses-feature> 요소에 기능을 선언합니다.
    그리고
  • 기기(하드웨어 또는 소프트웨어)에서 사용 가능한 기능 — 기기가 읽기 전용 시스템 속성으로 지원하는 기능을 보고합니다.

기능을 정확하게 비교하기 위해, Android 패키지 관리자는 애플리케이션과 기기가 기능 요구사항 및 지원을 선언하는 데 사용하는 기능 상수의 공유 집합을 제공합니다. 사용 가능한 기능 상수는 이 문서의 아래쪽 기능 참조 섹션과 PackageManager에 대한 클래스 문서에 나열되어 있습니다.

사용자가 Google Play를 시작하면, 애플리케이션은 getSystemAvailableFeatures()를 호출하여 기기에서 사용 가능한 기능 목록에 대해 패키지 관리자에게 쿼리합니다. 이때 스토어 애플리케이션은 사용자 세션을 설정할 때 기능 목록을 Google Play에 전달합니다.

Google Play Developer Console에 애플리케이션을 업로드할 때마다 Google Play가 애플리케이션의 매니페스트 파일을 검색합니다. Google Play는 <uses-feature> 요소를 찾아 <uses-sdk><uses-permission> 요소와 같은 다른 요소와 함께 평가합니다. 애플리케이션이 필요로 하는 기능 집합을 설정한 후, 해당 목록을 애플리케이션 .apk와 애플리케이션 버전과 연결된 메타데이터로서 내부에 저장합니다.

사용자가 Google Play 애플리케이션을 사용하여 애플리케이션을 검색하거나 찾을 때, 서비스가 각 애플리케이션이 필요로 하는 기능과 사용자 기기에서 사용 가능한 기능을 비교합니다. 애플리케이션이 필요로 하는 모든 기능이 기기에 있는 경우, Google Play를 통해 사용자는 해당 애플리케이션을 보고 잠재적으로 다운로드할 수 있습니다. 필요로 하는 기능을 기기가 지원하지 않는 경우 Google Play는 애플리케이션을 사용자에게 표시되지 않고 다운로드할 수 없도록 필터링합니다.

<uses-feature> 요소에 선언하는 기능은 Google Play가 애플리케이션을 필터링하는 방법에 직접적인 영향을 미치므로, Google Play가 애플리케이션의 매니페스트를 평가하고 필요로 하는 기능 집합을 설정하는 방법을 이해해야 합니다. 자세한 내용은 아래 섹션을 참조하세요.

명시적으로 선언된 기능 기반 필터링

명시적으로 선언된 기능은 애플리케이션이 <uses-feature> 요소에 선언한 기능입니다. 기능 선언은 android:required=["true" | "false"] 특성을 포함할 수 있으며(API 레벨 5 이상에 대해 컴파일하는 경우), 이 특성을 통해 사용자는 애플리케이션이 해당 기능을 절대적으로 필요로 하고 해당 기능이 없으면 제대로 작동할 수 없음을 지정하거나("true"), 사용 가능한 기능을 사용하는 것을 선호하지만 해당 기능 없이 실행하도록 고안되었음을 지정할 수 있습니다("false").

Google Play는 명시적으로 선언된 기능을 다음과 같은 방식으로 처리합니다.

  • 필요한 기능임을 명시적으로 선언한 경우 Google Play는 애플리케이션의 필요한 기능 목록에 해당 기능을 추가합니다. 이때 해당 기능을 제공하지 않는 기기에서 애플리케이션을 사용자에게 표시되지 않도록 필터링합니다. 예:
    <uses-feature android:name="android.hardware.camera" android:required="true" />
  • 필요한 기능이 아님을 명시적으로 선언한 경우 Google Play는 필요한 기능 목록에 해당 기능을 추가하지 않습니다. 따라서 명시적으로 선언된 필요하지 않은 기능은 애플리케이션을 필터링할 때 고려되지 않습니다. 기기가 선언된 기능을 제공하지 않는 경우에도 다른 필터링 규칙이 적용되지 않으면 Google Play는 기기와 호환되는 애플리케이션을 고려하고 사용자에게 표시합니다. 예:
    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • android:required 특성 없이 기능을 명시적으로 선언한 경우 Google Play는 필요한 기능으로 가정하고 필터링을 설정합니다.

일반적으로 애플리케이션이 Android 1.6 이하 버전에서 실행되도록 고안된 경우 android:required 특성은 해당 API에서 사용할 수 없고 Google Play는 모든 <uses-feature> 선언이 필요하다고 가정합니다.

참고: 기능을 명시적으로 선언하고 android:required="false" 특성을 포함하여 지정된 기능에 대한 모든 Google Play 필터링을 효과적으로 비활성화할 수 있습니다.

암시적 기능 기반 필터링

암시적 기능은 애플리케이션이 제대로 작동하기 위해 필요하지만 매니페스트 파일의 <uses-feature> 요소에 선언하지 않는 기능입니다. 엄격하게 말하면 모든 애플리케이션은 사용하거나 필요로 하는 모든 기능을 항상 선언해야 하므로, 애플리케이션이 사용하는 기능을 선언하지 않는 것은 오류로 간주됩니다. 그러나 사용자와 개발자의 안전을 위해 Google Play는 명시적으로 선언된 기능에 대해 수행하듯이 각 애플리케이션의 암시적 기능을 찾고 해당 기능에 대한 필터를 설정합니다.

애플리케이션은 다음과 같은 이유로 필요한 기능을 선언하지 않을 수 있습니다.

  • 애플리케이션을 이전 Android 라이브러리 버전(Android 1.5 이하)에 대해 컴파일하고 <uses-feature> 요소를 사용할 수 없습니다.
  • 개발자가 해당 기능이 모든 기기에 있고 선언이 불필요하다고 잘못 가정했습니다.
  • 개발자가 기능 선언을 실수로 누락했습니다.
  • 개발자가 기능을 명시적으로 선언했지만 선언이 유효하지 않습니다. 예를 들어, <uses-feature> 요소 이름의 맞춤법 오류 또는 android:name 특성에 대한 인식할 수 없는 문자열 값은 기능 선언을 무효화합니다.

위 사례를 설명하기 위해 Google Play는 매니페스트 파일에 선언된 다른 요소, 특히 <uses-permission> 요소를 검사하여 애플리케이션의 암시적 기능 요구사항을 찾으려고 시도합니다.

애플리케이션이 하드웨어 관련 권한을 요청하면 Google Play는 <uses-feature> 선언에 해당하는 기능이 없더라도 애플리케이션이 기본 하드웨어 기능을 사용 및 요구하는 것으로 가정합니다. 그런 권한을 위해 Google Play는 애플리케이션에 대해 저장하고 필터를 설정하는 기본 하드웨어 기능을 메타데이터에 추가합니다.

예를 들어, 애플리케이션이 CAMERA 권한을 요청하지만 android.hardware.camera에 대해 <uses-feature> 요소를 선언하지 않은 경우, Google Play는 애플리케이션이 카메라를 필요로 하지만 카메라를 제공하지 않는 기기의 사용자에게 애플리케이션을 표시하지 않아야 한다고 간주합니다.

특정 암시적 기능에 기반한 필터링을 Google Play가 하지 않게 하려면 해당 동작을 비활성화할 수 있습니다. 이를 수행하려면 <uses-feature> 요소에 기능을 명시적으로 선언하고 android:required="false" 특성을 포함합니다. 예를 들어, CAMERA 권한에서 파생된 필터링을 비활성화하려면 아래와 같이 기능을 선언합니다.

<uses-feature android:name="android.hardware.camera" android:required="false" />

<uses-permission> 요소에서 요청한 권한은 Google Play가 애플리케이션을 필터링하는 방법에 직접 영향을 미칠 수 있음을 이해해야 합니다. 참조 섹션 기능 요구사항을 암시하는 권한에는 기능 요구사항을 암시하고 필터링을 트리거하는 전체 권한 집합이 나열되어 있습니다.

블루투스 기능에 대한 특수 처리

Google Play는 블루투스에 대한 필터링을 결정할 때 위의 설명과 약간 다른 규칙을 적용합니다.

애플리케이션이 <uses-permission> 요소에 블루투스 권한을 선언하지만 <uses-feature> 요소에 블루투스 기능을 명시적으로 선언하지 않는 경우, Google Play는 <uses-sdk> 요소에 지정된 대로 애플리케이션이 실행하도록 고안된 Android 플랫폼의 버전을 확인합니다.

아래 표에서 보듯이 Google Play는 애플리케이션이 최하위 또는 대상 플랫폼을 Android 2.0(API 레벨 5) 이상으로 선언하는 경우에만 블루투스 기능에 대한 필터링을 활성화합니다. 그러나 Google Play는 애플리케이션이 <uses-feature> 요소에 블루투스 기능을 명시적으로 선언하는 경우 필터링에 대한 정상적인 규칙을 적용합니다.

표 1. Google Play가 블루투스 권한을 요청하지만 <uses-feature> 요소에 블루투스 기능을 선언하지 않는 애플리케이션에 대한 블루투스 기능 요구사항을 결정하는 방법

만약 minSdkVersion 또는 targetSdkVersion 결과
<=4 (또는 uses-sdk를 선언하지 않음) <=4 Google Play가 android.hardware.bluetooth 기능에 대한 보고된 지원에 따라 기기에서 애플리케이션을 필터링하지 않습니다.
<=4 >=5 Google Play가 android.hardware.bluetooth 기능을 지원하지 않는 기기(이전 릴리스 포함)에서 애플리케이션을 필터링합니다.
>=5 >=5

아래 예시는 Google Play가 블루투스 기능을 처리하는 방법에 따른 서로 다른 필터링 결과를 보여줍니다.

첫 번째 예시에서 이전 API 레벨에서 실행되도록 고안된 애플리케이션은 블루투스 권한을 선언하지만 <uses-feature> 요소에 블루투스 기능을 선언하지 않습니다.
결과: Google Play가 기기에서 애플리케이션을 필터링하지 않습니다.
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" />
    ...
</manifest>
아래 두 번째 예시에서 동일한 애플리케이션이 대상 API 레벨 "5"도 선언합니다.
결과: 이제 Google Play가 기능이 필요함을 가정하고 블루투스 지원을 보고하지 않는 모든 기기(이전 플랫폼 버전을 실행하는 기기 포함)에서 애플리케이션을 필터링합니다.
<manifest ...>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
여기서 이제 동일한 애플리케이션이 블루투스 기능을 구체적으로 선언합니다.
결과: 이전 예와 동일합니다(필터링 적용됨).
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>
마지막으로, 아래의 경우 동일한 애플리케이션이 android:required="false" 특성을 추가합니다.
결과: Google Play가 모든 기기에 대한 블루투스 기능 지원에 기반한 필터링을 비활성화합니다.
<manifest ...>
    <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="5" />
    ...
</manifest>

애플리케이션이 필요로 하는 기능 테스트

Android SDK에 소개된 aapt 도구를 사용하여 선언된 기능과 권한에 따라 Google Play가 애플리케이션을 필터링하는 방법을 결정할 수 있습니다. 그렇게 하려면 dump badging 명령을 사용하여 aapt를 실행합니다. 그러면 aapt가 애플리케이션의 매니페스트를 파싱하고 Google Play가 사용하는 것과 동일한 규칙을 적용하여 애플리케이션이 필요로 하는 기능을 결정합니다.

해당 도구를 사용하려면 다음 단계를 수행합니다.

  1. 먼저, 애플리케이션을 빌드하여 서명되지 않은 .apk로 내보냅니다. Android Studio를 개발 중인 경우 Gradle을 사용하여 애플리케이션을 빌드합니다.
    1. 프로젝트를 열고 Run > Edit Configurations를 선택합니다.
    2. Run/Debug Configurations 창의 왼쪽 위에 있는 더하기 기호를 선택합니다.
    3. Gradle을 선택합니다.
    4. NameUnsigned APK를 입력합니다.
    5. Gradle project 섹션에서 모듈을 선택합니다.
    6. Tasksassemble을 입력합니다.
    7. OK를 선택하여 새 구성을 완료합니다.
    8. 툴바에서 Unsigned APK 실행 구성을 선택하고 Run > Run 'Unsigned APK'를 선택합니다.
    <ProjectName>/app/build/outputs/apk/ 디렉터리에서 서명되지 않은 .apk를 찾을 수 있습니다.
  2. 이미 PATH에 있지 않는 경우 aapt 도구를 찾습니다. SDK Tools r8 이상을 사용 중인 경우 <SDK>/platform-tools/ 디렉터리에서 aapt를 찾을 수 있습니다.

    참고: 사용 가능한 최신 Platform-Tools 구성 요소에 대해 제공되는 aapt 버전을 사용해야 합니다. 최신 Platform-Tools 구성 요소가 없는 경우 Android SDK Manager를 사용하여 다운로드하세요.

  3. 다음 구문을 사용하여 aapt를 실행합니다.
$ aapt dump badging <path_to_exported_.apk>

다음은 상기 두 번째 블루투스 예시에 대한 명령 출력의 예시입니다.

$ ./aapt dump badging BTExample.apk
package: name='com.example.android.btexample' versionCode='' versionName=''
uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.bluetooth'
sdkVersion:'3'
targetSdkVersion:'5'
application: label='BT Example' icon='res/drawable/app_bt_ex.png'
launchable activity name='com.example.android.btexample.MyActivity'label='' icon=''
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large'
locales: '--_--'
densities: '160'

기능 참조

다음 섹션에서는 하드웨어 기능, 소프트웨어 기능, 특정 기능 요구사항을 암시하는 권한 집합에 대한 참조 정보를 제공합니다.

하드웨어 기능

이 섹션에서는 대부분의 현재 플랫폼 릴리스가 지원하는 하드웨어 기능을 소개합니다. 앱이 하드웨어 기능을 사용하거나 필요로 함을 나타내려면 android:name 특성에 ("android.hardware"로 시작하는) 해당 값을 선언합니다. 하드웨어 기능을 선언할 때마다 개별 <uses-feature> 요소를 사용해야 합니다.

오디오 하드웨어 기능

android.hardware.audio.low_latency
앱이 사운드 입력 또는 출력 처리 시 지연 시간을 줄이는, 기기의 짧은 대기 시간 오디오 파이프라인을 사용합니다.
android.hardware.audio.output
앱이 기기의 스피커, 오디오 잭, 블루투스 스트리밍 기능 또는 유사한 메커니즘을 사용하여 사운드를 전송합니다.
android.hardware.audio.pro
앱이 기기의 고급 오디오 기능 및 성능을 사용합니다.
android.hardware.microphone
앱이 기기의 마이크를 사용하여 오디오를 녹음합니다.

블루투스 하드웨어 기능

android.hardware.bluetooth
앱이 일반적으로 다른 블루투스 사용 기기와 통신하기 위해 기기의 블루투스 기능을 사용합니다.
android.hardware.bluetooth_le
앱이 기기의 블루투스 저전력 송수신 무선 기능을 사용합니다.

카메라 하드웨어 기능

android.hardware.camera
앱이 기기의 후방 카메라를 사용합니다. 전방 카메라만 있는 기기는 이 기능을 나열하지 않으므로, 카메라 방향에 상관없이 앱이 아무 카메라와 통신할 수 있는 경우 android.hardware.camera.any 기능을 대신 사용하세요.
android.hardware.camera.any
앱이 기기의 카메라를 사용하거나 기기에 연결된 외부 카메라를 사용합니다. 앱이 후방 카메라를 필요로 하지 않는 경우 android.hardware.camera 대신 이 값을 사용합니다.
android.hardware.camera.autofocus

앱이 기기의 카메라가 지원하는 자동 포커스 기능을 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.cameraandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.camera.capability.manual_post_processing

앱이 기기의 카메라가 지원하는 MANUAL_POST_PROCESSING 기능을 사용합니다.

앱은 이 기능을 사용하여 카메라의 자동 화이트 밸런스 기능을 재정의할 수 있습니다. TRANSFORM_MATRIX android.colorCorrection.mode, android.colorCorrection.transformandroid.colorCorrection.gains를 사용합니다.

android.hardware.camera.capability.manual_sensor

앱이 기기의 카메라가 지원하는 MANUAL_SENSOR 기능을 사용합니다.

이 기능은 카메라 노출 시간 및 민감도를 특정 값으로 고정할 수 있는 자동 노출 잠금(android.control.aeLock)에 대한 지원을 암시합니다.

android.hardware.camera.capability.raw

앱이 기기의 카메라가 지원하는 RAW 기능을 사용합니다.

이 기능은 기기가 DNG(원시) 파일을 저장할 수 있고 기기의 카메라가 해당 원시 이미지(raw image)를 직접 처리하는 DNG 관련 메타데이터를 제공함을 암시합니다.

android.hardware.camera.external
앱이 사용자가 기기에 연결한 외부 카메라와 통신합니다. 그러나 이 기능은 앱이 사용할 외부 카메라가 사용 가능함을 보장하지 않습니다.
android.hardware.camera.flash

앱이 기기의 카메라가 지원하는 플래시 기능을 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.cameraandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.camera.front

앱이 기기의 전방 카메라를 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.cameraandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.camera.level.full
앱이 한 개 이상의 기기 카메라가 제공하는 FULL 레벨 이미지 캡처 지원을 사용합니다. FULL 지원 카메라는 연속 촬영 기능, 프레임당 컨트롤 및 수동 후처리 컨트롤을 제공합니다.

기기 UI 하드웨어 기능

android.hardware.type.automotive

앱이 차량 내부의 화면에 UI를 표시하도록 고안되었습니다. 사용자는 하드 버튼, 터치, 회전식 컨트롤러, 마우스와 유사한 인터페이스 등을 사용하여 앱과 상호작용합니다. 일반적으로 차량 화면은 차량의 복합 계기 또는 중앙 콘솔에 표시됩니다. 일반적으로 해당 화면은 크기와 해상도가 제한되어 있습니다.

참고: 사용자가 이런 유형의 앱 UI를 사용하여 운전하므로 앱은 운전자의 주의를 산만하게 하는 요소를 최소화해야 합니다.

android.hardware.type.television

(지원이 중단되었습니다. android.software.leanback을 대신 사용하십시오.)

앱이 텔레비전에 UI를 표시하도록 고안되었습니다. 이 기능은 "텔레비전"을 대형 화면이 있고 사용자가 멀리 앉아 있고 주요 입력 방식이 D-패드와 유사하고 일반적으로 마우스, 포인터 또는 터치 기기를 사용하지 않는 전형적인 거실용 텔레비전으로 정의합니다.

android.hardware.type.watch
앱이 시계에 UI를 표시하도록 고안되었습니다. 시계는 손목과 같은 몸에 착용합니다. 사용자는 시계와 매우 가까운 곳에서 상호작용합니다.

지문 하드웨어 기능

android.hardware.fingerprint
앱이 기기의 생체 인식 하드웨어를 사용하여 지문을 읽습니다.

게임패드 하드웨어 기능

android.hardware.gamepad
앱이 기기 또는 연결된 게임패드의 게임 컨트롤러 입력을 캡처합니다.

적외선 하드웨어 기능

android.hardware.consumerir
앱이 일반적으로 다른 소비자용 적외선 기기와 통신하기 위해 기기의 적외선 기능을 사용합니다.

위치 하드웨어 기능

android.hardware.location
앱이 위치를 결정하기 위해 기기에서 한 개 이상의 기능(예: GPS 위치, 네트워크 위치 또는 휴대폰 위치)을 사용합니다.
android.hardware.location.gps

앱이 기기에서 위성 위치 확인 시스템(GPS) 수신기가 제공하는 정확한 위치 좌표를 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.locationandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.location.network

앱이 기기에 지원되는 네트워크 기반 위치정보 시스템이 제공하는 대략적인 위지 좌표를 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.locationandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

NFC 하드웨어 기능

android.hardware.nfc
앱이 기기의 NFC(근거리 무선 통신) 무선 기능을 사용합니다.
android.hardware.nfc.hce

(지원이 중단되었습니다.)

앱이 기기에 호스팅된 NFC 카드 에뮬레이션을 사용합니다.

OpenGL ES 하드웨어 기능

android.hardware.opengles.aep
앱이 기기에 설치된 OpenGL ES Android Extension Pack을 사용합니다.

센서 하드웨어 기능

android.hardware.sensor.accelerometer
앱이 기기의 현재 방향을 감지하기 위해 기기 가속도계의 이동 눈금을 사용합니다. 예를 들어, 앱이 세로 방향과 가로 방향 간 전환할 때를 결정하기 위해 가속도계 눈금을 사용할 수 있습니다.
android.hardware.sensor.ambient_temperature
앱이 기기의 주위 온도 센서를 사용합니다. 예를 들어, 날씨 앱이 실내 또는 실외 온도를 보고할 수 있습니다.
android.hardware.sensor.barometer
앱이 기기의 기압계를 사용합니다. 예를 들어, 날씨 앱이 기압을 보고할 수 있습니다.
android.hardware.sensor.compass
앱이 기기의 자력계(나침반)를 사용합니다. 예를 들어, 내비게이션 앱이 사용자가 향하는 현재 방향을 표시할 수 있습니다.
android.hardware.sensor.gyroscope
앱이 기기의 자이로스코프를 사용하여 회전 및 비틀기를 감지하고 6축 방향 시스템을 만듭니다. 이 센서를 사용하는 앱은 세로 방향과 가로 방향 간 전환 필요성을 훨씬 원활하게 감지할 수 있습니다.
android.hardware.sensor.hifi_sensors
앱이 기기의 고정밀(Hi-Fi) 센서를 사용합니다. 예를 들어, 게임 앱은 사용자의 고정밀 이동을 감지할 수 있습니다.
android.hardware.sensor.heartrate
앱이 기기의 심박측정기를 사용합니다. 예를 들어, 피트니스 앱이 시간의 흐름에 따른 사용자의 심박수 추세를 보고할 수 있습니다.
android.hardware.sensor.heartrate.ecg
앱이 기기의 심전도(ECG) 심박 센서를 사용합니다. 예를 들어, 피트니스 앱이 사용자의 심박수에 대한 자세한 정보를 보고할 수 있습니다.
android.hardware.sensor.light
앱이 기기의 광센서를 사용합니다. 예를 들어, 앱이 주변 조명 상태에 따라 서로 다른 두 개의 색 구성표 중 하나를 표시할 수 있습니다.
android.hardware.sensor.proximity
앱이 기기의 근접 센서를 사용합니다. 예를 들어, 전화통신 앱이 사용자가 몸 가까이에서 기기를 잡고 있음을 감지할 때 기기의 화면을 끌 수 있습니다.
android.hardware.sensor.relative_humidity
앱이 기기의 상대 습도 센서를 사용합니다. 예를 들어, 날씨 앱이 현재 노점(露點)을 계산 및 보고하기 위해 습도를 사용할 수 있습니다.
android.hardware.sensor.stepcounter
앱이 기기의 보행 계수기를 사용합니다. 예를 들어, 피트니스 앱이 1일 걸음 수 목표를 달성하기 위해 필요한 걸음 수를 보고할 수 있습니다.
android.hardware.sensor.stepdetector
앱이 기기의 보행 탐지기를 사용합니다. 예를 들어, 피트니스 앱이 걸음 간 시간 간격을 사용하여 사용자의 운동 유형을 추정할 수 있습니다.

화면 하드웨어 기능

android.hardware.screen.landscape
android.hardware.screen.portrait

앱이 기기가 세로 방향 또는 가로 방향을 사용하도록 요구합니다. 앱이 두 방향을 모두 지원하는 경우 둘 중 한 기능을 선언할 필요가 없습니다.

예를 들어, 앱이 세로 방향을 필요로 하는 경우 세로 방향을 지원하는 기기만 (항상 또는 사용자 선택에 따라) 앱을 실행할 수 있도록 다음 기능을 선언해야 합니다.

<uses-feature android:name="android.hardware.screen.portrait" />

기본적으로 두 방향을 필요로 하지 않는 것으로 가정하므로, 한 방향 또는 두 방향을 지원하는 기기에 앱을 설치할 수 있습니다. 그러나 android:screenOrientation 특성을 사용하여 액티비티가 특정 방향으로 실행되도록 요청하는 경우, 해당 선언은 앱이 해당 방향을 필요로 함을 의미합니다. 예를 들어, android:screenOrientation"landscape", "reverseLandscape" 또는 "sensorLandscape"로 선언한 경우, 앱은 가로 방향을 지원하는 기기에만 사용 가능합니다.

<uses-feature> 요소를 사용하여 해당 방향에 대한 요구사항을 여전히 선언하는 것이 좋습니다. android:screenOrientation을 사용하여 액티비티에 대한 방향을 선언하지만 실제로 필요로 하지 않는 경우, <uses-feature> 요소와 android:required="false"를 사용하여 방향 선언 요구를 비활성화할 수 있습니다.

이전 버전과의 호환성을 위해 Android 3.1(API 레벨 12) 이하를 실행 중인 기기는 가로 방향과 세로 방향을 모두 지원합니다.

전화통신 하드웨어 기능

android.hardware.telephony
앱이 데이터 통신 서비스 기능이 있는 전화통신 무선 등 기기의 전화통신 기능을 사용합니다.
android.hardware.telephony.cdma

앱이 CDMA(코드분할다중접속) 전화통신 무선 시스템을 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.telephonyandroid:required="false"로 선언하지 않는 경우, 해당 부모 기능도 사용함을 암시합니다.

android.hardware.telephony.gsm

앱이 GSM(글로벌 이동 통신 시스템) 전화통신 무선 시스템을 사용합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.telephonyandroid:required="false"로 선언하지 않는 경우, 해당 부모 기능도 사용함을 암시합니다.

터치스크린 하드웨어 기능

android.hardware.faketouch

앱이 탭 및 드래그와 같은 기본적인 터치 상호작용 이벤트를 사용합니다.

필요한 기능으로 선언한 경우 이 기능은 앱이 터치스크린을 에뮬레이트하거나("모조 터치" 인터페이스) 실제 터치스크린을 가진 기기하고만 호환됨을 나타냅니다.

모조 터치 인터페이스를 제공하는 기기는 터치스크린 기능 일부를 에뮬레이트하는 사용자 입력 시스템을 제공합니다. 예를 들어, 마우스 또는 리모컨은 화상 커서를 구동할 수 있습니다. 앱이 기본적인 포인트 및 클릭 상호작용을 필요로 하는 경우(즉, D-패드 컨트롤러하고만 작동하지 않는 경우) 이 기능을 선언해야 합니다. 이는 터치 상호작용의 최소 레벨이므로, 훨씬 복잡한 터치 인터페이스를 제공하는 기기에 이 기능을 선언하는 앱을 사용할 수도 있습니다.

참고: 앱은 기본적으로 android.hardware.touchscreen 기능을 필요로 합니다. 모조 터치 인터페이스를 제공하는 기기에 앱을 사용 가능하게 하려면, 또한 다음과 같이 터치스크린이 필요하지 않다고 명시적으로 선언해야 합니다.

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
android.hardware.faketouch.multitouch.distinct

앱이 모조 터치 인터페이스에서 두 개 이상의 고유한 "손가락"을 추적합니다. 이 기능은 android.hardware.faketouch 기능을 포함합니다. 필요한 기능으로 선언한 경우, 이 기능은 앱이 고유한 두 개 이상의 손가락 추적을 에뮬레이트하거나 실제 터치스크린을 가지는 기기하고만 호환됨을 나타냅니다.

android.hardware.touchscreen.multitouch.distinct가 정의하는 고유한 다중 터치와 달리 모조 터치 인터페이스와 고유한 다중 터치를 지원하는 입력 기기는 입력이 화상 커서 이동으로 변형되므로 모든 두 손가락 제스처를 지원하지는 않습니다. 즉, 이러한 기기에서 한 손가락 제스처는 커서를 이동하고, 두 손가락 스와이프는 한 손가락 터치 이벤트를 발생하게 하고, 다른 두 손가락 제스처는 해당 두 손가락 터치 이벤트를 트리거합니다.

커서 이동에 대해 두 손가락 터치 트랙 패드를 제공하는 기기는 이 기능을 지원할 수 있습니다.

android.hardware.faketouch.multitouch.jazzhand

앱이 모조 터치 인터페이스에서 5개 이상의 고유한 "손가락"을 추적합니다. 이 기능은 android.hardware.faketouch 기능을 포함합니다. 필요한 기능으로 선언한 경우, 이 기능은 앱이 고유한 5개 이상의 손가락 추적을 에뮬레이트하거나 실제 터치스크린을 가진 기기하고만 호환됨을 나타냅니다.

android.hardware.touchscreen.multitouch.jazzhand가 정의하는 고유한 다중 터치와 달리 모조 터치 인터페이스와 재즈핸드(jazzhand) 다중 터치를 지원하는 입력 기기는 입력이 화상 커서 이동으로 변형되므로 모든 다섯 손가락 제스처를 지원하지는 않습니다. 즉, 이러한 기기에서 한 손가락 제스처는 커서를 이동하고, 다중 손가락 제스처는 한 손가락 터치 이벤트를 발생하게 하고, 다른 다중 손가락 제스처는 해당 다중 손가락 터치 이벤트를 트리거합니다.

커서 이동에 대해 다섯 손가락 터치 트랙 패드를 제공하는 기기는 이 기능을 지원할 수 있습니다.

android.hardware.touchscreen

앱이 플링(fling)과 같은 기본 터치 이벤트보다 훨씬 대화형인 제스처에 대해 기기의 터치스크린 기능을 사용합니다. 이 기능은 android.hardware.faketouch 기능을 포함합니다.

기본적으로 앱은 이 기능을 필요로 합니다. 따라서 앱은 기본적으로 에뮬레이트된 터치 인터페이스("모조 터치")만을 제공하는 기기에서 사용할 수 없습니다. 모조 터치 인터페이스를 제공하는 기기에서 (또는 심지어 D-패드 컨트롤러만 제공하는 기기에서) 앱을 사용할 수 있게 하려면 android.hardware.touchscreenandroid:required="false"로 선언하여 터치스크린이 필요하지 않음을 명시적으로 선언해야 합니다. 앱이 실제 터치스크린 인터페이스를 사용하지만 필요로 하지 않는 경우 이 선언을 추가해야 합니다.

실제로 앱이 (플링과 같은 고급 터치 제스처를 수행하기 위해) 터치 인터페이스를 필요로 하는 경우, 기본적으로 요구되는 터치 인터페이스 기능을 선언할 필요가 없습니다. 그러나 앱이 사용하는 모든 기능을 명시적으로 선언하는 것이 좋습니다.

다중 손가락 제스처와 같은 훨씬 복잡한 터치 상호작용을 필요로 하는 경우, 앱이 고급 터치스크린 기능을 사용함을 선언해야 합니다.

android.hardware.touchscreen.multitouch

앱이 손가락 모으기 제스처와 같은 기기의 기본적인 두 지점 다중 터치 기능을 사용하지만 터치를 독립적으로 추적할 필요가 없습니다. 이 기능은 android.hardware.touchscreen 기능을 포함합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.touchscreenandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.touchscreen.multitouch.distinct

앱이 두 개 이상의 지점을 독립적으로 추적하기 위해 기기의 고급 다중 터치 기능을 사용합니다. 이 기능은 android.hardware.touchscreen.multitouch 기능을 포함합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.touchscreen.multitouchandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.hardware.touchscreen.multitouch.jazzhand

앱이 다섯 개 이상의 지점을 독립적으로 추적하기 위해 기기의 고급 다중 터치 기능을 사용합니다. 이 기능은 android.hardware.touchscreen.multitouch 기능을 포함합니다.

이 기능을 사용하는 앱은 부모 기능인 android.hardware.touchscreen.multitouchandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

USB 하드웨어 기능

android.hardware.usb.accessory
앱이 USB 기기로 작동하며 USB 호스트에 연결됩니다.
android.hardware.usb.host
앱이 기기에 연결된 USB 액세서리를 사용합니다. 기기는 USB 호스트 역할을 합니다.

Wi-Fi 하드웨어 기능

android.hardware.wifi
앱이 기기에서 802.11 네트워킹(Wi-Fi) 기능을 사용합니다.
android.hardware.wifi.direct
앱이 기기에서 Wi-Fi Direct 네트워킹 기능을 사용합니다.

소프트웨어 기능

이 섹션에서는 대부분의 현재 플랫폼 릴리스가 지원하는 소프트웨어 기능을 소개합니다. 앱이 소프트웨어 기능을 사용하거나 필요로 함을 나타내려면 android:name 특성에 ("android.software"로 시작하는) 해당 값을 선언합니다. 소프트웨어 기능을 선언할 때마다 개별 <uses-feature> 요소를 사용해야 합니다.

통신 소프트웨어 기능

android.software.sip
앱이 SIP(Session Initiation Protocol) 서비스를 사용합니다. SIP를 사용하는 앱은 화상 회의 및 인스턴트 메시징과 같은 인터넷 전화통신 작업을 지원할 수 있습니다.
android.software.sip.voip

앱이 SIP 기반 VoIP(Voice Over Internet Protocol) 서비스를 사용합니다. VoIP를 사용하는 앱은 양방향 화상 회의와 같은 실시간 인터넷 전화통신 작업을 지원할 수 있습니다.

이 기능을 사용하는 앱은 부모 기능인 android.software.sipandroid:required="false"로 선언하지 않는 경우 해당 부모 기능도 사용함을 암시합니다.

android.software.webview
앱이 인터넷 콘텐츠를 표시합니다.

사용자 지정 입력 소프트웨어 기능

android.software.input_methods
앱이 개발자가 InputMethodService에 정의하는 새 입력 메서드를 사용합니다.

기기 관리 소프트웨어 기능

android.software.backup
앱이 백업을 처리하고 작업을 복원하는 로직을 포함합니다.
android.software.device_admin
앱이 기기 정책을 적용하는 기기 관리자를 사용합니다.
android.software.managed_users
앱이 보조 사용자 및 관리된 프로필을 지원합니다.
android.software.securely_removes_users
앱이 사용자 및 관련 데이터를 영구적으로 제거할 수 있습니다.
android.software.verified_boot
앱이 다시 시작 작업 동안 기기 구성 변경 여부를 감지하는, 기기의 확인된 부팅 기능에서 도출된 결과를 처리하는 로직을 포함합니다.

미디어 소프트웨어 기능

android.software.midi
앱이 MIDI(Musical Instrument Digital Interface) 프로토콜을 사용하여 악기 또는 출력 사운드에 연결합니다.
android.software.print
앱이 기기에 표시된 문서를 인쇄하는 명령을 포함합니다.
android.software.leanback
앱이 텔레비전과 같은 대형 화면에서 보도록 고안된 UI를 제공합니다.
android.software.live_tv
앱이 생방송 텔레비전 프로그램을 스트리밍합니다.

화면 인터페이스 소프트웨어 기능

android.software.app_widgets
앱이 앱 위젯을 사용 또는 제공하고, 사용자가 앱 위젯을 삽입할 수 있는 홈 화면 또는 유사한 위치를 포함하는 기기에만 앱을 설치해야 합니다.
android.software.home_screen
앱이 기기의 홈 화면의 대체 항목으로 작동합니다.
android.software.live_wallpaper
앱이 애니메이션을 포함하는 배경화면을 포함합니다.

기능 요구사항을 암시하는 권한

일부 하드웨어 및 소프트웨어 기능 상수는 해당 API 이후의 애플리케이션에서 사용 가능하게 되었습니다. 예를 들어, android.hardware.bluetooth 기능은 Android 2.2(API 레벨 8)에 추가되었지만 이를 참조하는 Bluetooth API는 Android 2.0(API 레벨 5)에 추가되었습니다. 이 때문에 일부 앱은 <uses-feature> 시스템을 사용하여 API를 필요로 함을 선언하는 기능을 갖기 전에 API를 사용할 수 있었습니다.

실수로 해당 앱이 사용 가능해지는 것을 방지하기 위해 Google Play는 특정 하드웨어 관련 권한은 기본 하드웨어 기능을 기본적으로 필요로 함을 나타낸다고 가정합니다. 예를 들어, 블루투스를 사용하는 애플리케이션은 <uses-permission> 요소에서 BLUETOOTH 권한을 요청해야 합니다. 레거시 앱의 경우 Google Play는 권한 선언이 기본 android.hardware.bluetooth 기능을 애플리케이션이 필요로 하고, 해당 기능에 따라 필터링을 설정함을 의미한다고 가정합니다. 표 2에는 <uses-feature> 요소에 선언된 것과 동일한 기능 요구사항을 암시하는 권한이 나열되어 있습니다.

선언된 android:required을 비롯한 <uses-feature> 선언은 항상 표 2의 권한이 암시하는 기능보다 우선합니다. 이러한 권한의 경우 <uses-feature> 요소에서 android:required="false" 특성을 사용하여 암시적 기능을 명시적으로 선언하여 암시적 기능에 기반한 필터링을 비활성화할 수 있습니다. 예를 들어, CAMERA 권한에 기반한 필터링을 비활성화하려면 다음 <uses-feature> 선언을 매니페스트 파일에 추가합니다.

<uses-feature android:name="android.hardware.camera" android:required="false" />

표 2. 기기 하드웨어 용도를 암시하는 기기 권한.

카테고리 권한 암시하는 기능 요구사항
블루투스 BLUETOOTH android.hardware.bluetooth

(자세한 내용은 블루투스 기능에 대한 특수 처리를 참조하세요.)

BLUETOOTH_ADMIN android.hardware.bluetooth
카메라 CAMERA android.hardware.camera
android.hardware.camera.autofocus
위치 ACCESS_MOCK_LOCATION android.hardware.location
ACCESS_LOCATION_EXTRA_COMMANDS android.hardware.location
INSTALL_LOCATION_PROVIDER android.hardware.location
ACCESS_COARSE_LOCATION android.hardware.location.network
android.hardware.location
ACCESS_FINE_LOCATION android.hardware.location.gps
android.hardware.location
마이크 RECORD_AUDIO android.hardware.microphone
전화통신 CALL_PHONE android.hardware.telephony
CALL_PRIVILEGED android.hardware.telephony
MODIFY_PHONE_STATE android.hardware.telephony
PROCESS_OUTGOING_CALLS android.hardware.telephony
READ_SMS android.hardware.telephony
RECEIVE_SMS android.hardware.telephony
RECEIVE_MMS android.hardware.telephony
RECEIVE_WAP_PUSH android.hardware.telephony
SEND_SMS android.hardware.telephony
WRITE_APN_SETTINGS android.hardware.telephony
WRITE_SMS android.hardware.telephony
Wi-Fi ACCESS_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_STATE android.hardware.wifi
CHANGE_WIFI_MULTICAST_STATE android.hardware.wifi