-
AndroidManifest 란?Android 관련 2023. 5. 6. 15:48반응형
AndroidManifest (매니페스트)
각 구성요소 코틀린이나 자바클랴스의 이름과 같은 기본 속성을 정의해야 함
- Activity의 각 서브클래스의 <activity>
- Service의 각 서브클래스의 <service>
- BroadcastReceiver의 각 서브클래스의 <receiver>
- ContentProvider의 각 서브클래스의 <provider>
이러한 구성요소를 매니페스트 파일에서 선언하지 않고 서브클래스로 분류하면 시스템에서 이를 시작할수 없음
전체 페키지 지정을 사용하여 name 속성으로 서브클레스의 이름을 지정
<manifest ... > <application ... > <activity android:name="com.example.myapp.MainActivity" ... > </activity> </application> </manifest>
그러나 name 값의 첫번째 문자가 마침표라면 앱의 네임스페이스가 이름앞에 붙음
※ build.gradle 파일의 namespace 속성
ex ) "com.example.myapp" 이라면 com.example.myapp.MainActivity 으로 확인됨
<manifest ... > <application ... > <activity android:name=".MainActivity" ... > ... </activity> </application> </manifest>
인텐트 필드
앱 활동, 서비스, broadcast receiver는 인텐트로 활성화됩니다. 인텐트는 실행할 작업을 설명하는 Intent 객체로 정의되는 메시지
여기에는 작업할 데이터, 작업을 실행할 것으로 예상되는 구성요소 카테고리, 기타 명령이 포함 됨
앱이 인텐트를 시스템에 발행하면 시스템은 각 앱의 매니페스트 파일에 선언된 인텐트 필터에 기초하여 인텐트를 처리할 수 있는 앱 구성요소를 찾음
앱 구성요소는 인텐트 필터(<intent-filter> 요소로 정의)를 몇 개든 가질 수 있으며, 각 인텐트 필터는 구성요소의 각 기능을 설명
아이콘 라벨
많은 매니페스트 요소에는 해당 앱 구성요소에 대해 작은 아이콘과 텍스트 라벨을 사용자에게 각각 표시하기 위한 icon과 label 속성이 있음
예를 들어 <application> 요소에 설정된 아이콘과 라벨이 앱의 각 구성요소(예: 모든 활동)의 기본 아이콘과 라벨이 됨
권한
Android 앱은 민감한 사용자 데이터(예: 연락처, SMS) 또는 특정 시스템 기능(예: 카메라, 인터넷 액세스)에 액세스하기 위한 권한을 요청해야 함. 각 권한은 고유한 라벨로 식별
예를 들어 SMS 메시지를 보내야 하는 앱은 매니페스트에 다음과 같은 줄이 있어야함
<manifest ... > <uses-permission android:name="android.permission.SEND_SMS"/> ... </manifest>
Android 6.0(API 수준 23)부터 사용자는 런타임에서 일부 앱 권한을 승인하거나 거절할 수 있게 됨
러나 앱이 어떤 Android 버전을 지원하든 매니페스트에서 <uses-permission> 요소로 모든 권한 요청을 선언해야 함
1. 권한이 부여되면 앱이 보호된 기능을 사용할 수 있음
2. 권한이 부여되지 않으면 그러한 기능에 액세스하려는 시도가 실패
3. 새 권한을 선언할 때는 <permission> 요소를 사용함
기기 호환성
<uses-feature>
<uses-feature> 요소를 사용하면 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있음
나침반 센서가 없는 기기에서 앱이 기본적인 기능을 실행할 수 없다면, 필요에 따라 다음과 같이 매니페스트 태그를 사용하여 나침반 센서를 선언
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ... </manifest>
<uses-sdk>
연속적인 각 플랫폼 버전에서는 이전 버전에서 사용할 수 없는 새 API를 추가하는 경우 많음
그로 인해 앱이 호환되는 최소 버전을 나타내려면 매니페스트에 <uses-sdk> 태그와 그 minSdkVersion 속성을 포함
그러나 <uses-sdk> 요소의 속성은 build.gradle 파일의 상응하는 속성으로 재정의
따라서 Android 스튜디오를 사용하면 minSdkVersion 및 targetSdkVersion 값을 대신 지정
android { defaultConfig { applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdkVersion 21 // Specifies the API level used to test the app. targetSdkVersion 33 ... } }
파일 규칙
요소
<manifest> 및 <application> 요소만 필수
두 요소는 각각 한 번만 실행되어야 함
다른 요소는 대부분 한 번도 실행되지 않거나 한 번 이상 실행되어도 됨
다만 이들 중 일부가 있어야만 매니페스트 파일에 쓸모가 있음
같은 레벨에 있는 여러 요소는 보통 순서가 지정되지 않음
<activity>, <provider> 및 <service> 요소는 어느 순서로든 배치할 수 있음
이 규칙에는 두 가지 중요한 예외 사항이 있음
- <activity-alias> 요소는 이 요소를 별칭으로 사용하는 <activity> 다음에 와야 합니다.
- <application> 요소는 <manifest> 요소 내부에 있는 마지막 요소여야 합니다.
속성
속성은 선택사항
그러나 어떤 요소의 용도를 실현하기 위해서는 많은 속성을 지정
여러 개의 값
둘 이상의 값을 지정할 수 있는 경우, 한 요소 안에 여러 값이 나열되지 않고 해당 요소가 거의 항상 반복
<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 이름을 생략할 수 있음
type은 string 또는 drawable 같은 리소스 유형이며 name는 특정 리소스를 식별하는 이름
예 )
<activity android:icon="@drawable/smallPic" ... >
대신 테마에 정의된 값을 적용하려면 첫 문자는 @가 아니라 ?가 되어야 함
전체 예제
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0"> <!-- Beware that these values are overridden by the build.gradle file --> <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- This name is resolved to com.example.myapp.MainActivity based on the namespace property in the build.gradle file --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DisplayMessageActivity" android:parentActivityName=".MainActivity" /> </application> </manifest>
반응형'Android 관련' 카테고리의 다른 글
Android 난독화 - Flutter (0) 2024.07.31 Google Play Console 앱 권한 관리 (0) 2023.09.06 playStore App 판매 중단하기 (0) 2023.03.20 PlayStore 검색 노출 시기키 (0) 2023.02.21 No signature of method (0) 2023.02.20