[안드로이드] Manifest

안드로이드 Manifest

모든 안드로이드 앱 프로젝트에는 프로젝트 소스의 루트에 AndroidManifest.xml 파일이 존재해야 한다. Manifest 파일은 안드로이드 빌드 도구, 안드로이드 OS 및 Google Play에게 앱에 대한 필수 정보를 설명하는 역할을 한다.

Manifest 파일이 선언해야 하는 것

  • 앱의 모든 Activity, Service, Broadcast Receiver, Content Provider와 같은 구성 요소
  • 시스템 또는 다른 앱의 보호된 부분에 접근하기 위해 앱이 필요로 하는 권한(다른 앱이 이 앱의 콘텐츠에 접근하려는 경우 보유해야 하는 권한도 선언)
  • 앱에 필요한 하드웨어 및 소프트웨어 기능 → 이는 Google Play에서 앱을 설치할 수 있는 기기에 영향을 미친다.

앱 구성 요소

앱에 생성한 모든 각 구성 요소는 Manifest 파일에 상응하는 XML 요소로 선언해야 한다.

  • Activity의 모든 각 서브 클래스는 <activity>
  • Service의 모든 각 서브 클래스는 <service>
  • BroadcastReceiver의 모든 각 서브 클래스는 <receiver>
  • ContentProvider의 모든 각 서브 클래스는 <provider>

만약 앱의 구성 요소를 Manifest 파일에 선언하지 않으면 안드로이드 시스템에서 해당 구성 요소를 시작할 수 없다.

XML 요소의 name 속성에 구성 요소의 클래스 이름을 명시해야 한다. 전체 패키지 경로를 포함한 클래스 이름을 명시해야 한다. 만약 name 속성의 첫 번째 문자가 점(.)인 경우 모듈 수준 build.gradlenamespace 속성에 선언된 앱의 네임스페이스가 접두사로 붙는다. 앱의 구성 요소가 네임스페이스의 하위 패키지에 존재하면 누락된 하위 패키지 이름을 추가해야 한다.

예)

<activity android:name="com.example.myapp.MainActivity" ... >
<activity android:name=".MainActivity" ... >
<activity android:name=".ui.activity.MainActivity" ... >

인텐트 필터

앱의 Activity, Service, BroadcastReceiver는 안드로이드 인텐트에 의해 활성화된다.

인텐트는 수행할 데이터, 작업을 수행해야 하는 구성 요소 카테고리 및 기타 명령과 같은 수행할 작업을 설명하는 Intent 객체에 의해 정의된 메시지이다.

앱이 시스템에 인텐트를 발생시키면 안드로이드 시스템은 Manifest 파일의 인텐트 필터 선언을 기반으로 인텐트를 처리할 수 있는 앱의 구성 요소를 찾는다. 일치하는 구성 요소의 인스턴스를 시작하고 해당 구성 요소에 Intent 객체를 전달한다. 만약 한 인텐트를 처리할 수 있는 앱이 둘 이상인 경우 사용자가 선택할 수 있다.

Manifest 파일의 앱 구성 요소 선언에 <intent-filter> 요소로 여러 인텐트 필터를 선언할 수 있다. 각 인텐트 필터는 해당 구성 요소의 다른 기능을 설명한다.

아이콘과 레이블

많은 Manifest 요소들은 iconlabel 속성을 가지고 있다. 이는 해당하는 앱 구성 요소에 대해 사용자에게 표시될 작은 아이콘과 텍스트 레이블을 정의한다.

모든 경우에 상위 요소에 설정된 이 속성은 모든 하위 요소의 기본 값이 된다. 예를 들어 <application>에 정의된 iconlabel은 앱의 모든 구성 요소의 iconlabel 속성의 기본 값이 된다.

<intent-filter> 요소에도 iconlabel 속성을 설정할 수 있는데 이는 해당 구성 요소가 인텐트를 처리할 옵션으로 사용자에게 제공될 때마다 표시되는 아이콘과 레이블이다. 이 경우에도 상위 요소의 설정 값이 기본 값이 된다.

권한

안드로이드 앱은 민감한 사용자 데이터 또는 특정 시스템 기능에 대한 접근 권한을 요청해야 한다. 각 권한은 고유 레이블로 식별된다.

예) 앱이 메시지 전송에 대한 권한이 필요할 때

<uses-permission android:name="android.permission.SEND_SMS" />

