1. Gradle이란?
빌드 배포 도구이다.
Gradle은 유연함과 성능에 초점을 둔 오픈소스 빌드 도구이다.
즉, 코드들을 모바일에서 실행하도록 변환해주는 시스템이라고 생각하면 된다.
안드로이드 스튜디오(IDE)와 빌드 시스템은 서로 독립적인데 안드로이드 스튜디오는 코드의 편집만을 담당하고 빌드는 이 gradle를 통해서 수행된다.
1-1. 특징
-> JVM 기반으로 동작한다.
-> flavor이나 build type을 통해 필요한 task type이나 build model을 구현할 수 있다.
-> Build Scan을 통해 빌드 문제가 발생했을 때 문제를 찾을 수 있는 정보를 제공한다.
-> 성능적인 부분에서 기존에 빌드된 파일을 제외하고, 변경이 발생한 파일만 다시 빌드한다.
2. DSL
DSL(Domain Specific Langauage)은 특정 분야에 최적화된 프로그래밍 언어를 뜻한다.
java와 kotlin의 경우 서버도 만들 수 있고 앱도 만들 수 있기 때문에 DSL에는 해당하지 않는다.
즉, 어떤 목적이 있고 그 목적만 달성할 수 있도록 만들어진 언어이다.
그러면, 안드로이드 스튜디오에서 사용하는 Groovy DSL과 Kotlin DSL은 무엇이고 그 차이는 무엇인가?
2-1. Groovy DSL
-> JVM에서 실행되는 스크립트 언어로 문법이 java와 가깝다.
-> java와 호환이 되고 java 클래스 파일을 그대로 Groovy 클래스로 사용 할 수 있다.
-> 하지만, 컴파일 타임 체크가 부족해 오류를 런타임에 발견하는 경우가 많다고 한다.
2-2. Kotlin DSL
코틀린 언어의 특징으로 가독성이 좋고 간략하나 Gradle 스크립팅을 하는 것을 목적으로 하는 언어이다.
최근에 프로젝트를 진행하면서 Kotlin DSL을 사용하는데 그 이유에 대해 적자면 다음과 같다.
Kotlin DSL 장점
- 컴파일 타임에 에러 확인
- 코드 탐색
- 자동 완성
- 구문 강조
- IDE의 지원으로 향상된 편집환경
- 소스코드와 동일한 언어의 사용
Kotlin DSL 단점
- 클린 빌드시 Groovy보다 느리다.
- 새로운 라이브러리 버전 inspection 기능 미지원
3. Gradle 구성 요소
3-1. build.gradle
위의 build.gradle을 잘 보면 Project와 Module로 나누어져 있다.
Project
-> 전체 프로젝트를 위한 설정을 정의한다.
-> 안드로이드 스튜디오의 프로젝트는 여러 모듈로 구성 될 수 있기 때문에, 프로젝트 전반에 적용되는 공통 설정을 관리한다.
Module
-> 모듈별로 필요한 세부 설정(SDK 버전, 애플리케이션 버전, 의존성 등)을 정의한다.
-> 모듈마다 하나의 build.gradle 파일이 생성된다.
*Version Catalog(TOML)
Gradle 7.0 이상에서는 buildSrc를 대체할 수 있는 의존성과 버전을 관리할 수 있는 방법이 생겼다.
이제 Module의 build.gradle에 대한 내용을 자세하게 알아보자.
plugins
-> 안드로이드 플러그인 사용을 gradle에 적용하는 것.
-> Gradle 빌드 시스템 자체에 적용되고, Gradle 빌드 프로세스의 동작을 확장하고 자동화한다.
-> com.android.application 플러그인의 경우 (APK 생성, 서명 처리, Proguard 및 R8 설정 등)의 작업을 수행한다.
android
안드로이드와 관련된 빌드 설정들
android {
namespace = "com.nfancy" // 앱의 패키지 네임스페이스로, Android 12 이상에서 필수.
compileSdk = 34 // 앱을 빌드할 때 사용할 Android SDK 버전.
...
}
: namespace
-> 앱의 패키지 네임스페스로, Android 12 이상에서는 필수이다.
: compileSdk
-> Android API 레벨로, 적혀진 레벨 이하로 사용이 가능하다.
android 내부 블록
defaultConfig
-> 앱의 기본 설정을 정의한다.
defaultConfig {
applicationId = "com.nfancy"
minSdk = 28
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
: applicationId
-> 앱 고유 식별 ID로 Google Play에 앱을 게시할 때 이 값으로 앱을 구분한다.
: minSdk
-> 앱이 지원하는 최소 Android 버전이다.
: targetSdk
-> 앱을 기기에 실행 시 실제로 사용되는 Android API 레벨
-> 기기의 OS 버전 > targetSdkVersion
# 기기는 상위 API에 포함된 기능을 모두 사용할 수 있지만, targetSdkVersion을 기반으로 동작한다.
-> OS버전 < targetSdkVersion
# 기기의 OS 버전에 맞춰서 동작한다.
: versionCode, versionName
-> 앱의 내부 버전 번호 및 사용자에게 표시되는 앱 버전 이름
: testInstrumentationRunner
-> Test를 실행할 때 사용하는 테스트 러너를 지정한다.
: vectorDrawable
-> Android 5.0 이하에서도 Vector Drawable을 사용할 수 있게 한다.
buildTypes
-> 빌드 유형별(debug, release) 설정을 정의한다.
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions
-> Java 컴파일러 옵션을 설정한다.
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions
-> 코틀린 컴파일러 옵션을 정의한다.
kotlinOptions {
jvmTarget = "11"
}
buildFeatures
-> Compose나 View Binding, DataBinding 등 추가 기능을 활성화한다.
buildFeatures {
compose = true
}
dependencies
-> 라이브러리와 같은 의존성 추가를 위한 곳
3. 추가 gradle 파일
3-1. gradle-wrapper
Gradle의 호출이 필요한 경우 미리 다운로드 하는 스크립트라고 한다.
즉, 이미 존재하는 프로젝트를 새로운 환경에서 바로 빌드할 수 있도록 하는 방법을 gradle-wrapper를 통해 제공 해준다.
3-2. gradle.properties
프로젝트 전체 적용되며, 빌드 설정과 관련된 여러가지 옵션을 제공해준다고 한다. 따로 설정해준 적이 없지만 초기부터 저런 값들이 들어 있었다.
1. org.gradle.jvmargs
Gradle Daemon에 사용될 JVM 인자를 지정한다.
Gradle의 경우 한번 실행하면 일정시간동안 daemon으로 백그라운드 상태에 있다고 한다. 이렇게 하는 이유가 다시 실행했을 때 gradle을 새로 띄우지 않고 빌드 시간을 단축하기 위해서이다.
2. useAndroidX
support library 대신 적절한 AndroidX 라이브러리를 사용하도록 설정하는 것
3. kotlin.code.style
코틀린 코드 스타일을 지정하는 옵션이다.
4. android.nonTransitiveRClass
기존 범블비 이전까지의 AGP 라이브러리는 R 클래스 뿐 아니라 모든 종속성에 대한 키를 생성했고, 이러한 이유로 파일 크기가 크고 빌드 시간도 길었다. -> 전이적 R classes
하지만 비전이적 R class를 선언할 경우 해당 모듈에 선언된 리소스만 포함하여 R 클래스가 줄어든다고 한다.
3-3. setting.gradle
프로젝트 전체에 적용되는 설정을 정의하고, 앱을 빌드할 때 포함해야 하는 모듈을 Gradle에게 알려준다.
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven("https://repository.map.naver.com/archive/maven")
}
}
rootProject.name = "MiniMoment"
include(":app")
include(":domain")
include(":data")
include(":presentation")
include(":libs")
여기까지가 Gradle에 대해 간단하게 정리한 글이다.
*참고
'멀티 모듈로 프로젝트를 구성하려고 할 때, app 모듈을 제외하고 나머지 모듈에서는 build.gradle에 android 블록이 필요 없지 않을까?'
라는 궁금증을 가지고 있었다.
그에 대한 답변이,
com.android.library 플러그인을 사용하는 경우
-> Android-specific 라이브러리(Room, Retrofit, Glide 등)를 사용하거나 Android API(Context, Lifecycle 등)에 의존한다면 minSdkVersion, targetSdkVersion이 포함되어야 빌드 가능하기 때문에 필요하다고 한다.
다만, Android와 무관한 순수 Kotlin/Java 코드만 있는 경우에는 필요가 없다고 한다.
'Android > Android' 카테고리의 다른 글
[Android] 아키텍처 - MVC, MVP, MVVM 정리 (11) | 2024.10.19 |
---|---|
[Android] 컴포넌트 - Service (8) | 2024.10.18 |
[Android] Jetpack이란? (0) | 2024.07.09 |
[Android] Hilt 정리 (0) | 2024.06.16 |
[Android] Intent(인텐트)란? (0) | 2024.05.27 |