[Android] Manifest의 주요 속성 10가지

지영·2022년 11월 8일
1

👽 Android

목록 보기
1/1

1. Manifest란?

모든 앱 프로젝트는 프로젝트 소스 세트의 루트에 AndroidManifest.xml 파일이 있어야 한다.
매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명하는 역할이다.

  • 앱의 패키지 이름(일반적으로 코드의 네임스페이스와 일치). Android 빌드 도구는 프로젝트를 빌드할 때 이 이름으로 코드 엔터티의 위치를 확인, 앱을 패키징할 때 빌드 도구가 이 값을 Gradle 빌드 파일의 애플리케이션 ID로 대체한다. 이는 시스템과 Google Play에서 고유한 앱 식별자로 사용된다.
  • 앱의 구성 요소(모든 액티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자 포함). 각 구성 요소는 Kotlin이나 Java 클래스의 이름과 같은 기본 속성을 정의해야 한다. 또한 자신이 처리할 수 있는 기기 구성의 종류, 그리고 구성 요소가 어떻게 시작되는지 설명하는 인텐트 필터와 같은 기능을 선언할 수도 있다.
  • 앱이 시스템 또는 다른 앱의 보호된 부분에 액세스하기 위해 필요한 권한. (다른 앱이 이 앱의 콘텐츠에 액세스하고자 하는 경우 반드시 있어야 하는 모든 권한도 선언)
  • 앱에 필요한 하드웨어 및 소프트웨어 기능으로, 이에 따라 앱을 Google Play에서 설치할 수 있는 기기의 종류가 달라진다.

2. Manifest의 주요 속성 10가지

1. manifest

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

AndroidManifest.xml 파일의 루트 요소, 단 하나의 application 요소를 포함해야 한다.
네임스페이스를 지정해주는 xmlns:android 속성, package 속성을 지정

2. application

<application android:allowTaskReparenting=["true" | "false"]
             android:allowBackup=["true" | "false"]
             android:allowClearUserData=["true" | "false"]
             android:allowNativeHeapPointerTagging=["true" | "false"]
             android:appCategory=["accessibility" | "audio" | "game" |
             "image" | "maps" | "news" | "productivity" | "social" | "video"]
             android:backupAgent="string"
             android:backupInForeground=["true" | "false"]
             android:banner="drawable resource"
             android:dataExtractionRules="string resource"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:extractNativeLibs=["true" | "false"]
             android:fullBackupContent="string"
             android:fullBackupOnly=["true" | "false"]
             android:gwpAsanMode=["always" | "never"]
             android:hasCode=["true" | "false"]
             android:hasFragileUserData=["true" | "false"]
             android:hardwareAccelerated=["true" | "false"]
             android:icon="drawable resource"
             android:isGame=["true" | "false"]
             android:killAfterRestore=["true" | "false"]
             android:largeHeap=["true" | "false"]
             android:label="string resource"
             android:logo="drawable resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:networkSecurityConfig="xml resource"
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:requestLegacyExternalStorage=["true" | "false"]
             android:requiredAccountType="string"
             android:resizeableActivity=["true" | "false"]
             android:restrictedAccountType="string"
             android:supportsRtl=["true" | "false"]
             android:taskAffinity="string"
             android:testOnly=["true" | "false"]
             android:theme="resource or theme"
             android:uiOptions=["none" | "splitActionBarWhenNarrow"]
             android:usesCleartextTraffic=["true" | "false"]
             android:vmSafeMode=["true" | "false"] >
    . . .
</application>

포함된 위치 : manifest
포함 가능한 요소 : activity, activity-alias, meta-data, service, receiver, profileable, provider, uses-library, uses-native-library

매니페스트 파일에는 단 하나의 application 요소를 포함해야 한다.
이 요소는 애플리케이션의 각 구성요소를 선언하고 모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함한다.
이 중 여러 속성(icon, label, permission, process, taskAffinity, allowTaskReparenting)이 구성요소의 해당하는 속성에 기본값을 설정, 그 외 속성(debuggable, enabled, description, allowClearUserData)은 애플리케이션의 값을 전체적으로 설정하며 구성요소별로 재정의할 수 없다.

3. activity

