안드로이드 개발자라면 알아야 하는 Gradle 원리

김정원
5 min readOct 23, 2022
Gradle 오픈소스 빌드 자동화 툴

안드로이드 개발을 하면 한번쯤은 Gradle 문제로 삽질을 하는 경우가 다들 있으실 겁니다. 하지만 항상 Clean Project, Rebuild Project, Invalidate Cache & Restart 를 하며 넘어가죠. 오늘은 왜 우리가 빌드 문제가 있을 때 Clean Project를 하는지, build.gradle 파일에는 무슨 내용들이 있는지 한번 살펴보도록 하겠습니다.

Gradle 이란

Gradle은 거의 모든 종류의 소프트웨어를 빌드할 수 있는 오픈소스 빌드 자동화툴입니다. 여기서 빌드는 코드가 적혀져 있는 파일을 컴파일하여 실행 가능한 실행 파일로 만드는 과정을 말합니다. 윈도우에서는 .exe 파일을 만드는 과정이 빌드이지만 안드로이드에서는 .apk 파일을 만드는 과정이 빌드 과정입니다.

참고로 .apk 파일은 실행 파일이 아닌 설치 파일입니다

Gradle 은 build.gradle 파일과 setting.gradle 파일을 통해 우리가 원하는 소프트웨어를 빌드할 수 있도록 되어 있습니다.

Gradle 의 Task

Gradle 에서는 Task 를 기반으로 빌드를 진행합니다. 여기서 Task란 build.gradle 파일에 정의된 가장 작은 작업을 의미합니다. Gradle 에서 Task 라는 개념을 도입한 가장 큰 이유는 빌드 속도 향상입니다.

수정 사항이 발생할때

위 그림은 여러 Task 간의 종속성을 그린 예시 그림입니다.
이중 만약 Task B의 코드에 변경 사항이 생겼다면 빌드할 때 어떻게 빌드해야 효율적일까요?
Task B 에 종속된 Task가 없기 때문에 Task B만 다시 빌드하면 됩니다. Task C, D, E, Z까지 다시 빌드할 필요가 없는 거지요. 이를 Gradle 문서에서는 task dependency mechanism 이라고 합니다.

Gradle 고정 빌드 단계 (Fixed Build Phases)

그렇다면 실제 Gradle 에서 빌드는 어떻게 실행될까요?

Gradle에는 고정 빌드 단계라는 빌드 절차가 있습니다.

  1. 초기화 (Initialization)
  2. 구성 (Configuration)
  3. 실행 (Execution)

1) 초기화 단계 (Initialization)

초기화 단계는 빌드에 추가할 프로젝트를 선택하고 프로젝트 인스턴스를 만드는 과정인데요. 이를 조금 쉽게 설명하자면 안드로이드 프로젝트 내에 있는 모듈들의 빌드를 준비하는 과정이라고 보시면 됩니다.

좀 더 자세히 들여다 보면,
안드로이드 프로젝트를 만들면 항상 최상위 디렉토리에 setting.gradle 파일과 build.gradle 파일이 존재하게 되는데요. setting.gradle 파일에 해당 프로젝트에 포함되는 모듈을 정의하게 됩니다.

https://github.com/android/app-bundle-samples/blob/main/DynamicFeatures/settings.gradle

위 코드는 Google Archive 에 있는 android-bundle-samples 프로젝트에 있는 settings.gradle 파일인데요. 해당 프로젝트는 멀티 모듈이 구현되어 있고 이는 settings.gradle 파일에 각 모듈들이 추가되어 있습니다.

그리고 build.gradle 파일에는 해당 파일에서 공통적으로 사용하고 있는 오픈소스들의 버전, applicationId, Gradle 버전, repository 에 대한 정의가 명시 되어 있습니다. 이를 통해 각 모듈들을 빌드할 준비를 합니다

https://github.com/android/app-bundle-samples/blob/main/DynamicFeatures/build.gradle

2) 구성 단계 (Configuration)

구성 단계에서는 각 모듈에 정의되어있는 build.gradle 파일을 실행합니다.

이때 안드로이드 프로젝트인 경우, app 모듈에 있는 build.gradle 파일에 Android Gradle Plugin (AGP)을 통해 프로젝트를 구성하게 됩니다. 즉, 안드로이드 빌드 스크립트 템플릿을 적용했다고 이해하시면 됩니다.

3) 실행 단계 (Execution)

실행 단계에서는 각 모듈의 빌드 스크립트 (build.gradle)를 실행하면서 실행해야할 Task를 선별해 실행합니다.

이 때 개발자가 선언한 buildType, flavorType 에 맞춰 우리가 원하는 버전의 APK를 빌드할 수 있습니다. 그리고 의존성 파일들도 gradle api 에 맞춰 다운로드 및 컴파일 됩니다. (implementation, kapt, testImplementation 과 같은 api 들)

마치며

안드로이드 개발을 하면서 Gradle 에 문제가 생기면 두려웠던 경험이 많습니다. 이 글을 통해 저는 예전보다는 Gradle 에 대한 두려움이 조금은 사라진 것 같습니다. 이 글을 읽으시는 분들도 도움이 되셨으면 좋겠네요.
끝까지 읽어주셔서 감사합니다!

--

--

김정원

Android Developer who loves programming and sharing dev knowledge