본문 바로가기

Android Develop

[Android] Manifest file이란? (매니페스트 파일의 역할)

728x90
반응형

 

이번 시간에는 안드로이드 스튜디오에서 흔히 볼 수 있는 Manifest file에 대해서 알아보려고 합니다.

참고한 공식 문서는 아래와 같습니다.

 

developer.android.com/guide/topics/manifest/manifest-intro?hl=ko

 

앱 매니페스트 개요  |  Android 개발자  |  Android Developers

모든 앱 프로젝트는 프로젝트 소스 세트의 루트에 AndroidManifest.xml 파일(정확히 이 이름)이 있어야 합니다. 매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보

developer.android.com

 

 

컴포넌트는 어플리케이션을 이루고 있는 구성요소들입니다.

따라서 컴포넌트들을 매니페스트 파일에 적어줌으로써, 안드로이드 시스템이 어떤 컴포넌트를 사용하고 있는지 알도록 해야 어플리케이션이 실행됩니다.

 

 

즉, 어떤 컴포넌트 요소를, 또 어떤 클래스를 이용하여 생성하였는지 알려주는 지시서가 있어야 안드로이드에서 객체들을 만들고 실행시켜 줄 수 있습니다.

 

manifest file은 전체적으로 설명하는 내용들이 여러가지 있지만, 그 중에서도 아래와 같은 내용을 중점적으로 선언합니다.

 

 

 

 

1. 앱의 패키지 이름

 

 

기본적으로 앱의 패키지 이름은 프로젝트 디렉토리 구조와 일치합니다.

가장 처음에 프로젝트를 만들 때 입력하는 com.example.myapp 과 같은 패키지명을 의미하죠.

그렇다면 매니페스트 파일에서 앱의 패키지 이름은 어떻게 사용될까요?

 

 

안드로이드를 빌드하는 측면에서는 크게 두가지의 목적으로 나눌 수 있는데요,

 

첫번째는 앱 리소스에 접근하기 위해서 사용되는 R.java 의 네임스페이스로 해당 패키지 이름을 적용해줍니다.

 

두번째로는, 이 패키지명을 이용해서 manifest 내부의 상대 클래스 이름을 식별하는데요,

예를 들어서 manifest 파일 안에서 <activity android:name=".MainActivity"> 라는 코드를 작성했다면

.MainActivity -> com.example.myapp.MainActivity 인 것으로 식별하는 것이죠.

 

그러나 패키지 값이 안드로이드를 빌드한 이후에도 계속 그대로 사용되는 것은 아닙니다.

빌드 과정이 완료되면, package 이름 또한 build.gradle 파일의 applicationId 속성에 넣어져있는 값으로 바뀌기 때문입니다.

이를 이용하여 패키지 특성을 고유하게 보존함으로써 다른 앱과 식별할 수 있습니다!

 

 

아래 코드의 package="com.example.myapp" 부분이 패키지명에 해당됩니다.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >
    ...
</manifest>

 

 

 

 

2. 앱의 구성 요소(4대 컴포넌트 포함)

 

 

서론에서 말했듯이, 안드로이드 시스템은 해당 앱이 어떤 컴포넌트를 사용하고 있는지 알아야합니다.

만약 컴포넌트에 대한 내용을 manifest 파일에 적어주지 않는다면 시스템에서 해당 객체를 생성하고 실행하는 것이 불가능하기 때문에, 에러가 나게 됩니다.

가끔씩 액티비티를 만들어놓고 깜빡하고 manifest 파일에 이를 써주지 않으면 앱이 비정상 종료 하는 것이 이러한 이유때문이죠.

 

따라서 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 제공자에 각각

<activity>, <service>, <receiver>, <provider>라는 태그가 붙여주게 됩니다.

 

 

예시로 아래와 같이 사용할 수 있습니다.

더불어, 위에 패키지명이 있기 때문에 .MainActivity -> com.example.myapp.MainActivity 인 것으로 식별된 것임을 알 수 있습니다.

.MainActivity 대신에 com.example.myapp.MainActivity를 적어주어도 문제없습니다:)

<manifest package="com.example.myapp" ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

 

더불에 해당 구성 요소의 각 기능의 설명을 위해서 <intent-filter>라는 것을 사용하는데요,

해당 내용에 대해서는 나중에 더 자세히 다뤄보겠습니다.

 

 

 

 

3. 권한

 

 

안드로이드는 사용자의 카메라나 연락처, 위치 정보 등을 얻기 위해서 권한을 요청하기 위해서 아래와 같은 <uses-permission> 태그를 사용합니다.

 

흔히 우리가 앱을 처음에 다운 받았을 때에 '저장소의 접근 권한 요청'에 대해서 수락과 거절을 하는 창이 뜨게 되는데,

이게 바로 manifest 파일에 작성해 놓은 <uses-permission> 때문입니다.

만약 권한을 수락하지 않으면 앱에서 권한이 없는 기능에 접근할 수 없게 됩니다.

 

 

아래와 같이 manifest 파일에 작성할 수 있습니다.

 

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

 

 

 

 

4. 기기 호환성

 

 

기기 호환성이란 앱에 필요한 하드웨어 및 소프트웨어 기능으로, 앱을 출시할 때에 어떤 기종에서 사용할 수 있고 없는지를 판단하는 기준이 됩니다.

 

 

이렇게 어떤 기기가 해당 앱과 호환되는지를 작성하는 관련 태그들이 몇 가지 있는데요,

대표적인 태그로는 <uses-feature>와 <uses-sdk>가 있습니다.

 

<uses-feature> 요소에는 자이로 센서라던가, 나침반 센서와 같은 기능이 필요함을 나타내는 태그입니다.

따라서 필요한 센서나 기능들이 없는 앱에서는 설치되지 않도록 막을 수 있습니다.

 

아래와 같이 manifest 파일에 작성해 줄 수 있습니다.

 

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

 

 

<uses-sdk>는 이전 버전에서는 사용할 수 없는 새로운 API 기능이 추가될 수 있기 때문에

minSdkVersion이라는 값을 이용해서 이러한 기능이 호환되는 최소한의 버전을 나타냅니다.

 

그러나 <uses-sdk>의 특성값들은 build.gradle 파일 내에 있는 속성으로 덮어씌워지기 때문에

안드로이드 스튜디오에서 개발할 경우에는 build.gradle에

minSdkVersion과 targetSdkVersion(해당 앱이 개발 시에 사용한 API 레벨) 값을 대신 넣어줘야 한다고 하네요

 

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

    ...
  }
}

 

 

728x90
반응형