Android

[Android] Manifest란?

dev_zoe 2020. 12. 31. 01:20
반응형

출처 developer.android.com/guide/topics/manifest/manifest-intro?hl=ko#package-name

 

앱 매니페스트 개요  |  Android 개발자  |  Android Developers

모든 앱 프로젝트는 프로젝트 소스 세트의 루트에 AndroidManifest.xml 파일(정확히 이 이름)이 있어야 합니다. 매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보

developer.android.com

  • AndroidManifest.xml 파일(정확히 이 이름)이 있어야 합니다. 
  • 매니페스트 파일은 Android 빌드 도구, Android 운영체제 및 Google Play에 앱에 관한 필수 정보를 설명=> 앱의 명세서 같은 역할

1.  앱의 패키지 이름(일반적으로 코드의 네임스페이스와 일치)

    Gradle 빌드 파일의 애플리케이션 ID로 대체합니다.

    이는 시스템과 Google Play에서 고유한 앱 식별자로 사용됩니다.

패키지 이름과 애플리케이션 ID

앱을 최종 애플리케이션 패키지(APK)로 빌드하는 동안 Android 빌드 도구가 package 특성을 사용하는 목적은 두 가지입니다.

  • 빌드 도구는 앱에서 생성된 R.java 클래스의 네임스페이스로 이 이름을 적용합니다(앱 리소스에 액세스하는 데 사용).
  • 앱 리소스 : res 폴더 아래에 있는 layout, drawable, mipmap 등의 정적 콘텐츠 혹은 코드에서 사용하는 추가 파일(ex:menu, strings, values ...)

    예: 위의 매니페스트와 함께 R 클래스가 com.example.myapp.R에서 생성됩니다.

    접근 -> R.layout.activity_main.xml, R.drawable.image.png
  • 빌드 도구는 이 이름을 사용하여 매니페스트 파일에 선언되어 있는 상대 클래스 이름을 확인합니다.

    예: 위 매니페스트를 사용하면 <activity android:name=".MainActivity">로 선언된 액티비티가 com.example.myapp.MainActivity인 것으로 확인됩니다.

 

2. 앱의 구성 요소(모든 액티비티, 서비스, Broadcast Receiver, 콘텐츠 제공자 포함). 각 구성 요소는 Kotlin이나 Java 클래스의 이름과 같은 기본 속성을 정의해야 합니다. 또한 자신이 처리할 수 있는 기기 구성의 종류, 그리고 구성 요소가 어떻게 시작되는지 설명하는 인텐트 필터와 같은 기능을 선언할 수도 있습니다. 

앱 구성 요소

앱에서 생성하는 각각의 앱 구성 요소에 대해 매니페스트 파일에서 해당하는 XML 요소를 선언해야 합니다.

  • Activity 하나 이상의 기능을 수반하는 사용자와 상호작용하는 인터페이스
  • Service 앱이 구동되는 동안 Background에서 반드시 실행되어야 하는 동작 ex) 음악 앱 => 홈 화면으로 이동해도 음악이 재생되어야 함 (음악 재생 : Service)
  • BroadcastReceiver 하나의 앱이 시스템 또는 다른 앱과 관심사항에 해당하는 이벤트가 발생할 때 다른 시스템 및 앱과 주고받는 메시지 ex) 알람 앱 => 알람이 울릴 시간이 되면 '알람이 울려야 한다' 라는 BroadCast메시지 발생 후, 이 이벤트에 맞는 BroadCastReceiver가 설정된 알람이 메시지 수신 후 알람 울림 실행

 

  • Provider

매니페스트 파일에서 XML 요소를 선언하지 않고 이 구성 요소를 하위 클래스로 지정하면 시스템에서 이를 시작할 수 없습니다.

하위 클래스의 이름은 완전한 패키지 이름을 사용하여 name 특성으로 지정해야 합니다.

 

meta-data :  상위 구성요소에 제공될 수 있는 추가 임의 데이터 항목의 이름-값 쌍

 

