lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

앱 매니페스트

모든 애플리케이션에는 루트 디렉터리에 AndroidManifest.xml 파일(정확히 이 이름이어야 함)이 있어야 합니다. 매니페스트 파일에서는 Android 시스템이 앱의 코드를 실행하기 전에 확보해야 하는 앱에 대한 필수 정보를 시스템에 제공합니다.

이외에도 매니페스트 파일은 다음 작업을 수행합니다.

  • 애플리케이션에 대한 Java 패키지의 이름을 지정합니다. 이 패키지 이름은 애플리케이션에 대한 고유한 식별자 역할을 합니다.
  • 액티비티, 서비스, 브로드캐스트 수신기 및 콘텐츠 제공자 등 애플리케이션을 이루는 구성 요소를 설명합니다. 또한, 각 구성 요소를 구현하는 클래스의 이름을 지정하고 클래스가 처리할 수 있는 해당 기능(예: Intent 메시지)을 게시합니다. 이러한 선언은 Android 시스템에 구성 요소와 구성 요소가 실행될 수 있는 조건을 알립니다.
  • 애플리케이션 구성 요소를 호스팅하는 프로세스를 결정합니다.
  • 애플리케이션이 API의 보호된 부분에 액세스하여 다른 애플리케이션과 상호 작용하는 데 보유해야 하는 권한을 선언합니다. 또한, 다른 애플리케이션이 이 애플리케이션의 구성 요소와 상호작용하기 위해 보유해야 하는 권한도 선언합니다.
  • 애플리케이션이 실행 중일 때 프로파일링과 기타 정보를 제공하는 Instrumentation 클래스를 나열합니다. 이러한 선언은 애플리케이션이 개발 중인 동안에만 매니페스트에 존재하고, 애플리케이션이 게시되기 전에 삭제됩니다.
  • 애플리케이션이 필요로 하는 Android API의 최소 레벨을 선언합니다.
  • 애플리케이션이 연결되어야 하는 라이브러리를 나열합니다.

참고: Chromebook에서 실행할 Android 앱을 준비할 때 고려해야 할 몇 가지 중요한 하드웨어 및 소프트웨어 기능과 관련한 제한 사항이 있습니다. 자세한 내용은 Chromebook에 대한 앱 매니페스트 호환성 문서를 참조하세요.

매니페스트 파일 구조

아래에 나와 있는 코드 스니펫은 매니페스트 파일의 일반적인 구조와 매니페스트 파일에 들어 있을 수 있는 모든 요소를 보여줍니다. 각 요소와 각각의 특성을 모두 문서화한 전문은 별도의 파일에서 확인하실 수 있습니다.

: 이 문서에 언급된 요소에 대한 자세한 정보를 보려면 해당 요소 이름을 간단히 클릭하면 됩니다.

매니페스트 파일의 예는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />  
    <uses-feature />  
    <supports-screens />  
    <compatible-screens />  
    <supports-gl-texture />  

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>

다음 목록에는 매니페스트 파일에 나타날 수 있는 모든 요소가 사전순으로 나열되어 있습니다.

참고: 이 요소들만 허용됩니다. 개발자 자체적인 요소나 특성은 추가할 수 없습니다.

파일 규칙

이 섹션에서는 매니페스트 파일에 포함되는 모든 요소 및 특성에 일반적으로 적용되는 규칙에 대해 설명합니다.

요소
<manifest><application> 요소만 필수입니다. 이 요소는 모두 제공되어야 하며 한 번만 나올 수 있습니다. 다른 요소 대부분은 여러 번 나오거나 전혀 나오지 않아도 됩니다. 하지만, 매니페스트 파일이 유용하려면 이러한 요소 중 적어도 일부가 제공되어야 합니다.

요소에 무엇이든 들어있기만 하면, 그 요소는 다른 요소를 포함하고 있는 것입니다. 모든 값은 요소 내의 문자 데이터로서가 아니라 특성을 통해 설정됩니다.

