Android

안드로이드 매니패스트(manifest) 파일

becky(지은) 2023. 9. 9. 21:06



안드로이드 스튜디오는 코드작성과 빌드가 분리됨!


vscode와 같은 IDE(통합개발환경)을 사용하면, javascript 코드를 작성한 후에  “어떻게 컴파일을 하세요, 어떻게 빌드를 하세요.” 와 같은 내용을 작성한 기억이 없는데, 왜 안드로이드 스튜디오는 빌드에 관한 설명이 필요한 걸까?
- 그 이유는 안드로이드 스튜디오는 코드작성과 빌드가 구분되어 있기 때문이다.
  안드로이드 스튜디오는 코드 편집만 하는 IDE이고, 빌드는 gradle 파일에서 설정을 하고, 라이브러리를 받아서 수행한다.




+참고

빌드와 컴파일?
빌드란 코드를 실행가능한 형태로 변환하는 것, 
컴파일은 빌드 프로세스 안에 포함되며, 사용자가 작성한 코드를 기계어나 중간 언어로 변화시키는 것 이구나



 

매니패스트 파일이란?


이 코드들을 ‘빌드(코드를 실행가능한 형태로 변환하는 것)하기 위해선 이런 설정과 정보를 알아야한다.’ 라고 말하는 것이 Manifest 파일이다.
한줄요약: 매니패스트  = 안드로이드 스튜디오 빌드 설정 파일
 
 

매니페스트 파일 4가지 필수선언

  1. 앱의 패키지 이름 (APK name)
  Android aPplication Package 
 ex) package="com.android.myapplication"
APK name의 2가지 역할
1) R클래스의 네임스페이스(= R클래스가 앱정보를 구분할 수 있는 이름)
2) 파일 내에서 선언된 다른 코드들의 상대경로
android:name=".MainActivity" = > “com.android.myapplication.MainActivity” 와 같다

 그러나 패키지 값이 안드로이드를 빌드한 이후에도 계속 그대로 사용되는 것은 아닙니다.
빌드 과정이 완료되면, package 이름 또한 build.gradle 파일의 applicationId 속성에 넣어져있는 값으로 바뀌기 때문입니다. 이를 이용하여 패키지 특성을 고유하게 보존함으로써 다른 앱과 식별할 수 있습니다!


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/constraintlayoutMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.android.myapplication.MainActivity">


안드로이드 스튜디오에서는 일반적으로 패키지 이름을 앱의 패키지로 자동으로 설정합니다. 그래서 XML 레이아웃 파일에서 tools:context 속성을 사용할 때 패키지 이름을 명시적으로 설정해 주지 않아도 되는 경우가 있습니다.
tools:context 속성은 레이아웃 파일이나 뷰를 어떤 액티비티 클래스와 연결할지를 나타내는데 사용됩니다. 여기서 tools:context의 값은 액티비티 클래스의 전체 이름(패키지 이름 포함)을 나타내며, 패키지 이름을 명시적으로 설정하지 않은 경우 안드로이드 스튜디오는 자동으로 패키지 이름을 인식하고 사용합니다.

  2. 앱의 4대 컴포넌트
<activity> : 사용자 인터페이스, 앱의 화면을 표시, ui 갯수만큼 액티비티가 선언됨

<service> : Activity 가 종료되어 있는 상태에서도 동작하기 위해 만들어진 구성요소임, 사용자 ui를 사용하지 않고도 처리될 수 있다.
예를 들어, 전화 앱을 켜놓지 않은 상태에서 전화를 받을 수 있는 것은 백그라운드에서 서비스가 돌아가고 있기 때문이다.

service 태그를 사용하여 정의된 서비스는 백그라운드 서비스와 포그라운드 서비스로 나뉜다.
백그라운드 서비스는 사용자와 직접 상호 작용하지 않는 서비스를 나타낸다. 
ex) 데이터 처리, 네트워크 작업, 파일 다운로드 등
포그라운드 서비스는 사용자와 상호 작용하는 서비스를 나타낸다.
ex) 음악 재생 앱에서 음악 재생 중에 앱이 백그라운드에서 실행되는 경우, 포그라운드 서비스를 사용하여 알림을 표시

서비스는 오래 실행되는 백그라운드 작업이나 다른 애플리케이션에서 호출할 수 있는 리치 커뮤니케이션 API
(SMS 메시지를 리치 문자 메시지 시스템으로 대체하고 전화 번호부 폴링 (서비스 검색 용)을 제공하고 통화 중 멀티미디어를 전송할 수 있는 것을 목표로 하는 이동 전화 사업자 간 및 휴대 전화와 사업자 간의 통신 프로토콜이다)
를 구현하는 데 사용합니다

<provider> : 다른 앱과 데이터를 공유하고, 데이터베이스를 관리
일반적으로 어플리케이션에서 자료를 저장할 때 DB를 주로 사용한다. 이때 한 어플리케이션 내에 저장되어 있는 DB에는 해당 앱 외에 다른 앱이 접근하는 것이 불가능하다.
그렇다면 다른 앱이 데이터에 접근할 수 있는 방법은 없는 것인가? 그렇지 않다.
외부 어플리케이션이 마음대로 내 DB에 접근하지 못하게 하면서 동시에 내가 가진 DB 중 원하는 것들만 공유할 수 있도록 해주는 역할을 하는 것이 바로 Contents Provider 이다.

<receiver> : 특정 이벤트에 대해 응답하는 역할
배터리가 부족할 때, 스크린이 캡쳐될 때, 파일 다운로드가 완료되었을 때 등 이러한 행위는 broadcast receiver 를 통해 응답받을 수 있다.

위의 <activity> ,<service>, <receiver>는 주로 인텐트에 의해 활성화된다.
인텐트란?
컴포넌트 간에 데이터를 주고 받는 메세지 객체이다.