3. <uses-permission> 앱이 시스템 또는 다른 앱의 보호된 부분에 액세스하기 위해 필요한 권한. 이것은 다른 앱이 이 앱의 콘텐츠에 액세스하고자 하는 경우 반드시 있어야 하는 모든 권한도 선언합니다.

  • 앱에 필요한 하드웨어 및 소프트웨어 기능 ex) 위치 정보 사용시 위치 권한 알림창

권한

Android 앱은 민감한 사용자 데이터(예: 연락처, SMS) 또는 특정 시스템 기능(예: 카메라, 인터넷 액세스, 위치)에 액세스하기 위한 권한을 요청해야 합니다

 

<manifest ... >
   
<uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

기기 호환성

매니페스트 파일에서는 앱에 필요한 하드웨어 또는 소프트웨어 기능을 선언할 수 있고, 따라서 앱과 호환되는 기기 유형도 선언할 수 있습니다. Google Play Store에서는 앱에 필요한 기능이나 시스템 버전을 제공하지 않는 기기에 앱 설치를

<uses-feature>

<uses-feature> 요소를 사용하여 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있습니다.

 

ex) 카메라 사용시

 

파일 규칙

이 섹션에서는 매니페스트 파일에 포함되는 모든 요소 및 특성에 일반적으로 적용되는 규칙에 대해 설명합니다.

요소<manifest> 및 <application> 요소만 필수입니다.

특성

루트 <manifest> 요소의 몇 가지 특성을 제외하고 모든 특성 이름은 접두사 android:로 시작됩니다. 예를 들어 android:alwaysRetainTaskState가 있습니다. 이 접두사는 범용이기 때문에 특성을 이름으로 참조하는 경우 관련 문서에서 이를 생략하는 경우가 일반적입니다.

여러 개의 값둘 이상의 값을 지정할 수 있는 경우, 한 요소 안에 여러 값이 나열되지 않고 해당 요소가 거의 항상 반복됩니다. 예를 들어 한 인텐트 필터가 여러 개의 작업을 나열할 수 있습니다.

 

<intent-filter ... >
   
<action android:name="android.intent.action.EDIT" />
   
<action android:name="android.intent.action.INSERT" />
   
<action android:name="android.intent.action.DELETE" />
    ...
</intent-filter>

 

리소스 값

어떤 특성은 사용자에게 표시되는 값이 설정됩니다(예: 액티비티의 제목 또는 앱 아이콘). 이런 특성에 대한 값은 사용자 언어나 다른 기기 구성에 따라 달라질 수 있으므로(예를 들어 기기 픽셀 밀도에 따라 다른 아이콘 크기 제공) 매니페스트 파일에 하드코딩하지 말고 리소스 또는 테마에서 값을 설정해야 합니다. 그러면 실제 값을 각 기기 구성에 제공하는 대체 리소스에 따라 변경할 수 있습니다.

리소스는 다음과 같은 형식의 값으로 표현됩니다.

 

"@[package:]type/name"

 

앱에서 리소스를 제공할 경우 package 이름을 생략할 수 있습니다(라이브러리 리소스가 앱 리소스에 병합되므로 라이브러리 종속성에서 제공할 경우에는 포함합니다). Android 프레임워크의 리소스를 사용하고자 할 때 그 외에 유효한 패키지 이름은 android뿐입니다.

type은 리소스의 유형(예: string 또는 drawable)이고 name은 특정 리소스를 식별하는 이름입니다. 다음은 이에 대한 예입니다.

 

<activity android:icon="@drawable/smallPic" ... >

 

대신 테마에 정의된 값을 적용하려면 첫 문자는 @가 아니라 ?가 되어야 합니다.

 

"?[package:]type/name"

 

문자열 값특성 값이 문자열인 경우, 문자를 이스케이프 처리하려면 이중 백슬래시(\\)를 사용해야 합니다(예: 줄바꿈의 경우 \\n 또는 유니코드 문자의 경우 \\uxxxx).

반응형

'Android' 카테고리의 다른 글

[Android] 팔레트 항목 뜯어보기  (0) 2021.01.21
[Android] AsyncTask 클래스  (0) 2021.01.20
[Android] 스레드(Thread)와 핸들러(Handler)  (0) 2021.01.20
[Android] Intent(인텐트)  (0) 2021.01.20
[Android] LifeCycle  (0) 2021.01.07