Android manifest.xml

Android : 2010.07.26 15:07


내용 정리가 너무 잘 되어 있어서..
혹시나 나중에 삭제 될까봐 내용 복사해서 퍼다 나름..

<?xml version=”1.0” encoding=”utf-8”?>

<manifest>

<uses-permission />

<permission />

<permission-tree />

<permission-group />

<instrumentation />

<uses-sdk />

<uses-configuration />

<uses-feature />

<supports-screens />

<application>

<activity>

<intent-filter>

<action />

<category />

<data />

</intent-filter>

<meta-data />

</activity>

<activity-alias>

<intent-filter> . . . </intent-filter>

<meta-data />

</activity-alias>

<service>

<intent-filter> . . . </intent-filter>

<meta-data/>

</service>

<receiver>

<intent-filter> . . . </intent-filter>

<meta-data />

</receiver>

<provider>

<grant-uri-permission />

<path-permission />

<meta-data />

</provider>

<uses-library />

</application>

</manifest>

 

매니패스트 파일은 어플리케이션에 대한 전반적인 정보를 담고 있는 파일로, 어플리케이션이 실행되기 전에 시스템이 알고 있어야 하는 파일이다. 이 매니페스트 파일 안에는 어플리케이션 컴포넌트(Activity, Service, intents, Content provider, Broadcast Receivers)에 대한 노드를 포함하고 있고 Intent filter와 같이 permissions을 사용해 다른 컴포넌트와 어플리케이션이 어떻게 상호 작용을 하는지를 결정한다.

 

</receiver>

<provider>

<grant-uri-permission />

<path-permission />

<meta-data />

</provider>

<uses-library />

</application>

</manifest>

<manifest>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.android.notepad"

android:versionCode="1"

    android:versionName="1.0">

[어플리케이션 태그  Permission 태그들]

</manifest>

AndroidManifest.xml의 root element로써 <manifest> 태그가 전체를 감싸는 구조를 하고 있으며 package attribute의 값으로는 어플리케이션의 base를 지정하는 Java package 이름이 온다.

 

<uses-permission>

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

어플리케이션의 필요한 기능의 권한을 정의해준다. 여기에 정의된 권한은 설치 과정 중 사용자에게보여주고권한부여 혹은 거절이 결정된다.

android:name  애플리케이션 안에 <permission>엘리먼트를 사용해서 정의된 퍼미션 이름

다른 애플리케이션에 의해 정의된 퍼미션의 이름

표준 시스템 퍼미션의 이름( - android.permission.INTERNET)

 

<permission>

<permission android:description="string resource"

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:permissionGroup="string"

android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"]

/>

컴포넌 사용하기 위한 권한 중에 안드로이드가 제공하는 권한 이외에 다른 권한이 필요할 때 정의한다. 다른 어플리케이션이 이 컴포넌트를 사용하려면 자신의 매니페스트에 uses-permission 태그를 설정해 주거나<activity android:permission>속성에 권한을 추가해 주면 된다.

                                android:description  퍼미션의 설명으로 사용자에게 퍼미션을 설명하기 위해 사용 될 수도 있다.

android:icon  퍼미션을 의미하는 아이콘의 리소스의 레퍼런스로 예를 들어res/drawable/app_note.png라는 파일이 있다면 @drawable/app_note라고 쓴다.

android:label  사용자에게 보여질 수 있는 퍼미션의 이름다. 배포가 될때는 string.xml에 정의하고 @string/app_name 같이 사용하여야 한다.

android:name  코드에서 사용되는 퍼미션의 이름이다.com.example.project.PERMITTED_ACTION과 같이 고유한 이름을 사용해야 한다.

android:permissionGroup  그룹에 퍼미션을 할당한다. <permission-group>으로 선언되어진 그룹의 이름을 지정한다.

android:protectionLevel  이 레벨 설정에 따라서 사용자가 퍼미션을 요구하는 애플리케이션을 알 수 있거나 해당 퍼미션을 누가 사용하는지를 알 수 있다.

normal : 디폴트 값으로 낮은 수위의 위험을 갖는다. 최소한의 위험요소를 가진 애플리케이션이 다른 애플리케이션 레벨의 기능들에 대해 접접근하는 것 부여한다.

dangerous : 높은 수위의 위험을 갖는다. 사용자의 사적 데이터 접근이나 디바이스에 대한 제어를 허용한다.

signature 애플리케이션이 다른 애플리케이션과 같은 인증서를 가지고 사인되었을때에 한하여 시스템이 퍼미션을 부여한다.

signatureOrSystem 시스템이 안드로이드 시스템 이미지 안에 있거나 시스템 이미지 안에 있는 것들과 같은 인증서로 사인된 애플리케이션에 한하여 부여한다.

 

