Google Play는 앱 매니페스트에 선언된 <uses-feature> 요소를 사용하여 하드웨어 및 소프트웨어 기능 요구사항을 충족하지 않는 기기에서 앱을 필터링합니다.

애플리케이션에 필요한 기능을 지정하면 Google Play에서 모든 사용자가 아니라 애플리케이션의 기능 요구사항을 충족하는 기기 사용자에게만 애플리케이션을 제공하도록 사용 설정할 수 있습니다.

Google Play에서 필터링 기준으로 기능을 사용하는 방법에 관한 중요한 정보는 아래의 Google Play 및 기능 기반 필터링을 참고하세요.

구문:
<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에서 비교하는 항목은 다음과 같습니다.

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

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

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

Google Play 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> 요소에 선언한 기능입니다. API 수준 5 이상에 컴파일하는 경우 기능 선언이 android:required=["true" | "false"] 속성을 포함할 수 있습니다. 개발자는 이 속성을 통해 기능을 애플리케이션이 제대로 작동하기 위한 필수 요건으로 지정하거나("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 스튜디오에서 개발 중인 경우 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 도구 r8 이상을 사용 중인 경우 <SDK>/build-tools/<tools version number> 디렉터리에서 aapt를 찾을 수 있습니다.

    참고: 사용 가능한 최신 Build-Tools 구성요소용으로 제공되는 버전의 aapt를 사용해야 합니다. 최신 Build-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.hardware"로 시작)을 android:name 속성에서 선언합니다. 하드웨어 기능을 선언할 때마다 개별 <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_MATRIXandroid.colorCorrection.transform, android.colorCorrection.gains, android.colorCorrection.mode를 사용합니다.

android.hardware.camera.capability.manual_sensor

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

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

android.hardware.camera.capability.raw

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

이 기능은 기기가 DNG(원시) 파일을 저장할 수 있고 기기의 카메라가 이 RAW 이미지를 직접 처리하는 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(Code Division Multiple Access) 전화통신 무선 시스템을 사용합니다.

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

android.hardware.telephony.gsm

앱이 GSM(Global System for Mobile Communications) 전화통신 무선 시스템을 사용합니다.

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

터치스크린 하드웨어 기능

android.hardware.faketouch

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

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

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

참고: 앱에는 기본적으로 android.hardware.faketouch 기능이 필요합니다. 앱을 터치스크린이 있는 기기에서만 사용하도록 제한하려면 다음과 같이 터치스크린이 필요하다고 명시적으로 선언해야 합니다.

<uses-feature android:name="android.hardware.touchscreen"
    android:required="true" />

android.hardware.touchscreen을 명시적으로 요구하지 않는 모든 앱은 android.hardware.faketouch가 있는 기기에서도 작동합니다.

<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

앱이 플링과 같은 기본 터치 이벤트보다 상호작용이 많은 동작에 기기의 터치스크린 기능을 사용합니다. 이 기능은 android.hardware.faketouch 기능의 상위 집합입니다.

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

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

여러 손가락 동작과 같은 훨씬 복잡한 터치 상호작용이 필요한 경우 앱이 고급 터치스크린 기능을 사용함을 선언해야 합니다.

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 호스트 역할을 합니다.

Vulkan 하드웨어 기능

android.hardware.vulkan.compute
앱이 Vulkan 컴퓨팅 기능을 사용합니다. 이 기능은 앱에 하드웨어 가속 Vulkan 구현이 필요하다는 것을 나타냅니다. 기능 버전은 Vulkan 1.0 요구사항 이상으로 앱에 필요한 선택적 컴퓨팅 기능의 수준을 나타냅니다. 예를 들어 앱에 Vulkan 컴퓨팅 수준 0의 지원이 필요하다면 다음과 같은 기능을 선언해야 합니다.
<uses-feature
    android:name="android.hardware.vulkan.compute"
    android:version="0"
    android:required="true" />
기능 버전에 관한 자세한 내용은 FEATURE_VULKAN_HARDWARE_COMPUTE를 참고하세요.
android.hardware.vulkan.level
앱이 Vulkan 수준 기능을 사용합니다. 이 기능은 앱에 하드웨어 가속 Vulkan 구현이 필요하다는 것을 나타냅니다. 기능 버전은 앱에 필요한 선택적 하드웨어 기능의 수준을 나타냅니다. 예를 들어 앱에 Vulkan 하드웨어 수준 0의 지원이 필요하다면 다음과 같은 기능을 선언해야 합니다.
<uses-feature
    android:name="android.hardware.vulkan.level"
    android:version="0"
    android:required="true" />
기능 버전에 관한 자세한 내용은 FEATURE_VULKAN_HARDWARE_LEVEL을 참고하세요.
android.hardware.vulkan.version
앱이 Vulkan을 사용합니다. 이 기능은 앱에 하드웨어 가속 Vulkan 구현이 필요하다는 것을 나타냅니다. 기능 버전은 앱에 필요한 Vulkan API 지원의 최소 버전을 나타냅니다. 예를 들어 앱에 Vulkan 1.0 지원이 필요하다면 다음과 같은 기능을 선언해야 합니다.
<uses-feature
    android:name="android.hardware.vulkan.version"
    android:version="0x400003"
    android:required="true" />
기능 버전에 관한 자세한 내용은 FEATURE_VULKAN_HARDWARE_VERSION을 참고하세요.

Wi-Fi 하드웨어 기능

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

소프트웨어 기능

이 섹션에서는 현재 플랫폼 버전 대부분이 지원하는 소프트웨어 기능을 소개합니다. 앱이 소프트웨어 기능을 사용하거나 필요로 함을 나타내려면 해당 값("android.software"로 시작)을 android:name 속성에 선언합니다. 소프트웨어 기능을 선언할 때마다 개별 <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
앱이 Android TV 기기에서 실행하도록 설계되었습니다.
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)에 추가되었지만 이를 참조하는 블루투스 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" />

주의: 앱이 Android 5.0(API 수준 21) 이상을 타겟팅하고 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION 권한을 사용하여 네트워크 또는 GPS로부터 각각 위치 업데이트를 수신할 경우, 앱이 android.hardware.location.network 또는 android.hardware.location.gps 하드웨어 기능을 사용한다고 명시적으로 선언해야 합니다.

표 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

android.hardware.location.network(대상 API 수준이 20 이하인 경우만)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps(대상 API 수준이 20 이하인 경우만)

마이크 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