인텐트에는 명시적 인텐트와 암시적 인텐트가 있다.
명시적 인텐트는 호출할 컴포넌트를 콕 찝어 알려주는 것이다.
암시적 인텐트는 호출할 컴포넌트를 정확하게 아는 것이 아닌 인텐트 객체 내 호출 컴포넌트를 찾을 수 있는 정보들만 들어있다.
암시적인 인텐트를 통해 사용자로 하여금 어느 컴포넌트를 사용할지 선택하도록 하고자 할 때 IntentFilter 가 필요하다.
자신이 만든 컴포넌트라면 컴포넌트의 이름을 정확히 알 수 있지만, 다른 사람이 만든 컴포넌트의 이름을 알기는 어렵다. 따라서 명시적 인텐트를 사용하여 호출할 수 없다. intent-filter 태그 안에는 action 과 category 태그가 존재한다.
인텐트 필터에 들어가는 정보는 태그의 경우 MAIN 이 되어야하고 태그의 경우 LAUNCHER 되어야 한다.
안드로이드 시스템 내부에서 수많은 어플리케이션들에 의해 수많은 인텐트들이 발생하는데 이 중 자신에게 필요한 인텐트만 받기 위해 인텐트 필터가 필요한 것이다.

위의 3가지 컴포넌트는 인텐트 필터(Intent Filter)를 포함하는 경우가 많은데,  인텐트 필터는 인텐트 매칭이나, 액션과 카테고리 지정, 데이터 유형및 uri 지정, 우선순위 설정, 컴포넌트간 연결 등을 수행한다
요약하면, 인텐트 필터는 앱의 컴포넌트가 어떤 종류의 인텐트를 수신해야 하는지 걸러주는 역할을 한다.


<activity> 태그 내부에 <intent> 태그로 액션과 카테고리를 지정해주는 모습을 있다.

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

<application>

        <!-- Activity 선언 -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>



        <!-- Service 선언 -->
        <service android:name=".MyService" />

        <!-- Content Provider 선언 -->
        <provider
            android:name=".MyContentProvider"
            android:authorities="com.example.myapp.provider"
            android:exported="true" />



        <!-- Broadcast Receiver 선언 -->
        <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.SOME_CUSTOM_ACTION" />
            </intent-filter>
        </receiver>
        
    </application>

</manifest>

 

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"


application과 4대 컴포넌트 들은 icon 속성과 label 속성을 가지고 있다.
xml로 구성하다 보면 트리구조이기 때문에 부모-자식관계가 생기게되는데, 이때 자식 element에 icon과 label이 설정되어 있지 않다면,
부모에게 설정된 값이 기본값으로 설정되게 된다.
그렇기 때문에, 각 컴포넌트마다 설정하지 않고 앱 전체에 기본값을 설정하려면, application에 설정하면 된다.

그러나 Content Provider의 경우를 포함할 수 있으나, 일반적이지는 않다.
<Provider>는 데이터를 읽고 쓰는 데 사용되며, 다른 앱의 <ContentProvider>로부터 데이터를 액세스하거나 다른 앱에 데이터를 제공하는 데 사용됩니다. 따라서 <intent-filter>를 사용하여 외부 앱이 <Provider>를 실행하도록 하는 것은 일반적으로 필요하지 않습니다.

ContentResolver는 <Provider>를 통해 제공된 데이터에 접근하기 위한 주요 클래스 중 하나입니다
ContentResolver는 <Provider>를 통해 제공되는 데이터에 접근하고 데이터를 쿼리, 삽입, 업데이트, 삭제하며 데이터 변경 사항을 감지하기 위해 사용됩니다.
예를 들어 의료 전문가에 관한 정보를 저장하는 콘텐츠 제공자에 액세스하려는 경우 다른 인수 중에서 제공자를 식별하는 URI를 사용하는 ContentResolver.query() 메서드를 호출합니다.


3. 앱의 접근권한(Perimission) 우리가 만드는 앱이 다른 앱에 접근할 때 필요한 권한표시
구체적으로는 연락처, SMS, 카메라, 위치정보 등 민감한 사용자 데이터에 액세스 여부 권한을 의미한다
ex) 카메라 필터앱이 카메라에 접근하려면 “카메라 사용권한”을 필요로 하며, 사용자는 앱을 설치할때마 권한을 부여할지 선택할 수 있다. 흔히 우리가 앱을 처음에 다운 받았을 때에 '저장소의 접근 권한 요청'에 대해서 수락과 거절을 하는 창이 뜨게 되는데, 이게 바로 manifest 파일에 작성해 놓은 <uses-permission> 때문입니다. Android 시스템 디자인은 어떤 앱이든 다른 앱의 구성 요소를 시작할 수 있다는 점에서 독특한 측면이 있습니다. 예를 들어 사용자가 기기 카메라로 사진을 캡처하기를 바라는 경우, 그런 작업을 수행하는 다른 앱이 있을 가능성이 높습니다. 그러면 사진을 캡처하는 액티비티를 직접 개발하는 대신 여러분의 앱에서 그 앱을 사용하면 됩니다. 카메라 앱의 코드를 포함하거나 링크할 필요도 없습니다. 대신 사진을 캡처하는 앱에서 액티비티를 시작하면 됩니다. 작업이 완료되면 사진이 앱으로 반환되기까지 하여 바로 사용할 수 있습니다. 사용자에게는 마치 카메라가 앱의 일부분인 것처럼 보입니다.
시스템이 구성 요소를 시작할 때 그 앱에 대한 프로세스를 시작하고(이미 실행 중이지 않은 경우), 해당 구성 요소에 필요한 클래스를 인스턴스화합니다. 예를 들어 여러분의 앱이 카메라 앱 내에서 사진을 캡처하는 액티비티를 시작하면, 해당 액티비티는 여러분 앱의 프로세스가 아니라 카메라 앱에 속한 프로세스에서 실행됩니다. 그러므로 대부분의 다른 시스템에서 실행되는 앱과 달리 Android 앱은 단일한 진입 지점이 없습니다(예를 들어 main() 함수가 없음).

다른 앱에 있는 구성 요소를 활성화하려면 시스템에 메시지를 전달하여 특정 구성 요소를 시작하고자 하는 인텐트를 밝혀야 합니다. 그러면 시스템이 대신 해당 구성 요소를 활성화해줍니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    
    <application>
        <!-- 앱의 4대 컴포넌트 들어감 -->
    </application>

    //application 외부에 권한이 들어감
    <!-- 카메라 권한 요청 -->
    <uses-permission android:name="android.permission.CAMERA" />

</manifest>





4. 앱의 기기호환성(Device Compatibility)

