오늘은 그레이들을 다른 면에서 바라보겠습니다. 그레이들을 이루는 요소 파일들을 보고 설계자의 입장에서 '나라면 안드로이드를 위한 Gradle'을 어떻게 구성했을까'를 적어보겠습니다.
1. 그레이들을 구성하는 파일들
첫 번째 이야기에서 그레이들을 채택한 이유에 대해서 알아보았습니다. 간단히 키워드로 요약하면 다음과 같습니다.
1) 모듈화 개발
2) One Source Multi APK 실현
3) 라이브러리 의존성 관리
이와 같은 목표를 이루기 위한 구성 요소 파일들은 무엇이 있을까요?
settings.gradle : 모듈 목록을 추가함
(프로젝트) build.gradle : 빌드 스크립트 & 전체 프로젝트 대상
(모듈) build.gradle : 개별 모듈을 위한 빌드 스크립트
gradle.properties : 속성 파일
local.properties : 로컬 속성 파일
우리는 일반적으로 이렇게 알고 있습니다. 설계자의 입장으로 관점을 바꿔보겠습니다.
2. 그레이들이 생각하는 모듈화 개발
안드로이드로 모듈화 개발을 하려면 먼저 모듈을 정의해야 합니다. Android Studio를 설치해서 처음 HelloWorld를 만들면 다음과 같이 app이라는 모듈이 생깁니다.
이클립스에서 개발할 때는 프로젝트에 AndroidManifest.xml과 src 폴더, libs 폴더만 있으면 되는데 갑자기 너무 많아졌습니다. 그리고 src 폴더도 한층 더 복잡해졌습니다.
- BEFORE src 폴더에 com.helloworld면 충분했는데...
- AFTER src/main/java 폴더에 com.helloworld 패키지가 들어가게 됩니다.
오늘의 전반적인 논의는 (1) 모듈화 개발 (2) One Source Multi APK (3) 의존성 관리를 계속 생각해주세요~
〉〉 src/main/java 폴더는 무슨 의미일까?
main은 build variant를 의미합니다. (2)라는 목적을 달성하기 위해서는 product flavors와 build type을 재정의할 수 있는데 그것에 맞도록 재정의할 수 있습니다. 예를 들면 src/web/java도 가능하고 src/customer_01/java도 정의할 수 있도록 개념화해놓은 것입니다.
java는 우리가 아는 대로 Java 언어입니다. 그레이들은 폴리글랏(polyglot)을 지향합니다. 예를 들어 웹 분야에서 그레이들을 활용하여 서비스를 빌드하는 페이스북의 경우에는 20가지가 넘는 언어를 활용한다고 하더라고요. 따라서 말은 안 되지만 src/main/groovy 폴더, src/main/cpp 폴더가 (논리적으로는) 가능한 것입니다. 저도 안드로이드를 개발할 때 자바 언어 외에 다른 언어(NDK는 제외)를 함께 섞어서 프로젝트를 해본 적은 없습니다. 하지만 개념적으로 그렇다고 이해해주시면 됩니다.
3. settings.gradle과 build.gradle 파일
(1) 모듈화 개발의 관점에서 다른 구성 파일들도 함께 살펴보겠습니다.
앞에서 만든 HelloWorld 프로젝트의 settings.gradle을 열어보면 다음과 같이 달랑 한 줄만 있습니다.
include ':app'
이것으로 끝입니다. 만약 새로운 모듈을 추가한다면 거기에 콤마로 추가하면 됩니다.
예를 들면,
include ':app', ':engine' , 등등
또는
include ':app'
include ':engine'
이렇게 추가하시면 됩니다.
다음은 가장 중요한 build.gradle 파일입니다. 어찌보면 그레이들 빌드 시스템의 핵심 파일입니다. 그런데 우리는 이것이 (프로젝트) build.gradle 파일과 (모듈별) build.gradle 파일로 나누어져 있다고 알고 있습니다. 왜 나누어야 했을까요?
사실 멀티 모듈로 개발하게 되면 프로젝트 build.gradle 파일은 거의 변경할 일이 없습니다. 프로젝트 build.gradle 파일은 다음 역할을 담당합니다.
1) 안드로이드 그레이들 플러그인 정보 설정
- 예) classpath 'com.android.tools.build:gradle:3.0.0-alpha3'
이 경우 그레이들 플러그인 3.0.0-알파3 버전으로 지정하게 됩니다. 되도록 최신 버전을 따라가시면 좋습니다.
2) allprojects 설정
allprojects 와 비슷한 용어로는 subprojects라는 것이 있습니다. 말 그대도 all은 전체 프로젝트를 의미하고 sub은 최상위 모듈은 제외한 나머지 하위 모듈에 관한 설정을 의미합니다. 보통 처음 생성된 그대로 두는 경우가 많습니다.
4. 모듈 build.gradle 파일
사실상 개발자가 변경할 가능성이 높은 파일은 app 모듈의 build.gradle 파일입니다.
새로 만든 HelloWorld에서는 아주 기본적인 것만 설정되어 있습니다. 파일을 열어보면 크게 3개의 블록(block)이 보입니다.
1) apply plugin 블록구글은 안드로이드를 위한 그레이들을 확장성 있게 만들고 싶었습니다. 그래서 모듈 build.gradle의 문법이나 특수 목적을 선언할 수 있도록 플러그인 구조로 만들었습니다. 저도 사실 plugin 자체를 만들어보거나 수정해본 적은 없지만 프로젝트를 하면서 몇 가지 plugin을 경험해봤습니다.
a) APK냐? AAR이냐?
=> 'com.android.application' , 'com.android.library' 플러그인 적용
b) Retrolambda 활용
=> 'me.tatarka.retrolambda' 플러그인 적용
2) android 블럭
기본적으로 AndroidManifest.xml의 속성을 재정의하는 목적으로 활용합니다. AndroidManifest.xml보다 우선순위가 높습니다. 많은 문서에서 다루고 있으므로 따로 다루지는 않습니다.
3) dependencies 블럭
앞서 말한 (3)외부 라이브러리 의존성 관리에 해당합니다. 외부 라이브러리 관리를 하기 위한 블록입니다. 이것에 대해서는 3화에서 좀더 알아보도록 할께요
1, 2화는 주로 (1) 모듈화 개발의 측면에서 알아보았다면 3화부터는 '외부 라이브러리 관리' 측면에서 그레이들을 알아보도록 하겠습니다. 재밌게 읽어주세요. 감사합니다.
저자 블로그(원본 링크) https://brunch.co.kr/@yudong/70
최신 콘텐츠