소프트 스퀘어드에서 클라이언트 특강이 열렸길래 신청했다. 졸업작품으로 앱을 만들었는데 당시 안드로이드 스튜디오를 처음 쓰기도 했고, 기초부터 차근차근 하기에는 시간이 부족해 무작정 찾아보면서 진행했었다.
그러다 보니 프로젝트 진행한지 1년 정도 지난 지금 머리에 남은 게 하나도 없다. 이참에 열심히 배워두면 언젠가 앱 출시할 수 있는 기회가 오지 않을까?

Manifest

안드로이드 스튜디오에서 프로젝트를 생성하면 AndroidManifest.xml 파일이 생성된다. 공식 사이트에 있는 문서를 보면 Manifest 파일은 앱에 대한 필수 정보를 안드로이드 빌드 도구와 AOS, Google Play에 제공한다고 나와있다. 쉽게 앱에 대한 필수 정보를 시스템에 제공하는 목록 정도로 생각하면 될 것 같다. 이러한 Manifest 파일에 특히 선언되어야 하는 정보들이 있다.

  • Package name
  • App components
  • Permissions
  • Device compatibility

위의 네 가지 정보들이 어떻게 파일에 반영되는지 알아보자.

Package Name

Manifest 파일의 루트 요소(<manifest></manifest>)에는 해당 앱의 패키지 네임이 반드시 기재되어야 한다. “com.example.myapplication” 이라는 패키지를 만들었다면 아래와 같은 Manifest 파일이 생성된다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    ...
</manifest>

이러한 패키지 네임은 apk를 추출하는 과정에서 아래와 같은 목적으로 사용된다.

  1. R.java 클래스의 네임스페이스로 이 이름 적용
    • 위의 예시에서는 “com.example.myapplication.R” 클래스 생성
  2. Manifest 파일 내에서 선언된 상대 경로에 적용

주민등록번호가 사람의 고유 식별자인 것처럼 패키지 네임은 곧 프로젝트의 식별자이다.

App Components

안드로이드에는 4대 컴포넌트가 있는데, 앱에서 이 컴포넌트들을 사용하기 위해서는 Manifest 파일에 해당하는 XML 요소를 선언해줘야 한다.

  • 〈acvitivy〉 : Activity의 각 하위 클래스
  • 〈service〉 : Service의 각 하위 클래스
  • 〈receiver〉 : Broadcast Receive의 각 하위 클래스
  • 〈provider〉 : Content Provider의 각 하위 클래스

XML 요소를 선언하지 않고 위의 컴포넌트들을 하위 클래스로 지정해서 사용하면 시스템이 실행되지 않는다.
하위 클래스 이름은 name 특성에 패키지 네임을 지정해서 사용한다.

<activity android:name=".MainActivity">
    ...
</activity>

Intent filter

4대 컴포넌트들은 각각 인텐트에 의해 활성화된다. 인텐트는 메시지 객체로 작업할 데이터나 작업을 수행해야 하는 명령 등을 포함한다.

Permissions

안드로이드 앱은 연락처나 SMS와 같은 민감한 사용자 데이터, 카메라처럼 특정 시스템 기능에 엑세스하기 위한 권한을 반드시 요청해야 한다.
각 권한은 고유한 레이블로 식별되는데, SMS 메시지를 보내야 하는 앱은 아래와 같이 설정해준다.

<manifest ...>
    <uses-permission android:name="android.permission.SEND_SMS"/>
</manifest>

안드로이드 버전과 별개로 앱에서 필요로 하는 모든 권한에는 uses-permission 태그를 설정해줘야 한다.

Device Compatibility

Manifest 파일에는 앱에 필요한 하드웨어나 소프트웨어 기능 뿐만 아니라 앱과 호환되는 기기 유형도 선언할 수 있다.
uses-feature 태그를 사용하면 앱에 필요한 하드웨어 및 소프트웨어 기능을 선언할 수 있다. 만약 나침반 센서가 없는 기기에서 앱이 기본적인 기능을 실행하지 못한다면 다음과 같이 선언해서 사용할 수 있다.

<manifest ...>
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
</manifest>

앱이 호환되는 최소 버전을 나타내려면 uses-sdk 태그와 minSdkVersion 속성을 이용한다. 이는 build.gradle 파일에서 재정의하기 때문에 Manifest 파일이 아닌 build.gradle 파일에 선언하는 것이 더 좋다.

android {
  defaultConfig {
    applicationId "com.example.myapplication"

    // Defines the minimum API level required to run the app.
    minSdkVersion 15
    // Specifies the API level used to test the app.
    targetSdkVersion 28
  }
}

참고