Gradle

맥모닝·2024년 6월 6일
0

Study

목록 보기
3/3

https://assets.tomgregory.com/get-going-with-gradle/get-going-with-gradle-book.pdf

Gradle

  • 프로젝트의 모든 코드를 가져와 대상 환경에서 실행할 수 있는 배포 가능한 단위로 패키징하는 빌드 자동화 도구

  • 소규모 프로젝트를 빠르게 구축하거나 시간이 오래 걸리는 매우 복잡한 프로젝트를 구축할 수 있다.

  • Gradle 빌드는 JVM(Java Virtual Machine) 위에 구축된 스크립트 언어인 Kotlin으로 작성된다.

    • Groovy라는 다른 Java JVM 언어를 사용하여 Gradle 빌드 스크립트를 작성할 수도 있다.

    • 스크립트 언어 : 응용 소프트웨어를 제어하는 컴퓨터 프로그래밍 언어


Groovy vs Kotlin

VS Kotlin Groovy
용도 공식 안드로이드 앱 개발 언어 / 서버 측 프로덕션에 더 적합 스크립트와 도메인 특화 언어에 적합
널 안정성 두 가지 표기법(널 허용 및 널 허용 안 함)을 통해 널 안정성을 보장 널 안정성이 없음
학습 곡선 생산성과 신뢰성을 높이기 위한 간결한 구문 Java와 유사한 구문으로 전환이 쉬움
컴파일 정적 타이핑 언어 동적 및 정적 타입 체크 모두 지원
성능 거의 Java와 비교할 만한 높은 성능 클로저로 인해 성능이 느림
파일 확장자 .kt, .kts 파일 확장자 .groovy 파일 확장자
  • 둘 다 JVM에서 실행 가능한 언어로 자바와 상호 운용이 가능하며 함께 활용될 수 있다.

  • Groovy : 주로 동적 유형이지만 정적 유형으로도 실행될 수 있고 유형 확인은 런타임에 수행됩니다.

  • Kotlin : 정적으로 유형이 지정되고 컴파일 시간 동안 변수가 확인된다.

    • 클로저(Closure) : outer scope(상위 함수의 영역)의 변수를 접근할 수 있는 함수

Gradle을 사용하는 이유

  1. Gradle은 애플리케이션을 구축하고 실행하는 것을 매우 쉽게 만들어준다.

  2. 프로젝트를 사용하는 사람들이 Gradle을 설치할 필요가 없다.

    • Gradle 프로젝트와 함께 번들로 Gradle Wrapper Script를 제공한다.
  3. 빌드가 코드로 정의되어 있고 XML이 아니기 때문에 Maven과 같은 도구들보다 훨씬 간결하고 장황하지 않다.

  4. 매우 성능이 좋으며 불필요하게 같은 작업을 여러 번 반복하지 않도록 증분 빌드를 지원한다.


Gradle Scripts

build.gradle

  • build.gradle는 프로젝트의 빌드 방법을 정의하는 Gradle 빌드 스크립트 파일이다.

    • build.gradle.ktx는 Kotlin으로 작성되어 있으며, 빌드를 가능한 한 간결하게 정의할 수 있도록 Gradle 도메인 특화 언어(DSL)를 사용한다.

build.gradle (Project)

  • 프로젝트의 모든 모듈에 적용되는 빌드 구성을 정의하는 곳
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {

    repositories {
        google() // google API를 가지고 있는 저장소
        mavenCentral() // bintray 닷컴회사에서 제공하는 Maven 저장소
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${KOTLIN_VERSION}"
    }
}

plugins {
    id 'com.android.application' version '8.1.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
}

allprojects {
    // 빌드 디렉토리를 청소하는 작업을 정의
    tasks.register(Delete) {
        delete(rootProject.buildDir)
    }
}
  • buildsciprt : gradle 자체에 대한 저장소(repositories)와 종속성(dependencies)을 구성하는 곳

    • repositories : gradle이 dependencies를 검색하거나 다운로드하는데 사용하는 저장소를 설정하는 곳

    • dependencies : gradle이 프로젝트를 빌드하는데 필요한 라이브러리를 구성하는 곳

  • allprojects : 프로젝트 수준의 build.gradle 뿐만 아니라 해당 프로젝트에 포함된 모든 모듈의 build.gradle을 제어한다.

    • subprojects : 프로젝트 수준의 build.gradle을 제외한 모든 모듈(서브 모듈)의 build.gradle을 제어한다.

    • project : 특정 모듈의 build.gradle에만 스크립트가 추가된다.

  • tasks : Gradle 빌드 시스템에서 실행할 커스텀 작업을 정의한다.


