[Android] 매니페스트 (Manifest) 조사
매니페스트(Manifest) 란?
📍 Manifest 정의
: Android 빌드 툴, Android OS, Google Play에 관한 필수 정보(정의 및 용도)를 설명한다.
: 모든 앱은 AndroidManifest.xml 파일이 필수적으로 필요하다.
📍 Manifest 용도
: 패키지의 다른 파일을 읽거나, 응용 프로그램을 실행하지 않고도 앱에 대한 정보를 사용할 수 있다.
: 모든 앱은 AndroidManifest.xml 파일이 필수적으로 필요하다.
📍 Manifest에 선언해야 하는 것
- 앱의 패키지(Package) 이름
- 앱의 구성요소(Activity / Service / Broadcast Receiver / Content Provider)
- 시스템, 보호된 부분에 액세스를 하기 위한 권한
- 앱에 필요한 하드웨어/소프트웨어 기능
📍 4대 컴포넌트(Component)란?
1) Activity (액티비티)
: 화면 단위를 구성하는 컴포넌트
: 사용자에게 보여주는 UI 화면 (사용자와 상호작용하기 위한 것)
: Activity를 사용하기 위해서는 Manifest 파일에 선언 필요
: 1개의 애플리케이션에는 최소 1개 이상의 Activity가 필요
: Activity는 화면 하나를 나타냄
ex) 이메일 앱
= 새 이메일을 표시해주는 Activity + 이메일을 읽는 Activity + 이메일을 작성하는 Activity + ...
: 각각의 Activity는 서로 독립적 (두 개의 Activity를 동시에 보여주는 것은 불가능)
ex) 카메라 앱에서 찍은 사진을 이메일 작성 Activity를 실행시켜 이메일로 공유
2) Service (서비스)
: Activity가 종료된 상태에서도 동작하게끔 만들어진 구성요소
: UI를 제공하지 않음
: Service를 사용하기 위해서는 Manifest 파일에 선언 필요
: 응용 프로그램의 기능 중 일부를 다른 응용 프로그램에 노출하는 기능 수행
: 애플리케이션이 백그라운드에서 수행하려는 작업에 대해 시스템에 알리는 기능 수행
ex) 음악 애플리케이션 재생 후, 백그라운드에서 계속 음악 재생
3) Broadcast Receiver (브로드캐스트 리시버)
: 애플리케이션이 시스템 전체의 *Broadcast 알림에 응답하는 역할
ex) 에어팟 연결 해제 → 실행중인 음악 정지 → Broadcast Receiver 통해 이어폰 연결 해제 정보 수신
: Broadcast Receiver을 사용하기 위해서는 Manifest 파일에 선언 필요
: 상태 표시줄 알림을 생성해서 Broadcast 이벤트가 발생했다고 알릴 수 있음
*Broadcast(브로드캐스트) 란?
- Broadcast는 대부분 시스템에서 발생됨
ex) 화면 OFF, 배터리 부족, 사진 캡쳐 등의 알림 및 이벤트
- Broadcast는 **Intent(인텐트) 객체로 전달
** Intent(인텐트) 란?
- 메시징 객체
- 다른 앱 구성 요소로 부터 작업을 요청하는 데 사용할 수 있음
- 기본적으로 Activity 시작, Service 시작, Broadcast 전달 시 사용됨
- 유형 : 명시적 인텐트 / 암시적 인텐트
① 명시적 인텐트
: 인텐트를 충족하는 앱이 무엇인지 지정, 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공
ex) Activity 시작, Service 시작
② 암시적 인텐트
: 특정 구성 요소 이름을 대지 않지만, 수행할 일반적인 작업을 선언
ex) 지도에 한 위치를 표시하고 싶을 때, 해당 기능을 갖춘 다른 앱이 그 위치를 대신 표시하도록 요청
4) Content Provider (콘텐트 프로바이더)
: 앱에서 사용할 수 있는 데이터를 공유하기 위한 구성요소
: 앱은 Content Provider에만 접근해서 데이터를 얻을 수 있음
: Content Provider를 사용하기 위해서는 Manifest 파일에 선언 필요
: 용량이 큰 데이터를 공유하는 데에 적합
: 여러 애플리케이션 간에 데이터를 공유해야 하는 경우에만 필요
ex) 연락처에 등록되어 있는 전화번호들이 카카오톡에 자동으로 친구 추가
→ 연락처에 Content Provider가 접근할 수 있게 해줬기 때문에 가능
: 앱 내에서만 데이터에 액세스 하도록 권한을 부여하거나, 데이터 읽기와 쓰기에 대한 권한을 구성하거나,
다른 앱에서 데이터에 액세스 하도록 권한을 부여할 수 있음
📍 Manifest 항목 조사
1) <action>
: <intent-filter>에 작업을 추가
: 하나 이상 포함되어야 함
2) <activity>
: 시각적 사용자 인터페이스 요소를 구현하는 Activity 선언
- android: exported
: 다른 구성 요소로 해당 액티비티를 실행할 수 있는지에 대한 여부
3) <activity-alias>
: Activity의 별명을 선언
4) <application>
: 애플리케이션을 선언
: 애플리케이션의 각 구성요소를 선언하고, 모든 구성요소에 영향을 줄 수 있는 속성을 가진 하위 요소를 포함함
- android: allowBackup
: [true / false] → 사용자 데이터를 구글 드라이브에 25MB까지 자동 백업 여부
: 백업한 데이터로 복원도 가능
- android: icon / android: roundIcon
Q. 왜 두 개를 같이 사용할까?
A. 제조사 별로 rectangle에 가까운 icon을 보여주는 곳이 있고, round에 가까운 icon을 보여주는 곳도 있기 때문에
cf.) mipmap 폴더
→ 모든 기기의 해상도를 지원해야 하기 때문에 앱 아이콘의 res만 추가해야 함
- android: supportsRtl
: 한국어 같은 경우에 읽는 순서 = ltr
: rtl 순으로 읽는 언어들을 지원해주는 기능 있음
: [true / false] → 해당 기능들을 활성화
- android: theme
: 앱 전체에 적용되는 theme을 설정
5) <category>
: <intent-filter>에 카테고리 이름을 추가
6) <compatible-screens>
: 애플리케이션이 호환되는 각 화면 구성을 지정
: 각 <screen> 요소는 애플리케이션이 호환되는 특정 화면 크기-밀도 조합을 지정함
7) <data>
: <intent-filter>에 데이터 사양을 추가
: 사양은 데이터 유형, URI를 각각 사용하거나, 모두 사용할 수 있음
8) <grant-uri-permission>
: 상위 Content Provider에게 액세스 권한이 있는 앱 데이터의 하위 집합을 지정
: Content Provider의 grantUriPermissions 속성이 true이면 Provider의 범위 내에 있는 모든 데이터에
관한 권한을 부여할 수 있음
9) <instrumentation>
: 애플리케이션과 시스템의 상호작용을 모니터링할 수 있는 Instrumentation 클래스를 선언함
10) <intent-filter>
: Activity, Service, Broadcast Receiver가 응답할 수 있는 Intent의 유형을 지정함
11) <manifest>
: AndroidManifest.xml 파일의 루트 요소
: xmlns:android(= Android 네임 스페이스 정의) 및 package(= Android 앱의 전체 자바 언어 스타일 패키지 이름) 속성을 지정
12) <meta-data>
: 상위 구성요소에 제공될 수 있는 추가 임의 데이터 항목의 이름-값 쌍
13) <path-permission>
: Content Provider 내의 특정 데이터 하위 집합과 관련하여 경로와 필수 권한을 정의
14) <permission>
: 이 애플리케이션이나 다른 애플리케이션의 특정 구성요소 또는 기능에 대한 액세스를 제한하는 데에 사용될 수 있는 보안 권한을 선언
15) <permission-group>
: 관련 권한의 논리적인 그룹 이름을 선언
: 권한 자체를 선언하지는 않고, 권한을 배치할 수 있는 카테고리만 선언
16) <permission-tree>
: 권한 트리의 기본 이름을 선언
: PackageManager.addPermission()을 호출하여 동적으로 새 권한을 트리에 추가할 수 있음
: 트리 내에서 이름은 . 으로 구분
: 권한 자체를 선언하지는 않고, 추가 권한을 배치할 수 있는 네임스페이스만 선언
17) <provider>
: Content Provider의 구성요소를 선언
: 애플리케이션의 일부인 Content Provider만 선언
: Content Provider의 서브 클래스
18) <receiver>
: Broadcast Receiver를 애플리케이션의 구성요소 중 하나로 선언
: Broadcast Receiver의 서브 클래스
19) <service>
: Service를 애플리케이션의 구성요소 중 하나로 선언
: Service의 서브 클래스
: 모든 Service는 Manifest 파일의 <service> 요소로 나타내야 함
20) <supports-gl-texture>
: 앱에서 지원하는 단일 GL 텍스쳐 압축 형식을 선언
21) <supports-screens>
: 애플리케이션에서 지원하는 화면 크기를 지정하고, 사용하는 화면이 애플리케이션에서 지원하는 화면보다
큰 경우 화면 호환성 모드를 사용 설정 할 수 있음
: 애플리케이션에서 항상 이 요소를 사용하여 애플리케이션에서 지원하는 화면 크기를 지정
: 화면 호환성 모드를 사용하면 확대/축소 모드로 인해 UI에 픽셀화 및 블러가 발생할 수 있음
22) <uses-configuration>
: 애플리케이션에 필요한 하드웨어 및 소프트웨어 기능을 나타냄
: 애플리케이션이 요구하는 특정 입력 기능을 나타냄
23) <uses-feature>
: 애플리케이션이 사용하는 단일 하드웨어 또는 소프트웨어 기능을 선언
: 목적은 외부 엔터티에 애플리케이션이 의존하는 하드웨어 및 소프트웨어 기능 집합을 알려주는 것
: Android 기기에 따라 기능 지원이 다를 수 있기 때문에, 애플리케이션이 사용하는 기기별 가변 기능을 설정하는 중요한 역할
: 일반적으로 애플리케이션에 필요한 모든 기능에 대해 항상 이 요소를 선언해야 함
: 이 기능을 선언할 때 적절한 권한도 요청해야 함
24) <uses-library>
: 애플리케이션이 연결되어야 하는 공유 라이브러리를 지정
: 이 요소는 패키지의 클래스 로더에 라이브러리 코드를 포함하도록 시스템에 알림
: 이 요소는 특정 기기에서 애플리케이션 설치 및 Google Play의 애플리케이션 가용성에도 영향을 줌
25) <uses-permission>
: 앱이 올바르게 작동하기 위해 사용자가 반드시 부여해야 하는 시스템 권한
: 앱이 설치될 때, 앱이 실행 중일 때 사용자에게 권한이 부여됨
26) <uses-permission-sdk-23>
: 앱이 특정 권한을 원한다는 것을 지정
: 단, API 23 이상을 실행하는 기기에서 설치되는 경우에만 해당
: 이 요소는 추가 권한이 필요한 새 기능을 포함하기 위해 앱을 업데이트 하는 경우에 유용
27) <uses-sdk>
: 하나 이상의 Android 플랫폼 버전과의 애플리케이션 호환성을 API 레벨 정수로 나타낼 수 있음
: 이 요소를 사용하여 API 레벨을 지정
(API 레벨 = Android 플랫폼 버전에서 제공되는 프레임워크 API 수정 버전을 고유하게 식별하는 정수 값)
댓글