지난 포스팅까지는 Application 모듈에 대한 컨벤션 플러그인을 다루었는데, 이번 포스팅에서는 Compose가 없는 AndroidLibrary를 위한 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 브랜치를 확인하시면 됩니다.
'안드로이드 > 멀티 모듈' 카테고리의 다른 글
[안드로이드 멀티 모듈] 9. AndroidPresentationUIConventionPlugin 만들기 (0) | 2024.08.26 |
---|---|
[안드로이드 멀티 모듈] 8. AndroidLibraryComposeConventionPlugin 만들기 (0) | 2024.08.19 |
[안드로이드 멀티 모듈] 6. AndroidApplicationComposeConventionPlugin 만들기 (0) | 2024.08.07 |
[안드로이드 멀티 모듈] 5. BuildTypes 컨벤션 플러그인에 적용하기 (0) | 2024.08.02 |
[안드로이드 멀티 모듈] 4. AndroidApplicationConventionPlugin 만들기 (0) | 2024.08.01 |