이렇게 어떤 기기가 해당 앱과 호환되는지를 작성하는 관련 태그들이 몇 가지 있는데요,
대표적인 태그로는 <uses-feature> <uses-sdk>가 있습니다.

<uses-feature> 요소에는 자이로 센서라던가, 나침반 센서와 같은 기능이 필요함을 나타내는 태그입니다.
따라서 필요한 센서나 기능들이 없는 앱에서는 설치되지 않도록 막을 수 있습니다.

//compass sensor 가 있는 기기에서만 다운로드 가능하게 하기 위해서는 아래와 같이 매니페스트 파일을 작성

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>




<uses-sdk>는 이전 버전에서는 사용할 수 없는 새로운 API 기능이 추가될 수 있기 때문에
minSdkVersion이라는 값을 이용해서 이러한 기능이 호환되는 최소한의 버전을 나타냅니다.


그러나 <uses-sdk>의 특성값들은 build.gradle 파일 내에 있는 속성으로 덮어씌워지기 때문에
안드로이드 스튜디오에서 개발할 경우에는 build.gradle에
minSdkVersion과 targetSdkVersion(해당 앱이 개발 시에 사용한 API 레벨) 값을 대신 넣어줘야 한다고 하네요


android {
  defaultConfig {
    applicationId 'com.example.myapp'

    // Defines the minimum API level required to run the app.
    minSdkVersion 15

    // Specifies the API level used to test the app.
    targetSdkVersion 28

    ...
  }
}







각 태그에서 자주 쓰이는 속성들 정리


1. <manifest>

<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 
- XML 네임스페이스(namespace)를 정의하는 데 사용되는 속성, 이 네임스페이스를 통해 안드로이드에서 정의한 요소와 속성을 사용할 수 있게 됩니다
package - 앱의 패키지 이름을 정의합니다. 패키지 이름은 앱을 식별하는 중요한 요소입니다
android:versionCode - 앱의 버전 코드를 정의합니다. 이것은 앱 업데이트와 버전 관리에 사용됩니다
android:versionName - 앱의 버전 이름(사용자에게 표시되는 버전)을 정의합니다


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:isMonitoringTool=["parental_control" | "enterprise_management" |
             "other"]
             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>


android:label
 - 앱의 레이블(이름)을 정의합니다
android:icon -  앱 아이콘을 지정합니다
android:theme - 앱의 기본 테마를 정의합니다
android:name - 앱 클래스의 이름을 정의합니다
android:allowBackup - 앱 데이터 백업을 허용할지 여부를 지정합니다
android:screenOrientation - 앱의 화면 방향을 지정합니다
android:usesCleartextTraffic 
앱이 일반 텍스트 HTTP와 같은 일반 텍스트 네트워크 트래픽을 사용하는지 여부를 나타냅니다. API 수준 27 이하를 타겟팅하는 앱에서는 기본값이 "true"이고, API 수준 28 이상을 타겟팅하는 앱에서는 기본값이 "false"입니다.

android:backupAgent - 앱의 백업 에이전트 클래스의 이름을 지정합니다. 기본값은 없으며, 이름을 지정해야 합니다
android:banner
이 속성은 이미지가 포함된 드로어블 리소스의 참조로 설정해야 합니다(예: "@drawable/banner"). 기본 배너는 없습니다.

android:debuggable
사용자 모드로 기기에서 실행할 때에도 애플리케이션을 디버그할 수 있는지 여부입니다. 디버그할 수 있으면 "true"이고 디버그할 수 없으면 "false"입니다. 기본값은 "false"입니다.

android:description
애플리케이션에 관해 사용자가 읽을 수 있는 텍스트로, 애플리케이션 라벨보다 더 길고 더 자세하게 설명합니다. 값은 문자열 리소스의 참조로 설정해야 합니다. 라벨과 달리 원시 문자열일 수 없습니다. 기본값은 없습니다.

android:largeHeap - 앱에 대용량 힙 메모리를 할당할지 여부를 정의합니다
대부분의 앱에서는 이 속성이 필요하지 않으며 대신 성능 개선을 위해 전체 메모리 사용량을 줄이는 데 중점을 둡니다. 또한 이 속성을 사용 설정하는 경우 가용 메모리가 고정적으로 증가될 것이 보장되지 않습니다. 왜냐하면 일부 기기는 총 가용 메모리의 제약을 받기 때문입니다.
런타임에 사용 가능한 메모리 크기를 쿼리(요청)하려면 getMemoryClass() 메서드나 getLargeMemoryClass() 메서드를 사용하세요.

android:permission 
클라이언트가 애플리케이션과 상호작용하는 데 필요한 권한의 이름입니다. 이 속성을 사용하면 애플리케이션의 모든 구성요소에 적용되는 권한을 편리하게 설정할 수 있습니다. 개별 구성요소의 permission 속성을 설정하는 방법으로 이 속성을 덮어쓸 수 있습니다.

android:hardwareAccelerated - 하드웨어 가속을 사용할지 여부를 정의합니다
Android 3.0(API 수준 11)부터는 하드웨어 가속 OpenGL 렌더기를 애플리케이션에 사용할 수 있으며 이를 통해 다양한 일반적인 2D 그래픽 작업의 성능을 향상할 수 있습니다. 하드웨어 가속 렌더기를 사용 설정하면 캔버스, Paint, Xfermode, ColorFilter, 셰이더, 카메라의 대부분의 작업이 가속화됩니다.
그 결과, 프레임워크의 OpenGL 라이브러리를 명시적으로 사용하지 않는 애플리케이션에서도 애니메이션과 스크롤이 더 매끄러워지고 전반적인 응답성이 향상됩니다.



android:allowTaskReparenting - 앱이 태스크 재배치를 허용할지 여부를 정의합니다


android:taskAffinity
고유한 taskAffinity 속성을 사용하여 다른 어피니티를 설정하는 활동을 제외하고 애플리케이션 내의 모든 활동에 적용되는 어피니티 이름입니다.
기본적으로 애플리케이션 내의 모든 활동은 동일한 어피니티를 공유하며 이 어피니티의 이름은 <manifest> 요소에서 설정된 패키지 이름과 동일합니다.




android:appCategory

