[Android] Android 프로젝트 및 앱 빌드 과정

dEpayse
dEpayse_publication
8 min readFeb 3, 2023

--

안드로이드 어플리케이션 개발을 시작한다면, native 앱을 제작하기 위해서 일반적으로 Android Studio 를 설치한다. Android Studio 는 안드로이드 어플리케이션 개발을 위한 공식 IDE (Integrated Development Environment) 이다. 그리고 새로운 어플리케이션 개발을 위해 프로젝트를 만들게 되는데, 이번 포스트에서는 Android 프로젝트와, 프로젝트의 빌드 과정에 대해 알아볼 것이다.

본 포스트에서 다루는 Android Studio 의 버전은 Chipmunk(2022.2.1 Patch 1) 으로 버전이 다르면 UI 혹은 기능이 다를 수 있습니다.

프로젝트(Android Project)

Android Studio 를 설치한 후에 어플리케이션 개발을 위한 첫 걸음은 프로젝트를 생성하는 것이다. 프로젝트에는

  • Java 혹은 Kotlin 으로 작성한 소스 코드
  • xml 로 작성된 layout, drawable, style 등의 에셋
  • 테스트를 위한 Test code
  • 어떤 설정으로 빌드할 것인지를 정의하기 위한 빌드 구성

등등 앱을 위한 작업 공간을 정의하는 모든 항목을 포함한다(프로젝트의 루트 디렉토리). Android Studio 를 통해 프로젝트를 생성하면 프로젝트 유형에 맞게 구조화하여 파일들을 생성해준다.

모듈(Module)

모듈은 빌드 설정과 소스 파일의 모음이다. 모듈의 특징과 모듈 사용의 장점은 다음과 같다.

  • 모듈을 이용하여 프로젝트를 기능 단위로 분할하여 의존성을 낮출 수 있다.
  • 각 모듈은 서로 다른 패키지명을 갖고, 한 프로젝트 내에서 같은 패키지명을 갖는 모듈은 있을 수 없다.
  • 모듈 별로 독립적인 빌드, 테스트, 디버그를 할 수 있기 때문에 적절한 모듈 분리는 빌드 속도 향상을 가져올 수 있다.
  • 예를 들어 스마트폰을 위한 빈 프로젝트를 생성하면, ‘app’ 이라는 이름으로 Android Studio app 모듈 하나만 생성해준다.

모듈의 종류는 여러가지가 있으나, 본 포스트에서 전부 다루진 않고, Android app module 과 Library module 에 대해서만 간단하게 다룬다.

  • Android app module : 소스 코드, 리소스 파일, Manifest 파일과 빌드 구성으로 이루어진 컨테이너를 제공한다. Android Studio 에서 Run 을 통해 실행 가능한 ‘앱’을 만들 수 있는 모듈이다. 이 모듈을 빌드하면 출력 파일로 apk(Android PacKage) 혹은 aab(Android App Bundle)를 볼 수 있다.
  • Library module : Android app module 들에서 종속 항목으로 사용하거나, 다른 프로젝트로도 가져가서 재사용할 수 있는 컨테이너를 제공한다. 이 모듈을 빌드하면 출력 파일로 aar (Android ARchive) 혹은 jar(Java ARchive)을 볼 수 있다.

Android Project 파일 보기 설정

Fig1. Android 보기 설정

Android Studio 프로젝트 생성 후에 좌측 패널에 보면 기본적으로 Fig1 과 같은 화면을 볼 수 있다. 만약 없다면, 더 좌측에 Project 탭을 클릭하면 볼 수 있다. 여기도 없다면 상단 바에서 View -> Tool Windows 에서 찾을 수 있다.

app 이라는 글자 위에 보면 아래쪽 화살표와 함께 ‘Android’ 로 되어있는 것을 볼 수 있는데, 이것이 Android Studio 의 기본 보기이다. 이 보기 설정은 프로젝트 디렉토리 내의 파일들을 보는 여러 방법 중에 하나를 선택하여 해당 방법으로 파일들을 볼 수 있는 기능이다. 이 기본 ‘Android’ 라는 보기는 실제 파일을 모두 보여주지는 않고, Android 를 개발할 때 주로 사용하는 파일들을 보기 좋게 정리해서 보여준다. 이 보기는 프로젝트에 하나 이상의 module 이 있어야 사용 가능하다.