<permission-tree>

<permission-tree android:icon="drawable resource"

   android:label="string resource"

      android:name="string" />

퍼미션 트리에 대한 기본적인 이름을 선언한다. 이 애플리케이션은 트리 내의 모든 이름들에 대한 소유권을 갖는다.

 

<permission-group>

<permission-group android:description="string resource"

 android:icon="drawable resource"

 android:label="string resource"

        android:name="string" />

퍼미션 그룹의 이름을 선언한다.

 

<instrumentation>

실행 시 액티비티와 서비스를 테스트 하기 위한 프레임워크롤 제공하며, 선언된 클래스는 시스템리소스와 상호작용을 모니터링하기 위한 연결 고리를 제공한다.

Jfeature를 설치해 Test를 사용할 경우

<instrumentation android:targetPackage="com.jfeature" android:name="android.test.InstrumentationTestRunner"/>

<instrumentation android:functionalTest=["true" | "false"]

android:handleProfiling=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:targetPackage="string" />

이 엘리먼트가 매니페스트에 자동으로 생성된다.

android:functionalTest  기능적 테스트를 위해 수행되어야 하는지 여부를 표시한다. 디폴트 값은 false이다.

android:handleProfiling  프로파일링을 on, off 할 것인지의 여부를 표시한다. 프로파일링을 시작할 때와 멈출때는 결정하려면 ture, 프로파일링이 시행되는 모든 시간 동안 계속 하려면 false로 표시한다. 디폴트는false이다.

android:targetPackage  타겟으로 정할 패키지 주소를 입력한다.

 

<uses-sdk>

<uses-sdk android:minSdkVersion="integer"

android:maxSdkVersion="integer"

amdroid:targetSdkVersion="integer" />

Android Version이 아닌 API 레벨을 설정한다.

android:minSdkVersion  API의 최소레벨을 지정하는 함수로 Default값은 1이다.

시스템이 지정한 값보다 낮은 버전 이라면 시스템에 설치 되지 않는다.

android:maxSdkVersion  API의 최소레벨을 지정하는 함수이다. 시스템이 지정한 값보다 높은 버전이라면 시스템에 설치 되지 않는다. 이 애트리뷰트를 사용하는 것을 권장하지 않는다. 왜냐하면 신규 버전의 안드로이드 플렛폼 배치가 차단되고더 높은 API 레벨로 시스템이 업데이트 된 이후 사용자의 디바이스에서maxSdkVersion이 시스템보다 낮은 값으로 설정된 애플리케이션이 제거된다.

android:targetSdkVersion - 애플리케이션이 타겟으로 하고 있는 API 레벨을 지정하는 함수이다.

 

<uses-feature>

<uses-feature android:glEsVersion="integer"

       android:name="string" />

SDK버전을 선언하는 것과 비슷하게 기능을 지원하지 않는 디바이스 상에는 설치가 되지 않도록 하는 옵션이다. 예를 들어 디바이스가 카메라를 지원하지 않으면 어플리케이션이 설치 되지 않는다.애플리케이션이 특정 디바이스를 사용해야 한다면 이 옵션을 추가해야 한다.

                                   android:glEsVersion  애플리케이션이 필요로 하는 GLES 버전이다.

android:name  애플리케이션이 필요로 하는 기능의 이름으로써 예로android.hardware.camera와 같이 쓰이는데 이것은 애플리케이션이 카메라를 필요로 한다는 의미이다.

<supports-screens>

<supports-screens android:smallScreens=["true" | "false"]

                 android:normalScreens=["true" | "false"]

                 android:largeScreens=["true" | "false"]

                 android:anyDensity=["true" | "false"] />

애플리케이션이 지원하는 스크린 크기를 지정하는 옵션이다.(멀티해상도 관련)

android:smallScreens  애플리케이션이 normal보다 더 작은 스크린을 지원하는지 여부이다. API 레벨 4이상에서는 디폴트 값이 ture이고 다른 레벨에서는 false이다.

android:normalScreens  애플리케이션이 normal 스크린을 지원하는지 여부다. 디폴트 값은 true이다.

android:largeScreens  애플리케이션이 normal보다 더 큰 스크린을 지원하는지 여부이다. API 레벨 4이상에서는 디폴트 값이 ture이고 다른 레벨에서는 false이다.

android:anyDensity  애플리케이션이 임의의 스크린 밀도를 수용할 수 있는 지에 대한 옵션이다. API레벨 4이상에서는 디폴트 값이 true이고 다른 레벨에서는false이다.

 

<application>