이 앱의 카테고리를 선언합니다. 카테고리는 배터리나 네트워크, 디스크 사용량을 요약하는 경우와 같이 여러 앱을 의미 있는 그룹으로 클러스터링하는 데 사용됩니다. 앱이 특정 카테고리 중 하나에 잘 맞는 경우에만 이 값을 정의해야 합니다.




android:backupInForeground
이 앱이 포그라운드에 상응하는 상태일 때도 앱에서 자동 백업 작업이 실행될 수 있다는 것을 나타냅니다
기본값은 "false"이며, 이 경우 OS는 앱이 포그라운드에서 실행되는 동안(예: 음악 앱이 startForeground() 상태의 서비스를 통해 음악을 재생하는 중) 앱이 백업되지 않게 합니다.

android:persistent - 앱이 종료되어도 계속 실행될지 여부를 정의합니다
애플리케이션을 항상 실행 상태로 유지할지 여부입니다. 유지해야 하면 "true"이고 유지할 필요가 없으면 "false"입니다. 기본값은 "false"입니다. 일반적으로 이 플래그를 설정하지 않습니다. 지속 모드는 특정 시스템 애플리케이션만을 대상으로 합니다.

android:process 
<activity>, <service>, <receiver> 그리고 <provider>와 같은 컴포넌트 요소들과 관련된 매니페스트 항목은 android:process라는 속성을 이용해서, 해당 컴포넌트가 동작할 프로세스를 명시할 수 있다.
이 속성값을 활용해서 각각의 컴포넌트를, 애플리케이션 자체에서 제공하는 프로세스에서 동작시킬 수도 있고 아니면 다른 프로세스에서 동작시킬 수도 있다.
이와 같은 방식으로 일부 컴포넌트는 프로세스를 공유하지만 다른 컴포넌트들은 프로세스를 공유하지 않게 만들 수 있다. 그뿐 아니라, android:process 속성을 설정해서 서로 다른 애플리케이션에 있는 컴포넌트들을 동일한 프로세스에서 실행되게 할 수 있다.

종료시켜야 할 프로세스를 결정할 때, 안드로이드 시스템에서는 유저의 입장에서 각각의 프로세스에 가중치(우선순위)를 매긴다. 어떤 프로세스를 살리고 혹을 죽일지 결정할 때, 시스템에서는 컴포넌트의 상태와 프로세스에서 실행되고 있는 컴포넌트를 기초로 해서 각각의 프로세스에 "중요도 계층"를 할당한다.
"중요도 계층"에는 5개의 레벨이 존재한다.(가장 중요한 프로세스부터 - 중요하지 않은 프로세스까지)

android:enabled
Android 시스템이 애플리케이션의 구성요소를 인스턴스화할 수 있는지 여부입니다. 인스턴스화할 수 있으면 "true"이고 인스턴스화할 수 없으면 "false"입니다. 값이 "true"인 경우 각 구성요소의 enabled 속성은 구성요소가 사용 설정되는지 여부를 결정하고 값이 "false"이면 이 속성은 구성요소별 값을 재정의하여 모든 구성요소가 사용 중지됩니다.

android:requiredAccountType
애플리케이션이 작동하는 데 필요한 계정 유형을 지정합니다. 앱에 Account가 필요하면 이 속성의 값은 앱에서 사용하는 "com.google"과 같은 계정 인증자 유형(AuthenticatorDescription으로 정의됨)과 일치해야 합니다.
기본값은 null이며, 이 경우 애플리케이션이 계정 없이 작동할 수 있음을 나타냅니다.

제한된 프로필은 계정을 추가할 수 없으므로 이 속성을 지정하는 경우 같은 값을 사용해 android:restrictedAccountType도 선언하지 않는다면 제한된 프로필에서 앱을 사용할 수 없게 됩니다.

android:restrictedAccountType
이 애플리케이션에 필요한 계정 유형을 지정하며 제한된 프로필이 소유자 사용자가 가진 이 유형의 계정에 액세스할 수 있음을 나타냅니다. 앱에 Account가 필요하며 제한된 프로필이 기본 사용자의 계정에 액세스할 수 있는 경우 이 속성의 값은 앱에서 사용하는 "com.google"과 같은 계정 인증자 유형(AuthenticatorDescription에 의해 정의됨)과 일치해야 합니다.
기본값은 null이며, 이 경우 애플리케이션이 계정 없이 작동할 수 있음을 나타냅니다.

주의: 이 속성을 지정하면 제한된 프로필이 소유자 사용자의 계정으로 앱을 사용할 수 있으며 이 경우 개인 식별 정보가 공개될 수 있습니다. 계정에서 개인 정보가 공개될 수 있는 경우에는 이 속성을 사용해서는 안 되며 대신 android:requiredAccountType 속성을 선언하여 제한된 프로필에서 앱을 사용할 수 없게 만들어야 합니다.


android:resizeableActivity
앱이 멀티 윈도우 모드(Android는 여러 앱이 같은 화면을 동시에 공유)를 지원하는지 여부를 지정합니다. 이 속성은 <activity> 요소나 <application> 요소에서 설정할 수 있습니다.
이 속성을 "true"로 설정하면 사용자가 화면 분할 모드와 자유 형식 모드로 활동을 시작할 수 있고, 속성을 ”false”로 설정하면 앱을 멀티 윈도우 환경에 맞게 테스트하거나 최적화할 수 없습니다.

android:supportsRtl
어플리케이션이 RTL(right-to-left)를 지원해주는 여부를 선언한다.
기본 값은 false이다. 실제로 오른쪽에서 왼쪽으로 읽는 나라일 경우 지원이 된다.
따라서 우리나라에서는 true로 바꾸고 실행을 해봐도 결과는 같다.





3. <uses-permission>

<uses-permission android:name="android.permission.CAMERA"
                 android:maxSdkVersion="28"
                 android:minSdkVersion="21"
                 android:protectionLevel="signature"
                 android:required="true"
                 android:group="android.permission-group.BLUETOOTH"
                 android:description="Access to camera is required for taking photos"
                 android:label="Access Camera"
                 />


