Android 관련

AndroidManifest 란?

이나주니 2023. 5. 6. 15:48
반응형

AndroidManifest (매니페스트)

각 구성요소 코틀린이나 자바클랴스의 이름과 같은 기본 속성을 정의해야 함

 

Android 개발자  |  Android Developers

콘텐츠 제공자 구성요소를 선언합니다. 콘텐츠 제공자는 애플리케이션에서 관리되는 데이터에 구조적으로 액세스할 수 있게 하는 ContentProvider의 서브클래스입니다. query()에 애플리케이션의 모

developer.android.com

 

이러한 구성요소를 매니페스트 파일에서 선언하지 않고 서브클래스로 분류하면 시스템에서 이를 시작할수 없음

 

전체 페키지 지정을 사용하여 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>

 

반응형