def 변수를 이용해서 모듈 버전 관리
솔직히 단일 모듈로 진행했을 땐 불편한 점 없었음 😊
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
defaultConfig {
applicationId "projectName"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
dataBinding true
}
}
dependencies {
def preference_version = "1.2.0"
implementation "androidx.preference:preference-ktx:$preference_version"
def core_ktx_version = '1.7.0'
implementation "androidx.core:core-ktx:$core_ktx_version"
implementation 'androidx.appcompat:appcompat:1.5.1'
def material_version = '1.8.0-alpha02'
implementation "com.google.android.material:material:$material_version"
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
def nav_version = '2.5.3'
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
def lottie_version = '3.0.7'
implementation "com.airbnb.android:lottie:$lottie_version"
def custom_toastui = '1.5.2'
implementation "com.github.GrenderG:Toasty:$custom_toastui"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
Kotlin DSL + BuildSrc
gradle scripts output
buildSrc 모듈 생성 (buildSrc 디렉토리 생성)
build.gradle.kts (buildSrc)
plugins {
`kotlin-dsl`
}
repositories {
google()
mavenCentral()
}
gradle 생성하면 디렉토리가 생김
setting.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
url = uri("https://jitpack.io")
}
flatDir { dirs("libs") }
}
}
rootProject.name = "imchic"
include(":app")
include(":data")
include(":gdal_app")
build.gradle.kts (project)
plugins {
id ("com.android.application") version "7.2.0" apply false
id ("com.android.library") version "7.2.0" apply false
id ("org.jetbrains.kotlin.android") version "1.7.20" apply false
id("com.google.dagger.hilt.android") version "2.44" apply false
}
tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
}
build.gradle.kts (app)
import java.util.Properties
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
id("dagger.hilt.android.plugin")
}
android {
compileSdk = 32
// local.properties 가져오기
val localProperties = Properties().apply {
load(rootProject.file("local.properties").inputStream())
}
defaultConfig {
applicationId = AppConfig.applicationId
minSdk = AppConfig.minSdk
targetSdk = AppConfig.targetSdk
versionCode = AppConfig.versionCode
versionName = AppConfig.versionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters.add("armeabi-v7a")
abiFilters.add("arm64-v8a")
}
}
signingConfigs {
create("release") {
keyAlias = "key0"
keyPassword = ""
storePassword = ""
storeFile = file("../keystore/imchic.jks")
}
}
buildTypes {
getByName("debug") {
isMinifyEnabled = false
isDebuggable = true
isTestCoverageEnabled = true
applicationIdSuffix = ".debug"
buildConfigField("String", "api_url", localProperties.getProperty("api_url"))
buildConfigField("String", "BASE_URL", "\"${AppConfig.debugUrl}\"")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
getByName("release") {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
isDebuggable = false
applicationIdSuffix = ".release"
buildConfigField("String", "BASE_URL", "\"${AppConfig.releaseUrl}\"")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = AppConfig.javaVersion
}
buildFeatures {
dataBinding = true
}
lint {
abortOnError = false
}
}
dependencies {
// aar library add
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
implementation(Libraries.KTX.CORE)
implementation(Libraries.KTX.PREF)
implementation(Libraries.Google.MATERIAL)
implementation(Libraries.Google.HILT)
kapt(Libraries.Google.HILT_COMPILER)
implementation(Libraries.AndroidX.APP_COMPAT)
implementation(Libraries.AndroidX.CONSTRAINT_LAYOUT)
implementation(Libraries.AndroidX.NAVIGATION_FRAGMENT_KTX)
implementation(Libraries.AndroidX.NAVIGATION_UI_KTX)
implementation(Libraries.OPENSOURCE.OKHTTP)
implementation(Libraries.OPENSOURCE.LOTTIE)
implementation(Libraries.OPENSOURCE.CUSTOM_TOAST)
implementation(Libraries.Test.JUNIT)
implementation(Libraries.AndroidTest.ESPRESSO_CORE)
}
kapt {
correctErrorTypes = true
}
Dependency.kt
object AppConfig {
const val compileSdk = 32
const val applicationId = "com.example.imchic"
const val buildToolsVersion = "30.0.2"
const val minSdk = 24
const val targetSdk = 32
const val versionCode = 1
const val versionName = "0.0.1"
const val debugUrl = "http://dev.imchic.com/"
const val releaseUrl = "http://release"
const val javaVersion = "1.8"
}
object Versions {
// AndroidX
const val APP_COMPAT = "1.5.1"
const val MATERIAL = "1.8.0-alpha02"
const val CONSTRAINT_LAYOUT = "2.1.4"
const val NAVIGATION = "2.5.3"
// KTX
const val CORE = "1.7.0"
// HILT
const val HILT = "2.44"
// TEST
const val JUNIT = "1.1.3"
// Android Test
const val ESPRESSO_CORE = "3.4.0"
}
object Libraries {
object AndroidX {
const val APP_COMPAT = "androidx.appcompat:appcompat:${Versions.APP_COMPAT}"
const val CONSTRAINT_LAYOUT = "androidx.constraintlayout:constraintlayout:${Versions.CONSTRAINT_LAYOUT}"
const val NAVIGATION_FRAGMENT_KTX = "androidx.navigation:navigation-fragment-ktx:${Versions.NAVIGATION}"
const val NAVIGATION_UI_KTX = "androidx.navigation:navigation-ui-ktx:${Versions.NAVIGATION}"
}
object Google {
const val MATERIAL = "com.google.android.material:material:${Versions.MATERIAL}"
const val HILT = "com.google.dagger:hilt-android:${Versions.HILT}"
const val HILT_COMPILER = "com.google.dagger:hilt-android-compiler:${Versions.HILT}"
}
object KTX {
const val CORE = "androidx.core:core-ktx:${Versions.CORE}"
const val PREF = "androidx.preference:preference-ktx:1.2.0"
}
object OPENSOURCE {
const val OKHTTP = "com.squareup.okhttp3:okhttp:4.9.1"
const val LOTTIE = "com.airbnb.android:lottie:3.0.7"
const val CUSTOM_TOAST = "com.github.GrenderG:Toasty:1.5.2"
}
object Test {
const val JUNIT = "androidx.test.ext:junit:${Versions.JUNIT}"
const val ANDROID_JUNIT_RUNNER = "androidx.test.runner.AndroidJUnitRunner"
}
object AndroidTest {
const val ESPRESSO_CORE = "androidx.test.espresso:espresso-core:${Versions.ESPRESSO_CORE}"
}
}