<application android:allowClearUserData=["true" | "false]

android:allowTaskReparenting=["true" | "false"]

android:debuggable=["true" | "false"]

android:description="string resource"

android:enabled=["true" | "false"]

android:hasCode=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:manageSpaceActivity="string"

android:name="string"

android:permission="string"

android:persistent=["true" | "false"]

android:process="string"

android:task="string"

android:theme="resource or theme" >

. . .

</application>

이 엘리먼트는 반드시 한번 사용되어야 한다. Application 아래에 있는 서브 엘리먼트는 없거나 순서가 바뀌어도 문제되지 않는다. 애플리케이션의 메타데이타(타이틀, 아이콘, 테마 등)을 지정한다.

                                    android:allowClearUserData  사용자들에게 사용자 데이터를 제거할 수 있는 옵션을 부여할 것인가에 대한 애트리뷰트이다.

                                    android:allowTaskReparenting  이 애트리뷰트가 true로 설정되어 있다면 액티비티는 시작된 태스크부터 affinity를 갖는 태스크가 된다.

예를 들어 e-mail Activity에서 web page링크를 클릭하게 되면 해당 페이지가 보여지는 브라우저가 시작되게 된다. 이 Activity는 Browser Application에 정의 되어 있지만 e-mail Task의 일부로 실행된 상태이다. 만약 android:allowTaskReparenting이 true로 되어있고 Browser Task로 Reparenting되면 Browser어플리케이션에서 그 페이지가 보여질 것이고 다시 e-mail Task가 보여지면 그 Activity는 보이지 않게 된다. 디폴트 값은 false이다.

D:\WORK\리소스\Task.png

                                 android:debuggable  사용자모드로 실행중일 때 디버그 될수 있는지를 설정한다. 디폴트 값은 false이다. false로 설정한다면 Wating for Debugger화면에서 더 이상 진행되지 않는다.

     android:enable  애플리케이션의 컴포넌트를 인스턴스화 할 수 있는지를 설정한다. 디폴트 값은 true이다“true”라면 각 컴포넌트의 enabled 애트리뷰트가 그 컴포넌트의 활성화 여부를 결정하고 false라면 모든 컴포넌트들은 비활성화 된다.

 android:hasCode  시스템 코드가 아닌 다른 코드를 포함하고 있는지를 설정한다. 디폴트 값은 true이다.

 android:manageSpaceActivity  디바이스상에서 애플리케이션이 점유하는 메모리를 사용자가 관리 할 수 있도록 하는 액티비티 이름이다.

adroid:permission  클라이언트와 애플리케이션이 상호작용하기 위해 필요한 퍼미션 이름이다. 이 애트리뷰트는 애플리케이션 안의 모든 컴포넌트에 퍼미션을 적용한다.

android:persistent  애플리케이션이 항상 실행 상태로 있는지의 설정값이다. 디폴트는false이다.

android:process  애플리케이션 프로세스의 이름이다. 애플리케이션 안에 모든 컴포넌트는 이 애트리뷰트의 프로세스로 실행이 되고 각 컴포넌트에 process 애트리뷰트를 설정 함으로써 오버라이드 할 수 있다. 디폴트 <manifest>엘리먼트의 package이름이다. 이 애트리뷰트의 이름이 콜론(:)으로 시작되면 private하고 소문자로 시작한다면 그 이름을 가진 글로벌 프로세스가 만들어진다. 글로벌 프로세스는 공유될 수 있어 리소스 사용을 감소시킨다.

android:taskAffinity  애플리케이션 안 모든 액티비티에 적용되는 affinity이름이다. 액티비티 내에 taskAffinity를 설정했다면 적용되지 않는다. 디폴트로 <manifest>엘리먼트의 package 이름을 가지고 어플리케이션내에 액티비티는 동일 Affinity를 공유한다.

android:theme  애플리케이션 안의 모든 액티비티에 적용되는 스타일 리소스에 대한 레퍼런스 이다. 각각의 액티비티는 이 설정을 override 할 수 있다.

 

<activity>

<activity android:allowTaskReparenting=["true" | "false"]

android:alwaysRetainTaskState=["true" | "false"]

android:clearTaskOnLaunch=["true" | "false"]

android:configChanges=[one or more of: "mcc" "mnc" "locale"

"touchscreen" "keyboard" "keyboardHidden" "navigation""orientation" "fontScale"]

android:enabled=["true" | "false"]

android:excludeFromRecents=["true" | "false"]

android:exported=["true" | "false"]

android:finishOnTaskLaunch=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:launchMode=["multiple" | "singleTop" | "singleTask"| "singleInstance"]

android:multiprocess=["true" | "false"]

android:name="string"

android:permission="string"

android:process="string"

android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"]

android:stateNotNeeded=["true" | "false"]

android:taskAffinity="string"

android:theme="resource or theme"

android:windowSoftInputMode=[one or more of:"stateUnspecified"

"stateUnchanged" "stateHidden"

"stateAlwaysHidden" "stateVisible"

"stateAlwaysVisible" "adjustUnspecified"

"adjustResize" "adjustPan">

. . .

</activity>

각각의 액티비티마다 <activity>태그가 필요하다. 매니페스트 파일에 액티비티가 정의되어 있지 않다면 해당 액티비티를 실행시킬 수 없다.(런타임 오류가 발생)

                        android:allowTaskReparenting  친화력 있는 태스크 설정 애트리뷰트이다. 이 애트리뷰트가 설정되지 않으면 <application>엘리먼트의 allowTaskReparenting에 설정된 값이 액티비티에 적용된다. 디폴트 값은false이다.

                        android:alwaysRetainTaskState  사용자가 Task를 오랫동안 방치하면 시스템은 Root Activity를 제외한 모든 Activities의 Task를 Clear 시킨다. 이 애트리뷰트가 true로 설정 되어 있다면 Task는 오랜 시간이 지나도 Stack에 있는 모든 Activity를 유지한다. 디폴트 값은 false이다.

                        android:clearTaskOnLaunch  이 속성이 true로 설정되어 있으면 사용자가 Task를 떠났다가 다시 돌아 올 때마다 Stack은 Root Activity로 정리된다. 디폴트 값은 false이다.

                        Android:configChanges  시스템은 각 어플리케이션을 종료하고 재시작한 뒤 리소스 값을 다시 읽어 들임으로써 언어, 위치, 하드웨어에 대한 런타임 변경을 지원한다. 런타임 구성 변경을 감지하는 activity를 가지려면 Manifest 노드에 android: configChanges 속성을 추가 한 뒤 변경을 하고자 하는 구성 변경을 지정한다. 여러 값을 사용할 때는 |’에 의해 구분된다.

mcc IMSI 모바일 국가 코드가 변경되었다.

mnc : IMSI 모바일 네트워크 코드가 변경되었다.

locale : 사용자가 다른 언어 설정을 선택했다.

touchscreen : 터치스크린이 변경되었다.

keyboard : 키보드 종류가 바뀌었다.

keyboardHidden : 키보드가 보여졌거나 숨겨졌다.

navigation : 네비게이션 타입이 변경 되었다.

origentation : 화면이 세로 방향이나 가로 방향으로 회전됐다.

fontScale : 사용자가 선호하는 글꼴 크기를 변경했다.

 

/// Configuraion 객체를 사용해 새로운 구성 값을 결정하도록

/// OnConfigurationChnaged 메서드를  한다.

@Override

public void onConfigurationChanged(Configuration _newConfig) {

      super.onConfigurationChanged(_newConfig);

     // resource 값에 기반을 두고 있는 모든 GUI update 한다.

 

     // ....

     if (_newConfig.orientation == Configuration.OPRIENTATION_LANDSCAPE)

{

        // 방향이 landscape 변경되면 해당 방향으로 반응을 한다.

}

 

    if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO)

    {

        // 변경된 키보드의 유무에 반응을 한다.

    }

}

시스템이 재시작 되지 않을 경우 다음과 같이한다.

android:excludeFromRecents  true이면 사용자가 볼 수 있는 최근 런치된 액티비티 리스트에서 제외되고 false이면 리스트에 포함된다. 디폴트 값은 false이다.

android:exported  다른 애플리케이션의 컴포넌트에서 이 액티비티를 런치 할 수 있는지를 설정한다. false”라면 이 액티비티는 같은 애플리케이션 혹은 같은 유저 ID를 가진 애플리케이션 컴포넌트만 런치 할 수 있다. 디폴트는 액티비티가 인텐트 필터를 포함하는지에 달려있다. 필터가 없다면 디폴트 값이 false이고 필터가 있다면 true이다.

MAIN/LAUNCHER 액티비티에는 절대로 false값을 주면 안 된다false값을 주게 되면 SecurityException이 발생하고 exported 속성을 true로 설정해 달라는 메시지가 출된다.

            android:finishOnTaskLaunch  사용자가 태스크를 런치 할 때 마다 액티비티의 기존 인스턴스가 종료 되어야 하는지의 여부를 설정한다. 종료되어야 한다면 true이고 종료되지 않아야 한다면 false이다. 디폴트 값은 false이다. 만약 이 애트리뷰트와 allowTaskReparenting이 모두 true라면 액티비티 친화력은 무시되어 액티비티는 부모를 바꾸지 않고 파괴된다.

android:launchMode  액티비티가 어떻게 런치되어야 하는지에 대한 명령이다. 4가지 런치모드(standard singleTop” “singleTask singleInstance )가 있고 디폴트는 standard이다.

모드는 두개의 main Group으로 나뉜다(standard, singleTop / singleTask, singleInstance).