서밋코퍼레이션

Gradle Kotlin DSL 적용 본문

Android

Gradle Kotlin DSL 적용

SUMMIT-CORP 2020. 3. 29. 18:12

 

Gradle kotlin dsl 입니다!

 

먼저 설명에 앞서 필요한 몇가지 개념에 대해 잡고 넘아가야합니다..

 

 

먼저 저희가 개발을 진행할때 자주 사용되는 프로그램(Integrated Development Environment, IDE)은 크게 3가지 기능으로 나눌 수 있습니다.

 

¤ 소스 코드 편집기 : 시각적으로 사용자가 보기 편하도록 구문 강조와 같은 기능을 포함, 코드 작성을 돕는 텍스트 편집기입니다. 또한 언어별 자동 완성 기능과 코드 작성 중 버그 검사를 제공합니다.

 

¤ 로컬 빌드 자동화 : 컴퓨터 소스 코드를 바이너리 코드로 컴파일링하고, 바이너리 코드를 패키징하고 자동화 테스트를 실행하는 등 간편하고 반복가능한 태스크를 개발자가 사용하는 소프트웨어의 로컬 빌드를 생성할 때 자동화해주는 유틸리티입니다.

 

¤ 디버거: 원본 코드에 있는 버그 위치를 그래픽으로 표시할 수 있는 다른 프로그램을 테스트하는 프로그램입니다.

 

이 중 로컬 빌드 자동화에 해당하는 빌드도구(소스코드를 실행가능한 애플리케이션 생성물로 자동으로 만드는 프로그램. 빌드과정은 소스코드를 컴파일하고 연결하고 패키징하여 실행가능한 형태로 가공합니다.) 중 널리 사용되고 있는 빌드도구는 Gradle, Maven, Ant 등 이있습니다.

 

이 중 Gradle은 유연함과 성능에 초점을 둔 오픈소스 빌드도구이며, 기본적으로 Gradle Groovy DSL 이 사용됩니다.

 

 

 

Gradle Groovy DSL 과 비교한 Gradle Kotlin DSL 의 장점 

 

¤ 코드의 자동완성

 

¤ 빠른 문서보기가 가능

 

¤ 리팩토링 기능

 

¤ 오류코드 강조 표시

               

 < Gradle Groovy DSL >

 

 

 

 < Gradle Kotlin DSL >

 

 

p.s. 코틀린 DSL 모든 문자열을 큰따옴표(")로 작성해야합니다.(통일성)

     문자열에서 위치변환자 사용이 자유롭다.

 


 실제 적용해보기! 

 

 Gradle Groovy DSL 의 기본 확장자 : .gradle / .build.gradle / settings.gradle 

 Gradle Kotlin DSL 의 기본 확장자 : .gradle.kts / .buuld.gradle.kts / settings.gradle.kts

 

 

 

 

1 단계 )

먼저 New -> Directory를 통해 buildSrc라는 이름의 디렉토리를 생성해줍니다.

 

생성된 buildSrc 안에 build.gradle.kts 를 생성해줍니다.

생성된 buildSrc 안에 src/main/java 디렉토리를 생성하고 그 하위에 Dependencies.kt를 생성합니다.

 

총 2개의 파일이 추가되어야하며 최종적인 화면은 다음과 같습니다.

 

<build.gradle.kts>

plugins {

    `kotlin-dsl`

}

repositories {

    jcenter()

}

              

< Dependencies.kt >

object Apps {

    const val compileSdk = 29

    const val minSdk = 21

    const val targetSdk = 29

    const val versionCode = 1

    const val versionName = "1.0.0"

}

 

object Versions {

    const val gradle = "3.5.2"

    const val kotlin = "1.3.50"

    const val appcompat = "1.0.2"

 

    const val junit = "4.12"

}

 

object Libs {

    const val kotlin = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}"

    const val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"

}

 

object TestLibs {

    const val junit = "junit:junit:${Versions.junit}"

}

 

 

두 파일 모두 내용을 작성하신 후  Sync now를 눌러주세요.

 

 

 

 

 

2단계 )

settings.gradle  -> settings.gradle.kts  이름 변경

 

                   

< settings.gradle > 

include ':app'

rootProject.name='kotlinDSL'

 

                  ↓

 

 < settings.gradle.kts > 

include (":app")

rootProject.name="kotlinDSL"

 

 

 

3단계 ) 프로젝트수준 build.gradle 변경

 

build.gradle -> build.gradle.kts  이름 변경

 

 

