본문 바로가기

안드로이드/멀티 모듈

[안드로이드 멀티 모듈] 8. AndroidLibraryComposeConventionPlugin 만들기


지난 포스팅에서는 Compose가 없는 AndroidLibrary를 위한 AndroidLibraryConventionPlugin을 만들었습니다.
이번에는 Compose 관련 빌드 옵션이 포함된 AndroidLibraryComposeConventionPlugin을 만들겠습니다.

Compose 관련 모듈은 아래처럼 2가지로 나뉘게 됩니다.

  • 화면이 없는 모듈 (designsystem, ui 등)
  • 화면이 있는 모듈 (home, board, login 등)

designsystem처럼 화면이 없는 모듈이 있고, home처럼 Compose로 구성된 화면이 있는 presentation 성격의 모듈이 있습니다.

이번 포스팅에서는 Compose 관련 기능이 있지만 화면이 없는 모듈을 위한 컨벤션 플러그인을 만들겠습니다.

AndroidLibraryComposeConventionPlugin이 추가된 모습
AndroidLibraryComposeConventionPlugin이 추가된 모습

1. AndroidLibraryComposeConventionPlugin 만들기

지난 포스팅에서 만들어놓은 컨벤션 플러그인과 유틸 함수를 사용하면 아래처럼 간단하게 만들 수 있습니다.

// AndroidLibraryComposeConventionPlugin.kt
class AndroidLibraryComposeConventionPlugin: Plugin<Project> {
    override fun apply(target: Project) {
        target.run {
            pluginManager.run {
                apply("multi.module.android.library")
            }

            val extension = extensions.getByType<LibraryExtension>()
            configureAndroidCompose(extension)
        }
    }
}


pluginManager를 통해서 플러그인을 적용시켰는데, 이름을 보면 아시겠지만 지난 포스팅에서 만든 컨벤션 플러그인의 이름입니다. 즉, AndroidLibrary를 위한 컨벤션 플러그인을 적용시켰습니다.

그리고 이전에 만든 configureAndroidCompose 유틸함수를 불러와서 Compose와 관련된 빌드 옵션을 적용시켰습니다.

공통으로 사용할 수 있는 부분을 유틸 함수 및 컨벤션 플러그인으로 분리한 덕분에 AndroidLibraryComposeConventionPlugin을 간단하게 구성할 수 있습니다.

2. AndroidLibraryComposeConventionPlugin 적용하기

이전과 마찬가지로 Gradle에서 컨벤션 플러그인을 인식할 수 있도록 libs.versions.toml 파일에 id를 추가하고, build-logic 모듈에 컨벤션 플러그인을 등록하겠습니다.

// libs.versions.toml
...

# Custom Convention Plugin
multi-module-android-application = { id = "multi.module.android.application", version = "unspecified" }
multi-module-android-application-compose = { id = "multi.module.android.application.compose", version = "unspecified" }
multi-module-android-library = { id = "multi.module.android.library", version = "unspecified" }
multi-module-android-library-compose = { id = "multi.module.android.library.compose", version = "unspecified" }
// build.gradle.kts (Module :build-logic:convention)
...

gradlePlugin {
   plugins {
      register("androidApplication") {
         id = "multi.module.android.application"
         implementationClass = "AndroidApplicationConventionPlugin"
      }
      register("androidApplicationCompose") {
         id = "multi.module.android.application.compose"
         implementationClass = "AndroidApplicationComposeConventionPlugin"
      }
      register("androidLibrary") {
         id = "multi.module.android.library"
         implementationClass = "AndroidLibraryConventionPlugin"
      }
      register("androidLibraryCompose") {
         id = "multi.module.android.library.compose"
         implementationClass = "AndroidLibraryComposeConventionPlugin"
      }
   }
}


이번 포스팅에서 만든 컨벤션 플러그인은 위에서 언급했듯이, 화면이 없지만 Compose와 관련된 AndroidLibrary를 위한 것입니다. 그래서 저는 designsystem 모듈에 해당 컨벤션 플러그인을 적용하겠습니다.

// build.gradle.kts (:core:presentation:designsystem)
plugins {
    alias(libs.plugins.multi.module.android.library.compose)
}

android {
    namespace = "com.multi.module.core.presentation.designsystem"
}

dependencies {
    ...
}

3. 정리

화면은 없지만 Compose를 사용하는 모듈에 적용할 수 있는 AndroidLibraryComposeConventionPlugin을 만들었습니다. 

다음 포스팅에서는 Compose로 화면을 구성하는 모듈을 위한 컨벤션 플러그인을 만들겠습니다.

이번 포스팅의 결과물은 아래 Github Repository의 8-AndroidLibraryComposeConventionPlugin 브랜치를 확인하시면 됩니다.

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com

반응형