본문 바로가기

안드로이드/멀티 모듈

[안드로이드 멀티 모듈] 7. AndroidLibraryConventionPlugin 만들기


지난 포스팅까지는 Application 모듈에 대한 컨벤션 플러그인을 다루었는데, 이번 포스팅에서는 Compose가 없는 AndroidLibrary를 위한 AndroidLibraryConventionPlugin을 만들겠습니다. 안드로이드 프로젝트를 멀티모듈로 구성한다면 꼭 필요한 컨벤션 플러그인입니다.

AndroidLibraryConventionPlugin이 추가된 모습
AndroidLibraryConventionPlugin이 추가된 모습

1. AndroidLibraryConventionPlugin 만들기

이전 포스팅에서 확장성을 고려하여 여러 가지 유틸함수를 만든 덕분에 AndroidLibraryConventionPlugin을 간단하게 만들 수 있습니다. Build Type 설정을 위해 유틸함수를 만들었었는데, Enum Class로 ExtensionType에 대한 분기처리를 했기 때문에 아래처럼 ExtensionType.LIBRARY를 전달하면 AndroidLibrary용 Build Variant를 구성할 수 있게 됩니다.

// AndroidLibraryConventionPlugin.kt
class AndroidLibraryConventionPlugin: Plugin<Project> {
    override fun apply(target: Project) {
        target.run {
            pluginManager.run {
                apply("com.android.library")
                apply("org.jetbrains.kotlin.android")
            }

            extensions.configure<LibraryExtension> {
                configureKotlinAndroid(this)

                configureBuildTypes(
                    commonExtension = this,
                    extensionType = ExtensionType.LIBRARY
                )

                defaultConfig {
                    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
                    consumerProguardFiles("consumer-rules.pro")
                }
            }
        }
    }
}


유틸 함수 및 전체 프로젝트 구조는 포스팅 하단의 Github Repository에서 소스코드를 확인하시면 됩니다.

2. AndroidLibraryConventionPlugin 적용하기

Gradle이 컨벤션 플러그인을 인식할 수 있도록 libs.versions.toml 파일에 id를 정의하고, build-logic 모듈에서 AndroidLibraryConventionPlugin을 등록합니다.

// 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" }
// 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"
      }
   }
}


현재 만든 컨벤션 플러그인은 Compose 관련 코드가 없는 AndroidLibrary 컨벤션 플러그인입니다. 즉, XML 기반의 모듈이나 화면이 없는 data 모듈에서 사용하는 플러그인입니다. 여기서는 Compose 프로젝트로 생성했으므로 data 모듈에만 해당 컨벤션 플러그인을 적용하겠습니다.

// build.gradle.kts (:home:data)
plugins {
    alias(libs.plugins.multi.module.android.library)
}

android {
    namespace = "com.multi.module.home.data"
}

dependencies {
    implementation(projects.home.domain)
    ...
}


컨벤션 플러그인을 적용하기 전의 모습과 비교한다면 많은 중복코드가 제거된 것을 확인할 수 있습니다.

컨벤션 플러그인 적용 전/후 코드 차이 비교
컨벤션 플러그인 적용 전/후 코드 차이 비교

3. 정리

XML 기반의 모듈이나 data 모듈처럼 Compose를 사용하지 않는 모듈에 적용할 수 있는 AndroidLibraryConventionPlugin을 만들었습니다.

다음 포스팅에서는 Compose가 적용된 AndroidLibraryComposeConventionPlugin을 만들 예정입니다.

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

GitHub - taein8935/multi-module-template-aos

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

github.com