page.title=앱 매니페스트 @jd:body
모든 애플리케이션에는 루트 라이브러리에 AndroidManifest.xml 파일(정확히 이 이름으로)이 있어야 합니다. 매니페스트 파일은 Android 시스템에 대한 여러분의 앱 관련 필수 정보를 나타냅니다. 즉 앱의 코드를 실행하기 전에 시스템이 반드시 필요로 하는 정보를 말합니다. 매니페스트가 하는 일에는 여러 가지가 있지만, 그 중에서 몇 가지만 소개하면 다음과 같습니다.
아래의 다이어그램은 매니페스트 파일의 일반적인 구조와 매니페스트 파일에 들어있을 수 있는 모든 요소를 표시한 것입니다. 각 요소와 각각의 속성을 모두 문서화한 전문은 별도의 파일에서 확인하실 수 있습니다. 어떤 요소에 대해서든 상세한 정보를 보려면 다이어그램에서 해당 요소 이름을 클릭하십시오. 이름은 다이어그램 뒤에 나오는 요소 목록(알파벳 순) 또는 요소 이름이 언급되는 기타 영역 어디서든 클릭할 수 있습니다.
<?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>
매니페스트 파일에 표시될 수 있는 모든 요소는 아래에 알파벳 순서로 목록으로 표시되어 있습니다. 합법적인 요소는 이들이 전부입니다. 개발자 나름대로 요소 또는 속성을 추가해서는 안 됩니다.
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
몇몇 규칙과 규정은 매니페스트 내의 모든 요소와 속성에 전반적으로 적용됩니다.
<manifest>
및
<application>
요소뿐으로,
이들은 각기 따로 표시되어야 하며 한 번씩만 발생할 수 있습니다.
나머지는 대부분 여러 번 발생할 수 있거나 전혀 발생하지 않기도 합니다. 다만,
그 중 최소한 몇몇은 있어야 매니페스트가 무엇이든 의미 있는 작업을
달성할 수 있습니다.
요소에 무엇이든 들어있기만 하면 다른 요소가 그 요소에 들어 있는 것입니다. 모든 값은 요소 내의 문자 데이터로서가 아니라 속성을 통해 설정됩니다.
같은 레벨에 있는 여러 요소는 보통 순서가 지정되지 않습니다. 예를 들어
<activity>
,
<provider>
및
<service>
요소는 어떤 순서로든 서로 섞여도 됩니다 (이 규칙에서
<activity-alias>
요소는 예외입니다. 이것은
<activity>
의 별칭이므로
이를 반드시 따라야 합니다).
루트
<manifest>
요소의 몇 가지 속성을 제외하고 모든 속성 이름은 {@code android:alwaysRetainTaskState} 접두사로 시작합니다.
예를 들어, {@code android:}와 같습니다. 이 접두사는 범용이기 때문에
속성을 이름으로 참조하는 경우 관련 문서가 이를 생략하는 경우가
일반적입니다.
<application>
요소), 그것의 주 구성 요소도 포함됩니다. 즉, 액티비티
(<activity>
),
서비스
(<service>
),
브로드캐스트 수신기
(<receiver>
) 및
콘텐츠 제공자
(<provider>
) 등이 이에 해당됩니다.
하위 클래스를 정의하는 경우 구성 요소 클래스 ({@link android.app.Activity}, {@link android.app.Service}, {@link android.content.BroadcastReceiver} 및 {@link android.content.ContentProvider})는 거의 항상 이렇게 하게 되는데, 이때 하위 클래스는 {@code name} 속성을 통해 선언됩니다. 이 이름에 반드시 완전한 패키지 지정이 포함되어 있어야 합니다. 예를 들어, {@link android.app.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>
{@code @[패키지:]유형:이름}
여기에서 패키지 이름은 리소스가 애플리케이션과 같은 패키지에 있으면 생략할 수 있고, 유형 은 "문자열" 또는 "그릴 수 있음" 같은 리소스 유형입니다. 그리고 이름 은 특정 리소스를 식별하는 이름입니다. 예:
<activity android:icon="@drawable/smallPic" . . . >
테마에서 가져온 값도 비슷한 방식으로 표현되지만, 처음 부분에 '{@code ?}'를 사용합니다 ('{@code @}' 대신).
{@code ?[패키지:]유형:이름}
다음 섹션에서는 Android 기능을 매니페스트 파일에 반영하는 몇 가지 방식을 설명합니다.
애플리케이션의 핵심 구성 요소(액티비티, 서비스 및 브로드캐스트 수신기)를 활성화하는 것은 인텐트입니다. 인텐트는 원하는 작업을 설명하는 정보 묶음입니다({@link android.content.Intent} 객체). 여기에는 작업을 수행할 데이터, 작업을 수행할 구성 요소의 카테고리와 기타 관련 지침 등이 포함됩니다. Android는 인텐트에 응답할 적절한 구성 요소를 찾아 필요한 경우 구성 요소의 새 인스턴스를 시작하고, 이것을 인텐트 객체에 전달합니다.
구성 요소는 자신의 능력을 알립니다. 즉, 자신이 응답할 수 있는
인텐트 종류를 밝힙니다. 이때 사용하는 것이 인텐트 필터입니다. Android 시스템은
구성 요소를 시작하기 전에 해당 구성 요소가 처리할 수 있는 인텐트에 대해 학습해야 하기 때문에,
인텐트 필터는 매니페스트 파일에
<intent-filter>
요소로 지정됩니다. 구성 요소 하나에 필터는 얼마든지 있을 수 있으며, 각각 서로 다른 기능을
설명하게 됩니다.
대상 구성 요소를 명시적으로 지명하는 인텐트가 해당 구성 요소를 활성화합니다. 필터는 아무런 역할을 하지 않습니다. 하지만 대상을 이름으로 지정하지 않는 인텐트의 경우에는 자신이 구성 요소의 필터 중 하나를 통과할 수 있을 때에만 해당 구성 요소를 활성화할 수 있습니다.
인텐트 객체를 인텐트 필터에 대해 테스트하는 방법에 대한 자세한 방법은 별도의 문서인 인텐트 및 인텐트 필터를 참조하십시오.
대다수의 요소에 {@code icon}과 {@code label} 속성이 있으며
이것으로 사용자에게 표시될 수 있는 작은 아이콘과 텍스트 레이블을 나타냅니다. 몇몇 요소에는
{@code description} 속성도 있어 좀 더 긴 설명 텍스트를 나타낼 수 있고, 이것 또한 화면에
표시될 수 있습니다. 예를 들어
<permission>
요소는 이와 같은 속성을 셋 모두 가지고 있어 사용자가 이를 요청한 애플리케이션에 대한
권한을 허가할 것인지 여부를 물으면 해당 권한,
권한의 이름과 그에 수반되는 내용에 대한 설명을
사용자에게 표시할 수 있습니다.
어떤 경우에든, 요소에서 설정된 아이콘과 레이블이 해당 컨테이너의 모든 하위 요소에 대한 기본
{@code icon}과 {@code label} 설정이 됩니다.
따라서
<application>
요소에서 설정된 아이콘과 레이블이 애플리케이션의 각 요소에 대한 기본 아이콘과 레이블입니다.
이와 유사하게, 구성 요소에 대해 설정된 아이콘과 레이블이 — 예를 들어
<activity>
요소 — 각 구성 요소의
<intent-filter>
요소에 대한 기본 설정입니다.
<application>
요소가 레이블을 설정하지만 액티비티와 그 인텐트 필터는 이를 설정하지 않는 경우,
애플리케이션 레이블을 액티비티와 인텐트 필터 양쪽 모두의 레이블인 것으로
취급합니다.
인텐트 필터에 대해 설정된 아이콘과 레이블은 구성 요소가 사용자에게 표시될 때마다 구성 요소를 나타내는 데 사용되며, 이는 필터가 알린 기능을 충족하는 것입니다. 예를 들어 "{@code android.intent.action.MAIN}" 및 "{@code android.intent.category.LAUNCHER}"가 설정된 필터는 액티비티를 애플리케이션을 초기화하는 주역으로 알립니다. 다시 말해, 애플리케이션 시작 관리자에 표시되어야 하는 것이 됩니다. 따라서 필터에서 설정된 아이콘과 레이블이 시작 관리자에 표시되는 아이콘과 레이블입니다.
통상 권한 이란 기기에서 코드의 일부분 또는 데이터에 대한 액세스를 한정하는 제한입니다. 이런 한계를 부과하는 것은 중요한 데이터와 코드를 보호하여 이들이 남용되어서 사용자 환경을 왜곡하거나 손상시키지 않도록 하기 위해서입니다.
각 권한은 고유한 레이블로 식별할 수 있습니다. 레이블을 보면 자신이 어떤 작업을 제한하는지 나타내는 경우가 잦습니다. 예를 들어 다음은 Android가 정의하는 몇 가지 권한을 나타낸 것입니다.
{@code android.permission.CALL_EMERGENCY_NUMBERS}
{@code android.permission.READ_OWNER_DATA}
{@code android.permission.SET_WALLPAPER}
{@code android.permission.DEVICE_POWER}
하나의 기능을 보호하는 데에는 권한 하나면 충분합니다.
애플리케이션에서 권한으로 보호하는 기능에 액세스해야 하는 경우,
해당 권한이 필요하다고 매니페스트의
<uses-permission>
요소로 선언해야 합니다. 그런 다음, 해당 애플리케이션이 기기에 설치되고 나면
설치 관리자가 요청한 권한을 허가할지 여부를 판별합니다.
이때 애플리케이션의 인증서를 서명한 권한을 확인하고 어떤 경우에는 사용자에게
묻기도 합니다.
권한이 허가되면 해당 애플리케이션은 보호된 기능을 사용할 수
있습니다. 허가되지 않으면, 그러한 기능에 액세스하려는 애플리케이션의 시도가 단순히 실패하고 사용자에게는
아무런 알림도 표시되지 않습니다.
애플리케이션은 권한을 사용하여 자신의 구성 요소를(액티비티, 서비스,
브로드캐스트 수신기 및 콘텐츠 제공자) 보호할 수도 있습니다. Android가 정의한
권한이라면 어떤 것이든 사용할 수 있고(
{@link android.Manifest.permission 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>
이 예시에서는 {@code DEBIT_ACCT} 권한이
<permission>
요소로 선언하였을 뿐만 아니라, 해당 권한의 사용 또한
<uses-permission>
요소로 요청되었다는 점을 눈여겨 보십시오. 이것의 사용을 요청해야 애플리케이션의 다른 구성 요소가 보호된
액티비티를 시작할 수 있습니다. 이는 해당 보호를 애플리케이션 자신이 부과한 것이더라도
관계 없이 적용됩니다.
같은 예시에서, {@code permission} 속성이 다른 곳에서
선언한 권한에 설정된 경우
(예: {@code android.permission.CALL_EMERGENCY_NUMBERS}), 이것을
<permission>
요소를 사용하여 다시 선언할 필요가 없습니다. 하지만 해당 권한의 사용은 여전히
<uses-permission>
로 요청해야 합니다.
<permission-tree>
요소는 코드로 정의될 권한 그룹에 대한 네임스페이스를
선언합니다. 그리고
<permission-group>
가 권한 집합에 대한 레이블을 정의합니다(매니페스트에
<permission>
요소로 선언한 것과 다른 곳에서 선언한 것 양쪽 모두). 이것은 권한이 사용자에게 표시될 때
그룹 지정될 방식에만 영향을 미칩니다.
<permission-group>
요소는 그룹에 어느 권한이 속해 있는지 지정하는 것이 아니라, 그저
그룹에 이름을 부여할 뿐입니다. 그룹에 권한을 배치하려면 그룹 이름을
<permission>
요소의
permissionGroup
속성에 할당하면 됩니다.
모든 애플리케이션은 기본 Android 라이브러리에 연결되어 있습니다. 여기에는 애플리케이션 구축을 위한 기본적인 패키지(액티비티, 서비스, 인텐트, 보기, 버튼, 애플리케이션, ContentProvider 등 보편적인 클래스 포함)가 포함되어 있습니다.
그러나 패키지 가운데에는 자신만의 라이브러리에 속한 것도 있습니다. 애플리케이션이
사용하는 코드의 출처가 이러한 패키지 가운데 어느 한 가지에 해당되는 경우, 해당 패키지에 연결되도록
명시적으로 요청해야만 합니다. 매니페스트에는 별도의
<uses-library>
요소가 들어 있어 각 라이브러리의 이름을 나타내야 합니다 (라이브러리 이름은 패키지에 대한
관련 문서에서 찾을 수 있습니다).