같은 레벨에 있는 여러 요소는 보통 순서가 지정되지 않습니다. 예를 들어 <activity>, <provider><service> 요소는 어떤 순서로든 서로 섞여도 됩니다. 이 규칙에는 두 가지 중요한 예외 사항이 있습니다.

  • <activity-alias> 요소는 이 요소를 별칭으로 사용하는 <activity> 다음에 와야 합니다.
  • <application> 요소는 <manifest> 요소 내부에 있는 마지막 요소여야 합니다. 다시 말해, </application> 닫는 태그가 </manifest> 닫는 태그 바로 앞에 와야 합니다.
특성
공식적인 의미에서 모든 특성은 선택 항목입니다. 하지만, 요소가 특성이 가진 용도를 실현할 수 있도록 지정되어야 하는 일부 특성이 있습니다. 관련 문서를 지침으로 사용하세요. 정말로 선택 항목인 특성에 대해서는 기본값이 언급되어 있거나 지정하지 않을 경우 어떠한 동작이 수행되는지에 대한 설명이 나와 있습니다.

루트 <manifest> 요소의 몇 가지 특성을 제외하고 모든 특성 이름은 접두사 android:로 시작됩니다. 예를 들어 android:alwaysRetainTaskState와 같습니다. 이 접두사는 범용이기 때문에 특성을 이름으로 참조하는 경우 관련 문서에서 이를 생략하는 경우가 일반적입니다.

클래스 이름 선언
대다수의 요소가 Java 객체에 해당합니다. 여기에는 애플리케이션 자체에 대한 요소(<application> 요소)와 해당 주 구성 요소, 즉 액티비티 (<activity>), 서비스(<service>), 브로드캐스트 수신기(<receiver>) 및 콘텐츠 제공자(<provider>)에 대한 요소가 포함됩니다.

구성 요소 클래스(Activity, Service, BroadcastReceiverContentProvider)에 대해 거의 항상 그렇듯이 서브클래스를 정의하는 경우 서브클래스는 name 특성을 통해 선언합니다. 이름에는 완전한 패키지 지정이 포함되어야 합니다. 예를 들어, Service 서브클래스를 선언하려면 다음과 같이 할 수 있습니다.

<manifest . . . >
    <application . . . >
        <service android:name="com.example.project.SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

그러나 문자열의 첫 번째 문자가 마침표이면 애플리케이션 패키지 이름이 (<manifest> 요소의 package 특성에서 지정한 대로) 이 문자열에 추가됩니다. 다음 할당은 위에 표시된 것과 동일합니다.

<manifest package="com.example.project" . . . >
    <application . . . >
        <service android:name=".SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

Android 시스템은 구성 요소를 시작할 때 명명된 서브클래스의 인스턴스를 생성합니다. 서브클래스가 지정되지 않은 경우, 기본 클래스의 인스턴스를 생성합니다.

여러 개의 값
둘 이상의 값을 지정할 수 있는 경우, 한 요소 안에 여러 값이 나열되지 않고 해당 요소가 거의 항상 반복됩니다. 예를 들어 한 인텐트 필터가 여러 개의 작업을 나열할 수 있습니다.
<intent-filter . . . >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    . . .
</intent-filter>
리소스 값
몇몇 특성에는 액티비티에 대한 레이블 및 아이콘과 같이 사용자에게 표시될 수 있는 값이 있습니다. 이러한 특성의 값은 리소스나 테마에서 현지화되고 설정되어야 합니다. 리소스 값은 다음과 같은 형식으로 표현됩니다.

@[<i>package</i>:]<i>type</i>/<i>name</i>

리소스가 애플리케이션과 동일한 패키지에 있을 경우 package 이름을 생략할 수 있습니다. type은 리소스 유형(예: string 또는 drawable)이고 name은 특정 리소스를 식별하는 이름입니다. 다음은 이에 대한 예입니다.

<activity android:icon="@drawable/smallPic" . . . >

테마에서 설정하는 값은 이와 유사하게 표현되지만 @ 대신 ?를 시작 문자로 사용합니다.

?[<i>package</i>:]<i>type</i>/<i>name</i>

문자열 값
특성 값이 문자열인 경우, 문자를 이스케이프 처리하려면 이중 백슬래시(\\)를 사용해야 합니다(예: 줄바꿈의 경우 \\n 또는 유니코드 문자의 경우 \\uxxxx).

파일 기능

다음 섹션에서는 몇 가지 Android 기능이 매니페스트 파일에 반영되는 방법을 설명합니다.

인텐트 필터