android:name - 권한의 이름을 정의합니다
android:maxSdkVersion - 권한의 최대 SDK 버전을 지정합니다
android:maxSdkVersion - 권한의 최소 SDK 버전을 지정합니다
android:protectionLevel - 권한의 보호 수준을 설정합니다
android:required - 권한이 필수인지 여부를 정의합니다
android:group - 권한을 그룹에 추가합니다
android:description - 권한에 대한 설명을 제공합니다
android:label - 권한 요청 시에 표시되는 레이블(메시지)을 정의합니다


4. <uses-feature>

<uses-feature android:name="android.hardware.camera" 
                            android:required="true"
                            android:version="1"
                            android:glEsVersion="0x00020000"
/>


android:name - 기능의 이름을 정의합니다
android:required - 기능이 필수인지 여부를 정의합니다
android:version - 기능의 버전을 정의합니다.
android:glEsVersion - OpenGL ES 버전 요구 사항을 정의합니다



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


android:name - 액티비티 클래스의 이름을 정의합니다

android:label - 액티비티의 레이블(이름)을 정의합니다
라벨은 사용자 인터페이스의 다른 문자열처럼 현지화될 수 있도록 문자열 리소스의 참조로 설정합니다. 하지만 애플리케이션을 개발하는 동안 편의를 위해 라벨을 원시 문자열로 설정할 수도 있습니다.

android:theme - 액티비티의 테마를 정의합니다

android:icon - 액티비티 아이콘을 지정합니다

android:screenOrientation - 액티비티의 화면 방향을 지정합니다
기기에서 활동의 디스플레이 방향을 나타냅니다. 활동이 멀티 윈도우 모드로 실행 중인 경우 시스템은 이 속성을 무시합니다.

android:stateNotNeeded
상태를 저장하지 않고 활동을 종료하고 성공적으로 다시 시작할 수 있는지를 나타냅니다. 이전 상태 참조 없이 다시 시작할 수 있는 경우에는 "true"이고 이전 상태가 필요하면 "false"입니다. 기본값은 "false"입니다.
"true" 설정은 유지된 상태 없이 활동을 다시 시작할 수 있음을 의미합니다. 예를 들어 홈 화면을 표시하는 활동은 어떤 이유로든 비정상 종료되는 경우 삭제되지 않도록 이 설정을 사용합니다.


android:permission
클라이언트가 활동을 시작하거나 인텐트에 응답하는 데 필요한 권한의 이름입니다. startActivity() 또는 startActivityForResult() 호출자가 지정된 권한을 부여받지 못하면 인텐트가 활동에 전달되지 않습니다.

android:launchMode
안드로이드에서 액티비티를 실행할 경우 스택에 쌓이게 되는데 이때 액티비티를 어떠한 방식으로 스택에 쌓을 건지 LaunchMode를 통해 기술할 수 있다.
(다중 인스턴스 지원 여부)
지원 : standard, singleTop ( singleTop 은 조건부 지원 )
지원 안함 : singleTask, singleInstance


1. standard
Default 값으로 Task 내 중복된 Activity를 허용한다.

2. singleTop
FLAG_ACTIVITY_SINGLE_TOP 속성과 동일하다.
Task 내 Top Activity와 동일한 Activity일 경우 중복하지 않고 기존 인스턴스를 재활용한다
기존 Activity는 onCreate()를 다시 타지 않는다. (재활용이기때문에 인스턴스를 새롭게 생성하는것이 아님)
대신 Intent 처리를 위해 onNewIntent(Intent intent) 가 호출되기 때문에 새롭게 호출된 Intent 처리를 할 수 있다.

3. singleTask
Task 내 모든 Activity를 대상으로 중복을 제한한다.
만약 Task 내에 Activity가 이미 존재한다면 새로운 인스턴스를 사용하지 않고 기존 인스턴스를 재활용한다.
또한, Activity Stack에서 해당 Activity 위에 있던 Activity는 모두 finish 된다.
기존 Activity는 onCreate()를 다시 타지 않는다. (재활용이기때문에 인스턴스를 새롭게 생성하는것이 아님)
대신 Intent 처리를 위해 onNewIntent(Intent intent) 가 호출되기 때문에 새롭게 호출된 Intent 처리를 할 수 있다.
(중요 특징)
singleTask는 자신의 Task에서만 실행될 수 있다.

4. singleInstance
모든 Task를 대상으로 중복된 Activity를 허용하지 안는다.
또한, Task내에 오직 singleInstance 설정된 Activity 하나만 존재할 수 있다.
방으로 따지면 독방을 차지하고 있으면서 동일한 방의 중복을 허용하지 않는 상태다.


android:documentLaunchMode
활동이 시작될 때마다 활동의 새 인스턴스가 작업에 추가되는 방식을 지정합니다.
이 속성을 통해 사용자가 동일한 애플리케이션의 다중 문서를 최근 화면에 표시할 수 있습니다.

이 속성에는 사용자가 애플리케이션으로 문서를 열 때 다음과 같은 효과를 낳는 네 가지 값이 있습니다.
이. 속성을 사용한다는 것은 하나의 App에서 여러개의 Document를 사용한다는 것으로, 최근 앱 목록에 여러개의 Task가 나타난게 된다.

android:allowEmbedded
액티비티가 다른 액티비티의 포함된 하위 항목으로 시작할 수 있다. 기본값은 false이다.

android:excludeFromRecents
이 활동에서 시작된 작업을 최근 화면에서 제외할지를 나타냅니다. 즉, 이 활동이 새 작업의 루트 활동인 경우 이 속성은 최근 앱 목록에 작업을 표시할지를 결정합니다. 작업이 목록에서 제외되면 "true"이고 포함되면 "false"입니다. 기본값은 "false"입니다.

android:directBootAware
활동이 직접 부팅을 인식하는지, 즉 사용자가 기기를 잠금 해제하기 전에 실행될 수 있는지를 나타냅니다.
기본값은 "false"입니다.

android:exported 
액티비티가 다른 앱에서 접근 가능한지 여부를 설정합니다
"true"인 경우 모든 앱에서 활동에 액세스할 수 있으며 정확한 클래스 이름으로 활동을 시작할 수 있습니다.
"false"인 경우 활동은 같은 애플리케이션의 구성요소나 사용자 ID가 같은 애플리케이션, 권한이 있는 시스템 구성요소에서만 시작될 수 있습니다. 이는 인텐트 필터가 없는 경우의 기본값입니다.

