본문 바로가기

Android/공부

[Manifest 정복] 1. 매니페스트(Manifest)란 (with package)

안녕하세요, 닉네임간편입니다. 이번 시간에는 매니페스트(Manifest)에 대해 알아보겠습니다.

1. 정의

모든 앱 프로젝트는 프로젝트 소스 세트의 루트에 AndroidManifest.xml 파일을 반드시 가져야 합니다.

매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명합니다.

Android Studio를 사용하여 앱을 빌드하면 매니페스트 파일이 자동으로 생성됩니다.

예시는 다음과 같습니다.

[AndroidManifest.xml]

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ssacproject.manytrial">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ManyTrial">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

<application> 선언을 통해 애플리케이션의 각 구성 요소를 선언하고, 모든 구성 요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함합니다.

이때 <manifest>와 <application> 요소는 필수적이며, 각각 한 번씩만 실행되어야 합니다.

다른 요소는 꼭 그렇지 않아도 됩니다.

2. 주요 요소

메니페스트 파일에서 주요하게 선언해야 하는 내용에는 크게 package, 앱 구성 요소, 인텐트 필터, 아이콘 및 레이블, 권한, 기기 호환성이 있습니다.

모든 내용을 한 번에 다루기엔 글이 너무 길어지고 루즈해질 것이기 때문에, 이번 시간에는 package에 대해서만 다루겠습니다.

3. package

매니페스트 파일의 루트 요소는 앱의 패키지 이름에 대한 특성이 필요합니다.

패키지 이름은 다음과 같이 선언됩니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ssacproject.manytrial">
		...
</manifest>

패키지 이름은 일반적으로 프로젝트 디렉토리 구조와 일치하며, 이 경우 ManyTrial이라는 폴더가 이 프로젝트의 디렉토리가 됩니다.

패키지 이름은 다양한 곳에서 사용됩니다.

1) 코드의 네임스페이스

코드의 네임 스페이스란 코드가 있는 위치를 말하며, 위 그림에서 네모난 박스에 해당하는 부분입니다. 패키지 이름은 코드의 네임스페이스와 일치하고, 일치해야 합니다.

안드로이드 빌드 도구는 패키지 이름을 코드의 위치 값으로 인식하며, 빌드 시 소스 코드가 패키지 이름에 해당하는 위치에 있는 것으로 인식합니다. 즉, 이 경우 앞서 매니페스트 파일에서 package를 "com.ssacproject.manytrial"로 설정했으므로, 빌드 도구는 이 위치에 코드가 있다고 인식하고 빌드를 진행합니다. 따라서 패키지 이름을 코드의 네임 스페이스의 값과 일치시켜야 합니다.

2) 구성 요소 위치 확인

매니페스트에 선언된 안드로이드 구성 요소의 위치를 확인할 때, 패키지 이름에 해당하는 경로를 기본 경로로 사용합니다.

3) 어피니티(Affinity)

패키지 이름은 액티비티의 기본 작업 어피니티가 됩니다.

어피니티는 액티비티 실행 시 신규 task를 만들 경우 어느 이름의 task에 속할 지 지정하는 것이며, 값을 지정하지 않을 경우 default로 앱의 패키지 이름이 됩니다.

4) 빌드 시스템에서는 APK로 앱을 빌드하는 동안 두 가지 이유로 패키지 이름이 사용됩니다.

a. 앱 리소스를 액세스하는 데 사용되는 R.java 클래스용 네임스페이스로 패키지 이름이 적용됩니다. 위 예시를 들자면 R 클래스는 'com.ssacproject.manytrial.R'에 생성됩니다.

b. 매니페스트 파일에 선언되는 상대 클래스 이름을 확인하는 데 이 이름을 사용합니다.

위 예시를 들어 설명하면

<activity android:name=".MainActivity">

로 선언된 액티비티는 'com.ssacproject.manytrial.MainActivity'로 확인됩니다.

5) 애플리케이션 ID

애플리케이션 ID는 시스템과 Google Play에서 고유한 앱 식별자로 사용되는 것입니다.

안드로이드 스튜디오에서 새 프로젝트를 생성하면 패키지 이름과 애플리케이션 ID는 일치합니다. 그러나 설치 과정이 종료되면 이후로는 둘 사이 연관이 없으므로 패키지 이름을 변경하더라도 애플리케이션 ID에는 아무런 영향을 주지 않습니다.

그러나 패키지 이름과 애플리케이션 ID가 다른 이름을 가지더라도 빌드가 종료될 때에는 두 이름이 일치하게 됩니다. 앱을 APK 또는 Android App Bundle로 패키징 할 때, 빌드 도구가 이 값을 Gradle 빌드 파일의 애플리케이션 ID로 대체하기 때문입니다.

빌드 프로세스가 끝날 때 빌드 도구에서 build.gradle 파일의 applicationId 속성을 사용해 애플리케이션 ID를 재정의할 수 있고, 패키지 이름은 메니페스트 파일에서 재정의할 수 있습니다.

앱을 게시한 후 패키지 이름을 변경하려는 경우 변경은 가능하지만 애플리케이션 ID는 동일하게 유지해야 합니다. 애플리케이션 ID는 Google Play에서 앱의 고유 ID를 정의하는데, 이때 애플리케이션 ID를 변경하게 되면 APK가 다른 앱으로 간주되고 이전 버전의 사용자가 업데이트를 받을 수 없기 때문입니다. 따라서 앱을 게시한 이후에는 애플리케이션 ID를 변경하면 안 됩니다.

따라서 패키지 이름을 변경하려는 경우, 패키지 이름과 애플리케이션 ID의 차이점을 정확하게 이해하고 변경해야 합니다.

4. 마무리

이번 시간에는 Manifest에 대한 간략한 개요 및 package 속성에 대해 알아보았습니다.

Manifest는 안드로이드 스튜디오에서 자동으로 만들어지기에 쉽게 지나칠 수 있지만, 앱을 개발하는 데에 있어 정말 필수적인 요소이기 때문에 자세히 알아보는 것이 중요하다고 생각합니다. 따라서 앞으로 차근차근 알아가 보면 좋을 것 같습니다!

728x90
반응형