애플리케이션의 코드 네임스페이스를 나타냅니다. 일반적으로 Java의 패키지 명명 규칙을 따
처음 안드로이드 프로젝트를 열게 되면
APP 파일 안에
Mainfest 파일 안에
Mainfest.xml가 들어 있다
오늘은 Mainfest에 대해 알아볼 참이다
매니페스트를 공부하게 된 계기는 이렇다
안드로이드 카카오 로그인 api 예제를 사용하며 이해가 안되는 것이 있었다
바로 매니페스트에 대한 부분이었는데 예제대로 따라했는데 안 되서 너무 화가 났다
안 되는 이유가 매니페스트에 대한 이해 부족이라고 느껴 공부를 해봐야 겠다고 생각이 들었다
참고한 공식 문서는 아래와 같다
https://developer.android.com/guide/topics/manifest/manifest-intro?hl=ko
앱 매니페스트 개요 | Android 개발자 | Android Developers
앱 매니페스트 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 모든 앱 프로젝트는 프로젝트 소스 세트의 루트에 AndroidManifest.xml 파일(정확히 이 이름)
developer.android.com
- 매니페스트란?
- 매니페스트 이름과 애플리케이션 ID
- 메니페스트구성요소 4대 컴포넌트 (액티비티, 서비스, 브로드캐스트 리시버, 컨텐트 프로바이더)
- 매니페스트 4대 컴포넌트 분석
- 매니페스트 권한
- AndroidManifest.xml 분석
위의 각 내용을 상세하게 정리 해본다
매니페스트란?
모든 APP 프로젝트는 AndroidManifest.xml 파일(정확히 이 이름)이 있어야 한다
AndroidManifest.xml은 안드로이드 빌드 도구 안드로이드 운영체제 및 구글 플레이에 대한 필수 정보를 설명한다
app > mainfests > AndroidManifest.xml 경로에 위치한다.
매니페스트는 애플리케이션의 기본적인 속성을 정의한다
여기에는 패키지 이름, 애플리케이션의 아이콘 및 버전 정보등이 포함된다
이 정보들은 앱을 식별하고 관리하는데 필수적이다
application 태그의 경우 4대 컴포넌트를 등록하는 태그로 아래의 추가 중첩 구조를 갖는다.
<application>
ㄴ <activity | servcice | provider | receiver>
ㄴ <intent-filter>
ㄴ <action>
ㄴ <category>
ㄴ <data>
매니페스트 패키지 이름과 애플리케이션 ID
-패키지 이름
매니페스트에서의 패키지는 AndroidManifest.xml 파일에서 정의된다
애플리케이션의 코드 네임스페이스를 나타내며 일반적으로 Java의 패키지 명명 규칙을 따른다
코드 네임 스페이스란?
동일한 이름의 클래스를 다른 클래스와의 충돌을 방지할 수 있으며,
코드를 조직적이고 체계적으로 관리할 수 있다
패키지 이름이 (예: com.example.myapp).이라면 액티비티와 서브에 대한 선언 할 수있다
.MainActivity 클래스는 com.example.myapp.MainActivity로 간단히 지정할 수 있게 된다
- 네임스페이스 제공: 코드 내에서 클래스, 메서드 등을 조직화하는 데 사용
이를 통해 클래스 이름 충돌을 방지하고 코드를 체계적으로 관리할 수 있다 - 리소스 참조: 빌드 시 R.java 파일에서 사용되며,
애플리케이션 리소스(ID, 레이아웃, 문자열 등)에 대한 참조를 제공한다 - 예시: 만약 패키지 이름이 com.example.myapp라면, R.java 파일과 클래스는 이 패키지 내에 생성된다
예를 들어, MainActivity 클래스는 com.example.myapp.MainActivity로 참조된다
-애플리케이션 ID (Application ID)
build.gradle 파일에서 설정되며, 애플리케이션을 Google Play 스토어와 같은 앱 마켓에서 고유하게 식별하는 데 사용함
- 앱 스토어 식별자: Google Play 스토어에서 앱을 식별하는 데 사용되며.
이는 앱의 설치, 업데이트, 사용자 기기 간 동기화에 중요하다 - 버전 관리: 같은 애플리케이션 ID를 가진 앱은 같은 앱의 새 버전으로 간주되어 업데이트가 수행된다
- 예시: 애플리케이션 ID가 com.example.myapp인 경우, Google Play 스토어에서 이 ID로 앱을 식별하고 관리한다
이 ID는 앱의 업데이트와 관련이 있으며, 사용자의 기기에 앱을 고유하게 식별하는 데 사용한다
패키지 이름과 애플리케이션 ID의 관계
- 분리 가능성: 개발자는 필요에 따라 이 두 가지를 다르게 설정할 수 있다. 예를 들어, 여러 빌드 변형(예: 디버그 버전과 릴리스 버전)을 가진 애플리케이션에서 각 변형에 대해 다른 애플리케이션 ID를 사용할 수 있다
- 기본적으로 동일하게 설정: 일반적인 경우에는 이 두 값을 동일하게 설정하여 관리의 복잡성을 줄임
간단히 말해,
패키지 이름은 애플리케이션 내부에서의 코드 및 리소스 관리에 중점을 두고 있으며,
애플리케이션 ID는 앱 마켓과 같은 외부 시스템에서 앱을 식별하는 데 사용된다
개발자는 이 두 식별자를 통해 애플리케이션의 내부 구조와 외부 식별을 효과적으로 관리할 수 있게 된다
매니페스트 구성요소 -> 4대 컴포넌트
앱에서 생성하는 각각의 앱 구성 요소에 대해 매니페스트 파일에서 해당하는 xml 요소를 선언해야 한다
앱의 구성요소는 크게 4가지가 있으며 우리는 이것을 4대 컴포넌트라고 부른다
- <activity> Activity의 각 하위 클래스. (액티비티)
- <service> Service의 각 하위 클래스. (서비스 )
- <receiver> BroadcastReceiver의 각 하위 클래스. (브로드캐스트 리시버)
- <provider> ContentProvider의 각 하위 클래스. (컨텐트 프로바이더 )
매니페스트 파일에서 XML 요소를 선언하지 않고 이 구성 요소를 하위 클래스로 지정하면
시스템에서 이를 시작할 수 없다
하위 클래스의 이름은 완전한 패키지 이름을 사용하여 name 특성으로 지정해야 한다
예를 들어 Activity 하위 클래스를 선언하려면 다음과 같이 할 수 있다
<manifest ... >
<application ... >
<activity android:name="com.example.myapp.MainActivity" ... >
</activity>
</application>
</manifest>
클래스 이름은 점(.)으로 시작할 수 있으며,
이 경우 애플리케이션의 패키지 이름이 자동으로 접두어로 추가된다
<manifest package="com.example.myapp" ... >
<application ... >
<activity android:name=".MainActivity" ... >
...
</activity>
</application>
</manifest>
눈에 띄게 줄어든 모습 이는 코드네임 스페이스 제공으로 간단하고 효율적이게 된다
<activity android:name="com.example.myapp.MainActivity" ... >
▼ ▼ ▼ ▼ ▼
<activity android:name=".MainActivity" ... >
인텐트 필터 (Intent Filter)
인텐트 필터는 주로 세 가지 주요 구성 요소를 가진다 :
- 액션(Action): 수행할 작업의 종류를 나타낸다. 예를 들어, "보기", "편집" 등이 있다
- 데이터(Data): 액션을 수행할 데이터의 유형이다. 예를 들어, 이미지, 비디오, 텍스트 파일 등이 될 수 있다
- 카테고리(Category): 인텐트를 처리하는 데 있어 추가적인 정보를 제공한다
예를 들어, "기본" 또는 "홈" 등의 카테고리가 있다
- 사용자가 여러 애플리케이션 중 하나를 선택해야 하는 경우,
시스템은 이러한 인텐트 필터를 기반으로 애플리케이션을 제안한다
EX)카카오 지도 , 네이버 지도 , 구글 지도가 있다 이 앱들 중 하나를 선택해 링크를 열 수 있도록 하는 것이다
이는 각 웹 브라우저 앱이 웹 링크를 열 수 있다는 것을 인텐트 필터를 통해 시스템에 알리기 때문에 가능한 일이다
아이콘 및 레이블
- 각 앱 구성 요소에는 icon과 label 속성을 사용하여 사용자 인터페이스에 표시될 아이콘과 레이블을 지정할 수 있다
- 이 속성들은 선택기 대화상자에서 해당 구성 요소를 사용자에게 보다 명확하게 표시하는 데 사용된다
간단히 말해, 매니페스트 파일은 애플리케이션의 구조를 정의하는 중요한 문서로, 앱의 다양한 구성 요소와 그 설정, 행동 방식을 시스템에 알려준다 이를 통해 안드로이드 시스템은 앱이 어떻게 동작하고 다른 앱 또는 시스템 구성 요소와 어떻게 상호작용해야 하는지를 이해하게 된다
매니페스트 4대 구성요소와 컴포넌트 분석
나중에 미완
매니페스트 권한
안드로이드 매니페스트 파일에서 권한(permission)은 애플리케이션이 특정 시스템 기능에 접근하거나 사용자의 개인 데이터에 접근하기 위해 필요한 권한을 선언하는 데 사용된다. 이 권한 시스템은 사용자의 프라이버시를 보호하고, 앱이 필요 이상의 정보에 접근하는 것을 제한하는 데 중요한 역할을 한다.
권한의 역할
- 접근 제어: 권한은 앱이 전화 걸기, 문자 메시지 보내기, 인터넷 사용, 카메라 접근 등과 같은 특정 기능을 사용할 수 있는지를 결정한다.
- 사용자 동의: 앱이 특정 권한을 요구하는 경우, 사용자는 앱 설치 시 또는 실행 중 해당 권한을 허용하거나 거부할 수 있다.
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
...
</manifest>
이 예시에서, 애플리케이션은 인터넷 접근(android.permission.INTERNET)과 정밀 위치 정보 접근(android.permission.ACCESS_FINE_LOCATION) 권한을 요청하고 있다.
AndroidManifest.xml 분석
<manifest>: 매니페스트 파일의 루트 요소다. 애플리케이션에 대한 필수 정보를 포함한다.
<application>: 애플리케이션의 아이콘, 테마, 사용되는 컴포넌트 등을 정의한다. 여기에는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더 등이 포함된다.
<activity>: 사용자와 상호작용하는 화면(액티비티)을 정의한다. <intent-filter>를 사용하여 어떤 인텐트에 반응할지 지정할 수 있다.
<service>: 사용자 인터페이스 없이 백그라운드에서 실행되는 작업을 정의한다.
<receiver>: 브로드캐스트 인텐트에 반응하는 컴포넌트를 정의한다. 예를 들어, 배터리 낮음 알림, 화면 켜짐/꺼짐 등에 반응할 수 있다.
<provider>: 앱 데이터를 다른 앱과 공유할 수 있는 콘텐트 프로바이더를 정의한다.
추가적으로 매니페스트 파일은 애플리케이션이 요구하는 권한을 정의하고,
사용하는 하드웨어나 소프트웨어 기능을 명시하며, 지원하는 안드로이드 API 레벨의 최소 및 목표 버전을 지정한다.
또한 애플리케이션에 대한 추가적인 메타데이터를 제공하고,
특정 컴포넌트가 다른 앱에서 접근 가능한지 여부를 지정하는 등의 기능을 한다.
처음 프로젝트를 만든 후 AndroidManifest.xml 분석
전체 코드
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapplication">
<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"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
매니페스트 파일 시작 부분이다.
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
이 구문은 XML 파일의 선언부로, 안드로이드 매니페스트 파일이나 다른 XML 기반 파일의 맨 위에 위치한다.
이 구문에는 두 가지 주요 정보가 포함되어 있다:
- XML 버전: version="1.0"은 이 문서가 XML 버전 1.0을 따른다는 것을 나타낸다.
XML 버전 1.0은 가장 널리 사용되는 XML 버전이며, 표준 XML 문법을 따른다. - 인코딩: encoding="utf-8"은 이 XML 문서가 UTF-8 인코딩을 사용한다는 것을 나타낸다.
UTF-8은 유니코드를 지원하는 인코딩 방식으로, 다양한 언어와 특수 문자를 정확하게 표현할 수 있다.
안드로이드 개발에서 UTF-8 인코딩을 사용하는 것은 국제화 및 다양한 문자 집합을 지원하기 위한 표준 관행이다.
간단히 말해, 이 구문은 XML 문서의 기본 설정을 정의하며, XML 문서가 어떤 버전의 표준을 따르며 어떤 문자 인코딩을 사용하는지를 명시한다. 이는 문서를 해석하고 올바르게 표시하는 데 필요한 기본적인 정보를 제공한다.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapplication">
<manifest>
- 이 태그는 XML 파일이 안드로이드 앱의 매니페스트임을 나타낸다. 매니페스트는 앱의 권한, 사용하는 구성 요소, 최소 API 레벨, 호환성 등을 포함한 앱의 기본 정보를 정의한다.
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"
- xmlns:android는 XML 네임스페이스 정의다. 네임스페이스는 XML 문서 내에서 특정 태그나 속성이 어떤 XML 스키마에 속하는지 구분하는 데 사용된다.
- "http://schemas.android.com/apk/res/android"는 안드로이드 리소스와 속성을 위한 네임스페이스의 식별자(URL)다. 이를 통해 매니페스트 파일은 안드로이드 시스템이 이해할 수 있는 특정 속성과 요소를 사용할 수 있다.
- 예를 들어, 이 네임스페이스를 사용하여 android:name, android:icon, android:versionCode 같은 안드로이드 특화 속성을 매니페스트 태그에 추가할 수 있다.
xmlns:tools="http://schemas.android.com/tools"
- xmlns:tools는 XML 네임스페이스 정의이며, 안드로이드 스튜디오에서 제공하는 추가 도구들을 사용하기 위한 것이다.
- http://schemas.android.com/tools는 안드로이드 도구 네임스페이스의 URL이며, 이를 통해 빌드 프로세스나
안드로이드 스튜디오에서의 레이아웃 렌더링과 같은 작업에 대한 추가 설정이나 명령을 제공할 수 있다. - 예를 들어, tools:context를 사용하여 레이아웃 파일에 대한 액티비티 연결을 지정하거나,
tools:ignore를 통해 특정 경고를 무시할 수 있다.
package="com.example.myapplication"
package="com.example.myapplication"은 앱의 고유 패키지 이름을 정의한다.
애플리케이션 설정
<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"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
application 태그는 애플리케이션의 여러 특성을 설정한다.
- android:allowBackup="true"는 앱 데이터 백업을 허용한다.
- android:icon과 android:roundIcon은 앱 아이콘을 지정한다.
- android:label은 앱 이름을 정의한다.
- android:supportsRtl="true"는 오른쪽에서 왼쪽으로 텍스트 지원을 활성화한다.
- android:theme은 앱 테마를 설정한다.
- tools:targetApi="31"은 앱이 타겟팅하는 안드로이드 API 레벨을 지정한다.
액티비티 선언
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity> 태그
<activity> 태그는 안드로이드 매니페스트 파일에서 매우 중요한 역할을 하는데, 이는 애플리케이션의 액티비티를 정의한다. 액티비티는 안드로이드 앱에서 사용자 인터페이스를 가진 화면을 의미한다.
- MainActivity 액티비티를 선언한다. android:exported="true"는 다른 앱이나 시스템에서 이 액티비티를 시작할 수 있음을 의미한다.
- intent-filter는 MainActivity가 애플리케이션의 진입점임을 나타낸다. 사용자가 디바이스의 홈 화면에서 앱을 시작할 수 있게 한다.
<action> 태그
- 이 태그는 액티비티가 수행할 수 있는 '액션'을 나타낸다.
- 예를 들어, <action android:name="android.intent.action.MAIN" />는 이 액티비티가 애플리케이션의 진입점, 즉 '메인 액티비티'임을 나타낸다.
- android.intent.action.MAIN 액션은 사용자가 앱 아이콘을 탭했을 때 시작되는 액티비티에 사용된다.
- <category> 태그
- <category> 태그는 인텐트의 카테고리를 지정한다.
- 예를 들어, <category android:name="android.intent.category.LAUNCHER" />는 이 액티비티가 사용자의 디바이스 홈 화면 또는 앱 서랍에서 시작될 수 있음을 의미한다.
- android.intent.category.LAUNCHER 카테고리는 앱을 시스템의 앱 런처에 나타나게 한다.
이러한 설정을 통해 MainActivity는 사용자가 앱 아이콘을 탭했을 때 시작되는 메인 액티비티로 설정된다. intent-filter의 action과 category는 앱이 어떤 종류의 인텐트에 반응하고, 앱이 어떻게 사용자에게 나타날지를 결정하는 중요한 설정이다.
'Android' 카테고리의 다른 글
안드로이드 로그아웃 예제 (0) | 2024.01.24 |
---|---|
안드로이드 자바 카카오 로그인 API 예제 구현하기 (1) | 2024.01.19 |
Javax로 Email 보내기 (0) | 2024.01.16 |
SMTP 개념 (0) | 2024.01.13 |
안드로이드 회원가입 이메일 비밀번호 유효성 검사 (0) | 2023.12.27 |