본문 바로가기

Android/Gradle

[Android] Multi Module에서 Gradle 공통화를 해보자.

728x90

Clean Architecture 관련 예제를 만들며 공부를 하던 도중, 모듈을 여러개로 나누어서 테스트하다보니 gradle 에서 공통된 코드들이 많아서 이것을 하나의 코드로 관리할 수 있는 방법에 대해서 찾아보았다.

 

생각보다 많은 자료가 나오지 않았고, 다양한 오류가 발생하여 만족스럽게 작업을 하지 못하였으나 기록하기 위해 작성한다.

(추후 수정이 된다면 내용도 수정 될 예정입니다. 알고 계신분은 많은 가르침 부탁드립니다.)


우선, 하나의 gradle 파일로 공통된 부분을 관리하기 위한 gradle 파일을 생성해 주어야 한다.

gradle 파일의 위치는 편한대로 지정해도 되지만, 필자는 가장 최상위 프로젝트 폴더에 생성해 두었다.

 

필자처럼 gradle 파일을 한번도 생성해보지 않은 사람은,

어떻게 gradle 파일을 생성하는지 정확히 모를 것이다.

gradle 파일은 위의 사진처럼 new > File 을 선택한 후, ~.gradle 이라는 확장자를 붙여서 파일을 생성하면 된다.

 

그 후, 다시 Android 구조로 변경을 한 다음

file > Sync Project with gradle File 을 눌러어야 Gradle Scrpits 하위 항목으로 생성한 gradle 파일을 확인할 수 있다.

(이것을 하지 않아서 필자는 한참을 찾아 해맸다.)

 

이제 gradle 파일을 만들었으니 공통 코드를 빼내어 작성하고 적용시켜 보자.

 


우선, project 범위의 gradle 파일에서 해당 gradle을 등록해주자.

 

 

위와 동일하게 작성을 하되, "$rootDir/common.gralde" 부분에 자신이 만든 gradle 파일의 경로를 작성하면 된다.

필자와 동일한 방식으로 gradle을 작성했다면 동일하게 작성하면 된다.

 

*

여기서 afterEvaluate 를 선언하는 이유는 subproject 이기 때문에 root project 보다 먼저 구성되는 것을 방지하기 위해서 추가한다.

정확한 내용은 아직 공부가 부족하기 때문에 여기까지만 작성하고, 참고한 글을 추가하겠다.

 

https://stackoverflow.com/questions/16070567/difference-between-gradles-terms-evaluation-and-execution

 

Difference between Gradle's terms evaluation and execution

I am new to Gradle build tool and now I am reading the User Guide, but can't understand fully the difference between evaluation and execution phases. In configuration phase project objects are

stackoverflow.com

 

또한, 여기서

project.apply ("~")

형태로 중괄호가 아닌 일반 괄호를 사용한 예제를 보고 작업을 하였는데, 해당 예제는 정상적으로 동작하는 것으로 보였으나 필자의 경우 정상적으로 빌드가 되지 않았다.

그래서 자동완성으로 apply 를 추가해보니 중괄호로 나와서 이것으로 바꾸었더니 정상 동작 하였다. 혹 반대의 경우도 있을 가능성을 생각하여 해당 내용을 작성해둔다.

 

 

이제 gradle 을 적용시켰으니,

다음은 공통된 부분을 빼내어 작성할 차례이다.

 

common.gradle

 

위의 코드는 common.gradle 의 전체 코드이다.

 

여기서 if 문 내부에 있는 것들이 각 module 의 gradle 에서 확인할 수 있었던 중복된 코드이다.

완전히 동일한 부분이기 때문에 이 부분을 각 gradle 에서 제거하고 이 부분에 추가하였다.

 

그렇다면, def 와 if 문 조건은 무엇인가?

보이는 그대로 이해하면 된다. def 로 선언한 것들이 변수, if 는 잘 알고있는 조건문이다.

app 은 plugins 의 id 값으로 com.android.application 을 가지고 있고,

그 외 module 은 plugins 의 id 값으로 com.android.library 를 가지고 있다.

 

따라서 위와 같은 변수를 추가하여 해당 값과 동일 할 경우에 알맞은 작업을 수행할 수 있도록 하였다.

(사실 본 프로젝트에서는 필요한 부분은 아니지만 추후 사용성을 위하여 추가해두었다.)

 

여기서 궁금한 부분이 있을 것이다.

  • complieSdkVersion 과 같은 것들이 몇가지 빠진 것 같은데?
  • dependencies 부분은 왜 없지?

 

우선, 이것들에 대해서는 각 gradle 에 그대로 남아있다.

그 이유는 해당 값들이 gradle 에 위치하지 않으면 빌드 시 오류가 발생하게 된다.

 

그렇다면, 오류가 발생하는 이유는 무엇인가 ?

이것에 대해서는 필자도 정확히 모르겠다.

추후 이 부분을 gradle 에서 빼내지 못하는 이유나, 빼내는 방법에 대해서 알게 된다면 해당 포스팅을 수정하도록 하겠다.

 

스터디를 하고, 찾아본 결과로 빼내지 못하는 부분을 보자면.

 

 

다른 부분은 정상적으로 인식하고 동작하지만 해당 부분은 "찾을 수 없다" 라고 나온다.

 

그리고, dependencies 관련 부분에 대해서는 stackOverFlow의 어느 글에서

특정 버전으로 업데이트 된 이후, dependencies 의 implementation 명령어를 정상적으로 인식하지 못한다고 한다.

이 또한 정확하지 않기 때문에 정확한 이유에 대해서는 패스하도록 한다.


결과적으로,

많은 것을 빼내어 공통화 작업을 진행하지는 못하였지만,

모듈이 많으면 많을 수록 버전을 변경한다던지, 난독화 옵션을 추가한다던지 등 이러한 단순 작업을 수행할 때의 시간을 줄여줄 수 있을 것이고 어느 하나를 빼먹는 등의 실수를 방지할 수 있을 것이다.

 


저도 계속해서 스터디하고 수정 할 예정이지만, 위에 기술하지 못한 부분에 대해 알고 계신다면 댓글 부탁드리겠습니다.

 

728x90