3-1 단계 ) dependencies 변경

 < build.gradle > 

    dependencies {

        classpath 'com.android.tools.build:gradle:3.5.2'

        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

    }

                                      ↓

 < build.gradle.kts > 

dependencies {

classpath("com.android.tools.build:gradle:${Versions.gradle}")

    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}")

}

 

 

 

3-2 단계 ) task clean 변경

 

< build.gradle >

task clean(type: Delete) {

    delete rootProject.buildDir

}

 

                         ↓

< build.gradle.kts >

tasks.register("clean",Delete::class){

    delete(rootProject.buildDir)

}

 

 

 

3-3 단계 ) repositories 변경

< build.gradle >

   repositories {

        google()

        jcenter()

    }

 

               ↓

 

< build.gradle.kts >

repositories {

        google()

        jcenter()

        maven { url = uri("https://jitpack.io") }

   }

※ ext.kotlin_version = 'x.x.xx' 는 삭제해주세요 

 

 

 

 

4단계 )  수준 build.gradle 변경

 

build.gradle -> build.gradle.kts  이름 변경

4-1 단계 ) plugin 부분 변경

< build.gradle >

apply plugin: 'com.android.application'

 

apply plugin: 'kotlin-android'

 

apply plugin: 'kotlin-android-extensions'

                       ↓

< build.gradle.kts >

plugins {

    id("com.android.application")

    kotlin("android")

    kotlin("android.extensions")

    kotlin("kapt")

}

 

 

4-2 단계 ) android 부분 변경

 

 

< build.gradle >

android {

    compileSdkVersion 29

    buildToolsVersion "29.0.2"

    defaultConfig {

        applicationId "com.sean.kotlindsl"

        minSdkVersion 19

        targetSdkVersion 29

        versionCode 1

        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }

    buildTypes {

        release {

            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }

    }

}

                                                           ↓

< build.gradle.kts >

android {

    compileSdkVersion(Apps.compileSdk)

    defaultConfig {

        minSdkVersion(Apps.minSdk)

        targetSdkVersion(Apps.targetSdk)

        versionCode = Apps.versionCode

        versionName = Apps.versionName

        multiDexEnabled = true

        setProperty("archivesBaseName", "$applicationId-v$versionName($versionCode)")

        resConfigs("en")

        ndk {

            abiFilters("armeabi-v7a", "x86", "arm64-v8a", "x86_64")

        }

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

    }

 

    buildTypes {

        getByName("debug") {

            isMinifyEnabled = false

            isDebuggable = true

            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")

        }

        getByName("release") {

            isMinifyEnabled = false

            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")

        }

    }

 

    dataBinding {

 

        isEnabled = true

 

    }

}

 

4-3 단계 ) dependencies 부분 변경

 

dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    implementation 'androidx.appcompat:appcompat:1.1.0'

    implementation 'androidx.core:core-ktx:1.1.0'

    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

    testImplementation 'junit:junit:4.12'

    androidTestImplementation 'androidx.test.ext:junit:1.1.1'

    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

 

                                                 ↓

 

dependencies {

    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

    implementation(Libs.kotlin)

    implementation(Libs.appcompat)

    implementation(Libs.Permission.permission)

 

 

/* ------------------------------------------------------------------------------------------------ */

사용자에 따라 추가적인 implementaion 추가 , Dependencies.kt에 작성 후 적용

 

    implementation(Libs.Glide.glide)

    kapt(Libs.Glide.compiler)

    implementation(Libs.Glide.okhttp3Intergration)

 

    implementation(Libs.Retrofit.retrofit)

    implementation(Libs.Retrofit.converterGson)

    implementation(Libs.Retrofit.mock)

    implementation(Libs.Retrofit.rxjava2)

 

    implementation(Libs.OkHttp.loggingInterceptor)

 

    implementation(Libs.Firebase.core)

   implementation(Libs.Firebase.messaging)

 

/* ------------------------------------------------------------------------------------------------ */

 

    implementation(Libs.Jakewharton.Timber.common)

    testImplementation(TestLibs.junit)

    implementation ("androidx.core:core-ktx:1.1.0")

    implementation("androidx.constraintlayout:constraintlayout:1.1.3")

    implementation ("com.android.support:design:28.0.0")

    androidTestImplementation ("androidx.test.ext:junit:1.1.1")

    androidTestImplementation ("androidx.test.espresso:espresso-core:3.2.0")

}

 

 

위에서 작성했던 Dependencies.kt에 값을 사용하여 코드를 깔끔하게 작성할 수 있습니다.