개요
AndroidManifest.xml은 앱의 필수 구성요소이다. AndroidManifest.xml에서는 아래 3가지가 정의되며, 정의되지 않은 권한이나 구성요소를 앱 구동 시 사용할 수 없다.
- 앱의 고유한 식별자인 패키지명,
- 안드로이드 앱에서 필요한 권한,
- 안드로이드 구성요소(Activity, Service, Broadcast Recevicer, ContentProvider)
AndroidManifest.xml 파일에서 정의되지 않으면 앱의 구성요소로 인식이 되지 않아 사용할 수 없게 된다. 이미 눈치 챘겠지만 안드로이드의 모든 핵심 구성요소가 AndroidManifest.xml에서 정의되며, 따라서 AndroidManifest.xml을 사용하는 방법을 아는 것은 매우 중요하다.
패키지명 선언
Android Studio의 왼쪽 Browser을 보면 아래와 같은 화면이 나온다. 여기서 java의 namespace가 기본으로 잡혀서 나오는데, 패키지명은 일반적으로 이 값과 일치 시켜야 한다.
이유는 안드로이드 빌드 도구(Android의 공식 빌드 도구는 Gradle)가 이 값을 코드의 위치 값으로 인식하기 때문이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dailycarelab.jaksimharu"> //빌드시 소스가 이곳에 있는 것으로 인식함
...
</manifest>
Android Manifest 파일
더 자세하게 들어가면 package는 APK 빌드 시 두 가지에 사용된다.
- 빌드 도구는 앱에서 생성된 R.java 클래스의 네임스페이스로 package의 경로를 적용
- Manifest에 선언된 안드로이드 구성요소의 위치 확인 시 package의 경로를 기본 경로로 사용 : 아래 구성요소 확인 후 확인
*R.java :리소스 파일들을 엑세스 할 수 있는 클래스, 빌드 시 만들어짐
안드로이드 앱에서 필요한 권한
PlayStore에서 앱 검색 후 앱 권한 확인 시, 다음과 같은 화면을 볼 수 있다. 아래는 네이버 앱의 요청 권한 중 일부를 캡쳐한 것이다.
이러한 앱 권한들은 앱을 구동하기 위해 꼭 필요하다. 권한을 정의하는 곳이 바로 AndroidManifest.xml 파일이다. 권한은 다음과 같이 manifest 블록 내부에 선언하며, <uses-permission> 블록에 android:name 값을 주어 선언해야 한다. android:name값에는 필요한 권한을 입력한다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dailycarelab.fitodo">
//권한 요청 부분
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
</manifest>
안드로이드 구성요소
안드로이드는 안드로이드 4대 컴포넌트라 불리는 Activity, Service, Broadcast Recevier, Content Provider로 이루어져 있다. 안드로이드 앱을 개발할 때 이 구성요소들이 정의되는 곳이 바로 AndroidManifest.xml의 <application> 내부이다. 만약 이곳에 구성요소가 선언되어 있지 않다면 앱에서 구성요소는 실행되지 않는다.
먼저 <application>부터 살펴보자.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dailycarelab.jaksimharu">
<application
android:name=".TodoApplication" //앱의 어플리케이션 파일이 정의된 위치 com.dailycarelab.jaksimharu.TodoApplication
android:icon="@mipmap/ic_launcher" //앱의 아이콘 정의
android:label="@string/app_name" // 앱의 이름 정의
android:roundIcon="@mipmap/ic_launcher_round" // 앱 둥근 아이콘 정의
android:theme="@style/Theme.Jaksimharu"> //앱의 테마 정의
... // Activity, Service, Receiver, ContentProvider은 이곳에 선언
</application>
</manifest>
<application>은 앱을 정의하는 공간이다. 이곳에서는 앱의 어플리케이션 파일이 정의된 곳, 앱의 아이콘, 앱의 명칭, 앱의 테마를 정의한다. 더욱 자세한 사항은 Android Developers를 참조한다.
<application> 내부에는 Activity, Service, Broadcast Recevier, Content Provider 을 정의한다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dailycarelab.jaksimharu">
<application
... >
<activity
android:name=".activity.main.MainActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
더욱 자세한 사항은 아래에서 확인한다.
- Activity
- Service
- Broadcast Receiver
- Content Provider