(추가중) AndroidManifest.xml 파일의 <manifest> 태그에 대한 정리

JIYOON·2021년 7월 9일
1

Android

목록 보기
2/9
post-thumbnail

📣 목표
안드로이드 앱 프로젝트에 반드시 포함해야 하는 파일인 AndroidManifest.xml의 기능과 manifest 태그의 속성에 대해 알아보자!

❗️ 본 포스팅의 많은 부분을 Android Developers에서 내용을 참조하여 정리했다.


1️⃣ AndroidManifest 파일

01. 파일 경로

AndroidManifest.xml 파일은 안드로이드 앱 프로젝트를 처음 생성한 뒤 app > manifests 폴더에 존재한다.
생성 시 이뤄지는 기본적인 설정은 위와 같다.


02. 목적

manifest 단어의 뜻은 '나타내다'로, 프로젝트 내에서 어떤 기능들이 사용되고 있는지 나타내는 명세서이다.
앱의 전반적인 정보, 즉 애플리케이션의 이름이나 앱을 구성하고 있는 컴포넌트를 기술하고 실행 시에 필요한 권한을 지정하는 역할을 한다.





2️⃣ 필수 태그

01. <manifest>

1) 기능

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

AndroidManifest 처음 생성 시에 기본으로 생성된다. Manifest 파일의 루트 요소이다.


2) 속성

xmlns:android: 안드로이드의 네임스페이스를 정의하며, 값은 항상 위와 같이 설정돼야 한다.

package : 패키지 이름을 지정하는 데 사용된다. 보통 도메인 주소를 반대로 써서 설정한다. 예를 들어 google.com에서 게시한 애플리케이션의 패키지명은 "com.google.googleapplication"으로 설정한다. R.java 클래스용 네임스페이스로 패키지 이름이 사용되는데, 위의 예시를 다시 들면 R 클래스는 "com.google.googleapplication.R"에 생성된다.

android:sharedUserId: Android에서는 각 앱에 고유한 사용자 ID를 할당한다. android:sharedUserId은 다른 앱과 공유될 Linux 사용자 ID를 할당한다. 그러나 API 레벨 29에서 지원이 중단되었고 향후 안드로이드 버전에서 삭제될 수 있기에 사용에 유의해야 한다.

android:sharedUserLabel: 사용자가 읽을 수 있는 공유 사용자 ID에 관한 라벨이다. android:sharedUserId 속성이 설정돼야 한다. 후에 삭제될 수 있는 속성이므로 사용하지 않는 것이 좋다.

android:targetSandboxVersion: 해당 앱에서 사용할 타겟 샌드박스를 설정한다.

android:versionCode: 내부 버전 번호이다. 사용자에게는 표시되지 않는다.

android:versionName: 사용자에게 표시되는 버전 번호이다.

android:installLocation: 앱의 기본 설치 위치이다. 기본적으로 앱은 내부 저장소에 설치되며, 'auto' 또는 'preferExternal' 값을 설정하여 외부 저장소에 설치할 수 있다.



네임스페이스
xml 문서 내에서 유일한 엘리먼트나 속성 이름을 제공하기 위해 사용된다.
(* 엘리먼트 : 태그의 시작과 끝을 포함해서 그 내부에 들어가는 모든 것)
사용자가 엘리먼트를 자유롭게 설정할 수 있지만 이러한 엘리먼트가 xml 문서 내에서 중복될 수 있는데, 이러한 이름 중복 충돌을 방지하는 것이 네임스페이스의 기능이다.

R.java
안드로이드 프로젝트에서 사용되는 리소스들을 ID 형태로 관리한다.