안드로이드 6.0(API 23)부터는 런타임시에 사용자가 일부 앱 권한을 허용하거나 거부할 수 있다. 앱이 지원하는 안드로이드 버전에 관계없이 Manifest에서 <uses-permission> 요소를 사용하여 모든 권한을 선언해야 한다. 권한이 부여되지 않으면 해당 기능에 접근할 수 없다.

앱은 권한을 사용하여 자체 구성 요소를 보호할 수 있다. android.Manifest.permission에 존재하는 안드로이드에서 정의한 모든 권한 또는 다른 앱에서 선언된 권한을 사용할 수 있다.

앱은 자체 권한을 정의할 수 있다. <permission> 요소를 사용하여 앱의 자체 권한을 선언한다.

디바이스 호환성

앱에 필요한 하드웨어 또는 소프트웨어 기능의 유형과 앱이 호환되는 기기 유형을 선언할 수 있다. Google Play 스토어는 앱에 필요한 기능이나 시스템 버전을 제공하지 않는 기기에 앱을 설치하는 것을 허용하지 않는다.

기능

<uses-feature> 요소를 사용하여 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있다.

예) 앱이 나침반 센서가 있는 기기에서 호환되는 경우

<uses-feature android:name="android.hardware.sensor.compass"
							android:required="true" />

SDK 사용

안드로이드 최신 버전에서는 이전 버전에서 사용할 수 없는 새로운 API를 추가하곤 한다. 앱이 호환되는 최소 버전을 나타내려면 Manifest에 <uses-sdk> 요소와 minSdkVersion 속성이 포함되어야 한다. 이 요소는 build.gradle 파일의 동일한 속성으로 재정의되기 때문에 이 요소를 사용하지 않고 build.gradle 파일에 minSdkVersiontargetSdkVersion 값을 지정한다.

Manifest 파일 컨벤션

요소

<manifest><application> 요소만 필수이며 각각 한 번만 선언되어야 한다. 대부분의 다른 요소는 0개 이상 존재할 수 있다. 모든 값은 요소 내의 속성에 의해 설정된다.

같은 수준의 요소는 순서가 지정되지 않는다. 예를 들어 <activity>, <provider>, <service> 요소는 임의의 순서로 배치할 수 있다.

예외)

  • <activity-alias> 요소는 별칭이 되는 <activity> 다음에 와야 한다.
  • <application> 요소는 <manifest> 요소 내부의 마지막 요소여야 한다.

속성

기술적으로 모든 속성은 선택 사항이지만 요소를 정의하기 위해 많은 속성을 지정해야 한다. 완전한 선택 옵션의 경우 레퍼런스 문서에 명시되어 있다.

루트 <manifest> 요소의 일부 속성을 제외하고 모든 속성의 이름은 android: 접두사로 시작한다.

다중 값

만약 둘 이상의 값을 지정해야 하는 경우 대부분의 경우에 단일 요소 내에 여러 값이 나열되는 대신 요소가 반복된다.

예)

<intent-filter ... >
	<action android:name="android.intent.action.EDIT" />
	<action android:name="android.intent.action.INSERT" />
	<action android:name="android.intent.action.DELETE" />
</intent-filter?>

리소스 값

일부 속성은 사용자에게 표시되는 값을 가진다. 이러한 값들은 일반적으로 사용자의 언어, 디바이스 환경에 따라 다를 수 있기 대문에 하드 코딩된 값 대신 리소스 또는 테마로부터 설정해야 한다. 실제 값은 다양한 디바이스 환경에 대해 제공하는 대체 리소스를 기반으로 변경될 수 있다.

  • 형식: “@[패키지:]type/name”
    앱에서 리소스를 제공하는 경우 패키지 이름을 생략할 수 있다. 다른 유효한 유일한 패키지 이름은 안드로이드 프레임워크의 리소스를 사용하려는 경우 사용하는 android이다.
    typestring, drawable과 같은 리소스의 유형을 결정하고 name은 리소스를 식별하는 이름이다.

예)

<application android:icon="@drawable/smallIcon" ... >

테마에 정의된 값을 사용하는 경우 @대신 ?를 사용한다.

문자열 값

속성 값이 문자열인 경우 이스케이프 문자에 \\를 사용해야 한다. 예를 들어 개행 문자는 \\n을 사용한다.

Manifest 파일의 요소