앱의 활동에 인텐트 필터가 포함되어 있으면 이 요소를 "true"로 설정하여 다른 앱에서 활동을 시작할 수 있게 합니다. 활동이 앱의 기본 활동이고 category android.intent.category.LAUNCHER를 포함하는 경우를 예로 들 수 있습니다.
이 요소가 "false"로 설정되어 있고 앱에서 활동을 시작하려고 하면 시스템에서 ActivityNotFoundException이 발생합니다.
이 속성 외에도 다른 애플리케이션에 대한 활동 노출을 제한하는 방법이 있습니다. 권한은 활동을 호출할 수 있는 외부 항목을 제한하는 데도 사용됩니다. permission 속성을 참고하세요.


android:allowTaskReparenting
활동을 시작한 작업에서 그 작업이 다음에 앞으로 나올 때 어피니티가 있는 작업으로 활동을 이동할 수 있는지를 나타냅니다. 이동할 수 있으면 "true"이고 시작된 작업에 남아 있으면 "false"입니다.

예를 들어 이메일 메시지가 웹페이지 링크를 포함하는 경우 링크를 클릭하면 페이지를 표시할 수 있는 활동을 표시합니다. 이 활동은 브라우저 애플리케이션이 정의하지만 이메일 작업의 일부로 실행됩니다. 상위 활동을 브라우저 작업으로 재지정할 경우 활동은 브라우저가 다음에 앞으로 올 때 표시되며 이메일 작업이 다시 앞으로 올 때 표시되지 않습니다

android:taskAffinity
활동에 어피니티가 있는 작업입니다. 어피니티가 같은 활동은 개념적으로 같은 작업(사용자 관점에서 같은 '애플리케이션')에 속합니다. 작업의 어피니티는 루트 활동의 어피니티가 결정합니다.
어피니티는 두 가지를 결정합니다. 하나는 활동이 상위 요소로 재지정된 작업(allowTaskReparenting 속성 참고)이고 하나는 FLAG_ACTIVITY_NEW_TASK 플래그로 시작될 때 활동을 수용하는 작업입니다.


android:alwaysRetainTaskState
활동이 있는 작업의 상태를 항상 시스템이 유지하는지를 나타냅니다. 유지하면 "true"이고 시스템이 특정 상황에서 작업을 초기 상태로 재설정할 수 있으면 "false"입니다. 기본값은 "false"입니다.
일반적으로 지우기는 사용자가 30분과 같이 특정 시간 동안 작업을 방문하지 않는 경우 실행됩니다.

그러나 이 속성이 "true"인 경우 사용자는 도착 방법과 상관없이 항상 마지막 상태의 작업으로 돌아갑니다. 이는 사용자가 손실을 원하지 않는 여러 상태(예: 열려 있는 여러 탭)가 있는 웹브라우저 등의 애플리케이션에서 유용합니다.

android:clearTaskOnLaunch
홈 화면에서 다시 시작할 때마다 루트 액티비티(사용자가 선택하여 실행되는 최초의 액티비티)를 제외한 모든 액티비티를 작업에서 제거할지 여부를 결정한다. 기본값은 false로, true인 경우에는 사용자가 작업을 다시 시작할 때마다 액티비티를 작업에서 제거하며 루트 액티비티로 이동한다.


android:configChanges
Activity 가 스스로 handling 할 환경 변화 ( Config Changes ) 를 나열해 주는 곳입니다.
- Runtime 시 환경 변화가 일어나면, 기본동작은 activity가 종료되고 재시작되는 것입니다.
- 하지만, android:configChanges 에 값을 주면 환경변화가 되어도 activity가 restart 되는 것을 막을 수 있습니다.
- 이 때 activity의 onConfigurationChanged() 함수가 대신 호출됩니다.

android:configChanges = "orientation" 이 설정되면, portrait mode -> landscape mode 가 되어도, Activity는 destroy 되지 않습니다. 대신에 Activity에 override 된 onConfigurationChanged() 함수가 호출되며, 여기서 환경변화 ( config changes ) 에 대한 처리를 해줍니다.


android:multiprocess
활동 인스턴스가 활동을 시작한 구성요소의 프로세스로 시작될 수 있는지를 나타냅니다. 시작될 수 있으면 "true", 없으면 "false"입니다. 기본값은 "false"입니다.
일반적으로 새 활동 인스턴스는 이를 정의한 애플리케이션의 프로세스로 시작되므로 모든 활동 인스턴스가 동일한 프로세스에서 실행됩니다. 그러나 이 플래그를 "true"로 설정하는 경우 활동 인스턴스는 다중 프로세스에서 실행될 수 있으며 시스템이 사용되는 곳과 상관없이 인스턴스를 생성할 수 있습니다(권한이 있는 경우). 이는 거의 필요하지 않거나 바람직하지 않습니다.


android:persistableMode
기기를 다시 시작할 때 포함 작업 내에 액티비티의 인스턴스를 어떤 식으로 보존할지 정의한다. 기본값은 'persistRootOnly'이다. 기본값일 시, 시스템이 다시 시작되면 액티비티 작업이 보존되지만, 루트 액티비티의 시작 인텐트만 사용됩니다.


android:windowSoftInputMode
활동의 기본 창이 터치형 소프트 키보드를 포함하는 창과 상호작용하는 방법을 나타냅니다. 이 속성 설정은 다음 두 가지에 영향을 미칩니다.
활동에 사용자의 관심이 집중될 때 소프트 키보드를 숨기거나 표시할지 여부
소프트 키보드의 공간을 확보하도록 활동의 기본 창 크기를 더 작게 조절할지, 창의 일부가 소프트 키보드로 인해 가려질 때 현재 포커스가 표시되도록 콘텐츠를 이동할지 여부


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

android:enabled - 서비스를 활성화 또는 비활성화합니다
시스템에서 서비스를 인스턴스화할 수 있는지 여부입니다. 인스턴스화할 수 있으면 "true"이고 인스턴스화할 수 없으면 "false"입니다. 기본값은 "true"입니다

