본문 바로가기

어플리케이션 구성/AndroidManifest.xml

메니페스트 파일, 너는 누구냐?

안드로이드 프로젝트에는 꼭 하나의 메니페스트 파일이 있습니다.
메니페스트 파일은 어플리케이션에 대한 전반적인 정보를 담고 있는 파일로, 안드로이드 시스템에서 어플리케이션의 정보를 알아내는데 사용합니다. 따라서 이 메니페스트 파일 안에는 어플리케이션 컴포넌트(액티비티, 서비스 등..) 뿐 아니라 어플리케이션 이름, 사용하는 라이브러리 등에 대한 모든 정보들이 포함되어 있죠. 
즉, 메니페스트 파일은 어플리케이션의 "프로필"과 같은 역할을 한다고 보시면 됩니다.

이번 글에서는 안드로이드 어플리케이션의 메니페스트 파일에 대해 다뤄보도록 하겠습니다. 메니페스트 파일의 모든 요소를 다루는 것은 아니고, 주요 구성요소에 대해서만 다루도록 하겠습니다.

이클립스 ADT에서는 메니패스트 파일의 각종 항목들을 쉽게 설정할 수 있도록 아래와 같은 환경을 제공합니다.


GUI 설정 메뉴는 크게 Manifest, Application, Permissions, Instrumentation으로 구성되어 있으며, AndroidManifest.xml 탭을 클릭하면 실제로 코드를 보면서 수정할 수 있게 되어있습니다. 그럼, 코드를 보면서 메니페스트 파일에는 어떤 것들이 들어가는지 알아보도록 하겠습니다.

<manifest> 태그

안드로이드 메니페스트 파일은 레이아웃 파일과 유사하게 <manifest> 태그가 전체를 감싸는 구조를 하고 있습니다.
이 manifest 태그의 안에 아래에서 다루게 될 application 태그, uses-permission 태그 등이 들어가게 됩니다.

manifest 태그의 속성으로는 여기에서 사용할 네임스페이스를 지정해주는 xmlns:android 속성, 어플리케이션의 패키지명 및 버전 등이 있습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.androidhuman.HelloAndroid"
      android:versionCode="1"
      android:versionName="1.0">
      [ 어플리케이션 태그 및 Permission 태그들... ]
</manifest>

<application> 태그

메니페스트 파일에는 단 한개의 어플리케이션 태그가 있습니다. 이는 어플리케이션에 대한 정보 (어플리케이션 이름, 아이콘, 테마 등) 뿐 아니라 어플리케이션 내의 컴포넌트들에 대한 태그들을 포함합니다.

<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".HelloAndroid"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

1. <activity> 태그

어플리케이션 내의 각 액티비티마다 이 activity 태그가 필요합니다. activity 태그에는 액티비티의 이름, 클래스 이름 및 액티비티가 받을 수 있는 인텐트가 정의되어 있는 인텐트 필터를 포함합니다. 메니페스트 파일에 액티비티가 정의되어 있지 않다면 해당 액티비티를 실행시킬 수 없으므로 (런타임 오류가 발생합니다) 꼭 메니페스트 파일에 액티비티를 정의해주어야 합니다.

<activity android:name=".HelloAndroid"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2. <service> 태그

액티비티와 마찬가지로 서비스 또한 액티비티와 마찬가지로 각 서비스마다 서비스 태그를 정의해주어야 하며, 서비스를 실행할 수 있는 인텐트가 정의된 인텐트 필터를 포함할 수 있습니다.

<service android:name=".app.RemoteService" android:process=":remote">
            <intent-filter>
                <action android:name="com.example.android.apis.app.IRemoteService" />
                <action android:name="com.example.android.apis.app.ISecondary" />
                <action android:name="com.example.android.apis.app.REMOTE_SERVICE" />
            </intent-filter>
        </service>

3. <provider> 태그

어플리케이션의 컨텐트 프로바이더 (Content Provider)를 등록하기 위해 사용합니다. 컨텐트 프로바이더는 어플리케이션 내의 데이터베이스를 다른 어플리케이션가 공유할 수 있도록 해주는 역할을 합니다. 

<provider android:name=".app.SearchSuggestionSampleProvider"
                  android:authorities="com.example.android.apis.SuggestionProvider" />

4. <receiver> 태그

어플리케이션이 브로드캐스트 메시지 (시스템의 상태정보에 관련된 메시지 : 인텐트로 구성됨)를 수신할 수 있도록 합니다. <receiver> 태그 안에 인텐트 필터를 정의하여 어떠한 브로드캐스트 메시지에 반응할지를 지정합니다.

<receiver android:name=".appwidget.ExampleAppWidgetProvider">
            <meta-data android:name="android.appwidget.provider"
                    android:resource="@xml/appwidget_provider" />
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
        </receiver>

<uses-permission> 태그

어플리케이션에 시스템의 여러가지 정보들 (위치정보, SMS 수신, 전화 걸기, 주소록 읽기, 인터넷 사용 등...)을 사용하기 위해서는 그에 해당하는 권한이 필요합니다. <uses-permission> 태그에는 이렇게 어플리케이션에서 필요한 권한들을 정의해줍니다. 여기에 정의된 권한은 어플리케이션 설치시 해당 어플리케이션이 어떤 권한을 요구하는지를 사용자에게 보여줍니다.

<uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />

<permission> 태그

컴포넌트를 사용하기 위한 권한 중 안드로이드에서 기본으로 제공하는 권한 외에 다른 권한이 필요할 경우, 이 태그를 이용하여 새 권한을 만들어줄 수 있습니다. 

<permission android:name="com.androidhuman.DESTROY_PHONE"
    android:protectionLevel="dangerous"
    android:label="Destroy Phone"
    android:description="Boom!"
</permission>

<permission> 태그의 선언은 해당 permission으로 보호된 어플리케이션 컴포넌트에 접근하기 위해 해당 컴포넌트에 접근하려는 어플리케이션에서 포함해야 하는 내용이고, 실제로 위의 권한으로 어플리케이션 컴포넌트를 보호하려면 아래와 같이 컴포넌트의 속성 중 permission에 해당 권한을 추가해주면 됩니다.

<activity android:name=".HelloAndroid"
                  android:label="@string/app_name" 
                  android:permission="com.androidhuman.DESTROY_PHONE">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

여기까지 안드로이드 메니페스트 파일의 구성요소들에 대해 간략히 알아보았습니다. 이 정도면 메니페스트 파일이 무엇인가? 에 대해 어느 정도 감은 오리라 생각합니다. 보다 더 자세한 설명은 개발자 페이지의 AndroidManifest.xml 페이지를 참조하세요.