면접 질문실전 질문꼬리 질문

AndroidManifest.xml

skydovesJaewoong Eum (skydoves)||8분 소요

AndroidManifest.xml

AndroidManifest.xml 파일은 모든 안드로이드 애플리케이션 모듈의 루트에 반드시 존재해야 하는 필수 설정 파일입니다. 이 파일은 애플리케이션의 컴포넌트, 권한, 하드웨어 요구 사항, 메타데이터 등을 안드로이드 운영 체제에 선언하는 역할을 합니다. 시스템은 애플리케이션의 어떤 코드가 실행되기 전에 이 파일을 먼저 읽기 때문에, 앱과 플랫폼 사이의 **핵심 계약서(contract)**라고 할 수 있습니다. 면접에서도 빈번하게 출제되는 주제이므로, 매니페스트의 각 역할과 동작 원리를 정확히 이해해 두시는 것이 중요합니다. 이 장을 학습하고 나면 다음 내용을 설명하실 수 있게 됩니다.

  • 매니페스트가 컴포넌트 등록과 프로세스 시작에서 어떤 역할을 하는지 설명할 수 있습니다.
  • 권한, 인텐트 필터, 하드웨어 기능 선언이 어떻게 동작하는지 이해할 수 있습니다.
  • 매니페스트 병합(manifest merge) 과정에서 여러 매니페스트 파일이 어떻게 합쳐지는지 파악할 수 있습니다.
  • 매니페스트 설정에서 자주 발생하는 실수와 그 영향을 인식할 수 있습니다.

컴포넌트 등록

Activity, Service, BroadcastReceiver, ContentProvider 등 안드로이드의 4대 컴포넌트는 모두 매니페스트에 선언되어야 시스템이 해당 컴포넌트를 인식할 수 있습니다. 시스템은 이 선언 정보를 기반으로 각 컴포넌트를 어떻게 시작할지, 어떤 프로세스에서 실행할지 결정하게 됩니다. 즉, 매니페스트에 등록되지 않은 컴포넌트는 시스템 입장에서 존재하지 않는 것과 마찬가지입니다.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <!-- 런처에 표시될 메인 액티비티 -->
    <activity android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category
                android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name=".SyncService" />
    <receiver android:name=".BootReceiver" />
</application>

MainActivity에 선언된 intent-filter는 런처(홈 화면)에 이 Activity를 앱의 진입점(entry point)으로 표시하도록 지시합니다. 이 인텐트 필터가 없으면 앱이 설치되더라도 앱 서랍에 아이콘이 나타나지 않으므로 사용자가 직접 실행할 수 없게 됩니다. android:exported 속성은 다른 애플리케이션이 해당 컴포넌트를 시작할 수 있는지를 제어하며, API 31(Android 12) 이상에서는 인텐트 필터가 있는 컴포넌트에 이 속성을 반드시 명시해야 합니다.

권한(Permissions)

매니페스트에서는 앱이 요청하는 권한과 자체 컴포넌트를 보호하기 위해 정의하는 커스텀 권한을 모두 선언합니다. 요청 권한은 uses-permission 요소로 작성합니다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION" />

Android 6.0(API 23)부터 위치 정보와 같은 **위험 권한(dangerous permission)**은 매니페스트 선언 외에도 런타임에 사용자 동의를 별도로 받아야 합니다. 그렇다고 매니페스트 선언을 생략해도 되는 것은 아닙니다. 시스템이 런타임 권한 다이얼로그를 표시하기 전에 매니페스트의 선언 여부를 먼저 확인하기 때문입니다. 매니페스트에 해당 권한이 선언되어 있지 않으면 런타임 요청 자체가 무시될 수 있습니다.

또한, permission 요소를 사용하여 자체 컴포넌트에 대한 커스텀 권한을 정의할 수도 있습니다. 이렇게 하면 다른 앱에서 동일한 권한 모델을 통해 접근 권한을 요청할 수 있게 됩니다. 이는 앱 간 데이터 공유나 서비스 호출 시 보안을 강화하는 데 유용합니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기