서비스를 포함한 모든 애플리케이션 구성요소에 적용되는 자체 enabled 속성이 있습니다. <application> 속성과 <service> 속성이 모두 "true"(두 속성의 기본값)여야 서비스를 사용할 수 있습니다. 둘 중 하나가 "false"이면 서비스가 사용 중지되며 서비스를 인스턴스화할 수 없습니다.

android:process
서비스가 실행될 프로세스 이름을 지정합니다
일반적으로 애플리케이션의 모든 구성요소는 애플리케이션용으로 만들어진 기본 프로세스에서 실행됩니다. 애플리케이션 패키지와 이름이 동일합니다. <application> 요소의 process 속성은 모든 구성요소에 다른 기본값을 설정할 수 있습니다. 하지만 구성요소는 자체 process 속성을 사용해 이 기본값을 재정의할 수 있으므로 이 방법을 통해 애플리케이션을 여러 프로세스에 확산시킬 수 있습니다.

android:exported
다른 애플리케이션의 구성요소가 서비스를 호출하거나 서비스와 상호작용할 수 있는지 여부입니다. 할 수 있으면 "true", 할 수 없으면 "false"입니다. 이 값이 "false"이면 동일한 애플리케이션의 구성요소 또는 동일한 사용자 ID를 가지고 있는 애플리케이션만 서비스를 시작하거나 서비스에 바인딩할 수 있습니다.

기본값은 서비스가 인텐트 필터를 포함하는지 여부에 따라 다릅니다. 필터가 없는 경우 정확한 클래스 이름을 지정해야 서비스를 호출할 수 있습니다. 즉, 다른 사람은 클래스 이름을 알지 못하므로 서비스가 애플리케이션 내부용으로만 사용된다는 것을 의미합니다. 이 경우 기본값은 "false"입니다. 반면 필터가 하나 이상 있으면 경우 서비스가 외부용임을 의미하므로 기본값은 "true"입니다.

android:directBootAware 
서비스가 직접 부팅을 인식하는지 여부, 즉 사용자가 기기를 잠금 해제하기 전에 서비스가 실행될 수 있는지 여부입니다.


android:foregroundServiceType 
서비스가 특정 사용 사례를 충족하는 포그라운드 서비스임을 지정합니다. 예를 들어 포그라운드 서비스 유형 "location"은 앱이 기기의 현재 위치를 가져올 수 있다는 것을 의미합니다. 일반적으로는 기기 위치와 관련된 사용자가 시작한 작업을 계속하기 위한 목적입니다.
여러 포그라운드 서비스 유형을 특정 서비스로 할당할 수 있습니다.


android:permission
서비스를 시작하거나 서비스에 바인딩하기 위해 항목이 반드시 가져야 하는 권한의 이름입니다.
startService(), bindService() 또는 stopService() 호출자가 이 권한을 부여하지 않았을 경우 이 메서드는 작동하지 않고 Intent 객체가 서비스에 전달되지 않습니다.
이 속성을 설정하지 않은 경우 <application> 요소의 permission 속성이 설정한 권한을 서비스에 적용합니다. 둘 중 어느 속성도 설정하지 않은 경우 서비스는 권한으로 보호되지 않습니다.




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


android:authorities - ContentProvider의 권한(authority)을 정의합니다
(예: com.example.provider.cartoonprovider). 일반적으로 제공자를 구현하는 ContentProvider 서브클래스의 이름입니다.
기본값은 없으며, 권한을 하나 이상 지정해야 합니다.

android:enabled
시스템에서 콘텐츠 제공자를 인스턴스화할 수 있는지 여부입니다. 할 수 있으면 "true"이고 할 수 없으면 "false"입니다. 기본값은 "true"입니다.
<application> 요소에는 콘텐츠 제공자를 포함한 모든 애플리케이션 구성요소에 적용되는 고유의 enabled 속성이 있습니다. <application> 속성과 <provider> 속성은 모두 "true"여야(기본값임) 콘텐츠 제공자를 사용 설정할 수 있습니다. 둘 중 하나가 "false"이면 제공자가 사용 중지되어 인스턴스화할 수 없습니다.

android:grantUriPermissions 
일반적으로는 콘텐츠 제공자의 데이터에 액세스할 수 있는 권한이 없는 사용자에게 액세스 권한을 부여함으로써 readPermission, writePermission, permission, exported 속성으로 가해진 제한을 일시적으로 극복할 수 있는지 여부입니다.
권한을 부여할 수 있는 경우 "true"이고, 부여할 수 없는 경우 "false"입니다. "true"이면 콘텐츠 제공자의 모든 데이터에 액세스할 수 있는 권한을 부여할 수 있습니다. "false"인 경우 <grant-uri-permission> 하위 요소(있는 경우)에 나열된 데이터 하위 집합에만 액세스할 수 있는 권한을 부여할 수 있습니다. 기본값은 "false"입니다.

android:initOrder
동일한 프로세스에서 호스팅하는 다른 콘텐츠 제공자에 상대적으로 콘텐츠 제공자를 인스턴스화하는 순서입니다. 콘텐츠 제공자 사이에 종속 항목이 있는 경우 제공자별로 이 속성을 설정하면 종속 항목에서 요구하는 순서대로 생성됩니다. 이 값은 정수이며 숫자가 높을수록 먼저 초기화됩니다.


android:readPermission 
클라이언트가 콘텐츠 제공자를 읽어들이는 데 필요한 권한입니다.
제공자가 android:grantUriPermissions를 "true"로 설정하는 경우 또는 특정 클라이언트가 <grant-uri-permission> 하위 요소의 조건을 충족하는 경우 클라이언트는 콘텐츠 제공자 데이터의 읽기 액세스 권한을 일시적으로 얻을 수 있습니다.



android:writePermission 
클라이언트가 콘텐츠 제공자에 의해 제어되는 데이터를 변경하는 데 필요한 권한입니다.
제공자가 android:grantUriPermissions를 "true"로 설정하는 경우 또는 특정 클라이언트가 <grant-uri-permission> 하위 요소의 조건을 충족하는 경우 클라이언트는 콘텐츠 제공자 데이터의 수정 액세스 권한을 일시적으로 얻을 수 있습니다.



