From 5419d93d14b46253fa9e9709e7ff6cbf1d22915f Mon Sep 17 00:00:00 2001 From: unam98 Date: Thu, 2 Apr 2026 22:03:12 +0900 Subject: [PATCH] =?UTF-8?q?Gradle=20Version=20Catalog(libs.versions.toml)?= =?UTF-8?q?=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 의존성 버전을 libs.versions.toml로 중앙 관리 - buildscript classpath → plugins DSL 전환 - Firebase는 BOM으로 버전 관리 (개별 버전 제거) - bundle 적용: firebase, kakao, compose, network, lifecycle --- app/build.gradle | 243 ++++++++++++++------------------------ build.gradle | 34 ++---- gradle/libs.versions.toml | 238 +++++++++++++++++++++++++++++++++++++ 3 files changed, 336 insertions(+), 179 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle b/app/build.gradle index 8129f499..aaeca7d7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,27 +1,15 @@ plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) id 'kotlin-parcelize' - - id 'org.jetbrains.kotlin.plugin.serialization' version '2.2.0' - id 'org.jetbrains.kotlin.plugin.compose' - id 'dagger.hilt.android.plugin' - - // plugin for ksp (Hilt, Glide) - id 'com.google.devtools.ksp' - - // plugin for data binding + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.hilt) + alias(libs.plugins.ksp) id 'kotlin-kapt' - - // plugin for hiding keys used in manifest - id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' - - // Add the Google services Gradle plugin - id 'com.google.gms.google-services' - - // Add the Firebase Crashlytics Gradle plugin - id 'com.google.firebase.crashlytics' + alias(libs.plugins.secrets.gradle.plugin) + alias(libs.plugins.google.services) + alias(libs.plugins.firebase.crashlytics) } Properties properties = new Properties() @@ -29,14 +17,14 @@ properties.load(project.rootProject.file('local.properties').newDataInputStream( android { namespace 'com.runnect.runnect' - compileSdk 35 + compileSdk libs.versions.compileSdk.get().toInteger() defaultConfig { applicationId "com.runnect.runnect" - minSdk 28 - targetSdk 35 - versionCode 26 - versionName "2.1.2" + minSdk libs.versions.minSdk.get().toInteger() + targetSdk libs.versions.targetSdk.get().toInteger() + versionCode libs.versions.versionCode.get().toInteger() + versionName libs.versions.versionName.get() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "RUNNECT_DEV_URL", properties["RUNNECT_DEV_URL"] @@ -52,7 +40,6 @@ android { signingConfigs { release { - // local.properties에서 키 정보 불러오기 def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -69,7 +56,10 @@ android { buildFeatures { buildConfig = true compose true + dataBinding true + viewBinding true } + buildTypes { release { minifyEnabled false @@ -86,135 +76,76 @@ android { kotlinOptions { jvmTarget = '17' } - - buildFeatures { - dataBinding true - viewBinding true - } } dependencies { - implementation 'androidx.core:core-ktx:1.9.0' - implementation 'androidx.appcompat:appcompat:1.5.1' - implementation 'com.google.android.material:material:1.8.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.core:core:1.9.0' - implementation 'com.google.firebase:firebase-common-ktx:20.1.0' - implementation 'androidx.preference:preference-ktx:1.2.1' - implementation 'com.google.firebase:firebase-dynamic-links-ktx:21.2.0' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - - def lifecycle_version = "2.5.1" - //ViewModel - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" - //LiveData - implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" - //DataBinding - implementation "androidx.activity:activity-ktx:1.6.1" - //Timber - implementation 'com.jakewharton.timber:timber:5.0.1' - //Coroutine - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") - //retrofit - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' - implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' - //define a BOM and its version - implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0")) - //define any required OkHttp artifacts without version - implementation("com.squareup.okhttp3:okhttp") - implementation("com.squareup.okhttp3:logging-interceptor") - //hilt - implementation "com.google.dagger:hilt-android:$hilt_version" - ksp "com.google.dagger:hilt-compiler:$hilt_version" - // Glide - implementation "com.github.bumptech.glide:glide:4.16.0" - ksp "com.github.bumptech.glide:ksp:4.16.0" - //fragment change - implementation("androidx.fragment:fragment-ktx:1.5.5") - //coil - implementation("io.coil-kt:coil:2.2.2") - - //naver map - implementation 'com.naver.maps:map-sdk:3.22.1' -// implementation 'com.google.android.gms:play-services-location:21.0.1' - - // Ted Permission - RxJava3 - // Normal - implementation 'io.github.ParkSangGwon:tedpermission-normal:3.3.0' - //Location 라이브러리(현재위치) - implementation 'com.google.android.gms:play-services-location:21.3.0' - - implementation "com.squareup.retrofit2:converter-gson:2.9.0" - implementation 'com.google.code.gson:gson:2.10.1' - - implementation 'com.ssomai:android.scalablelayout:2.1.6' - - //google social login - implementation 'com.google.android.gms:play-services-auth:20.4.1' - - //recycler view selection - implementation 'androidx.recyclerview:recyclerview:1.3.0' - - // EncryptedSharedPreferences - implementation "androidx.security:security-crypto-ktx:1.1.0-alpha03" - - // kakao social login - implementation 'com.kakao.sdk:v2-user:2.10.0' - - // pull to refresh - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - - // view Pager2 - implementation "androidx.viewpager2:viewpager2:1.0.0" - implementation 'me.relex:circleindicator:2.1.6' - - //Firebase Realtime Database - implementation 'com.google.firebase:firebase-database-ktx' - - //Cloud Firestore - implementation 'com.google.firebase:firebase-firestore-ktx' - - // Firebase Storage SDK - implementation 'com.google.firebase:firebase-storage-ktx' - - // Import the Firebase BoM - implementation platform('com.google.firebase:firebase-bom:31.2.3') - - // When using the BoM, don't specify versions in Firebase dependencies - implementation 'com.google.firebase:firebase-analytics-ktx' - - //카카오 SDK - implementation "com.kakao.sdk:v2-user:2.15.0" // 카카오 로그인 - implementation "com.kakao.sdk:v2-talk:2.15.0" // 친구, 메시지(카카오톡) - implementation "com.kakao.sdk:v2-story:2.15.0" // 카카오스토리 - implementation "com.kakao.sdk:v2-link:2.9.0" // 메시지(카카오링크) - implementation "com.kakao.sdk:v2-navi:2.15.0" // 카카오내비 - - - //swipe refresh layout - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - - //Skeleton UI - implementation "com.facebook.shimmer:shimmer:0.5.0" - - //firebase remote config - update dialog - implementation 'com.google.firebase:firebase-config-ktx' - - // Firebase Crashlytics - implementation 'com.google.firebase:firebase-crashlytics-ktx' - - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.2' - implementation 'androidx.activity:activity-compose:1.9.0' - implementation platform('androidx.compose:compose-bom:2023.03.00') - implementation 'androidx.compose.ui:ui' - implementation 'androidx.compose.ui:ui-graphics' - implementation 'androidx.compose.ui:ui-tooling-preview' - implementation 'androidx.compose.material3:material3' - androidTestImplementation platform('androidx.compose:compose-bom:2023.03.00') - androidTestImplementation 'androidx.compose.ui:ui-test-junit4' - debugImplementation 'androidx.compose.ui:ui-tooling' - debugImplementation 'androidx.compose.ui:ui-test-manifest' -} \ No newline at end of file + // AndroidX + implementation libs.androidx.core.ktx + implementation libs.androidx.appcompat + implementation libs.androidx.constraintlayout + implementation libs.androidx.activity.ktx + implementation libs.androidx.fragment.ktx + implementation libs.bundles.lifecycle + implementation libs.androidx.recyclerview + implementation libs.androidx.viewpager2 + implementation libs.androidx.swiperefreshlayout + implementation libs.androidx.preference.ktx + implementation libs.androidx.security.crypto.ktx + + // Compose + implementation platform(libs.compose.bom) + implementation libs.bundles.compose + implementation libs.androidx.activity.compose + debugImplementation libs.bundles.compose.debug + androidTestImplementation platform(libs.compose.bom) + androidTestImplementation libs.compose.ui.test.junit4 + + // Material + implementation libs.material + + // Hilt + implementation libs.hilt.android + ksp libs.hilt.compiler + + // Network + implementation platform(libs.okhttp.bom) + implementation libs.bundles.network + + // Coroutines + implementation libs.kotlinx.coroutines.android + + // Image + implementation libs.glide + ksp libs.glide.ksp + implementation libs.coil + + // Firebase + implementation platform(libs.firebase.bom) + implementation libs.bundles.firebase + + // Map + implementation libs.naver.map.sdk + implementation libs.play.services.location + + // Kakao + implementation libs.bundles.kakao + + // Google + implementation libs.play.services.auth + + // Logging + implementation libs.timber + + // UI + implementation libs.circleindicator + implementation libs.scalablelayout + implementation libs.shimmer + + // Permission + implementation libs.tedpermission.normal + + // Test + testImplementation libs.junit + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.espresso.core +} diff --git a/build.gradle b/build.gradle index f421b7c8..d15d977d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,24 +1,12 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - ext { - hilt_version = '2.56.2' - } - - repositories { - google() - } - dependencies { - classpath 'com.google.gms:google-services:4.3.15' - classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.6' - classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" - classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" - } -} - plugins { - id 'com.android.application' version '8.13.2' apply false - id 'com.android.library' version '8.13.2' apply false - id 'org.jetbrains.kotlin.android' version '2.2.0' apply false - id 'org.jetbrains.kotlin.plugin.compose' version '2.2.0' apply false - id 'com.google.devtools.ksp' version '2.2.0-2.0.2' apply false -} \ No newline at end of file + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.compose) apply false + alias(libs.plugins.ksp) apply false + alias(libs.plugins.hilt) apply false + alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.google.services) apply false + alias(libs.plugins.firebase.crashlytics) apply false + alias(libs.plugins.secrets.gradle.plugin) apply false +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..12b6db88 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,238 @@ +[versions] +# SDK +compileSdk = "35" +minSdk = "28" +targetSdk = "35" + +# App +versionCode = "26" +versionName = "2.1.2" + +# Gradle plugins +agp = "8.13.2" +kotlin = "2.2.0" +ksp = "2.2.0-2.0.2" + +# AndroidX +core-ktx = "1.9.0" +appcompat = "1.5.1" +constraintlayout = "2.1.4" +activity-ktx = "1.6.1" +activity-compose = "1.9.0" +fragment-ktx = "1.5.5" +lifecycle = "2.8.2" +recyclerview = "1.3.0" +viewpager2 = "1.0.0" +swiperefreshlayout = "1.1.0" +preference-ktx = "1.2.1" +security-crypto = "1.1.0-alpha03" + +# Compose +compose-bom = "2023.03.00" + +# Material +material = "1.8.0" + +# Hilt +hilt = "2.56.2" + +# Network +retrofit = "2.9.0" +okhttp-bom = "4.10.0" +kotlinx-serialization-json = "1.4.1" +retrofit2-kotlinx-serialization = "0.8.0" +gson = "2.10.1" + +# Coroutines +coroutines = "1.6.4" + +# Image +glide = "4.16.0" +coil = "2.2.2" + +# Firebase +firebase-bom = "31.2.3" +firebase-crashlytics-gradle = "3.0.6" +google-services = "4.3.15" + +# Map +naver-map = "3.22.1" +play-services-location = "21.3.0" + +# Kakao +kakao-sdk = "2.15.0" +kakao-link = "2.9.0" +kakao-login-legacy = "2.10.0" + +# Google +play-services-auth = "20.4.1" + +# Logging +timber = "5.0.1" + +# UI +circleindicator = "2.1.6" +scalablelayout = "2.1.6" +shimmer = "0.5.0" + +# Permission +tedpermission = "3.3.0" + +# Secrets +secrets-gradle-plugin = "2.0.1" + +# Toolchain +foojay = "0.10.0" + +# Test +junit = "4.13.2" +androidx-junit = "1.1.5" +espresso = "3.5.1" + +[libraries] +# AndroidX +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } +androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activity-ktx" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment-ktx" } +androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } +androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } +androidx-viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version.ref = "viewpager2" } +androidx-swiperefreshlayout = { group = "androidx.swiperefreshlayout", name = "swiperefreshlayout", version.ref = "swiperefreshlayout" } +androidx-preference-ktx = { group = "androidx.preference", name = "preference-ktx", version.ref = "preference-ktx" } +androidx-security-crypto-ktx = { group = "androidx.security", name = "security-crypto-ktx", version.ref = "security-crypto" } + +# Compose +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +compose-ui = { group = "androidx.compose.ui", name = "ui" } +compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +compose-material3 = { group = "androidx.compose.material3", name = "material3" } +compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } + +# Material +material = { group = "com.google.android.material", name = "material", version.ref = "material" } + +# Hilt +hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } +hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } + +# Network +retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } +retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } +retrofit2-kotlinx-serialization = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofit2-kotlinx-serialization" } +okhttp-bom = { group = "com.squareup.okhttp3", name = "okhttp-bom", version.ref = "okhttp-bom" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp" } +okhttp-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor" } +kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } + +# Coroutines +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } + +# Image +glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } +glide-ksp = { group = "com.github.bumptech.glide", name = "ksp", version.ref = "glide" } +coil = { group = "io.coil-kt", name = "coil", version.ref = "coil" } + +# Firebase (BOM 관리 - 개별 버전 불필요) +firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } +firebase-common-ktx = { group = "com.google.firebase", name = "firebase-common-ktx" } +firebase-dynamic-links-ktx = { group = "com.google.firebase", name = "firebase-dynamic-links-ktx" } +firebase-database-ktx = { group = "com.google.firebase", name = "firebase-database-ktx" } +firebase-firestore-ktx = { group = "com.google.firebase", name = "firebase-firestore-ktx" } +firebase-storage-ktx = { group = "com.google.firebase", name = "firebase-storage-ktx" } +firebase-analytics-ktx = { group = "com.google.firebase", name = "firebase-analytics-ktx" } +firebase-config-ktx = { group = "com.google.firebase", name = "firebase-config-ktx" } +firebase-crashlytics-ktx = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" } + +# Map +naver-map-sdk = { group = "com.naver.maps", name = "map-sdk", version.ref = "naver-map" } +play-services-location = { group = "com.google.android.gms", name = "play-services-location", version.ref = "play-services-location" } + +# Kakao +kakao-user = { group = "com.kakao.sdk", name = "v2-user", version.ref = "kakao-sdk" } +kakao-talk = { group = "com.kakao.sdk", name = "v2-talk", version.ref = "kakao-sdk" } +kakao-story = { group = "com.kakao.sdk", name = "v2-story", version.ref = "kakao-sdk" } +kakao-link = { group = "com.kakao.sdk", name = "v2-link", version.ref = "kakao-link" } +kakao-navi = { group = "com.kakao.sdk", name = "v2-navi", version.ref = "kakao-sdk" } + +# Google +play-services-auth = { group = "com.google.android.gms", name = "play-services-auth", version.ref = "play-services-auth" } + +# Logging +timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } + +# UI +circleindicator = { group = "me.relex", name = "circleindicator", version.ref = "circleindicator" } +scalablelayout = { group = "com.ssomai", name = "android.scalablelayout", version.ref = "scalablelayout" } +shimmer = { group = "com.facebook.shimmer", name = "shimmer", version.ref = "shimmer" } + +# Permission +tedpermission-normal = { group = "io.github.ParkSangGwon", name = "tedpermission-normal", version.ref = "tedpermission" } + +# Test +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-junit" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso" } + +[bundles] +firebase = [ + "firebase-common-ktx", + "firebase-dynamic-links-ktx", + "firebase-database-ktx", + "firebase-firestore-ktx", + "firebase-storage-ktx", + "firebase-analytics-ktx", + "firebase-config-ktx", + "firebase-crashlytics-ktx", +] +kakao = [ + "kakao-user", + "kakao-talk", + "kakao-story", + "kakao-link", + "kakao-navi", +] +compose = [ + "compose-ui", + "compose-ui-graphics", + "compose-ui-tooling-preview", + "compose-material3", +] +compose-debug = [ + "compose-ui-tooling", + "compose-ui-test-manifest", +] +network = [ + "retrofit", + "retrofit-converter-gson", + "retrofit2-kotlinx-serialization", + "kotlinx-serialization-json", + "okhttp", + "okhttp-logging-interceptor", + "gson", +] +lifecycle = [ + "androidx-lifecycle-viewmodel-ktx", + "androidx-lifecycle-livedata-ktx", + "androidx-lifecycle-runtime-ktx", +] + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +android-library = { id = "com.android.library", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics-gradle" } +secrets-gradle-plugin = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "secrets-gradle-plugin" }