샌드박스
외부로부터 받은 파일을 바로 실행하지 않고 보호된 영역에서 실행시켜 봄으로써 외부로부터 들어오는 파일과 프로그램이 내부 시스템에 악영향을 주는 것을 미연에 방지하는 기술이다. 외부로부터 들어온 프로그램이나 실행 파일을 가상화 내부에서 시험적으로 동작시켜봄으로써 가상화 밖으로는 영향을 주지 않는다. 가상화 기술을 악성행위나 악성코드 감지 시스템에 적용한, 보안 가상화의 일종으로 설명할 수 있다.

안드로이드 샌드박스
Android 플랫폼은 Linux 사용자 기반 보호 기능을 활용하여 앱 리소스를 식별하고 분리하며, 앱과 시스템을 악성 앱으로부터 분리한다. 이 기능을 위해서 Android는 각 Android 애플리케이션에 고유한 사용자 ID(UID)를 할당하여 자체 프로세스에서 실행하며, UID를 사용하여 Linux 커널 수준의 애플리케이션 샌드박스를 설정한다.




02. <application>

1) 기능

Android manifest 파일 내에 한 번 반드시 사용돼야 하는 항목이다.
액티비티의 구성 요소를 선언하다.

액티비티
안드로이드 Activity는 화면에 표시되는 UI 구성을 위해 가장 기본이 되는 요소로, 화면에 UI를 표시하기 위한 툴이다.
안드로이드 공식 홈페이지에서는 Activity를 작업이라고 명시하고 있다. Activity의 주요 활동으로는 전체 화면에 앱의 UI를 표시하고, 사용자가 터치한 화면의 이벤트 처리를 하거나, 새로운 UI를 화면에 표시하는 것 등이 있다.


2) 속성

android:allowTaskReparenting: 액티비티를 시작한 작업에서 해당 작업이 다음에도 실행될 때 액티비티를 실행한 태스크가 아닌, 액티비티를 선호하는 그 다음 작업으로 이동할 수 있는지를 나타내는데, 이 값이 "true"인 경우 이동 가능하고 "false"인 경우 시작한 작업에 그대로 머물러 있어야 한다. 기본값은 false로 설정되어 있다.
작동 원리에 대해 좀 더 알아보려면 아래 그림을 참고하면 된다.

위 그림은 사용자가 이메일을 읽다가 인터넷 링크가 있어서 클릭했을 때 일어나는 태스크와 액티비티를 표현한 것이다. allowTaskReparenting 이 false 값이라면, 액티비티를 실행한 태스크인 E-mail 태스크에서 해당 작업이 실행된다. 반대로 allowTaskReparenting 이 true라면, 액티비티를 선호하는 태스크인 Web browser 태스크로 작업이 이동한다. 이 때 이와 같이 액티비티가 실행되면서 실행된 task stack의 child가 되는 것이 아닌 다른 task로 이동하는 것을 reparenting이라고 한다.
따라서 E-mail Task에 Web Page 작업이 쌓인 첫번째 그림이 allowTaskReparenting 를 false로 지정했을 때, E-mail Task에서 Web browser Task로 작업이 이동한 두 번째와 세 번째 그림이 allowTaskReparenting 를 true로 지정했을 때다. 이렇게 이동할 작업을 지정하는 것은 android:taskAffinity 속성과 관계있다.


android:taskAffinity: 친밀감을 가지는 Task를 지정한다. taskAffinity 의 default value 는 <manifest> 에 정의된 packageName 이다. Activity 들의 Task 관리 측면에서 android:allowTaskReparenting 속성과 함께 알아두어야 한다.





3️⃣ 컴포넌트 태그

01. <activity>

1) 기능

애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 액티비티를 선언하다.


2) 속성

android:allowEmbedded: 액티비티가 다른 액티비티의 포함된 하위 항목으로 시작할 수 있다. 기본값은 false이다.

