이동식 저장소

[Android] Manifest 파일이란? 본문

Primary/Android

[Android] Manifest 파일이란?

해스끼 2022. 7. 25. 22:54
잘 모르지만 그냥 사용했던 파일 1위! ``AndroidManifest.xml``

 

...어쨌든 잘 모르고 쓴 건 맞지 않는가? Activity나 service 정의할 때 많이 보긴 했지만, 정작 manifest 파일이 뭔지는 제대로 공부하지 않았다. 

그래서 manifest가 뭔데요?

Android가 앱을 실행하기 위해서는 우선 그 앱에 어떤 컴포넌트가 있는지 알아야 한다. ``AndroidManifest.xml`` 파일에는 앱의 모든 컴포넌트가 정의되며, 이것이 가장 중요한 역할이다.

 

그 밖에도 다음의 역할을 수행한다.

  • 앱에서 요구할 사용자 권한을 정의한다. ex) ``android.permissions.INTERNET``
  • 앱이 실행될 수 있는 최소 API 레벨을 정의한다.
  • 앱에서 사용하는 하드웨어/소프트웨어 기능을 정의한다. ex) 카메라, 블루투스
  • 앱에 링크되어야 하는 라이브러리를 선언한다. ex) Google Maps 라이브러리

컴포넌트 정의

Manifest 파일의 가장 중요한 기능이다.

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:icon="@drawable/app_icon.png" ... >
        <activity android:name="com.example.project.ExampleActivity"
                  android:label="@string/example_label" ... >
        </activity>
        ...
    </application>
</manifest>

자주 보던 코드 맞지? 참고로 컴포넌트란 다음의 요소를 의미한다.

  • ``<activity>``
  • ``<service>``
  • ``<receiver>``
  • ``<provider>``

``<activity>``는 앱의 시작점과 관련있고(MainActivity?), ``<service>``는 앱의 포그라운드/백그라운드 서비스를 정의하며, ``<receiver>``는 앱이 특정 작업을 수행할 수 있음을 의미하며, ``<provider>``는 앱이 다른 앱과 데이터를 공유할 수 있게 돕는다. 

 

이런 요소들을 manifest에 정의해야 하는 이유는, 앱의 기능 중 안드로이드 시스템과 가장 밀접하게 연결된 부분이기 때문이다. 

 

시스템은 manifest에 정의되지 않은 요소들을 인식할 수 없으며, 따라서 코드가 있더라도 해당 코드를 실행할 수 없다. 예외로 broadcast receiver는 manifest 대신 코드를 통해 정의할 수 있다.

컴포넌트에 기능 부여 with ``Intent``

``Activity`` 와 ``Service``는 ``Intent``를 통해 실행된다. 인텐트에는 명시적 인텐트와 암묵적 인텐트 두 종류가 있다.

  • 명시적 인텐트는 실행할 요소의 이름을 ``Intent``에 명시하는 방법이다.
  • 암묵적 인텐트는 실행할 액션만을 정의하며, 실제로 어떤 요소가 액션을 실행할 지는 신경쓰지 않는다. 대신 Android 시스템이 해당 액션을 실행할 수 있는 요소를 찾는다.

암묵적 인텐트를 사용한 예시로는, 공유하기 버튼을 눌렀을 때 수많은 앱의 수많은 기능이 뜨는 모습이 있다. 물론 시스템이 알아서 인식할 수는 없으니, manifest에 ``<intent-filter>``를 정의하여 앱이 이 액션을 수행할 수 있음을 시스템에 알려야 한다.

 

예를 들어 내가 개발하는 이메일 앱 ``MyMail``이 send 인텐트에 반응하게 하고 싶다면, 다음과 같이 manifest를 정의한다.

<manifest ... >
    ...
    <application ... >
        <activity android:name="com.example.project.ComposeEmailActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <data android:type="*/*" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

이제 Android 시스템은 send 인텐트를 받을 수 있는 옵션으로 ``MyMail``을 고려할 것이다.

설치 조건 정의

앱에서 필요한 하드웨어/소프트웨어 조건을 만족하지 못하는 기기에는 앱이 설치되지 않도록 미리 거를 필요가 있다. Google Play는 앱의 요구 조건을 읽어 해당 조건을 만족하는 기기에만 앱을 보여준다. 예를 들어 앱을 실행하려면 API 레벨이 24 이상이어야 한다던가, 카메라가 있어야 한다던가. 물론 카메라는 웬만하면 있겠지만.

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 26
    targetSdkVersion 29
  }
}

 

주의: ``minSdkVersion``과 ``targetSdkVersion``은 어차피 ``buld.gradle``의 값이 사용되므로 manifest에 정의하지 말자.

참고

 

애플리케이션 기본 항목  |  Android 개발자  |  Android Developers

애플리케이션 기본 항목 Android 앱은 Kotlin, Java, C++ 언어를 사용하여 작성할 수 있습니다. Android SDK 도구는 모든 데이터 및 리소스 파일과 함께 코드를 컴파일하여 하나의 APK를 만듭니다. Android 패

developer.android.com

 

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

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

developer.android.com

 

 

기기 호환성 개요  |  Android 개발자  |  Android Developers

기기 호환성 개요 Android는 스마트폰에서 태블릿, TV에 이르기까지 다양한 기기에서 실행되도록 설계되었습니다. 개발자로서 다양한 기기를 지원하면 앱의 잠재고객을 늘릴 수 있습니다. 이 모든

developer.android.com

 

Comments