애플리케이션의 핵심 구성 요소(액티비티, 서비스 및 브로드캐스트 수신기)는 인텐트에 의해 활성화됩니다. 인텐트는 원하는 작업을 설명하는 정보 묶음입니다(Intent 객체). 여기에는 작업을 수행할 데이터, 작업을 수행해야 하는 구성 요소의 범주 및 기타 관련 지침 등이 포함됩니다. Android 시스템은 인텐트에 응답할 수 있는 적절한 구성 요소를 찾아 필요한 경우 구성 요소의 새 인스턴스를 시작하고, 이것을 Intent 객체에 전달합니다.

구성 요소는 인텐트 필터를 통해 응답할 수 있는 인텐트 유형을 알립니다. Android 시스템은 구성 요소를 시작하기 전에 해당 구성 요소가 처리할 수 있는 인텐트에 대해 알아야 하기 때문에 인텐트 필터를 매니페스트 파일에서 <intent-filter> 요소로 지정합니다. 하나의 구성 요소에 있을 수 있는 필터의 수에는 어떠한 제한도 없으며, 각각 다른 기능을 설명합니다.

대상 구성 요소를 명시적으로 지명하는 인텐트가 해당 구성 요소를 활성화합니다. 따라서 필터는 아무런 역할도 하지 않습니다. 하지만 이름으로 대상을 지정하지 않는 인텐트는 구성 요소의 필터 중 하나를 통과할 수 있는 경우에만 해당 구성 요소를 활성화할 수 있습니다.

Intent 객체가 인텐트 필터에 대해 테스트되는 방식에 대한 자세한 내용은 인텐트 및 인텐트 필터 문서를 참조하세요.

아이콘 및 레이블

대다수의 요소에는 사용자에게 표시될 수 있는 작은 아이콘 및 텍스트 레이블을 나타내는 iconlabel 특성이 있습니다. 몇몇 요소에는 화면에 표시될 수 있는 좀 더 긴 설명 텍스트를 나타내는 description 특성도 있습니다. 예를 들어 <permission> 요소는 이와 같은 특성을 세 개 모두 가지고 있으므로 사용자에게 이를 요청한 애플리케이션에 권한을 부여할지 여부를 물을 때 권한을 나타내는 아이콘, 권한 이름 및 이에 수반되는 내용에 대한 설명이 모두 사용자에게 표시됩니다.

어떤 경우에든, 포함하는 요소에 설정된 아이콘과 레이블이 해당 컨테이너의 모든 하위 요소에 대한 기본 iconlabel 설정이 됩니다. 이와 같이 <application> 요소에 설정된 아이콘과 레이블이 애플리케이션의 각 구성 요소에 대한 기본 아이콘과 레이블이 됩니다. 이와 유사하게, 구성 요소(예: <activity> 요소)에 대해 설정된 아이콘과 레이블이 각 구성 요소의 <intent-filter> 요소에 대한 기본 설정입니다. <application> 요소가 레이블을 설정하지만 액티비티와 그 인텐트 필터는 이를 설정하지 않는 경우, 애플리케이션 레이블이 액티비티와 인텐트 필터 양쪽 모두의 레이블인 것으로 취급됩니다.

인텐트 필터에 대해 설정된 아이콘과 레이블은 구성 요소가 사용자에게 표시되어 필터가 알리는 기능을 이행할 때마다 구성 요소를 나타냅니다. 예를 들어 android.intent.action.MAINandroid.intent.category.LAUNCHER가 설정된 필터는 애플리케이션을 초기화하는 항목으로 액티비티를 알립니다. 즉, 애플리케이션 런처에 표시되어야 하는 항목으로 알립니다. 필터에 설정된 아이콘과 레이블은 런처에 표시됩니다.

권한

권한은 기기에서 코드의 일부분이나 데이터로 액세스를 한정하는 제한입니다. 이러한 제한을 부과하는 것은 중요한 데이터와 코드를 보호하여 이들이 남용되어서 사용자 환경을 왜곡하거나 손상시키지 않도록 하기 위해서입니다.

각 권한은 고유한 레이블로 식별됩니다. 레이블은 대개 제한되는 작업을 나타냅니다. 다음은 Android에서 정의한 몇 가지 권한입니다.

  • android.permission.CALL_EMERGENCY_NUMBERS
  • android.permission.READ_OWNER_DATA
  • android.permission.SET_WALLPAPER
  • android.permission.DEVICE_POWER

