꾸쀀함이 진리닀!!

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ 였늘이 λ˜κ³ ν”ˆ πŸ§‘πŸ»β€πŸ’» 의 λΈ”λ‘œκ·Έ

Android

[Android] Android λΉŒλ“œ 둜직(build-logic) 적용기

λŽμš” 2025. 7. 2. 23:31

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„!
μ˜€λŠ˜μ€ μ œκ°€ 졜근 ν”„λ‘œμ νŠΈμ— λΉŒλ“œ 둜직(Build Logic)을 μ μš©ν–ˆλ˜ κ²½ν—˜μ— λŒ€ν•΄μ„œ κ³΅μœ ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

1. λΉŒλ“œ 둜직(Build Logic)은 μ™œ ν•„μš”ν–ˆμ„κΉŒ? πŸ€”

사싀 ν”„λ‘œμ νŠΈκ°€ μž‘μ„ λ•ŒλŠ” Gradle μ„€μ •ν•˜λŠ” 건 λ³„λ‘œ μ–΄λ ΅μ§€ μ•ŠμŠ΅λ‹ˆλ‹€..

ν•˜μ§€λ§Œ λͺ¨λ“ˆμ΄ 점차 λŠ˜μ–΄λ‚˜κ³  ν”ŒλŸ¬κ·ΈμΈμ΄ λ§Žμ•„ μ§ˆλ•Œλ§ˆλ‹€

같은 μž‘μ—…μ„ λ°˜λ³΅ν•˜λŠ”κ±΄ 정말 μ§€μ˜₯이죠..☠️

이 문제λ₯Ό ν•΄κ²° ν•  수 μžˆλŠ” 방법이 μ—†μ„κΉŒ μƒκ°ν•˜λ‹€κ°€ λΉŒλ“œ λ‘œμ§μ„ μ μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

2. λΉŒλ“œ 둜직 (Build Logic) 적용기 πŸš€

1. build-logic λͺ¨λ“ˆ λ§Œλ“€κΈ°

λͺ¨λ“ˆμ€ Java or Kotlin Library둜 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

 

 

2. build-logic Gradle μ„ΈνŒ…ν•˜κΈ°

 

λͺ¨λ“ˆ 내뢀에 build.gradle κ³Ό settings.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 μ˜ˆμ‹œ