도구 및 라이브러리 상호 종속 항목

빌드 종속 항목은 프로젝트를 성공적으로 빌드하는 데 필요한 외부 구성요소입니다. 빌드는 라이브러리, 플러그인, 하위 프로젝트, Android SDK, Kotlin 및 Java 컴파일러와 같은 도구, Android 스튜디오와 같은 개발 환경, Gradle 자체에 종속될 수 있습니다.

각 종속 항목은 자체적으로 다른 종속 항목을 필요로 할 수 있습니다. 이를 전이 종속 항목이라고 하며, 애플리케이션에서 사용하는 전체 종속 항목을 빠르게 늘릴 수 있습니다. 라이브러리, 도구, Android SDK 등 종속 항목을 업그레이드하려는 경우 업그레이드가 연쇄적으로 발생하여 다른 많은 종속 항목이 업그레이드될 수 있습니다.

많은 라이브러리가 시맨틱 버전 관리라는 스키마를 따르므로 이로 인해 문제가 발생하는 경우는 많지 않습니다. 이러한 라이브러리는 이전 버전과의 호환성을 제공하기 위해 변경 유형을 제한합니다.

시맨틱 버전 관리는 major.minor.patch 형식을 따릅니다. 예를 들어 버전 번호 4.8.3에서 4는 major 버전이고 8은 minor 버전이며 3은 patch 번호입니다. major 부분이 변경되면 라이브러리의 API 또는 동작에 브레이킹 체인지가 있을 수 있습니다. 이는 빌드 또는 애플리케이션 동작에 영향을 미칠 수 있습니다.

minor(새 기능) 또는 patch(버그 수정) 부분이 변경되면 라이브러리 개발자는 라이브러리가 여전히 호환되며 애플리케이션에 영향을 미치지 않는다고 알립니다.

빌드의 관계

Android 빌드에는 다음 간의 관계가 포함됩니다.

  • 소스 코드 - 개발자가 제어할 수 있는 코드 및 리소스
  • 라이브러리 종속 항목 - 빌드 시 프로젝트 및 하위 프로젝트에 포함되는 외부 라이브러리 또는 모듈
  • 도구 - 소스를 애플리케이션 또는 라이브러리로 변환하는 컴파일러, 플러그인, SDK
빌드 종속 항목 및 관계
그림 1. 관계 형성

소스 코드

소스 코드는 애플리케이션 또는 라이브러리에 작성하는 Kotlin 또는 Java 코드입니다. C++ 사용에 관한 자세한 내용은 Android NDK를 참고하세요.

소스 코드는 라이브러리(Kotlin 및 Java 런타임 라이브러리 포함)와 Android SDK에 종속되며, 상응하는 Kotlin 또는 Java 컴파일러가 필요합니다.

일부 소스 코드에는 추가 처리가 필요한 주석이 포함되어 있습니다. 예를 들어 Jetpack Compose 코드를 작성하는 경우 Compose Kotlin 컴파일러 플러그인에서 처리해야 하는 @Composable과 같은 주석을 추가합니다. 다른 주석은 Kotlin Symbol Processor(KSP) 또는 별도의 주석 처리 도구로 처리할 수 있습니다.

라이브러리 종속 항목

라이브러리에는 애플리케이션의 일부로 가져온 바이트코드가 포함되어 있습니다. 이는 Java JAR, Android 라이브러리(AAR) 또는 빌드의 하위 프로젝트일 수 있습니다. 많은 라이브러리가 시맨틱 버전 관리를 따르므로 업그레이드 시 호환성이 유지되는지 여부를 파악하는 데 도움이 됩니다.

라이브러리에는 다른 라이브러리에 대한 전이 종속 항목이 있는 경우가 많습니다. 이렇게 하면 명시적으로 관리해야 하는 항목이 줄어듭니다. 직접 종속 항목을 지정하면 Gradle이 전이 종속 항목과 함께 가져옵니다. 직접 종속 항목을 업그레이드하면 전이 종속 항목도 업그레이드될 수 있습니다.

런타임(minSdk) 또는 컴파일 시간(compileSdk)에 Android SDK의 최소 버전을 요구하는 라이브러리도 있습니다. 이는 라이브러리가 Android SDK 또는 제공된 JDK API에 포함된 함수를 사용하는 경우에 필요합니다. 애플리케이션의 유효 minSdk은 애플리케이션과 모든 직접 및 전이 라이브러리 종속 항목에서 요청한 가장 높은 minSdk입니다.