android:alwaysRetainTaskState: 시스템이 액티비티의 작업 상태를 항상 유지관리하는지 여부를 설정한다. 기본값은 false이며, 기본값일 경우 시스템이 특정 상황에서 작업을 초기 상태로 다시 설정할 수 있다.
true인 경우 사용자는 작업을 지운 후에도 다시 방문할 시 항상 마지막 상태의 작업으로 돌아가게 된다. 이런 설정값은 아래 사진과 같이 웹 브라우저 애플리케이션에서 방문한 페이지의 상태를 유지하는 탭을 설정할 때 사용된다.

( 이미지 출처 : KEBI 블로그 )


android:banner: 연결된 항목에 대한 그래픽 배너를 제공한다.

android:clearTaskOnLaunch: 홈 화면에서 다시 시작할 때마다 루트 액티비티를 제외한 모든 액티비티를 작업에서 제거할지 여부를 결정한다. 기본값은 false로, true인 경우에는 사용자가 작업을 다시 시작할 때마다 액티비티를 작업에서 제거하며 루트 액티비티로 이동한다.

android:colorMode: 넓은 색 공간 모드가 호환되는 기기에서 해당 모드로 액티비티가 요청되도록 표시한다. 넓은 색 공간모드에서 더욱 선명한 색을 표시할 수 있다.

android:configChanges: 액티비티가 스스로 handling할 구성 변경(환경 변화)을 지정한다. runtime 시 환경 변화가 일어나면, 기본 동작은 Activity가 종료되고 재시작되는 것이다. 하지만 해당 속성을 활용해 환경 변화가 돼도 Activity가 restart되지 않게 할 수 있다. 가급적 사용하지 말아야 하는 속성이다. 이 속성보다는 구성 변경 처리에 관한 문서를 바탕으로 설정해야 한다.

android:directBootAware: 액티비티가 직접 부팅을 인식하는지 여부를 설정한다. 기본값은 false이다.

android:documentLaunchMode: 시작할 때마다 새 액티비티 인스턴스를 작업에 추가하는 방법을 지정한다. 기본값은 'none'으로, 액티비티가 문서에 대해 새 작업을 생성하지 않는다. 앱에 대한 하나의 작업을 표시하고, 이때 사용자가 마지막으로 호출한 작업이 무엇이든 관계없이 그 작업에서부터 재개한다.

android:enabled: 시스템이 액티비티를 인스턴스화할 수 있는지 여부를 정한다. 기본값은 true이다.

android:excludeFromRecents: 다른 애플리케이션의 구성요소로 액티비티를 시작할 수 있는지 설정한다. 인텐트 필터가 없는 경우, 이 요소의 기본값은 false이다.

android:finishOnTaskLaunch: 사용자가 작업을 다시 시작(홈 화면에서 작업을 선택)할 때마다 액티비티의 기존 인스턴스를 종료할지 여부를 정한다. 기본값은 false이다.

android:hardwareAccelerated: 해당 액티비티에 대해 하드웨어 가속 렌더링을 활성화할지 정한다. 기본값은 false이다. 하드웨어 가속 렌더러를 활성화하면 애니메이션과 스크롤이 원활하게 작동하고 응답성이 전반적으로 개선되지만, 하드웨어 가속을 활성화하는 데 필요한 리소스가 증가하면서 앱의 RAM 사용량이 증가한다.

android:icon: Activity를 나타내는 아이콘이다. 드로어블 리소스를 참조로 설정한다.

android:immersive: 현재 액티비티에 대해 몰입형 모드를 설정한다. 몰입형 모드란 전체 화면을 의미한다.

android:label: 액티비티에 대해 사용자가 읽을 수 있는 레이블을 나타낸다.

android:launchMode: 액티비티를 시작하는 방법에 대한 지침이다. 기본값은 'standard'이다. 기본값일 때 시스템이 항상 대상 작업에 새 액티비티 인스턴스를 생성하고 인텐트를 해당 인스턴스로 라우팅한다.

