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

빌드 종속 항목은 프로젝트를 성공적으로 빌드하는 데 필요한 외부 구성요소입니다. 빌드는 라이브러리, 플러그인, 하위 프로젝트, Android SDK, KotlinJava 컴파일러와 같은 도구, 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 기호 프로세서 (KSP)나 별도의 주석 처리 도구에서 처리할 수 있습니다.

라이브러리 종속성

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

라이브러리는 재사용을 위해 다른 라이브러리에 종속될 수 있으며 이를 전이 종속 항목이라고 합니다. 이렇게 하면 명시적으로 관리해야 하는 종속 항목이 줄어듭니다. 직접 사용하는 종속 항목을 지정하면 Gradle에서 이러한 전이 종속 항목과 함께 가져옵니다. 직접 종속 항목을 업그레이드하면 이러한 전이 종속 항목이 업그레이드될 수 있습니다.

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

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

도구

Gradle

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

Gradle 플러그인

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

컴파일러

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

컴파일러 플러그인

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

Android SDK

Android SDK에는 특정 버전의 Android용 Android 플랫폼 및 Java API와 해당 도구가 포함되어 있습니다. 이러한 도구를 사용하면 SDK를 관리하고 애플리케이션을 빌드하며 Android 기기와 통신하고 에뮬레이션할 수 있습니다.

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

JDK

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

Gradle 범위

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

예를 들어 AGP는 종속 항목을 하위 프로젝트의 사용자에게 노출할지 지정하는 방법인 implementationapi 범위를 정의합니다. 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
}