[Android] Manifest 알아보기

성승모·2025년 11월 26일

Android

목록 보기
6/8

 최근 시험을 보면서 Manifest에 관한 문제가 나왔다. 두루뭉실하게 역할과 어떤 내용이 있는지 작성했지만, 한계점까진 답하지 못 했다. 그리하여 이번에 제대로 알아보기 위해 이 글을 작성한다.

개요

 manifest는 빌드 툴, Android OS, 구글 플레이 등 필수적인 정보를 담고 있으며, 특히 다음과 같은 내용이 있다.

  • 안드로이드 4대 컴포넌트: class 이름, 컴포넌트를 다루는 기기 사양, intent 등
  • 기기 및 OS 사양: 앱이 작동 가능한 최소한의 기기 및 OS 사양
  • 권한

 즉, 앱이 작동하기 위한 메타 데이터를 작성하는 파일이다. 따라서, Android 프로젝트에 반드시 필요하며, 프로젝트 시작 시 자동으로 생성된다.

장단점

장점

  1. 중앙 집중적 앱 구성 정보
    : 앱 구동을 위한 메타 데이터가 한 곳에 모여있기 때문에 이 파일만으로 진입점, 앱 이름, 권한 등을 한 번에 파악할 수 있다.

  2. 선언적 구성
    : 미리 정의하고 선언하는 형태이기 때문에 런타임에 OS가 앱의 동작을 예측할 수 있다.

  3. 빌드 시스템/라이브러리와의 연동
    : 각 모듈마다 독립적인 manifest 파일을 가질 수 있어서 이를 활용하는 2차 개발자가 추가 설정을 하지 않아도 된다. 해당 모듈은 빌드 시 Manifest Merge로 합쳐진다.

  4. 플랫폼/도구 지원이 풍부
    : Android Studio에서 Manifest의 내용을 인식하여 잘못된 코드를 알려준다.

단점

  1. 큰 규모에서의 가독성
    : 한 곳에 작성하기 때문에 앱 규모가 커질수록, 파악하기 어려워진다.

  2. 디버깅 포인트가 분산
    : Manifest Merge로 합쳐지면 어떤 manifest 파일의 문젠지 찾기 어렵다. 따라서, 라이브러리의 manifest도 미리 파악해여 권한 설정, 보안 취약점 등을 관리해야 한다.

  3. 정적 선언이라 런타임 유연성이 제한됨
    : 미리 선언하는 만큼 런타임동안의 변경이 어렵다. 플러그인 구조, 다이내믹 모듈 구조 같이 동적 구조에서는 오히려 이를 제한하는 형태가 된다. 그래서 Play Feature Delivery가 필요하다.

Manifest Merge

 위에서 언급했듯이 각 모듈마다 독립적인 manifest 파일을 가질 수 있고, 빌드 시 이를 합치는 Manifest Merge가 발생한다. 이에 대해 알아보자.

타입 및 Merge 우선 순위

  1. 빌드를 위한 manifest
  2. app 모듈에 위치한 manifest
  3. 라이브러리의 manifest

 위 세가지 타입의 manifest 파일이 있으며, 제일 낮은 "라이브러리의 manifest"부터 순서대로 merge한다.
(우선 순위는 "제일 가치있어 보존해야 하는 순위"라고 이해해야 한다.)

충돌 해결

 merge 중 같은 항목을 갖지 않거나 갖더라도 값이 같으면 충돌이 일어나지 않는다. 하지만 같은 항목을 갖지만 값이 서로 다르면 이 때 충돌이 일어나게 된다.

하지만 몇몇 상황에서는 충돌을 피하기 위해 다르게 작동한다.

  • 높은 우선 순위의 값을 사용한다.

  • <uses-feature>나 <uses-library>의 android:required는 or 연산을 통해 merge된다.

  • <uses-sdk>는 다음 상황에선 다르게 작동한다.

    • 하위 manifest가 상위보다 더 높은 minSdk 가지고, 이에 대한 merge rule이 없다면, 충돌을 발생시킨다.
    • 하위 manifest가 상위보다 targetSdkVersion이 낮다면, 상위 manifest의 값을 이용한다. 또한 그에 맞는 하위 manifes에 권한을 추가한다. 하지만 이는 권한 충돌을 일으킬 수 있으므로 따로 처리해줘야 한다.
  • 는 manifest 파일마다 무조건 다르다. 이는 merge가 완료된 manifest 파일에 포함되어, 유니크한 값으로 취급된다.

Merge rule markers

 충돌 시 merge 해결 방법과 원하지 않는 항목들을 삭제하는 등의 설정을 작성할 수 있다. 모든 markers tools: 네임스페이스에 포함되며, manifest 파일에 무조건 먼저 선언해야 한다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    xmlns:tools="http://schemas.android.com/tools"> <!--이 부분이 Merge rule markers였다.-->

여러 설정이 가능한데, 자세한 내용은 여기서 확인해보자.

profile
안녕하세요!

0개의 댓글