인텐트
액티비티끼리 서로 호출하기 위해서 필요한 통신 장치를 의미한다. 텐트에 호출할 대상 컴포넌트가 분명히 명시되어 있는 것을 명시적(Explicit) 인텐트, 호출 대상이 분명히 정해지지 않은 인텐트를 암시적(Implicit) 인텐트라 한다. 각 컴포넌트들은 하나의 독립된 형태로 존재하며, 정해진 역할을 수행한다. 이때, 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.


android:lockTaskMode: 기기가 잠금 작업 모드에서 실행 중일 때 시스템이 이 액티비티를 표시하는 방법을 결정한다.

android:maxRecents: 액티비티에 루팅된 작업의 최대 개수가 개요 화면에 나타난다.

루팅
모바일 기기에서 구동되는 안드로이드 운영 체제 상에서 최상위 권한(루트 권한)을 얻음으로 해당 기기의 생산자 또는 판매자 측에서 걸어 놓은 제약을 해제하는 행위를 의미한다.


android:maxAspectRatio: 액티비티가 지원하는 최대 화면비를 설정한다.

android:multiprocess: 액티비티 인스턴스를 시작한 구성 요소의 프로세스에서 액티비티 인스턴스를 시작할 수 있는지 여부를 나타낸다. 기본값은 false이다. 사용하는 데 주의가 필요한 속성이다.

인스턴스
실행 중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 의미한다.


android:name: 액티비티를 구현하는 클래스(Activity의 하위 클래스)의 이름이다.

android:noHistory: 사용자가 액티비티 밖으로 탐색하고 화면에 액티비티가 더 이상 표시되지 않을 때 액티비티 스택에서 액티비티를 제거하고 종료(finish() 메서드 호출)하는지 여부를 나타낸다. 기본값은 false이다. 기본값일 시 종료되지 않는다.

android:parentActivityName: 액티비티의 논리적 상위 액티비티의 클래스 이름을 입력한다.

android:persistableMode: 기기를 다시 시작할 때 포함 작업 내에 액티비티의 인스턴스를 어떤 식으로 보존할지 정의한다. 기본값은 'persistRootOnly'이다. 기본값일 시, 시스템이 다시 시작되면 액티비티 작업이 보존되지만, 루트 액티비티의 시작 인텐트만 사용됩니다.

android:permission: 클라이언트가 액티비티를 시작하거나 인텐트에 응답하는 데 필요한 권한의 이름을 입력한다.

android:process: 액티비티가 실행해야 하는 프로세스의 이름을 입력한다.

android:relinquishTaskIdentity: 액티비티가 작업 스택에서 상위 액티비티에 대한 작업 식별자를 포기하는지 여부를 나타낸다. 기본값은 false이다.

❗️ 추가공부 : 이해 못 함...


resizeableActivity: 앱이 다중 창 표시를 지원하는지 여부를 지정한다.

android:screenOrientation: 기기에서 액티비티의 디스플레이 방향을 지정한다. 기본값은 'unspecified'이다. 기본값일 시 시스템이 방향을 선택한다.

android:showForAllUsers: 기기의 현재 사용자가 액티비티를 시작한 사용자와 다를 경우 액티비티를 표시할지 설정한다.

android:stateNotNeeded: 상태를 저장하지 않고 액티비티를 중지했다가 다시 시작할 수 있는지 여부를 지정한다. 기본값은 false이다.

supportsPictureInPicture: 액티비티가 화면 속 화면 표시를 지원하는지 여부를 지정한다.

android:theme: 액티비티의 전체 테마를 정의하는 스타일 리소스에 대해 참조한다.

android:uiOptions: 액티비티 UI에 대한 추가 옵션이다.

android:windowSoftInputMode: 액티비티의 기본 창이 화상 키보드를 포함하는 창과 상호작용하는 방법을 지정한다.




02. <activity-alias>

액티비티의 별칭을 지정한다.


03. <provider>

콘텐츠 제공자 구성요소를 선언한다.


04. <reciever>

broadcast receiver(BroadcastReceiver 서브클래스)를 애플리케이션의 구성요소 중 하나로 선언한다.