자주 사용하는 Manifest 파일의 요소에 대해 알아보자. 추가 정보는 안드로이드 개발자 문서에서 자세하게 볼 수 있다.

  • <action>: <intent-filter>의 하위 요소로 인텐트 필터에 작업을 추가한다.
    name 속성에 작업의 이름 값이 설정되는데 이는 Intent 클래스에 ACTION_string 상수로 정의되어 있다. 사용자 정의 작업도 설정할 수 있다.

  • <activity>: Activity 구성 요소를 선언한다.

    속성

    • android:alwaysRetainTaskState: 안드로이드 시스템이 작업 상태를 항상 유지관리하는지 나타낸다. 작업의 루트 Activity에만 의미가 있다.
    • android:clearTaskOnLaunch: 홈 화면에서 다시 시작할 때마다 루트 Activity를 제외한 모든 Activity를 작업에서 제거할지 여부를 설정한다.
    • android:exported: 다른 애플리케이션의 구성 요소에서 Activiy를 시작할 수 있는지를 설정한다. Android 12부터는 명시적으로 선언해야 한다. 기본값은 true이다.
    • android:launchMode: Activity를 시작하는 방법을 설정한다. Intent의 Activity 플래그와 함께 동작한다.
    • android:theme: Activity의 전체 테마를 설정한다. 설정하지 않으면 <application>의 값을 상속받는다.
    • android:windowSoftInputMode: Activity의 창이 터치형 소프트 키보드를 포함하는 창과 상호작용하는 방법을 설정한다.
  • <application>: 애플리케이션의 선언이다. 이 요소의 속성은 모든 앱 구성 요소에 상응하는 속성에 영향을 줄 수 있다.

    속성

    • android:allowBackup: 애플리케이션이 백업 및 복원이 가능할 수 있도록 허용할지 여부이다.
    • android:allowClearUserData: 애플리케이션이 사용자 데이터를 재설정하도록 허용할지 여부이다.
    • android:icon: 전체 애플리케이션의 아이콘 및 앱 구성 요소의 기본 아이콘이다.
    • android:label: 전체 애플리케이션의 텍스트 레이블 및 앱 구성 요소의 기본 텍스트 레이블이다.
    • android:logo: 전체 애플리케이션의 로고 및 Activity를 나타내는 기본 로고이다.
    • android:name: 애플리케이션에 대해 구현되는 Application 서브 클래스의 정규화된 이름이다.
    • android:theme: 애플리케이션의 모든 Activity의 기본 테마를 정의한다.
    • android:usesCleartextTraffic: 앱이 일반 텍스트 HTTP와 같은 일반 텍스트 네트워크 트래픽을 사용하는지 여부를 설정한다. API 27 이하를 타겟팅하면 기본값이 true이고, API 28 이상을 타겟팅하면 기본값이 false이다.
  • <category>: <intent-filter>의 하위 요소로 인텐트 필터에 카테고리 이름을 추가한다.

  • <data>: <intent-filter>의 하위 요소로 인텐트 필터에 데이터 명세를 추가한다.

  • <intent-filter>: 앱 구성 요소들의 Manifest 요소의 하위 요소로 Activity, Service, BroadcastReceiver가 응답할 수 있는 인텐트 유형을 지정한다.

  • <manifest>: Manifest 파일의 루트 요소로 <application> 요소를 반드시 포함해야 하고, 안드로이드 네임스페이스를 지정하는 xmlns:android 속성과 앱의 패키지를 명시하는 package 속성이 반드시 존재해야 한다.

  • <permission>: 앱 또는 다른 앱의 특정 구성 요소 또는 기능에 대한 접근을 제어하는 데 사용될 수 있는 보안 권한을 선언한다.

  • <permission-group>: 관련 권한의 논리적 그룹에 대한 이름을 선언한다. <permission> 요소의 permissionGroup 속성을 통해 권한 그룹에 속할 수 있다.

  • <provider>: ContentProvider 구성 요소를 선언한다.

  • <receiver>: BroadcastReceiver 구성 요소를 선언한다.

  • <uses-feature>: 앱이 사용하는 하드웨어 또는 소프트웨어 기능을 선언한다.

  • <uses-permission>: 앱이 올바르게 동작하기 위해 사용자가 부여해야 하는 시스템 권한을 지정한다.

참고

안드로이드 개발자 가이드: App Manifest File

좋은 웹페이지 즐겨찾기