Programming/Android

[UMC 3rd/Android] Manifest 주요 속성

코딩뽀시래기 2022. 9. 27. 23:03
728x90

Android Studio의 모든 프로젝트에는 AndroidManifest.xml 파일이 있다. Manifest 파일은 Android Build 도구, Android 운영체제 및 Google Play에 앱에 대한 필수적인 정보를 설명하는 데에 사용된다. 앱의 패키지 이름, 앱의 구성 요소, 시스템 또는 다른 앱의 보호된 부분에 액세스하기 위한 권한, 하드웨어 및 소프트웨어 기능 등의 내용이 선안되어 있다.

 

[ 🔥 Manifest 주요 속성 🔥 ]

 

1️⃣ manifest

- AndroidManifest.xml 파일의 루트 요소

- <appication> 요소를 포함해야 함

- xmlns:android 및 package 속성을 지정함

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="string"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource" 
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
    . . .
</manifest>

▶ xmlns:android

- Android 네임스페이스를 정의함

- 이 속성은 항상 "http://schemas.android.com/apk/res/android"로 설정해야 함

▶ package

- Android 앱의 전체 자바 언어 스타일 패키지 이름

 

2️⃣ application

- appication 선언

- appication의 각 구성요소를 선언하는 하위 요소를 포함

- 모든 구성요소에 영향을 줄 수 있는 속성을 가짐

<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>

 

3️⃣ activity

- appication의 시각적 사용자 인터페이스 요소를 구현하는 활동(Activity 서브 클래스)을 선언

- 모든 activity를 Manifest 파일의 <activity> 요소로 나타내야 함

- 여기에 선언되지 않은 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>

 

4️⃣ service

- 서비스(Service 서브클래스)를 애플리케이션의 구성요소 중 하나로 선언함.

- activity와 달리 시각적 사용자 인터페이스가 없음

- 오래 실행되는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API를 구현하는 데 사용

- 모든 service를 Manifest 파일의 <activity> 요소로 나타내야 함

- 여기에 선언되지 않은 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>

 

5️⃣ receiver

- broadcast receiver를 appication의 구성요소 중 하나로 선언함

- broadcast receiver를 사용하면 appication의 다른 구성요소가 실행되고 있지 않을 때도 시스템이나 다른 appication에서 broadcast 하는 intent를 appication에서 수신할 수 있음.

- broadcast receiver를 시스템에 알리는 방법

  1) 이 요소를 이용해 Manifest 파일에 broadcast receiver를 선언

  2) 코드에서 동적으로 broadcast receiver를 만든 다음 Context.registerReceiver() 메서드를 사용해 등록

<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>

 

6️⃣ provider

- content provider 구성 요소를 선언

- content provider는 application에서 관리되는 데이터에 관해 구조화된 엑세스를 제공하는 ContentProvider 서브클래스

- application의 모든 content provider는 Manifest 파일의 <provider> 요소에서 정의해야 함. 그렇지 않으면 시스템에서 인식하지 못해 이 구성 요소를 실행하지 않음.

- application의 일부인 content provider만 선언해야 함. application에서 사용하는 다른 application의 content provider를 선언하면 안 됨.

- Android 시스템은 provider의 content URI의 일부인 권한 문자열에 따라 content provider 참조를 저장함.

  예) 의료 전문가에 관한 정보를 저장한느 content provider에 액세스하려는 경우, provider를 식별하는 URI를 다른 Argument에서 가져오는 ContentResolver.query() 메서드를 호출함.

content://com.example.project.healthcareprovider/nurses/rn

- 여기서 content: 스키마는 URI를 Android content provider를 가리키는 content URI로 식별함.

- 권한 com.example.project.healthcareprovider는 provider 자체를 식별함.

- Android 시스템은 알려진 provider 및 권한 목록에서 권한을 조회함.

- 하위 문자열 nurses/rn은 경로로, content provider가 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>

 

7️⃣ intent-filter

- activity, service, broadcast receiver가 응답할 수 있는 intent의 유형을 지정

- intent-filter는 상위 구성요소의 기능, 즉 activity나 service가 할 수 있는 작업과 receiver가 처리할 수 있는 broadcast의 유형을 선언

- 전달된 유형의 receive intent로 구성요소를 열고, 이 구성요소에 의미가 없는 intent를 filtering함.

filter 내용의 대부분은 <action>, <category>, <data> 하위 요소에서 설명됨.

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

 

8️⃣ category

- intent-filter에 category 이름을 추가

<category android:name="string" />

 

9️⃣ action

- intent-filter에 작업을 추가

- <intent-filter> 요소에 <action> 요소가 하나 이상 포함되어야 함.

- intent-filter에 <action> 요소가 없으면 filter가 Intent 객체를 허용하지 않음.

<action android:name="string" />

 

🔟 uses-permission

- 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한

- application이 설치될 때(Android 5.1 이하 버전을 실행하는 기기) 또는 앱이 실행 중일 때(Android 6.0 이상 버전을 실행하는 기기) 사용자에게 권한이 부여

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

★ 참고

- 경우에 따라 <user-permission>을 통해 요청하는 권한이 Google Play에서 application을 filtering하는 방식에 영향을 미칠 수 있음.

728x90