Android manifest.xml
<?xml version=”1.0” encoding=”utf-8”?>
<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<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이다.
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” )가 있고 디폴트는 “