안드로이드 빌드 시스템은 gradle을 이용하고 있습니다. gradle자체는 범용 빌드툴로 여러곳에서 사용되고 있고, 그 중 하나가 안드로이드 입니다. 깊게 다루지는 못하고 제가 살펴본 만큼만 다룰건데, 좀 더 깊게 들어가고 싶은 사람들의 가이드정도가 될거 같네요.
안드로이드를 위한 gradle을 공부하고 싶을 때, 좋은 시작지점이 있습니다. Udacity의 무료강의 입니다. gradle 공식사이트도 관련 정보를 얻기에는 최적의 장소겠죠. 문서부터 트레이닝까지 학습정보가 충분합니다.
gradle은 groovy문법에 기반한 스크립트 언어로 구현됩니다. groovy는 저도 익숙하지 않은데, java와 비슷한 스크립트 언어라고 생각하면 될거 같습니다. 안드로이드 스튜디오에서 새 프로젝트를 생성해서 파일들을 한번 살펴보죠.

먼저, gradlew 또는 gradlew.bat 가 보입니다. gradle wrapper라는 것으로 gradle을 직접 실행하지 않고 wrapper를 통해 실행합니다. wrapper는 gradle을 최신으로 업데이트 하는등의 작업을 자동으로 해줍니다. 안드로이드 스튜디오의 빌드도 gradle wrapper를 통한 작업이기 때문에, 커맨드라인에서 gradlew를 통해 직접 빌드도 가능합니다.
안드로이드 스튜디오에서의 gradle에 대한 것은 안드로이드 스튜디오 사이트에 빌드 관련 항목에서 도움을 얻을 수 있습니다.
gradle의 기본 작업 단위는 task 입니다. 안드로이드 스튜디오에서 기본으로 오른쪽에 있는 Gradle탭을 열면 볼 수 있습니다.

assemble, build, clean등이 tasks 입니다. 빌드 단계별로 쪼개진 task를 각각 실행할 수도 있고, task간 의존성이 존재해서 전체 빌드를 수행하면 알아서 앞 단계의 tasks들을 수행하기도 합니다. 빌드란, 이렇게 task를 실행하는 것입니다. task가 프로젝트와 app두 항목으로 존재하는 것은 아마도 멀티모듈을 위한 것으로 보입니다. settings.gradle파일을 보면 다음과 같이 include되어 있음을 알 수 있습니다.
include ':app'
gradle은 범용 빌드 툴입니다. 그런데 어떻게 안드로이드를 위한 tasks들이 알아서 존재할까요? 물론, 구글이 만들어 제공하는 것이지만, gradle에서 plugin이란 것으로 제공하고 있습니다. 자바 개발을 위해선 java plugin, 안드로이드를 위해선 android plugin이 필요한 거죠. 프로젝트의 build.gradle파일을 보면 확인 할 수 있습니다.
apply plugin: 'com.android.application'
build.gradle파일을 살펴본 김에, 아래 내용도 살펴봅시다. 먼저 android 블럭이 보입니다.

gradle을 사용하기 이전엔 AndroidManifest에 기술하던 정보들이 기술되어 있음을 볼 수 있습니다. buildTypes는 release, debug등의 빌드를 구별하기 위한 부분입니다.

그 아래에는 dependencies 블럭이 보입니다. 각 줄을 보면, 앞의 configuration이 뒤의 파일이나 라이브러리에 의존성이 있음을 기술하고 있습니다. 최근에 ‘compile’이란 이름으로 사용되던 configuration이 ‘implementation’으로 변경된 것으로 보입니다.
이제, project global build.gradle을 살펴보죠.

주석문이 많은걸 말해주고 있습니다. 내부에는 repositories 블럭이 보이는데, 기본 원격 repositories가 적혀있습니다. 아래에는 clean task가 하나 정의되어 있습니다. task의 복잡한 기능을 돕기위해, gradle에서는 task type이란걸 지원하는데, 파일에는 Delete라고 기술되어 있습니다. type에는 copy, delete, zip등 수많은 기능들이 존재하며, gradle 공식 페이지의 DSL 레퍼런스 뭐가 있는지 찾아볼 수 있습니다.
글을 써야지 마음 먹었을 때는 gradle사용법부터, android 적용방법까지 원대한 생각을 했는데, 저도 잘 모르는 상태에서 역시 어려운 일인거 같네요. 이런 파일들이 존재한다는 정도가 지금으로서는 전부인 거 같습니다. 개발을 하고, 구글플레이에 앱을 올리기 위해선 gradle의 수정이 필수니까, 앞으로 gradle 파일을 수정할 일이 생길 때, 새로 포스팅을 해보도록 하겠습니다. 🙂