일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Compose
- android
- 암호학
- ProGuard
- Rxjava
- Gradle
- architecture
- 백준
- GitHub
- MiTweet
- MyVoca
- livedata
- Python
- Hilt
- boj
- 코드포스
- pandas
- 코루틴
- TEST
- 프로그래머스
- Coroutines
- AWS
- Codeforces
- androidStudio
- textfield
- Coroutine
- relay
- Kotlin
- 쿠링
- activity
- Today
- Total
이동식 저장소
[Android] Manifest 파일이란? 본문
잘 모르지만 그냥 사용했던 파일 1위! ``AndroidManifest.xml``
...어쨌든 잘 모르고 쓴 건 맞지 않는가? Activity나 service 정의할 때 많이 보긴 했지만, 정작 manifest 파일이 뭔지는 제대로 공부하지 않았다.
그래서 manifest가 뭔데요?
Android가 앱을 실행하기 위해서는 우선 그 앱에 어떤 컴포넌트가 있는지 알아야 한다. ``AndroidManifest.xml`` 파일에는 앱의 모든 컴포넌트가 정의되며, 이것이 가장 중요한 역할이다.
그 밖에도 다음의 역할을 수행한다.
- 앱에서 요구할 사용자 권한을 정의한다. ex) ``android.permissions.INTERNET``
- 앱이 실행될 수 있는 최소 API 레벨을 정의한다.
- 앱에서 사용하는 하드웨어/소프트웨어 기능을 정의한다. ex) 카메라, 블루투스
- 앱에 링크되어야 하는 라이브러리를 선언한다. ex) Google Maps 라이브러리
컴포넌트 정의
Manifest 파일의 가장 중요한 기능이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:icon="@drawable/app_icon.png" ... >
<activity android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
자주 보던 코드 맞지? 참고로 컴포넌트란 다음의 요소를 의미한다.
- ``<activity>``
- ``<service>``
- ``<receiver>``
- ``<provider>``
``<activity>``는 앱의 시작점과 관련있고(MainActivity?), ``<service>``는 앱의 포그라운드/백그라운드 서비스를 정의하며, ``<receiver>``는 앱이 특정 작업을 수행할 수 있음을 의미하며, ``<provider>``는 앱이 다른 앱과 데이터를 공유할 수 있게 돕는다.
이런 요소들을 manifest에 정의해야 하는 이유는, 앱의 기능 중 안드로이드 시스템과 가장 밀접하게 연결된 부분이기 때문이다.
시스템은 manifest에 정의되지 않은 요소들을 인식할 수 없으며, 따라서 코드가 있더라도 해당 코드를 실행할 수 없다. 예외로 broadcast receiver는 manifest 대신 코드를 통해 정의할 수 있다.
컴포넌트에 기능 부여 with ``Intent``
``Activity`` 와 ``Service``는 ``Intent``를 통해 실행된다. 인텐트에는 명시적 인텐트와 암묵적 인텐트 두 종류가 있다.
- 명시적 인텐트는 실행할 요소의 이름을 ``Intent``에 명시하는 방법이다.
- 암묵적 인텐트는 실행할 액션만을 정의하며, 실제로 어떤 요소가 액션을 실행할 지는 신경쓰지 않는다. 대신 Android 시스템이 해당 액션을 실행할 수 있는 요소를 찾는다.
암묵적 인텐트를 사용한 예시로는, 공유하기 버튼을 눌렀을 때 수많은 앱의 수많은 기능이 뜨는 모습이 있다. 물론 시스템이 알아서 인식할 수는 없으니, manifest에 ``<intent-filter>``를 정의하여 앱이 이 액션을 수행할 수 있음을 시스템에 알려야 한다.
예를 들어 내가 개발하는 이메일 앱 ``MyMail``이 send 인텐트에 반응하게 하고 싶다면, 다음과 같이 manifest를 정의한다.
<manifest ... >
...
<application ... >
<activity android:name="com.example.project.ComposeEmailActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<data android:type="*/*" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
이제 Android 시스템은 send 인텐트를 받을 수 있는 옵션으로 ``MyMail``을 고려할 것이다.
설치 조건 정의
앱에서 필요한 하드웨어/소프트웨어 조건을 만족하지 못하는 기기에는 앱이 설치되지 않도록 미리 거를 필요가 있다. Google Play는 앱의 요구 조건을 읽어 해당 조건을 만족하는 기기에만 앱을 보여준다. 예를 들어 앱을 실행하려면 API 레벨이 24 이상이어야 한다던가, 카메라가 있어야 한다던가. 물론 카메라는 웬만하면 있겠지만.
android {
...
defaultConfig {
...
minSdkVersion 26
targetSdkVersion 29
}
}
주의: ``minSdkVersion``과 ``targetSdkVersion``은 어차피 ``buld.gradle``의 값이 사용되므로 manifest에 정의하지 말자.
참고
'Primary > Android' 카테고리의 다른 글
[Hilt] Application (0) | 2022.08.11 |
---|---|
[Android] 계정명이 한글일 때 test error 해결법 (0) | 2022.07.26 |
[Android] Build variant 심화 (0) | 2022.07.21 |
[Android] 코드 경량화 시 Instrumented test가 실행되지 않는 오류 (0) | 2022.07.19 |
[Android] Build variant 기초 (0) | 2022.07.17 |