안드로이드 매니페스트 예제 - andeuloideu maenipeseuteu yeje

안드로이드 스튜디오에서 프로젝트를 생성하면 AndroidManifest.xml 파일이 생성된다. 공식 사이트에 있는 문서를 보면 Manifest 파일은 앱에 대한 필수 정보를 안드로이드 빌드 도구와 AOS, Google Play에 제공한다고 나와있다. 쉽게 앱에 대한 필수 정보를 시스템에 제공하는 목록 정도로 생각하면 될 것 같다. 이러한 Manifest 파일에 특히 선언되어야 하는 정보들이 있다.

  • Package name
  • App components
  • Permissions
  • Device compatibility

위의 네 가지 정보들이 어떻게 파일에 반영되는지 알아보자.

Package Name

Manifest 파일의 루트 요소(<manifest></manifest>)에는 해당 앱의 패키지 네임이 반드시 기재되어야 한다. “com.example.myapplication” 이라는 패키지를 만들었다면 아래와 같은 Manifest 파일이 생성된다.

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

이러한 패키지 네임은 apk를 추출하는 과정에서 아래와 같은 목적으로 사용된다.

  1. R.java 클래스의 네임스페이스로 이 이름 적용
    • 위의 예시에서는 “com.example.myapplication.R” 클래스 생성
  2. Manifest 파일 내에서 선언된 상대 경로에 적용

주민등록번호가 사람의 고유 식별자인 것처럼 패키지 네임은 곧 프로젝트의 식별자이다.

App Components

안드로이드에는 4대 컴포넌트가 있는데, 앱에서 이 컴포넌트들을 사용하기 위해서는 Manifest 파일에 해당하는 XML 요소를 선언해줘야 한다.

  • 〈acvitivy〉 : Activity의 각 하위 클래스
  • 〈service〉 : Service의 각 하위 클래스
  • 〈receiver〉 : Broadcast Receive의 각 하위 클래스
  • 〈provider〉 : Content Provider의 각 하위 클래스

XML 요소를 선언하지 않고 위의 컴포넌트들을 하위 클래스로 지정해서 사용하면 시스템이 실행되지 않는다.
하위 클래스 이름은 name 특성에 패키지 네임을 지정해서 사용한다.

<activity android:name=".MainActivity">
    ...
</activity>

Intent filter

4대 컴포넌트들은 각각 인텐트에 의해 활성화된다. 인텐트는 메시지 객체로 작업할 데이터나 작업을 수행해야 하는 명령 등을 포함한다.

Permissions

안드로이드 앱은 연락처나 SMS와 같은 민감한 사용자 데이터, 카메라처럼 특정 시스템 기능에 엑세스하기 위한 권한을 반드시 요청해야 한다.
각 권한은 고유한 레이블로 식별되는데, SMS 메시지를 보내야 하는 앱은 아래와 같이 설정해준다.

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

안드로이드 버전과 별개로 앱에서 필요로 하는 모든 권한에는

<activity android:name=".MainActivity">
    ...
</activity>
0 태그를 설정해줘야 한다.

Device Compatibility

Manifest 파일에는 앱에 필요한 하드웨어나 소프트웨어 기능 뿐만 아니라 앱과 호환되는 기기 유형도 선언할 수 있다.

<activity android:name=".MainActivity">
    ...
</activity>
1 태그를 사용하면 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있다. 만약 나침반 센서가 없는 기기에서 앱이 기본적인 기능을 실행하지 못한다면 다음과 같이 선언해서 사용할 수 있다.

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

앱이 호환되는 최소 버전을 나타내려면

<activity android:name=".MainActivity">
    ...
</activity>
2 태그와 minSdkVersion 속성을 이용한다. 이는
<activity android:name=".MainActivity">
    ...
</activity>
3 파일에서 재정의하기 때문에 Manifest 파일이 아닌 build.gradle 파일에 선언하는 것이 더 좋다.

안드로이드 빌드 도구는 패키지 이름을 코드의 위치 값으로 인식하며, 빌드 시 소스 코드가 패키지 이름에 해당하는 위치에 있는 것으로 인식합니다. 즉, 이 경우 앞서 매니페스트 파일에서 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는 안드로이드 스튜디오에서 자동으로 만들어지기에 쉽게 지나칠 수 있지만, 앱을 개발하는 데에 있어 정말 필수적인 요소이기 때문에 자세히 알아보는 것이 중요하다고 생각합니다. 따라서 앞으로 차근차근 알아가 보면 좋을 것 같습니다!