본문 바로가기
안드로이드

[Android] 플러그인을 이용하여 공통 설정 없애기

by algosketch 2023. 11. 21.

멀티 모듈 구성에서 build.gradle(.kts)? 코드를 작성하다 보면 gradle에 공통으로 사용하는 코드가 생긴다. 예를 들면 hilt 사용을 위해 kapt(혹은 ksp) 플러그인과 의존성을 추가한다거나, Java 버전을 설정하는 코드 등이 있다. 버전을 한 번에 변경하는 건 buildSrc나 버전 카탈로그(toml)를 이용해 처리할 수 있다. 하지만 많은 모듈에 같은 코드를 추가하거나 삭제해야 하는 상황이라면? 프로젝트가 지속되어도 일관성을 유지할 수 있을까? 이런 고민을 해결하기 위해 플러그인을 사용할 수 있다.

현재 프로젝트에서 사용할 정도로만 학습했기 때문에 지식을 전달한다기보다는 어떤 과정으로 공통 코드를 추출했는지 시간 순으로 이야기할 예정이다. (정확히 이 상황에 맞는 공식 문서 페이지를 찾지 못 했다. 그냥 내가 못 찾은 것 같다.)

 

빌드 로직을 알게된 계기

우선 이 방법을 알게된 건 드로이드 나이츠 2023 컨퍼런스이다. 거의 Track2에서 들었기 때문에 현장에서 해당 내용을 들었다. 바로 최근 프로젝트를 멀티 모듈로 구성했기 때문에 해당 내용이 조금 더 잘 들렸던 거 같다. 물론 적용하는 과정은 쉽지 않았다.

 

적용하기 위한 발버둥

https://github.com/boostcampwm2023/and04-catchy-tape

 

GitHub - boostcampwm2023/and04-catchy-tape: 너의 목소리가 들려 ~ 📼

너의 목소리가 들려 ~ 📼. Contribute to boostcampwm2023/and04-catchy-tape development by creating an account on GitHub.

github.com

이 프로젝트에서 빌드 로직을 적용해 사용하고 있다.

1) 발표자료 따라하기

이전에도 발표 내용을 듣고 두 번 정도 시도해 보았으나 실패했다. 실패했던 원인은 발표 내용에 생략된 내용이 있었기 때문이었는데, 그걸 눈치챌 정도로 gradle을 잘 알지 못 했다. 다시 시도하면서 성공할 수 있었던 건 리포지토리가 공개되어 있었기 때문이었다. 실행되는 코드와 실행되지 않는 코드를 라인 바이 라인으로 변경해 가면서 비교하면 실패하는 원인을 찾을 수 있다. 평소 디버깅에도 이 방법을 많이 사용한다.

발표자료에서는 buildSrc라는 이름으로 디렉토리를 만들었는데, sync하면 자동으로 이 디렉토리를 찾는 것 같다. 다만 이 이름을 사용할 경우 기존 build.gradle과 충돌이 일어나고, 이를 해결하기 위해선 점진적 수정이 아니라 한 번에 많은 코드를 수정해야 하는 것 같다.

 

2) 적용된 오픈소스 커밋 추적하기

적용하기 위해 실제로 가장 많이 참고한 코드는 드로이드 나이츠 2023 앱이다.

https://github.com/droidknights/DroidKnights2023_App/commit/b15ec89d72dd3f0d7cea5e81bc7085c4822f7121

 

gradle kts 초기 설정 · droidknights/DroidKnights2023_App@b15ec89

1. precompiled-script 2. kotlin-dsl

github.com

이 프로젝트에도 빌드 로직이 적용되어 있어서 관련 PR을 참고하려 했다. 그런데, 이 내용은 사실 PR 없이 커밋된 코드이고 두 번째 커밋에서 찾을 수 있었다. 이 커밋의 변경사항을 추적하여 내 프로젝트에 적용할 수 있었다.

 

3) 적용하기

https://www.slideshare.net/YoungjikYoon/gradle-kotlin

 

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 머

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기 - Download as a PDF or view online for free

www.slideshare.net

이미 잘 정리된 발표 자료가 있기 때문에, 여기서는 다르게 적용한 부분이나 자료에 없는 내용만 설명하려고 한다. 발표자료는 33페이지부터 보면 된다.

 

 

빌드 로직을 프로젝트에 포함했으나 서브 모듈로 처리하지는 않는다. 따라서 별도로 settings.gradle.kts를 구성했다. 특히 build.gradle.kts 코드에서 dependencies를 추가하는 부분에 libs를 사용했는데, 이는 버전 카탈로그의 정보를 사용하는 것이라 settings.gradle.kts의 8~12번 라인이 반드시 필요하다.

pluginManagement {
    includeBuild("build-logic")
    // ...
}

내 프로젝트에서는 디렉토리 이름을 buildSrc가 아닌 build-logic으로 지었는데, 이렇게 할 경우 별도의 코드가 필요하다. 위에서 build-logic은 서브 모듈로 처리하지 않는다고 했다. 따라서 기본적으로는 해당 디렉토리의 설정을 참조하지 않는다. includeBuild를 통해 복합 빌드를 구성할 수 있다.

 

4) 플러그인 코드

 

 

 

생략할 내용이었으나 간단히 코드만 첨부했다. 플러그인은 Plugin<Project>을 구현할 수 있다. 위 코드는 안드로이드 라이브러리 모듈에 공통적으로 들어가는 내용을 넣은 것이다. 테스트를 위한 버전의 코드라 최소한의 내용만 넣고 빌드해 보았다.

 

현시점 적용 후기

장점

  • build.gradle.kts 파일에 들어갈 코드가 간소화 된다.
  • 변경 사항을 한 번에 적용할 수 있다.

단점

  • 새로운 설정을 추가할 때 플러그인에 이미 정의 되어 있는지 확인해야 한다.

 

참고자료

https://github.com/droidknights/DroidKnights2023_App/commit/b15ec89d72dd3f0d7cea5e81bc7085c4822f7121

 

gradle kts 초기 설정 · droidknights/DroidKnights2023_App@b15ec89

1. precompiled-script 2. kotlin-dsl

github.com

https://github.com/laco-dev/gradle-convention-plugins

 

GitHub - laco-dev/gradle-convention-plugins

Contribute to laco-dev/gradle-convention-plugins development by creating an account on GitHub.

github.com

https://youtu.be/7iag6zpGd98?feature=shared

https://www.slideshare.net/YoungjikYoon/gradle-kotlin

 

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 머

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기 - Download as a PDF or view online for free

www.slideshare.net