[Android] Manifest(매니페스트) 이해하기

문승연·2023년 8월 1일
0

Android 기초

목록 보기
1/8

Manifest란?

Manifest 파일은 Android 빌드 도구(Build Tools), Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명한다. 따라서 모든 앱 프로젝트는 반드시 AndroidManifest.xml파일을 포함해야한다.

Manifest가 포함하는 내용

  • 앱의 패키지 이름(package name). 이 이름을 바탕으로 Android 빌드 툴이 프로젝트를 빌드할 때 코드 위치를 확인한다. 또한 시스템과 Google Play에서 고유 앱 식별자로 사용된다.
  • 앱 구성 요소(Activity, Service, Broadcast Receiver, Content Provider). 흔히 안드로이드 앱 4대 구성 요소라고 불리는 요소들이 Manifest에서 선언된다. 클래스 명과 같은 기본 속성부터 각 구성 요소가 처리할 수 있는 기기 구성의 종류, 그리고 구성 요소가 어떻게 시작되는지 설명하는 인텐트 필터(intent-filter)와 같은 기능을 선언할 수 있다.
  • 앱이 시스템 또는 다른 앱의 보호된 부분에 액세스하기 위해 필요한 권한. 다른 앱이 이 앱에 액세스하고자 할 때 필요한 권한도 모두 선언한다.
  • 앱에 필요한 하드웨어 및 소프트웨어 기능. 이에 따라 Google Play에서 앱을 설치할 수 있는 기기의 종류가 달라진다.

Manifest 파일 예시

<?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>

패키지 이름과 애플리케이션 ID

위의 예시에서 패키지 이름은 package="com.example.myapp"이다. 앱을 APK 또는 AAB로 빌드하는 동안 Android 빌드 도구가 package를 사용하는 이유는 2가지가 있다.

  • 빌드 도구는 앱에서 생성된 R.java 클래스의 네임스페이스로 이 이름을 사용한다. (앱 리소스에 접근하는데 사용한다.) ex. 위의 Manifest를 바탕으로 R클래스가 com.example.myapp.R에서 생성된다.
  • 이 이름을 사용하여 빌드 도구가 Manifest 파일에 선언되어있는 상대 클래스의 이름을 확인한다. (ex. 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-filter)

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>

아이콘 및 레이블

기본적으로 iconlabel은 상위 요소에 설정된 값이 하위 요소의 기본 값이 된다.
<application> 단에서 설정된 iconlabel값은 <activity>와 같은 하위 요소에도 적용된다.

만약 각 하위 요소에 대해 더 적당한 iconlabel이 있다면 변경할 수 있다.

권한

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>
  1. <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

profile
"비몽(Bemong)"이라는 앱을 개발 및 운영 중인 안드로이드 개발자입니다.

0개의 댓글