하나의 기능은 하나의 권한으로만 보호될 수 있습니다.

애플리케이션이 권한으로 보호되는 기능에 액세스해야 하는 경우, 매니페스트에 <uses-permission> 요소를 사용하여 해당 권한이 필요하다는 것을 선언해야 합니다. 그러면 애플리케이션이 기기에 설치될 때 설치 프로그램이 애플리케이션의 인증서에 서명한 인증 기관을 확인하고, 경우에 따라 사용자에게 묻는 방식으로 요청된 권한을 부여할지 여부를 결정합니다. 권한이 부여되면 애플리케이션이 보호된 기능을 사용할 수 있습니다. 부여되지 않으면, 그러한 기능에 액세스하려는 시도가 실패하고 사용자에게는 아무런 알림도 표시되지 않습니다.

애플리케이션이 권한을 사용하여 자체적인 구성 요소를 보호할 수도 있습니다. Android에서 정의했거나(android.Manifest.permission에 나열됨) 다른 애플리케이션에서 선언한 권한은 무엇이든 사용할 수 있습니다. 또한 자체적으로 정의할 수도 있습니다. 새 권한을 선언할 때에는 <permission> 요소를 사용합니다. 예를 들어 액티비티를 보호하려면 다음과 같이 하면 됩니다.

<manifest . . . >
    <permission android:name="com.example.project.DEBIT_ACCT" . . . />
    <uses-permission android:name="com.example.project.DEBIT_ACCT" />
    . . .
    <application . . .>
        <activity android:name="com.example.project.FreneticActivity"
                  android:permission="com.example.project.DEBIT_ACCT"
                  . . . >
            . . .
        </activity>
    </application>
</manifest>

참고로, 이 예시에서는 DEBIT_ACCT 권한이 <permission> 요소를 사용하여 선언되었을 뿐만 아니라, 이에 대한 사용도 <uses-permission> 요소를 사용하여 요청되었습니다. 이렇게 사용을 요청해야만 애플리케이션의 다른 구성 요소가 보호된 액티비티를 시작할 수 있습니다. 이는 애플리케이션이 자체적으로 보호를 적용한 경우에도 해당됩니다.

위에 표시된 예시를 계속 참고하여, permission 특성이 다른 곳에서 선언된 권한으로 설정된 경우(예: android.permission.CALL_EMERGENCY_NUMBERS), <permission> 요소를 사용하여 이를 다시 선언할 필요가 없습니다. 하지만 해당 권한의 사용은 여전히 <uses-permission>을 사용하여 요청해야 합니다.

<permission-tree> 요소는 코드에 정의된 권한 그룹에 대한 네임스페이스를 선언하고 <permission-group><permission> 요소를 사용하여 매니페스트에 선언된 권한 집합과 다른 곳에서 선언된 권한 집합 모두에 대한 레이블을 정의합니다. 이것은 권한이 사용자에게 표시될 때 그룹화되는 방식에만 영향을 미칩니다. <permission-group> 요소는 그룹에 속하는 권한을 지정하지는 않지만, 그룹에 이름을 제공합니다. 그룹에 권한을 배치하려면 그룹 이름을 <permission> 요소의 permissionGroup 특성에 할당하면 됩니다.

라이브러리

모든 애플리케이션은 기본 Android 라이브러리에 연결되어 있습니다. 여기에는 애플리케이션 빌드를 위한 기본적인 패키지(액티비티, 서비스, 인텐트, 뷰, 버튼, 애플리케이션, ContentProvider 등 보편적인 클래스 포함)가 포함되어 있습니다.

그러나 패키지 가운데에는 자신만의 라이브러리에 속한 것도 있습니다. 애플리케이션이 사용하는 코드의 출처가 이러한 패키지 가운데 어느 한 가지에 해당되는 경우, 해당 패키지에 연결되도록 명시적으로 요청해야만 합니다. 매니페스트에는 각 라이브러리의 이름을 지정하는 개별 <uses-library> 요소가 들어 있어야 합니다. 패키지 관련 문서에서 라이브러리 이름을 확인할 수 있습니다.