Manifest
모든 앱 프로젝트는 프로젝트 소스 세트(소스 코드와 리소스의 그룹)의 루트에는 반드시 AndroidManifest.xml 파일이 존재해야 한다. (이때, xml 파일은 정확히 AndroidManifest.xml이라는 이름을 갖는다.)
다시 말해, 매니페스트 파일(AndroidManifest.xml)은 앱의 필수 구성요소로 해당 애플리케이션의 기본적이고 필수적인 정보들을 담고 있다. 매니페스트 파일에 적힌 이 필수 정보들은 안드로이드 빌드 툴과 Android OS, 그리고 구글 플레이에 제공된다.
매니페스트 파일에는 여러 정보가 담겨 있지만 아래의 정보들은 애플리케이션의 구동을 위해서 특히 선언되어야 한다.
- 앱의 패키지 이름
- 앱에서 사용되는 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider)
- 권한(Permission)
- 앱에서 요구하는 하드웨어와 소프트웨어 특징
다음 각각의 정보를 하나씩 살펴 보겠다.
1. 패키지 이름
매니페스트 파일의 Root element(<manifest></manifest>)에는 해당 앱의 패키지 이름이 반드시 기재되어야 한다.
다음은 패키지명이 "com.test.example1"인 매니페스트 파일이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.example1"
android:versionCode="1"
android:versionName="1.0" >
...
</manifest>
이 매니페스트 파일의 패키지 이름은 우리가 앱을 빌드하여 APK를 추출하는 과정에서 Android Build Tool에 의해 다음 2가지 목적으로 사용된다.
- 빌드 도구(소스 코드를 실행 가능한 애플리케이션으로 만들어주는 도구)는 패키지 이름을 App Resource에 접근하는 데 사용되는 R 클래스의 네임스페이스로 적용한다.
위 예에서는 com.test.example1.R 클래스가 생성된다. - 빌드 도구는 패키지 이름을 사용하여 매니페스트 파일에 선언되어 있는 상대 클래스 이름을 확인한다.
예를 들어 <activity android:name=".MainActivity>라고 선언했다면 이는 "com.test.example1.MainActivity"를 가리키게 된다.
이때, 매니페스트의 package 특성에 있는 이름은 액티비티와 기타 애플리케이션 코드가 들어 있는 프로젝트의 기본 패키지 이름과 항상 일치해야 한다.
2. 사용되는 컴포넌트
안드로이드에는 4대 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider)가 존재하는데,
각각의 컴포넌트들은 매니페스트 파일에 정의되어야 한다.
만약, 컴포넌트들이 매니페스트 파일에 정의되어 있지 않다면 앱 구동 시 앱의 구성요소로 인식되지 않아 컴포넌트들을 사용할 수 없게 된다.
각각의 컴포넌트는 매니페스트 파일 내에서 다음 태그를 통해 선언할 수 있다.
- <activity> : Activity
- <service> : Service
- <receiver> : Broadcast Receiver
- <provider> : Content Provider
*컴포넌트에 대한 설명은 다음 글을 참고
안드로이드의 4대 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider)
이 4대 컴포넌트들은 각각 인텐트에 의해 활성화된다. 인텐트란 메세지 객체로, 어떤 행동을 수행할지에 대한 명령이나 작업에 필요한 데이터를 포함한다.
*인텐트에 대한 설명은 다음 글을 참고
3. 권한 설정
안드로이드 앱은 민감한 사용자 데이터(예: 연락처, SMS) 또는 특정 시스템 기능(예: 카메라, 인터넷 액세스)에 액세스 하기 위해 반드시 권한을 요청해야 한다. 이때 각 권한은 고유한 레이블로 식별된다.
예를 들어 SMS 전송에 대한 권한을 요청하기 위해서는 Manifest 파일에 다음과 같이 설정하면 된다.
<manifest ... >
<uses-permission android:name="android.permission.SEND_SMS"/>
...
</manifest>
4. 요구되는 하드웨어와 소프트웨어 특징
매니페스트 파일에는 앱이 필요로 하는 하드웨어나 소프트웨어 특징을 명시할 수 있다. 예를 들어, 카메라 앱을 만들 경우에 카메라가 필수로 있어야 하기 때문에 Play Store에서 카메라가 존재하는 기기에서만 해당 앱이 다운로드될 수 있도록 명시하는 것이다.
어느 기기가 앱과 호환되는지 정의하는 매니페스트 태그가 여러 가지 있는데,
일반적으로는 <uses-feature>태그를 사용하여 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있다.
예를 들어 나침반 센서가 있는 기기에서만 앱 다운로드가 가능하게 하기 위해서는 아래와 같이 매니페스트 파일을 작성하면 된다.
<manifest ... >
<uses-feature android:name="android.hardware.sensor.compass"
android:required="true" />
...
</manifest>