build.gradle (Module)

  • 해당 모듈의 빌드 설정을 정의하는 곳
plugins {
    id 'com.android.application' // 안드로이드 애플리케이션 플러그인
    id 'kotlin-kapt' // Kotlin Annotation Processing
}

android {
    // 애플리케이션 패키지 이름(for Gradle 빌드 시스템)
    namespace = "com.example.myapplication"
    // Gradle이 컴파일하는 데 사용해야하는 Android API 수준
    compileSdk = 34

    defaultConfig { // 빌드에 대한 기본 설정
        applicationId = "com.example.myapplication"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        // 계측 테스트를 실행할 때 사용할 테스트 러너
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    // 여러 빌드 유형을 구성할 수 있는 곳
    buildTypes {
        release {
            minifyEnabled false // 코드 축소 활성화
            // 코드 축소, 최적화, 난독화 작업을 수행할 때 사용하는 설정 파일을 지정하는 데 사용
            proguardFiles(
                // Android SDK에 포함된 기본 ProGuard 최적화 파일
                getDefaultProguardFile("proguard-android-optimize.txt"),
                // 프로젝트에 포함된 사용자 정의 ProGuard 규칙 파일
                "proguard-rules.pro"
            )
        }
    }
    compileOptions { // Java 버전 기능을 이용할 수 있도록 옵션 추가
        sourceCompatibility JavaVersion.VERSION_1_8
                targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions { // kotlin에서 바이트코드를 생성할때 대상 Java 버전을 설정
        jvmTarget = "1.8"
    }
}

dependencies {

    implementation "androidx.core:core-ktx:1.9.0"
    testImplementation "junit:junit:4.13.2"
    androidTestImplementation "androidx.test.ext:junit:1.1.5"

    // https://developer.android.com/build/migrate-to-ksp?hl=ko
    kapt "androidx.room:room-compiler:$roomVersion"
    ksp "androidx.room:room-compiler:$roomVersion"
}

kapt {
    // 런타임에서 발생할 수 있는 에러에 대한 검사를 컴파일 시점에 체크한다.
    correctErrorTypes true
}
  • plugins : 프로젝트에 적용할 플러그인으로 Gradle 빌드 시스템의 기능을 확장하거나 설정을 간소화하는 데 사용된다.

  • android : 안드로이드 프로젝트에 특화된 설정을 정의한다.

    • release : 디버깅 정보를 삽입하지 않고 코드를 최적화하여 실행 파일을 만들어준다.

      • debug : 실행 파일에 디버깅 정보를 삽입하여 언제든지 디버깅을 할 수 있도록 하며 Debug 서브 폴더에 실행 파일을 만들어준다.
  • dependencies : 프로젝트가 의존하는 라이브러리와 모듈을 정의한다. 외부 라이브러리, 모듈 간 종속성 등이 포함된다.


proguard-rules.pro

  • 모듈과 그 모듈의 종속되어 있는 라이브러리의 proguard와 연관되어 있는 규칙을 선언하는 파일

    • proguard : 코드를 난독화해주고, 최적화를 해주는 오픈소스 툴
  • https://nezhitsya.tistory.com/26


gradle.properties

  • 빌드 설정과 관련된 여러가지 옵션을 제공한다.

  • 프로젝트 최상단에 위치한 파일이므로, 프로젝트 전체에 적용된다.

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
kotlin.code.style=official
android.nonTransitiveRClass=true
  • org.gradle.jvmargs : Gradle Daemon에 사용될 JVM 인자를 지정한다. 이 설정은 빌드 성능을 위한 JVM 메모리 세팅에 유용하다.

    • Daemon Process : 서비스의 요청에 응답하기 위해 오랫동안 실행중인 백그라운드 프로세스

    • gradle daemon : gradle이 실행되는 인스턴스를 유지하고 빌드가 끝난 뒤에도 사라지지 않고 백그라운드에서 대기한다. Gradle 빌드 시간을 단축시키는 역할을 한다.

  • useAndroidX : support library 대신 적절한 AndroidX 라이브러리를 사용한다.

  • kotlin.code.style : 코틀린 코드 스타일을 지정하는 옵션이다. gradle은 코드를 정렬하는 기능은 하지 않기 때문에, 이 옵션은 Intellij IDE에서 사용하는 옵션이다.

  • android.nonTransitiveRClass : R 클래스(R.xx.xxx 형식으로 안드로이드 리소스를 관리하는 변수들이 모여있는 클래스)에 라이브러리 자체에 선언된 리소스만 포함하고, 라이브러리에 종속되는 항목들은 포함하지 않도록 하는 옵션이다. 이 옵션을 사용하면 APK 빌드시 용량이 크게 줄어든다.


gradle-wrapper.properties

  • Gradle Wrapper (gradlew)는 소스 코드와 함께 포함된 작은 애플리케이션으로, Gradle을 자동으로 다운로드하고 실행하여 빌드 실행의 일관성을 높여준다. 개발자는 애플리케이션 소스를 다운로드하고 gradlew를 실행하면 필요한 Gradle 배포판이 다운로드되고 애플리케이션이 빌드된다.
  • gradle/wrapper/gradle-wrapper.properties 파일에는 Gradle 버전을 설명하는 distributionUrl 속성이 포함되어 있다. 이 속성은 빌드를 실행하는 데 사용되는 Gradle 버전을 지정한다.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

local.properties

  • 안드로이드 프로젝트의 루트 디렉토리에 위치한 설정 파일로, 주로 로컬 개발 환경의 특정 정보를 저장하는 데 사용된다.

  • 안드로이드 스튜디오에서 자동으로 생성되며, 프로젝트의 빌드나 실행에 필요한 SDK 경로와 같은 로컬 설정을 포함한다.

  • 보안에 민감한 정보나 인증 키를 저장할 때도 사용될 수 있다.


settings.gradle.kts

  • settings.gradle.kts 파일(Kotlin DSL의 경우)은 루트 프로젝트 디렉토리에 위치해 있다.

  • 프로젝트 레벨의 저장소 설정을 정의하고, Gradle에게 애플리케이션을 빌드할 때 포함해야 할 모듈들을 알려준다.

  • 멀티 모듈 프로젝트는 최종 빌드에 포함될 각 모듈을 명시해야 한다.

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "My Application"
include(":app")
  • pluginManagement.repositories 블록

    • Gradle이 Gradle 플러그인과 그 의존성을 검색하거나 다운로드하는 데 사용하는 저장소를 구성한다.
    • Gradle은 기본적으로 JCenter, Maven Central, Ivy 같은 원격 저장소를 지원하며, 로컬 저장소나 사용자 정의 원격 저장소도 사용할 수 있다.
  • dependencyResolutionManagement.repositories
    • 프로젝트의 모든 모듈에서 사용하는 저장소와 의존성을 설정하는 곳
    • 애플리케이션을 만들 때 필요한 라이브러리들을 의미한다. 모듈별 의존성은 각 모듈의 build.gradle 파일에서 따로 설정해야한다.

Kotlin DSL

  • 다른 DSL의 비해서 특정 도메인이나 작업에 대해 보다 표현력이 뛰어나고 유연한 코드를 작성할 수 있도록 도와주는 도구

    • DSL(Domain Specific Language) : 특정 도메인에 대한 목적으로 만들어진 언어

      • GPL(General Purpose Language) : 다양한 문제 및 도메인을 다룰 수 있는 범용적인 언어로 다양한 종류의 소프트웨어 개발에 사용된다.

Groovy에서 KTS로 마이그레이션

dependencies {
    def nav_version = "2.5.0"

    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
}
dependencies {
    val navVersion = "2.5.0"

    implementation("androidx.navigation:navigation-fragment-ktx:$navVersion")
}
profile
필요한 내용을 공부하고 저장합니다.

0개의 댓글