ツールとライブラリの相互依存関係

ビルド依存関係は、プロジェクトを正常にビルドするために必要な外部コンポーネントです。ビルドは、ライブラリ、プラグイン、サブプロジェクト、Android SDK、KotlinJava コンパイラなどのツール、Android Studio などの開発環境、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 Symbol Processor やその他のアノテーション プロセッサをインストールします。これらのプロセッサは、ライブラリ機能の使用をサポートするためにコードを生成したり、ソースのコンパイルを変更したりします。たとえば、Jetpack Room には、データベース内のデータの取得と変更を行う生成コードに変換するアノテーションと KSP が含まれています。Jetpack Compose では、アノテーション付きの関数を変更して、その関数の再実行方法とタイミングを管理するために、Compose コンパイラ プラグインが必要です。

ツール

Gradle

Gradle は、ビルドファイルを読み取ってアプリケーションやライブラリを生成するビルドツールです。また、プラグインが機能を拡張するための API も公開します。Gradle は 1 つ以上の 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 Development Kit。Java ソースをコンパイルして Java アプリケーションを実行するための 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
}