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

ビルド依存関係は、プロジェクトを正常にビルドするために必要な外部コンポーネントです。ビルドは、ライブラリ、プラグイン、サブプロジェクト、Android SDK、Kotlin や Java コンパイラなどのツール、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 開発キット。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
}