https://assets.tomgregory.com/get-going-with-gradle/get-going-with-gradle-book.pdf
프로젝트의 모든 코드를 가져와 대상 환경에서 실행할 수 있는 배포 가능한 단위로 패키징하는 빌드 자동화 도구
소규모 프로젝트를 빠르게 구축하거나 시간이 오래 걸리는 매우 복잡한 프로젝트를 구축할 수 있다.
Gradle 빌드는 JVM(Java Virtual Machine) 위에 구축된 스크립트 언어인 Kotlin으로 작성된다.
Groovy라는 다른 Java JVM 언어를 사용하여 Gradle 빌드 스크립트를 작성할 수도 있다.
스크립트 언어 : 응용 소프트웨어를 제어하는 컴퓨터 프로그래밍 언어
VS | Kotlin | Groovy |
---|---|---|
용도 | 공식 안드로이드 앱 개발 언어 / 서버 측 프로덕션에 더 적합 | 스크립트와 도메인 특화 언어에 적합 |
널 안정성 | 두 가지 표기법(널 허용 및 널 허용 안 함)을 통해 널 안정성을 보장 | 널 안정성이 없음 |
학습 곡선 | 생산성과 신뢰성을 높이기 위한 간결한 구문 | Java와 유사한 구문으로 전환이 쉬움 |
컴파일 | 정적 타이핑 언어 | 동적 및 정적 타입 체크 모두 지원 |
성능 | 거의 Java와 비교할 만한 높은 성능 | 클로저로 인해 성능이 느림 |
파일 확장자 | .kt, .kts 파일 확장자 | .groovy 파일 확장자 |
둘 다 JVM에서 실행 가능한 언어로 자바와 상호 운용이 가능하며 함께 활용될 수 있다.
Groovy : 주로 동적 유형이지만 정적 유형으로도 실행될 수 있고 유형 확인은 런타임에 수행됩니다.
Kotlin : 정적으로 유형이 지정되고 컴파일 시간 동안 변수가 확인된다.
Gradle은 애플리케이션을 구축하고 실행하는 것을 매우 쉽게 만들어준다.
프로젝트를 사용하는 사람들이 Gradle을 설치할 필요가 없다.
빌드가 코드로 정의되어 있고 XML이 아니기 때문에 Maven과 같은 도구들보다 훨씬 간결하고 장황하지 않다.
매우 성능이 좋으며 불필요하게 같은 작업을 여러 번 반복하지 않도록 증분 빌드를 지원한다.
build.gradle는 프로젝트의 빌드 방법을 정의하는 Gradle 빌드 스크립트 파일이다.
// 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 빌드 시스템에서 실행할 커스텀 작업을 정의한다.
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 빌드 시스템의 기능을 확장하거나 설정을 간소화하는 데 사용된다.
kapt(kotlin annotation processing tool) : Kotlin에서 Java Annotation Processor를 사용하여 Annotation들을 사용할 수 있도록 해준다.
android : 안드로이드 프로젝트에 특화된 설정을 정의한다.
release : 디버깅 정보를 삽입하지 않고 코드를 최적화하여 실행 파일을 만들어준다.
dependencies : 프로젝트가 의존하는 라이브러리와 모듈을 정의한다. 외부 라이브러리, 모듈 간 종속성 등이 포함된다.
모듈과 그 모듈의 종속되어 있는 라이브러리의 proguard와 연관되어 있는 규칙을 선언하는 파일
빌드 설정과 관련된 여러가지 옵션을 제공한다.
프로젝트 최상단에 위치한 파일이므로, 프로젝트 전체에 적용된다.
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 빌드시 용량이 크게 줄어든다.
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
안드로이드 프로젝트의 루트 디렉토리에 위치한 설정 파일로, 주로 로컬 개발 환경의 특정 정보를 저장하는 데 사용된다.
안드로이드 스튜디오에서 자동으로 생성되며, 프로젝트의 빌드나 실행에 필요한 SDK 경로와 같은 로컬 설정을 포함한다.
보안에 민감한 정보나 인증 키를 저장할 때도 사용될 수 있다.
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 블록
다른 DSL의 비해서 특정 도메인이나 작업에 대해 보다 표현력이 뛰어나고 유연한 코드를 작성할 수 있도록 도와주는 도구
DSL(Domain Specific Language) : 특정 도메인에 대한 목적으로 만들어진 언어
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")
}