Android 빌드 로직(build-logic) 적용기

dev_yo·2025년 7월 2일
post-thumbnail

안녕하세요 여러분!
오늘은 제가 최근 프로젝트에 빌드 로직(Build Logic)을 적용했던 경험에 대해서 공유하려고 합니다.

1. 빌드 로직(Build Logic)은 왜 필요했을까? 🤔

사실 프로젝트가 작을 때는 Gradle 설정하는건 별로 어렵지 않습니다.. 하지만 모듈이 점차 늘어나고 플러그인이 많아 질때마다 같은 작업을 반복하는건 정말 지옥이죠..☠️ 이 문제를 해결 할 수 있는 방법이 없을까 생각하다가 빌드 로직을 적용하게 되었습니다!

2. 빌드 로직 (Build Logic) 적용기 🚀

1. build-logic 모듈 만들기

모듈은 Java or Kotlin Library로 만들어줍니다.

2. build-logic Gradle 세팅하기

모듈 내부에 build.gradlesettings.gradle을 생성해주세요.

// settings.gradle.kts

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

rootProject.name = "build-logic"
// build.gradle.kts

plugins {
    `kotlin-dsl`
    alias(libs.plugins.kotlin.serialization)
}

dependencies {
    compileOnly(libs.kotlin.gradle.plugin)
    compileOnly(libs.android.build.gradle)
    compileOnly(libs.gradle.hilt)
}

3. Convention Plugin 만들기

class AndroidLibraryConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) = with(target) {
        pluginManager.apply {
            apply("com.android.library")
            apply("org.jetbrains.kotlin.android")
            apply("org.jetbrains.kotlin.plugin.serialization")
        }
        extensions.configure<LibraryExtension> {
            kotlinAndroidConfiguration(this)
            buildConfigConfiguration(this)
            defaultConfig {
                consumerProguardFiles("consumer-rules.pro")
            }
        }
    }
}
internal fun Project.kotlinAndroidConfiguration(
    commonExtension: CommonExtension<*, *, *, *, *, *>,
) = with(commonExtension) {
    compileSdk = 35

    defaultConfig {
        minSdk = 24
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_17.toString()
    }

    buildFeatures {
        buildConfig = true
    }
}

fun CommonExtension<*, *, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
    (this as ExtensionAware).extensions.configure("kotlinOptions", block)
}
fun Project.buildConfigConfiguration(
    commonExtension: CommonExtension<*, *, *, *, *, *>,
) = with(commonExtension) {
    buildTypes {
        getByName("release") {
            buildConfigField("boolean", "APP_DEBUG", false.toString())
        }
        getByName("debug") {
            buildConfigField("boolean", "APP_DEBUG", true.toString())
        }
    }
}

4. build-logic Gradle에 plugin 추가하기

gradlePlugin {
    plugins {
        register("androidLibrary") {
            id = "com.android.library.convention"
            implementationClass = "AndroidLibraryConventionPlugin"
        }
}

5. 모듈에 적용하기

plugins {
    id("com.android.library.convention")
}

android {
    namespace = "com.test.example.module"
}

dependencies {
}

3. 적용기를 마치며...

Library 모듈에 대한 Plugin뿐만 아니라 Compose , Hilt 혹은 Application Convention 등에 대해서도 한번 적용해 놓으면 개발이 훨씬 편해지는걸 느끼실수 있을겁니다!
아래 NowInAndroid Github 샘플 코드를 끝으로 Build Logic 적용기는 마치겠습니다. 🙇‍♂️
NowInAndroid Convention Plugin 예시

profile
어제보다 발전한 오늘이 되고픈 🧑🏻‍💻

0개의 댓글