Android 보기를 선택했을 때, Android app 모듈은 manifests, java, res 그룹으로 분류해서 보여준다.

  • manifests : AndroidManifest.xml 파일을 포함한다. Manifest 파일은 앱의 패키지명, 앱의 구성요소, Google Play 앱에 관한 필수 정보, 앱을 사용하는데 필요한 권한, 하드웨어 및 소프트웨어 기능 등을 정의한다.
  • java : Java 혹은 Kotlin 코드를 package 로 분류하여 보여준다. 테스트 코드 파일들도 포함한다.
  • res : app resource 파일들을 보여준다. xml 로 작성된 layout, drawable, style 파일 등을 포함한다.

모듈이 아닌 Gradle Scripts 라는 것도 볼 수 있는데, Gradle 은 Android 프로젝트의 빌드를 도와주는 도구이고, Android 와는 독립적인 빌드 시스템이다. 빌드 자동화 도구라고도 하는데 빌드 시스템에 이해가 부족했던 처음에는 무슨 말인지 이해하기 힘들었다. 간단하게 예를 들자면 Android Studio 에서 앱 모듈을 실행하면 프로젝트를 빌드하고, apk 를 만든 후, 기기에 설치하는 일련의 과정을 거쳐야하는데, 이런 과정을 하나의 gradle task 로 묶어 gradle이 task 를 실행하는 것을 ‘빌드 자동화’ 라고 표현한 것이다. Gradle 에 관련된 자세한 내용은 본 포스트에서는 다루진 않는다. (Android 빌드 시스템과 Gradle 에 관련된 좀 더 자세한 내용은 아래 링크를 참고 바랍니다.)

만약 실제 디스크에 저장된 구조 그대로 파일들을 보려면 ‘Android’ 와 함께 적힌 화살표를 누르고 ‘Project Files’ 라고 적힌 보기를 선택하면 된다.

주로 사용하는 보기는 ‘Android’ 와 ‘Project Files’ 이고, 다른 보기들은 본 포스트에서 다루지 않는다.

앱 모듈 빌드 과정

Fig2. Android App Module build process

안드로이드 앱 모듈의 빌드 과정은 Fig2 와 같다. Fig2 는 Android 공식 문서를 토대로 작성했으나, 2023.02.02 현재 문서에서는 찾아볼 수 없게 됐다. 과정에 조금 변형이 생겼더라도 어떤 과정으로 앱 모듈이 빌드되는지 보는 것은 도움이 될 것 같다.

대략적인 빌드 과정은 아래와 같다.

  1. xml 로 작성된 layout, drawable, style 등의 에셋과 이미지와 같은 리소스 파일들을 aapt 가 소스 코드에서 사용할 수 있게 해주는 R.java 파일과 컴파일된 파일을 생성한다.
  2. aidl 파일들은 aidl 이 Java 인터페이스로 변경한다.
  3. 소스코드, R.java, aidl 을 거쳐 생성된 Java 인터페이스가 java 컴파일러, kotlin 컴파일러를 거쳐 Java Byte Code 인 .class 파일을 생성한다.
  4. .class 파일을 dex 가 Dalvik Executable 파일인 .dex 파일로 컴파일한다.
  5. apkbuilder 가 컴파일된 리소스와 다른 리소스들, 컴파일된 .dex 파일들을 패키지화하여 .apk 파일을 생성한다.
  6. jarsigner.apk 파일에 서명을 추가한다.
  7. release 모드라면 zipalign 이 align 된 .apk 를 생성한다.

Android 는 위와 같은 과정을 gradle 을 통해서 빌드한다. Android Studio 에서 Run 버튼을 누르면 gradle 이 특정 task 를 실행한다는 뜻이다. 좀 더 자세한 예시로는, 프로젝트의 루트 디렉토리에서 ./gradlew assembleDebug 라는 명령어를 입력하면 기본 상태에서 Run 버튼을 눌렀을 때와 같은 동작이 실행된다.

아래는 좀 더 세분화된 빌드 과정을 나타낸 것이다.

Fig 2–1. Android App Module build process (http://tools.android.com/tech-docs/new-build-system/build-workflow)

Reference

  1. [Android Docs] “프로젝트 개요” — https://developer.android.com/studio/projects?hl=ko
  2. [Android Docs] “앱 매니페스트 개요” — https://developer.android.com/guide/topics/manifest/manifest-intro?hl=ko
  3. [코딩하기 좋은날] “Gradle 이란?” — https://huiung.tistory.com/159

--

--

dEpayse
dEpayse_publication

나뿐만 아니라 다른 사람들도 이해할 수 있도록 작성하는, 친절한 블로그를 목표로.