<activity android:allowEmbedded=["true" | "false"]
          android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:autoRemoveFromRecents=["true" | "false"]
          android:banner="drawable resource"
          android:clearTaskOnLaunch=["true" | "false"]
          android:colorMode=[ "hdr" | "wideColorGamut"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "screenLayout", "fontScale",
                                 "uiMode", "orientation", "density",
                                 "screenSize", "smallestScreenSize"]
          android:directBootAware=["true" | "false"]
          android:documentLaunchMode=["intoExisting" | "always" |
                                  "none" | "never"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:hardwareAccelerated=["true" | "false"]
          android:icon="drawable resource"
          android:immersive=["true" | "false"]
          android:label="string resource"
          android:launchMode=["standard" | "singleTop" |
                              "singleTask" | "singleInstance" | "singleInstancePerTask"]
          android:lockTaskMode=["normal" | "never" |
                              "if_whitelisted" | "always"]
          android:maxRecents="integer"
          android:maxAspectRatio="float"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:parentActivityName="string" 
          android:persistableMode=["persistRootOnly" | 
                                   "persistAcrossReboots" | "persistNever"]
          android:permission="string"
          android:process="string"
          android:relinquishTaskIdentity=["true" | "false"]
          android:resizeableActivity=["true" | "false"]
          android:screenOrientation=["unspecified" | "behind" |
                                     "landscape" | "portrait" |
                                     "reverseLandscape" | "reversePortrait" |
                                     "sensorLandscape" | "sensorPortrait" |
                                     "userLandscape" | "userPortrait" |
                                     "sensor" | "fullSensor" | "nosensor" |
                                     "user" | "fullUser" | "locked"]
          android:showForAllUsers=["true" | "false"]
          android:stateNotNeeded=["true" | "false"]
          android:supportsPictureInPicture=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:uiOptions=["none" | "splitActionBarWhenNarrow"]
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
    . . .
</activity>

포함된 위치 : application
포함 가능한 항목 : intent-filter, meta-data, layout

애플리케이션의 시각적 사용자 인터페이스 요소를 구현하는 활동(Activity 서브클래스)을 선언한다.
모든 활동은 매니페스트 파일의 activity 요소로 나타내야 한다.
여기에 선언되지 않은 활동은 시스템에 표시되지 않으며 실행되지 않는다.

4. service

<service android:description="string resource"
         android:directBootAware=["true" | "false"]
         android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:foregroundServiceType=["camera" | "connectedDevice" |
                                        "dataSync" | "location" | "mediaPlayback" |
                                        "mediaProjection" | "microphone" | "phoneCall"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>

포함된 위치 : application
포함 가능한 항목 : intent-filter, meta-data

안드로이드 애플리케이션을 구성하는 component 중 service를 정의한다.
Activity와 달리, 서비스는 시각적 사용자 인터페이스가 없고 오래 실행되는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데 사용한다.
모든 서비스는 매니페스트 파일의 service 요소로 나타내야 한다. 또한 activity와 마찬가지로 여기에 선언되지 않은 서비스는 시스템에 표시되지 않으며 실행되지 않는다.

5. receive

<receiver android:directBootAware=["true" | "false"]
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:name="string"
          android:permission="string"
          android:process="string" >
    . . .
</receiver>

포함된 요소 : applicaion
포함 가능한 항목 : intent-filter, meta-data

안드로이드 애플리케이션을 구성하는 component 중 broadcast receiver을 정의한다.
broadcast receiver를 사용하면 애플리케이션의 다른 구성요소가 실행되고 있지 않을 때도 시스템이나 다른 애플리케이션에서 브로드캐스트팅하는 인텐트를 애플리케이션에서 수신할 수 있다.
receiver 태그 안에 intent filter을 정의하여 어떠한 브로드캐스트 메시지에 반응할지를 지정할 수 있다.

6. provider

<provider android:authorities="list"
          android:directBootAware=["true" | "false"]
          android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:grantUriPermissions=["true" | "false"]
          android:icon="drawable resource"
          android:initOrder="integer"
          android:label="string resource"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:permission="string"
          android:process="string"
          android:readPermission="string"
          android:syncable=["true" | "false"]
          android:writePermission="string" >
    . . .
</provider>

포함된 요소 : application
포함 가능한 요소 : meta-data, grant-uri-permission, intent-filter, path-permission

안드로이드 애플리케이션을 구성하는 component 중 content provider 을 정의한다.
content provider는 어플리케이션 내의 데이터베이스를 다른 애플리케이션가 공유할 수 있도록 해주는 역할을 한다.
애플리케이션의 모든 content provider은 manifest 파일의 provider 요소에서 정의해야 하며 그러지 않으면 시스템에서 인식되지 않고 실행되지 않는다.

7. intent-filter

<intent-filter android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
    . . .
</intent-filter>

포함된 요소 : activity, activity-alias, service, receiver, provider
포함해야 하는 요소 : action
포함 가능한 요소 : category, data

Activity, Service, Broadcast Receiver가 응답할 수 있는 인텐트의 유형을 지정한다.
인텐트 필터는 상위 구성요소의 기능, 즉 활동이나 서비스가 할 수 있는 작업과 수신기가 처리할 수 있는 브로드캐스트의 유형을 선언한다.
전달되는 유형의 수신 인텐트로 구성요소를 열고 이 구성요소에 유의미하지 않은 인텐트를 필터링한다.

8. action

<action android:name="string" />

포함된 요소 : intent-filter

intent filter에 작업을 추가한다.
intent-filter 요소에 action 요소가 하나 이상 포함되어야 하며 없으면 필터가 Intent 객체를 허용하지 않는다.

9. category

<category android:name="string" />

포함된 요소 : intent-filter

intent filter 밑에 category 요소를 정의하여 component의 유형이 무엇인지 정의할 수 있다.

10. uses-permission

<uses-permission android:name="string"
        android:maxSdkVersion="integer" />

포함된 위치 : manifest

앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한이다.
애플리케이션이 설치될 때(Android 5.1 이하 버전을 실행하는 기기) 또는 앱이 실행 중일 때(Android 6.0 이상 버전을 실행하는 기기) 사용자에게 권한이 부여된다.

3. 안드로이드 4대 컴포넌트

  • 각 컴포넌트들은 하나의 독립적인 형태로 존재 / 고유의 기능을 수행 / 인텐트를 통해 상호작용

액티비티(Activity)

  • 사용자가 애플리케이션과 상호작용하는 단일화면 (UI를 갖는 하나의 스크린)
  • 사용자 인터페이스 화면을 가지며 특정한 작업을 담당하는 컴포넌트이다.
  • 한 화면에 모든 사용자 인터페이스 구성 요소 (버튼, 텍스트 등)이 포함되어 있다.
  • 안드로이드 애플리케이션은 반드시 하나의 activity를 가지고 있어야 한다.
  • 하나 이상의 View를 가질 수 있다.

서비스(Service)

  • 별도의 UI를 가지지 않으며 백그라운드에서 실행되는 컴포넌트, 사용자와 직접적으로 상호작용 X
  • 오래 실행되는 작업이나 원격 프로세스를 위한 작업을 할 때 사용
  • 사용자의 인터페이스(화면)를 방해하지 않고 눈에 보이지 않는 곳에서 작업을 처리한다.
  • 네트워크를 통하여 데이터를 꺼내 올 수 있다.
  • 액티비티와 서비스는 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행한다.
  • 이미 시작된 Service는 애플리케이션이 종료되고 다른 애플리케이션으로 이동해도 계속 백그라운드에서 실행한다.

방송 수신자 (BroadCast Receiver)

  • 안드로이드 단말기로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트
  • 단말기에서 발생하는 일 중에서 애플리케이션이 알아야 하는 상황이 발생하면 방송을 해준다.
    (ex. 사용자 안드로이드 디바이스의 시스템 부팅시 앱 초기화, 네트워크 끊김 등 특수한 이벤트에 대한 처리나 배터리 부족 알림, 문자 수신 등)
  • 일반적으로 UI가 없다.
  • 특정한 상황을 제외하고는 브로드캐스트는 시스템에서 시작한다.

콘텐트 제공자 (Content Provider)

  • 데이터를 관리하고 다른 애플리케이션의 데이터를 제공하는 데 사용되는 컴포넌트
  • 특정한 애플리케이션이 사용하고 있는 DB를 공유하기 위해 사용한다.
    (접근 권한 관리, 자신이 공개하고 싶은 데이터만 공유할 수 있도록)
  • 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공한다.
  • 음악 또는 사진 파일 등과 같이 용량이 큰 데이터들을 공유하는데 적합하다.
    (작은 데이터들은 인텐트(Intent)로 애플리케이션끼리 데이터 공유가 가능)

인텐트 (Intent)

  • 애플리케이션 구성요소 간에 작업 수행을 위한 정보(액션, 데이터 등)를 전달하는 역할
  • 독립적인 컴포넌트들의 상호 통신을 위한 장치
  • 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.
  • ex) 액티비티 간의 화면 전환(이동)

참고
https://developer.android.com/guide/topics/manifest/manifest-intro?hl=ko#components

profile
안녕하세요, 몰입을 꿈꾸는 개발자 박지영입니다.

0개의 댓글