이번 영상에서는 Build Tool과 Android Gradle Plugin에 대해 알아보도록 하겠습니다.
소스코드를 바이너리코드로 컴파일한 뒤, 그 바이너리 코드들을 서로 링크해서 실행가능한 파일로 패키징하는 것을 소프트웨어를 빌드한다고 합니다. 실제 프로덕션의 빌드 과정은 컴파일과 링크 이외에도 다음과 같이 여러가지 작업이 필요합니다.
소스코드를 수정할 때 마다 이 과정을 하나하나 수행하는 것은 노력이 많이 들어가기 때문에, 일반적으로는 이 과정을 자동으로 수행해주는 Build Tool이라는 프로그램을 사용합니다. Android 개발에 채택된 언어인 Java의 Build Tool은 Ant > Maven > Gradle의 순으로 개선되어져 왔습니다.
1976년에 발표된 Make는 당시 사용할 수 있는 거의 유일한 Build Tool이었는데요, 초기 Java의 어플리케이션 개발에 사용되었으나 많은 규칙이 Java 시스템과 맞지 않는 문제가 있었습니다.
Ant (Another Neat Tool)는 Make를 대체하기 위해 Apache에서 2000년도에 발표한 Build Tool로, Make와 유사하지만 Java를 사용해 구현되었습니다. Makefile 형식을 사용하는 Make와 달리 Ant는 XML을 사용하며, 빌드 파일명은 관례상 build.xml 이라고 합니다.
Ant는 코딩 규칙이나 프로젝트 구조를 강요하지 않으므로 유연성이 높지만 개발자의 부담이 커졌고, Remote repository는 가져올 수 없다는 문제가 있었습니다.
Maven은 2004년 Apache에서 발표한 Build Tool로, XML 기반의 코딩 규칙을 강화했고 Remote repository를 가져올 수 있게 되었습니다. Maven의 구성 파일명은 규칙에 따라 pom.xml 이라고 합니다.
Gradle은 Ant 및 Maven의 개념을 기반으로 구축된 Build Tool입니다. 2008년 처음 발표되었는데 XML 대신 Groovy 언어를 사용하게 변경되었고, 규칙에 따라 build.gradle이라는 구성 파일명을 사용합니다. Java와 유사한 문법을 가진 스크립트 언어 Groovy를 Domain-specific language로 채택함으로써 가독성이 좋아졌고, 컴파일을 할 필요가 없어졌습니다.
구글은 Gradle이 수많은 가능성을 가지고 있다고 판단했고 2013년 Google I/O에서 Gradle을 기반으로 한 Android SDK build system을 발표합니다.
그런 이유로 Android Studio에서 Gradle을 사용하기 위해 Android Gradle plugin(AGP)를 제작하였습니다. AGP는 Gradle을 기반으로 하면서, Android 앱을 빌드하는 데 사용하는 몇 가지 기능들이 추가된 것입니다.
초기에는 Gradle 릴리즈 버전과 AGP 버전이 일치하지 않아 헷갈리는 문제가 있었지만 7.0 부터는 AGP의 메이저 버전을 gradle 버전과 동기화되도록 변경하였습니다.
| Plugin version | Required Gradle version |
|---|---|
| 1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
| 1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
| 1.5.0 | 2.2.1 - 2.13 |
| 2.0.0 - 2.1.2 | 2.10 - 2.13 |
| 2.1.3 - 2.2.3 | 2.14.1 - 3.5 |
| 2.3.0+ | 3.3+ |
| 3.0.0+ | 4.1+ |
| 3.1.0+ | 4.4+ |
| 3.2.0 - 3.2.1 | 4.6+ |
| 3.3.0 - 3.3.3 | 4.10.1+ |
| 3.4.0 - 3.4.3 | 5.1.1+ |
| 3.5.0 - 3.5.4 | 5.4.1+ |
| 3.6.0 - 3.6.4 | 5.6.4+ |
| 4.0.0+ | 6.1.1+ |
| 4.1.0+ | 6.5+ |
| 4.2.0+ | 6.7.1+ |
| 7.0 | 7.0+ |
| 7.1 | 7.2+ |
| 7.2 | 7.3+ |
AGP의 버전관리 체계는 2020년 11월부터 다음과 같이 관리되고 있습니다.
이제 AGP는 시맨틱 버전 관리를 사용하고, 주요 버전에는 브레이킹 체인지가 타겟팅됩니다.
Gradle 주요 버전에 맞춘 AGP 주요 버전이 매년 1회 출시될 예정입니다.
AGP 4.2 이후 출시되는 버전은 7.0이며 Gradle 버전 7.x로 업그레이드해야 합니다. AGP의 모든 주요 버전에는 기본 Gradle 도구의 주요 버전 업그레이드가 필요합니다.
API는 1년 정도 미리 지원 중단될 예정이며 이를 대체하는 기능이 곧바로 제공됩니다. 지원 중단된 API는 약 1년 후, 다음 주요 업데이트 동안 삭제됩니다.
Gradle을 통한 안드로이드 앱 모듈의 빌드 프로세스는 다음과 같이 이루어지게 됩니다.

Gradle 5.0에는 여러가지 큰 변경사항이 있었는데 그 중 하나가 Java 11의 도입과 Kotlin-DSL의 도입입니다. Groovy를 사용하던 기존의 Gradle 스크립팅을 Kotlin으로도 할 수 있게 되었는데, AGP에는 4.0부터 적용되었습니다. 구글에서는 Kotlin-DSL을 Kotlin script (KTS)라고 부르는데 둘은 사실상 동일한 것으로 생각하시면 됩니다.
현재 build.gradle에 KTS를 적용하는 경우의 장점과 단점은 다음과 같이 정리할 수 있습니다.
장점
단점
실제 빌드 테스트를 수행한 비교 결과는 다음과 같다고 합니다. 클린빌드는 느리지만 abi변경이 없을때의 빌드는 매우 빨라지는 것을 알 수 있습니다.
| Use Case | Groovy | Kotlin | Difference |
|---|---|---|---|
| First use | 🟢 38.855s | 🔴 63.54s | Groovy DSL is 1.6x faster |
| buildSrc abi change | 🟢 25.307 | 🔴 35.014s | Groovy DSL is 1.4x faster |
| buildSrc non-abi change | 🔴 24.526s | 🟢 4.732s | Kotlin DSL is 5x faster |
현재로서는 속도가 느리다는 단점이 있긴 하지만 IDE의 지원에 따른 편집환경의 개선점이 매우 크기 때문에, 구글에서는 앞으로 KTS가 더 많이 사용될 것이라는 전망을 하고 있습니다.
In the future, KTS will be preferred over Groovy for writing Gradle scripts because Kotlin is more readable and offers better compile-time checking and IDE support.
이렇게 해서 Build Tool과 Android의 Gradle Plugin에 대해 알아보았습니다.