05. <service>

서비스(Service 하위 클래스)를 애플리케이션의 구성요소 중 하나로 선언한다.





4️⃣ 인텐트 필터 태그

인텐트
메시징 객체로, 다른 앱 구성 요소로부터 작업을 요청하는 데 사용할 수 있다. 액티비티나 서비스를 시작하거나, 브로드캐스트를 시작하는 방식으로 구성 요소 사이의 통신을 촉진시킨다.

메시징
메시징은 데이터를 요구하는 메서드 호출이 아니라 작업을 요청하는 메서드 호출을 의미한다. 이러한 메시징 기능을 원활하게 하기 위하여 모듈 내의 속성 및 동작보다 모듈 간의 의사소통을 잘 설계하는 것이 성장 가능한 훌륭한 시스템을 만드는 데 훨씬 더 중요하다.


01. <intent-filter>

인텐트의 유형을 지정한다.


02. <action>

인텐트 필터에 작업을 추가한다. <intent-filter> 요소에 <action> 요소가 하나 이상 포함되어야 하며, 인텐트 필터에 <action> 요소가 없으면 필터가 Intent 객체를 허용하지 않는다.


03. <category>

인텐트 필터에 카테고리 이름을 추가한다.


04. <data>

데이터 사양을 인텐트 필터에 추가한다.





5️⃣ 권한 태그

01. <permission>

어떤 기능에 대한 액세스를 제한하는 보안 권한을 선언하다.


02. <permission-group>

보안 권한의 논리적 그룹 이름을 선언한다.


03. <permission-tree>

권한 트리의 기본 이름을 선언한다.

트리
트리란 계층적인 자료를 표현하는 데 이용되는 자료구조이다.
예를 들어, 안드로이드 사용자 인터페이스 화면은 뷰 계층 구조로 돼있다. 뷰 계층 구조는 계층 구조트리의 가장 위에 위치한 루트 뷰와 그 밑에 위치한 자식뷰들로 구성돼 있다. 사용자 인터페이스가 화면에 보일 때 안드로이드 런타임은 뷰 계층 구조를 루트 뷰에서 시작해서 밑으로 내려가며 화면에 나타낸다.


04. <uses-permission>

앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한을 설정한다.


05. <uses-permission-sdk-23>

애플리케이션이 원하는 특정 기능을 지정한다.

uses-permission 와 uses-permission-sdk-23의 차이
<uses-permission>은 안드로이드의 모든 플랫폼 버전, 모든 SDK에서 적용 가능하나, <uses-permission-sdk-23>은 Android 6.0 이상(SDK 23+,API 레벨 23 이상)을 실행하는 기기에서만 적용한다.

SDK(Software Development Kit)
하드웨어 플랫폼, 운영 체제(Operatting System, OS) 또는 프로그래밍 언어 제작사가 제공하는 일련의 툴을 의미한다. 쉽게 말해서 소프트웨어 개발 도구 모음으로, 개발에 도움이 될만한 프로그램, 디버깅 툴, 문서 등을 포함해 이야기한다.

API 레벨
Android 플랫폼 버전에서 제공되는 프레임워크 API 수정 버전을 고유하게 식별하는 정수 값이다.
아래 사진과 같이 플랫폼 버전, API 레벨, 버전 코드에 따라 업데이트 내역을 관리한다.


06. <grant-uri-permission>

상위 콘텐츠 제공업체에게 액세스 권한이 있는 앱 데이터의 하위 집합을 지정한다. 데이터 액세스 권한이 없는 제공업체의 클라이언트가 일회성으로 제한을 극복할 수 있도록 하는 방법이다. 제공업체의 범위 내에 있는 모든 데이터에 관한 권한을 부여하거나 요소에서 지정하는 데이터 하위 집합에만 권한을 부여할 수 있다.

07. <path-permission>

