AndroidManifest 파일의 역할
AndroidManifest 파일의 역할
AndroidManifest.xml 파일은 모든 안드로이드 프로젝트에 반드시 포함되어야 하는 필수 설정 파일입니다. 이 파일은 애플리케이션에 관한 핵심 정보를 안드로이드 운영 체제에 선언하며, 앱과 시스템 사이의 다리 역할을 수행합니다. 운영 체제는 앱 설치 시점과 런타임에 이 파일을 읽어 앱의 구조, 기능, 요구 사항을 파악합니다. 안드로이드 개발자라면 매니페스트 파일의 구조와 역할을 정확히 이해하는 것이 매우 중요하며, 면접에서도 자주 등장하는 주제이기도 합니다. 이 장을 마치면 다음 내용을 명확히 설명하실 수 있습니다.
- 매니페스트가
Activity,Service,BroadcastReceiver,ContentProvider등의 애플리케이션 컴포넌트를 어떻게 선언하는지 이해할 수 있습니다. - 권한(permission)의 선언 방식과 시스템의 권한 적용 메커니즘을 설명할 수 있습니다.
- 인텐트 필터(intent filter)를 통해 컴포넌트가 암시적 인텐트(implicit intent)에 어떻게 응답하는지 파악할 수 있습니다.
- 하드웨어 및 소프트웨어 기능 선언이 Google Play Store에서 기기 호환성에 어떤 영향을 미치는지 설명할 수 있습니다.
애플리케이션 컴포넌트 선언
매니페스트 파일은 앱에서 사용하는 모든 주요 컴포넌트를 등록합니다. Activity, Service, BroadcastReceiver, ContentProvider는 반드시 매니페스트에 선언해야 시스템이 해당 컴포넌트를 인스턴스화하고 상호작용할 수 있습니다. APK 안에 클래스 파일이 존재하더라도 매니페스트에 선언되지 않은 컴포넌트는 시스템이 실행할 수 없다는 점을 꼭 기억하셔야 합니다.
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- 메인 액티비티: 런처에서 앱 실행 시 가장 먼저 실행되는 진입점 -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService" />
<receiver android:name=".MyBroadcastReceiver" />
<provider android:name=".MyContentProvider"
android:authorities="com.example.provider" />
</application>
각 컴포넌트 태그는 해당 컴포넌트의 클래스 이름, 외부 노출 여부(exported), 그리고 응답할 인텐트 필터 정보를 시스템에 전달합니다. 런처 Activity는 인텐트 필터에서 android.intent.action.MAIN과 android.intent.category.LAUNCHER의 조합으로 식별됩니다. 참고로, Android 12(API 31) 이상에서는 인텐트 필터가 있는 컴포넌트에 android:exported 속성을 반드시 명시해야 하므로 유의하시기 바랍니다.
권한과 보안
매니페스트는 앱이 접근해야 하는 시스템 리소스와 기능에 대한 권한을 선언합니다. 사용자는 API 레벨에 따라 설치 전 또는 런타임에 이러한 권한 요청 정보를 확인하게 됩니다. INTERNET, ACCESS_FINE_LOCATION, READ_CONTACTS 등의 권한은 매니페스트의 최상위 레벨에서 선언합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 네트워크 통신을 위한 인터넷 접근 권한 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 정밀한 위치 정보 접근 권한 (GPS 기반) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>