android:permission
클라이언트가 콘텐츠 제공자의 데이터를 읽거나 쓰기 위해 필요한 권한의 이름입니다.
이 속성을 사용하면 읽기 및 쓰기를 위한 단일 권한을 편리하게 설정할 수 있습니다. 하지만 readPermission, writePermission, grantUriPermissions 속성이 이 속성보다 우선합니다.
readPermission 속성도 설정되어 있으면 이 속성은 콘텐츠 제공자 쿼리용 액세스를 제어합니다. writePermission 속성이 설정되어 있으면 이 속성은 제공자 데이터 수정용 액세스를 제어합니다.


android:multiprocess 
앱이 여러 프로세스에서 실행되는 경우 이 속성은 콘텐츠 제공자 인스턴스를 여러 개 만들지 결정합니다. "true"이면 앱의 각 프로세스마다 고유한 콘텐츠 제공자 객체가 있고, "false"이면 앱의 여러 프로세스가 콘텐츠 제공자 객체 하나만 공유합니다. 기본값은 "false"입니다.
이 플래그를 "true"로 설정하면 프로세스 간 통신의 오버헤드를 줄여 성능을 개선할 수 있지만 각 프로세스의 메모리 사용량도 증가합니다.


android:exported 
다른 애플리케이션에서 콘텐츠 제공자를 사용할 수 있는지 여부를 지정합니다.
"true": 다른 애플리케이션에서 제공자를 사용할 수 있습니다. 모든 애플리케이션이 제공자에 지정된 권한에 따라 제공자의 콘텐츠 URI를 사용해 액세스할 수 있습니다.
"false": 다른 애플리케이션에서 제공자를 사용할 수 없습니다. 내 애플리케이션만 제공자에 액세스할 수 있게 제한하려면 android:exported="false"를 설정합니다. 제공자와 동일한 사용자 ID(UID)를 가진 애플리케이션 또는 android:grantUriPermissions 요소를 통해 제공자 액세스 권한을 일시적으로 부여받은 애플리케이션이 액세스할 수 있습니다.



android:syncable 
콘텐츠 제공자가 제어하는 데이터를 서버의 데이터와 동기화할 수 있는지 여부입니다. 할 수 있으면 "true"이고 할 수 없으면 "false"입니다.







8. <receiver>

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


android:name - BroadcastReceiver 클래스의 이름을 지정합니다

android:label - BroadcastReceiver의 레이블(이름)을 지정합니다

android:directBootAware 
서비스가 직접 부팅을 인식하는지 여부, 즉 사용자가 기기를 잠금 해제하기 전에 서비스가 실행될 수 있는지 여부입니다.

android:enabled
시스템에서 broadcast receiver를 인스턴스화할 수 있는지 여부입니다. 인스턴스화할 수 있으면 "true"이고 인스턴스화할 수 없으면 "false"입니다. 기본값은 "true"입니다.
<application> 요소에는 broadcast receiver를 비롯하여 모든 애플리케이션 구성요소에 적용되는 자체 enabled 속성이 있습니다. broadcast receiver를 사용하려면 <application> 및 <receiver> 속성이 모두 "true"여야 합니다. 둘 중 하나가 "false"면 broadcast receiver가 사용 중지되며 인스턴스화될 수 없습니다.

android:exported 
broadcast receiver에서 애플리케이션 외부의 비시스템 소스에서 메시지를 수신할 수 있는지 여부입니다. 할 수 있으면 "true"이고 할 수 없으면 "false"입니다. "false"인 경우 broadcast receiver는 시스템이나 동일한 애플리케이션의 구성요소, 사용자 ID가 같은 애플리케이션에서 보낸 메시지만 수신할 수 있습니다.
지정하지 않으면 기본값은 broadcast receiver에 인텐트 필터가 포함되어 있는지에 따라 달라집니다. broadcast receiver에 인텐트 필터가 1개 이상 포함되어 있으면 기본값은 "true"이고 그 외 경우 기본값은 "false"입니다.

android:permission 
broadcaster가 broadcast receiver에 메시지를 보내는 데 필요한 권한 이름입니다. 이 속성이 설정되어 있지 않으면 <application> 요소의 permission 속성에서 설정한 권한이 broadcast receiver에 적용됩니다. 아무 속성도 설정되어 있지 않으면 broadcast receiver가 권한으로 보호되지 않습니다.

android:process 
broadcast receiver가 실행되는 프로세스의 이름입니다. 일반적으로 애플리케이션의 모든 구성요소는 애플리케이션용으로 만들어진 기본 프로세스에서 실행됩니다. 애플리케이션 패키지와 이름이 동일합니다.
<application> 요소의 process 속성은 모든 구성요소에 다른 기본값을 설정할 수 있습니다. 하지만 각 구성요소는 고유한 process 속성을 사용해 이 기본값을 재정의할 수 있으므로, 이 방법을 통해 애플리케이션을 여러 프로세스에 확산시킬 수 있습니다.






9.<intent-filter>

<intent-filter
    android:priority="100"
    android:autoVerify="true" >

android:priority -Intent 필터의 우선순위를 설정합니다. 높은 우선순위를 가진 필터가 먼저 매칭됩니다
android:autoVerify - 웹사이트 연동 앱의 경우 자동 검증을 사용하여 웹사이트와 앱 간의 링크를 자동으로 확인할 수 있습니다


10. <action>

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

android:name- Intent 액션을 정의합니다. 특정 액션과 일치하는 인텐트만 필터를 통과합니다.


11. <category>

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>


android:name - Intent 카테고리를 정의합니다. 특정 카테고리를 갖는 인텐트만 필터를 통과합니다.



12. <data>

<intent-filter>

<data android:scheme="http" />
      android:host="www.example.com"
      android:port="8080"
      android:path="/products"
      android:pathPrefix="/images/"
      android:pathPattern="/products/.*"
      android:mimeType="text/plain" 
      />

<intent-filter/>


android:scheme - 데이터의 URI 스키마를 지정합니다
android:host - URI의 호스트(도메인)를 지정합니다
android:port - URI의 포트 번호를 지정합니다
android:path - URI 경로를 지정합니다
android:pathPrefix - URI 경로의 접두사를 지정합니다
android:pathPattern - 정규 표현식을 사용하여 URI 경로 패턴을 지정합니다
android:mimeType - 데이터의 MIME 유형을 지정합니다