콘텐츠 제공자 내의 특정 데이터 하위 집합과 관련하여 경로와 필수 권한을 정의한다.





6️⃣ 지정 태그

01. <uses-configuration>

애플리케이션에 필요한 하드웨어 및 소프트웨어 기능을 지정한다. 예를 들어 애플리케이션에서 실제 키보드 또는 특정 탐색 기기(예: 트랙볼)가 필요하다고 지정할 수 있다. 하지만 대부분의 앱에서는 사용을 권장하지 않는 태그이다. 시각장애인을 지원하기 위해 터치 이외에 방향패드(D패드) 입력을 지원해야 하기 때문이다. D패드 입력 지원은 다른 방식을 사용한다.


02. <uses-feature>

애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 선언한다. 정보만 제공하는 태그이므로 기기에서는 기능 지원 여부를 확인하지 않으나, 서비스(예시: Google paly)에서는 확인할 수 있다. 따라서 애플리케이션이 사용하는 모든 기능을 선언하는 것이 중요하다.


03. <uses-library>

애플리케이션이 연결되어야 하는 공유 라이브러리를 지정한다.


04. <supports-gl-texture>

앱에서 지원하는 단일 GL 텍스처 압축 형식을 선언한다.





7️⃣ 호환성 태그

01. <compatible-screens>

애플리케이션이 호환되는 각 화면 구성을 지정한다.
<compatible-screens>은 정보 제공의 목적으로만 사용되며 외부 서비스가 특정 화면과 애플리케이션과의 호환성을 이해하고 사용자를 필터링하기 위해 이 항목을 사용한다. 이 태그에 선언되지 않은 화면 구성은 애플리케이션이 호환되지 않는 화면이다.
따라서 일반적으로 이 항목은 잘 사용되지 않는다. 이 항목에 선언되지 않은 화면 구성이 없는 기기는 해당 애플리케이션을 설치할 수 없으므로 사용자층이 현저히 줄어들기 때문이다.


02. <supports-screens>

애플리케이션에서 지원하는 화면 크기를 지정하고 사용하는 화면이 애플리케이션에서 지원하는 화면보다 큰 경우 화면 호환성 모드를 사용 설정할 수 있게 한다. 애플리케이션에서 항상 이 요소를 사용하여 애플리케이션에서 지원하는 화면 크기를 지정하는 것이 중요하다.
하지만 화면 호환성 모드는 애플리케이션을 실행할 때 UI의 픽셀화 및 블러가 발생할 수 있으므로 호환성 모드보다는 화면 크기별 대체 레이아웃을 만드는 것이 중요하다.


03. <uses-sdk>

하나 이상의 Android 플랫폼 버전과의 애플리케이션 호환성을 API 레벨 정수로 표시한다.





8️⃣ 기타 태그

01. <instrumentation>

애플리케이션과 시스템의 상호작용을 모니터링할 수 있는 Instrumentation 클래스를 선언한다.


02. <meta-data>

상위 구성요소에 제공될 수 있는 추가 임의 데이터 항목의 이름-값 쌍을 지정한다.





✅ Reference

안드로이드 Manifest가 무엇이고 어느 곳에 쓰는지 간단 설명 by CodeJB
안드로이드 앱의 기본 구조 by 주니온TV 아무거나연구소
XML namespace 이해하기 by 탁구치는 개발자
안드로이드 액티비티 by 개발자를 위한 레시피
Android User Interface by seokjun
안드로이드 런타임(Android Rumtime) by develoid
객체 지향 프로그래밍과 메시징 by HomoEfficio
ITWorld 용어풀이 | 샌드박스(SandBox) by 이대영
Manifest Activity 태그의 taskAffinity Attribute. by 돼지왕 놀이터
Manifest Activity 태그 속성 allowTaskReparenting. by 돼지왕 놀이터
[안드로이드] 액티비티(Activity)와 인텐트(Intent) by 사용자 WITN

0개의 댓글