일부 라이브러리를 사용하려면 특정 Gradle 플러그인을 사용해야 할 수 있습니다. 이러한 도우미 플러그인은 라이브러리 기능 사용을 지원하기 위해 코드를 생성하거나 소스 컴파일을 수정하는 Kotlin 기호 프로세서 또는 기타 주석 프로세서를 설치하는 경우가 많습니다. 예를 들어 Jetpack Room에는 주석과 이를 생성된 코드로 변환하여 데이터베이스에서 데이터를 검색하고 수정하는 KSP가 포함되어 있습니다. Jetpack Compose는 주석이 달린 함수를 수정하여 해당 함수가 다시 실행되는 방식과 시기를 관리하기 위해 Compose 컴파일러 플러그인이 필요합니다.

도구

Gradle

Gradle은 빌드 파일을 읽고 애플리케이션 또는 라이브러리를 생성하는 빌드 도구이며, 플러그인이 기능을 확장할 수 있도록 API를 노출합니다. Gradle은 하나 이상의 자바 가상 머신에서 여러 프로세스를 실행하며, Gradle의 자바 플러그인은 JDK 내의 자바 도구를 호출합니다.

Gradle 플러그인

Gradle 플러그인은 새로운 작업과 구성을 정의하여 Gradle을 확장합니다. 빌드에 플러그인을 적용하면 빌드 스크립트에서 데이터로 구성된 특정 빌드 기능을 사용할 수 있습니다. Android 빌드에서 가장 중요한 Gradle 플러그인은 Android Gradle 플러그인(AGP)입니다.

컴파일러

Kotlin 또는 자바 컴파일러는 소스 코드를 실행 가능한 바이트 코드로 변환합니다. Kotlin 컴파일러는 파싱된 코드 구조에 액세스하여 컴파일러 내에서 직접 외부 분석 및 코드 생성을 실행할 수 있는 플러그인 API를 노출합니다.

컴파일러 플러그인

컴파일러 플러그인은 Kotlin 컴파일러가 코드를 분석하는 동안 Kotlin 컴파일러 내부에서 분석 및 코드 생성을 실행하며, Gradle 플러그인을 빌드에 적용할 때 설치됩니다.

Android SDK

Android SDK에는 특정 버전의 Android를 위한 Android 플랫폼과 Java API, 그리고 이에 상응하는 도구가 포함되어 있습니다. 이러한 도구는 SDK를 관리하고, 애플리케이션을 빌드하고, Android 기기와 통신하고 에뮬레이션하는 데 도움이 됩니다.

Android SDK의 각 버전은 소스 코드가 액세스할 수 있는 특정 자바 API와 이전 버전의 Android에서 이러한 API를 사용할 수 있는 디슈가링 지원을 제공합니다.

JDK

자바 소스를 컴파일하고 자바 애플리케이션을 실행하는 자바 라이브러리와 실행 파일이 포함된 Java 개발 키트입니다. Android 빌드에는 여러 JDK가 사용됩니다. 자세한 내용은 Android 빌드의 Java 버전을 참고하세요.

Gradle 범위

Gradle은 라이브러리 종속 항목을 다양한 범위(Gradle API에서는 구성이라고 함)로 그룹화하여 빌드의 여러 부분에서 사용할 다양한 라이브러리 종속 항목 집합을 지정할 수 있습니다. 예를 들어 게시된 애플리케이션이나 라이브러리에 JUnit과 같은 테스트 라이브러리를 포함하지 않으려고 하지만 단위 테스트를 빌드하고 실행할 때는 필요합니다. 또한 범위를 사용하여 기호 또는 주석 프로세서를 추가하여 코드를 분석합니다.

예를 들어 AGP는 implementation 및 api 범위를 정의합니다. 이는 종속 항목을 하위 프로젝트 사용자에게 노출해야 하는지 지정하는 방법입니다. Android 빌드에 사용되는 이러한 범위 및 기타 범위에 관한 설명은 종속 항목 구성을 참고하세요.

빌드 파일의 dependencies 블록에 라이브러리 종속 항목을 group:artifact:version 문자열로 추가합니다.

Kotlin

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation("com.example:library1:1.2.3")
    api("com.example:library2:1.1.1")
}

Groovy

// In a module-level build script
// explicit dependency strings ("group:artifact:version")
dependencies {
    implementation 'com.example:library1:1.2.3'
    api 'com.example:library2:1.1.1'
}

또는 버전 카탈로그에서:

# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"

[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }

[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }

생성된 변수를 빌드 파일에 지정합니다.

Kotlin

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation(libs.example.library)
}

Groovy

// In a module-level build script
// Using a version catalog
plugins {
    alias(libs.plugins.example.plugin)
}

dependencies {
    implementation libs.example.library
}