Manifest 파일은 Android 빌드 도구(Build Tools), Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명한다. 따라서 모든 앱 프로젝트는 반드시 AndroidManifest.xml
파일을 포함해야한다.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
<!-- Beware that these values are overridden by the build.gradle file -->
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- This name is resolved to com.example.myapp.MainActivity
based upon the package attribute -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" />
</application>
</manifest>
위의 예시에서 패키지 이름은 package="com.example.myapp"
이다. 앱을 APK 또는 AAB로 빌드하는 동안 Android 빌드 도구가 package
를 사용하는 이유는 2가지가 있다.
R.java
클래스의 네임스페이스로 이 이름을 사용한다. (앱 리소스에 접근하는데 사용한다.) ex. 위의 Manifest를 바탕으로 R
클래스가 com.example.myapp.R
에서 생성된다.activity android:name=".MainActivity">
로 선언된 것을 com.example.myapp.MainActivity
인 것을 확인한다.)그러나 위 작업이 수행되고 나면 프로젝트의 build.gradle
파일의 applicationId
값이 package
값을 대신한다. 이 2가지를 구분해서 사용할 경우 혼동이 올 수 있기 때문에 보통 동일한 값으로 사용한다.
Manifest에서 앱 구성 요소를 나타내는 태그는 다음과 같다.
<activity>
: 액티비티 (Activity)<service>
: 서비스 (Service)<receiver>
: 브로드캐스트 리시버(Broadcast Receiver)<provider>
: 콘텐트 제공자 (Content Provider)Manifest에서 각 구성 요소를 선언하지 않으면 시스템에서 이를 시작할 수 없다.
Intent
는 액티비티, 서비스, Broadcast Receiver 등 앱 구성요소에 실행할 작업을 설명하는 메시지 객체이다. Intent
에는 작업할 데이터, 작업을 수행해야하는 구성 요소의 카테고리 및 기타 지침 등이 포함된다.
시스템은 각 앱의 Manifest 파일에 선언된 intent-filter 에 기반하여 발행된 Intent를 처리할 수 있는 앱 구성 요소를 찾는다. 일치하는 구성 요소를 찾으면 해당 구성 요소의 인스턴스를 시작하고 Intent
객체를 전달한다.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
기본적으로 icon
과 label
은 상위 요소에 설정된 값이 하위 요소의 기본 값이 된다.
<application>
단에서 설정된 icon
과 label
값은 <activity>
와 같은 하위 요소에도 적용된다.
만약 각 하위 요소에 대해 더 적당한 icon
과 label
이 있다면 변경할 수 있다.
Android 앱은 민감한 사용자 데이터나 특정 시스템 기능에 접근하기 위한 권한을 요청해야한다.
<manifest ... >
<uses-permission android:name="android.permission.SEND_SMS"/>
...
</manifest>
사용자는 런타임에서 일부 앱 권한을 승인하거나 거절할 수 있다(Android 6.0 이상).
그러나 안드로이드 버전에 상관 없이 Manifest에서는 <uses-permission>
태그로 모든 권한 요청을 선언해야한다.
Manifest에서는 앱에 필요한 하드웨어 또는 소프트웨어 기능을 선언할 수 있다. 또한 앱과 호환되는 기기 유형도 선언할 수 있다.
어느 기기가 앱과 호환되는지 정의하는 태그가 여럿 존재한다. 그 중 일반적으로 사용되는 태그는 아래와 같다.
1. <uses-feature>
: 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언한다. 아래는 앱이 나침반 센서가 있는 기기에서만 호환 가능함을 알린다.
<manifest ... >
<uses-feature android:name="android.hardware.sensor.compass"
android:required="true" />
...
</manifest>
<uses-sdk>
: 앱이 호환되는 최소 버전을 나타내려면 <uses-sdk>
태그의 <minSdkVersion>
속성을 사용한다. 그러나 이는 build.gradel
파일의 해당 속성으로 재정의되므로 유의해야한다.android {
defaultConfig {
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 15
// Specifies the API level used to test the app.
targetSdkVersion 28
...
}
}
각 태그별 속성과 자세한 사용 방법은 레퍼런스 문서를 참고하자.
[레퍼런스]
https://developer.android.com/guide/topics/manifest/action-element?hl=ko