태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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

2009.11.13 03:57

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

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

이클립스 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 페이지를 참조하세요.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

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

  1. Blog Icon
    정석지킴이

    잘보았습니다 ~

  2. Blog Icon
    시작하는1人

    이해가 쏙쏙~되네요. 감사합니다.

  3. 좋은글 출처를 표시하고 블로그에 담아갑니다. ^^

  4. Blog Icon
    시작하는2人

    책에 예제를 그대로 따라하면서 공부하던 중에 실행이 안 되는 액티비티가 있어서 뭔가 했는데 덕분에 해결했습니다. ^^ 감사합니다.

  5. Blog Icon
    시작하는ㅅ

    책에는 설명이 안 되어있는 부분까지 세세히 설명해주시니

    이해하기 훨씬 수월했어요~ ㅎㅎ
    감사합니다!^^

  6. Blog Icon
    ds

    질문이 있습니다.

    permission에서 protectionLevel의 종류가 4가지가 있는데요.

    각각의 의미를 알고 싶은데 개발자 사이트에서 확인은 했는데 영문이라 이해하는데 어려움을 겪고 있습니다.

    normal / dangerous / signature / signatureOrSystem